You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

373 lines
7.8 KiB

/*
*
@file sockutil.c
@brief Implementation of useful function of iinChip
*
*/
#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#include "types.h"
//#include "serial.h"
//#include "myprintf.h"
#include "util.h"
//#include "config.h"
#include "w5100.h"
#include "sockutil.h"
/**
@brief Convert 32bit Address(Host Ordering) into Dotted Decimal Format
@return a char pointer to a static buffer containing the text address in standard ".'' notation. Otherwise, it returns NULL.
*/
char* inet_ntoa(
unsigned long addr /**< Pointer variable to store converted value(INPUT) */
)
{
static char addr_str[16];
memset(addr_str,0,16);
sprintf(addr_str,"%d.%d.%d.%d",(int)(addr>>24 & 0xFF),(int)(addr>>16 & 0xFF),(int)(addr>>8 & 0xFF),(int)(addr & 0xFF));
return addr_str;
}
#if 0
char* inet_ntoa_pad(unsigned long addr)
{
static char addr_str[16];
memset(addr_str,0,16);
sprintf(addr_str,"%03d.%03d.%03d.%03d",(int)(addr>>24 & 0xFF),(int)(addr>>16 & 0xFF),(int)(addr>>8 & 0xFF),(int)(addr & 0xFF));
return addr_str;
}
#endif
/**
@brief Converts a string containing an (Ipv4) Internet Protocol decimal dotted address into a 32bit address
@return 32bit address (Host Odering)
*/
unsigned long inet_addr(
unsigned char* addr /**< dotted notation address string. */
)
{
char i;
u_long inetaddr = 0;
char taddr[30];
char * nexttok;
int num;
strcpy(taddr,addr);
nexttok = taddr;
for(i = 0; i < 4 ; i++)
{
nexttok = strtok(nexttok,".");
if(nexttok[0] == '0' && nexttok[1] == 'x') num = ATOI(nexttok+2,0x10);
else num = ATOI(nexttok,10);
inetaddr = inetaddr << 8;
inetaddr |= (num & 0xFF);
nexttok = NULL;
}
return inetaddr;
}
#if 0
/**
@brief Verify dotted notation IP address string
@return success - 1, fail - 0
*/
char VerifyIPAddress(
char* src /**< pointer to IP address string */
)
{
int i;
int tnum;
char tsrc[50];
char* tok = tsrc;
strcpy(tsrc,src);
for(i = 0; i < 4; i++)
{
tok = strtok(tok,".");
if ( !tok ) return 0;
if(tok[0] == '0' && tok[1] == 'x')
{
if(!ValidATOI(tok+2,0x10,&tnum)) return 0;
}
else if(!ValidATOI(tok,10,&tnum)) return 0;
if(tnum < 0 || tnum > 255) return 0;
tok = NULL;
}
return 1;
}
/**
@brief Output destination IP address of appropriate channel
@return 32bit destination address (Host Ordering)
*/
unsigned long GetDestAddr(
SOCKET s /**< Channel number which try to get destination IP Address */
)
{
u_long addr=0;
int i = 0;
for(i=0; i < 4; i++)
{
addr <<=8;
addr += IINCHIP_READ(Sn_DIPR0(s)+i);
}
return addr;
}
/**
@brief Output destination port number of appropriate channel
@return 16bit destination port number
*/
unsigned int GetDestPort(
SOCKET s /**< Channel number which try to get destination port */
)
{
u_int port;
port = ((u_int) IINCHIP_READ(Sn_DPORT0(s))) & 0x00FF;
port <<= 8;
port += ((u_int) IINCHIP_READ(Sn_DPORT0(s)+1)) & 0x00FF;
return port;
}
#endif
/**
@brief htons function converts a unsigned short from host to TCP/IP network byte order (which is big-endian).
@return the value in TCP/IP network byte order
*/
unsigned short htons(
unsigned short hostshort /**< A 16-bit number in host byte order. */
)
{
#if ( SYSTEM_ENDIAN == _ENDIAN_LITTLE_ )
return swaps(hostshort);
#else
return hostshort;
#endif
}
/**
@brief htonl function converts a unsigned long from host to TCP/IP network byte order (which is big-endian).
@return the value in TCP/IP network byte order
*/
unsigned long htonl(
unsigned long hostlong /**< hostshort - A 32-bit number in host byte order. */
)
{
#if ( SYSTEM_ENDIAN == _ENDIAN_LITTLE_ )
return swapl(hostlong);
#else
return hostlong;
#endif
}
/**
@brief ntohs function converts a unsigned short from TCP/IP network byte order to host byte order (which is little-endian on Intel processors).
@return a 16-bit number in host byte order
*/
unsigned long ntohs(
unsigned short netshort /**< netshort - network odering 16bit value */
)
{
#if ( SYSTEM_ENDIAN == _ENDIAN_LITTLE_ )
return htons(netshort);
#else
return netshort;
#endif
}
/**
@brief converts a unsigned long from TCP/IP network byte order to host byte order (which is little-endian on Intel processors).
@return a 16-bit number in host byte order
*/
unsigned long ntohl(unsigned long netlong)
{
#if ( SYSTEM_ENDIAN == _ENDIAN_LITTLE_ )
return htonl(netlong);
#else
return netlong;
#endif
}
#if 0
// destip : BigEndian
u_char CheckDestInLocal(u_long destip)
{
int i = 0;
u_char * pdestip = (u_char*)&destip;
for(i =0; i < 4; i++)
{
if((pdestip[i] & IINCHIP_READ(SUBR0+i)) != (IINCHIP_READ(SIPR0+i) & IINCHIP_READ(SUBR0+i)))
return 1; // Remote
}
return 0;
}
#endif
/**
@brief Get handle of socket which status is same to 'status'
@return socket number
*/
SOCKET getSocket(
unsigned char status, /**< socket's status to be found */
SOCKET start /**< base of socket to be found */
)
{
SOCKET i;
if(start > 3) start = 0;
for(i = start; i < MAX_SOCK_NUM ; i++) if( getSn_SR(i)==status ) return i;
return MAX_SOCK_NUM;
}
#if 0
/**
@brief Calculate checksum of a stream
@return checksum
*/
unsigned short checksum(
unsigned char * src, /**< pointer to stream */
unsigned int len /**< size of stream */
)
{
u_int sum, tsum, i, j;
u_long lsum;
j = len >> 1;
lsum = 0;
for (i = 0; i < j; i++)
{
tsum = src[i * 2];
tsum = tsum << 8;
tsum += src[i * 2 + 1];
lsum += tsum;
}
if (len % 2)
{
tsum = src[i * 2];
lsum += (tsum << 8);
}
sum = lsum;
sum = ~(sum + (lsum >> 16));
return (u_short) sum;
}
#ifndef NO_USE_SOCKUTIL_FUNC
/**
@brief Get Source IP Address of iinChip.
@return Source IP Address(32bit Address-Host Ordering)
*/
u_long GetIPAddress(void)
{
u_long ip=0;
int i;
for(i=0; i < 4; i++)
{
ip <<= 8;
ip += (char)IINCHIP_READ(SIPR0+i);
}
return ip;
}
/**
@brief Get Gateway IP Address of iinChip.
@return Gateway IP Address(32bit Address-Host Ordering)
*/
u_long GetGWAddress(void)
{
u_long ip=0;
int i;
for(i=0; i < 4; i++)
{
ip <<= 8;
ip += (char)IINCHIP_READ(GAR0+i);
}
return ip;
}
/**
@brief Get Subnet mask of iinChip.
@return Subnet Mask(32bit Address-Host Ordering)
*/
u_long GetSubMask(void)
{
u_long ip=0;
int i;
for(i=0; i < 4; i++)
{
ip <<= 8;
ip += (char)IINCHIP_READ(SUBR0+i);
}
return ip;
}
/**
@brief Get Mac Address of iinChip.
@return Subnet Mask(32bit Address-Host Ordering)
*/
void GetMacAddress(
unsigned char* mac /**< Pointer to store Mac Address(48bit Address)(INPUT, OUTPUT) */
)
{
int i = 0;
for(i=0; i<6;i++)*mac++ = IINCHIP_READ(SHAR0+i);
}
void GetDestMacAddr(SOCKET s, u_char* mac)
{
int i = 0;
for(i=0; i<6;i++)*mac++ = IINCHIP_READ(Sn_DHAR0(s)+i);
}
/**
@brief Read established network information(G/W, IP, S/N, Mac) of iinChip and Output that through Serial.
Mac Address is output into format of Dotted HexaDecimal.Others are output into format of Dotted Decimal Format.
*/
void GetNetConfig(void)
{
u_char addr[6];
u_long iaddr;
printf("\r\n================================================\r\n");
printf(" Net Config Information\r\n");
printf("================================================\r\n");
GetMacAddress(addr);
printf("MAC ADDRESS : 0x%02X.0x%02X.0x%02X.0x%02X.0x%02X.0x%02X\r\n",addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
iaddr = GetSubMask();
printf("SUBNET MASK : %s\r\n",inet_ntoa(iaddr));
iaddr = GetGWAddress();
printf("G/W IP ADDRESS : %s\r\n",inet_ntoa(iaddr));
iaddr = GetIPAddress();
printf("LOCAL IP ADDRESS : %s\r\n",inet_ntoa(iaddr));
printf("================================================\r\n");
}
#endif
#endif