2 * Acess2 Networking Toolkit
3 * By John Hodge (thePowersGang)
13 #define __thread // Disable TLS
16 * \brief Read an IPv4 Address
17 * \param String IPv4 dotted decimal address
18 * \param Addr Output 32-bit representation of IP address
19 * \return Boolean success
21 static int Net_ParseIPv4Addr(const char *String, uint8_t *Addr)
27 for( j = 0; String[i] && j < 4; j ++ )
30 for( ; String[i] && String[i] != '.'; i++ )
32 if('0' > String[i] || String[i] > '9') {
34 printf("0<c<9 expected, '%c' found\n", String[i]);
38 val = val*10 + String[i] - '0';
42 printf("val > 255 (%i)\n", val);
53 printf("4 parts expected, %i found\n", j);
57 if(String[i] != '\0') {
59 printf("EOS != '\\0', '%c'\n", String[i]);
67 * \brief Read an IPv6 Address
68 * \param String IPv6 colon-hex representation
69 * \param Addr Output 128-bit representation of IP address
70 * \return Boolean success
72 static int Net_ParseIPv6Addr(const char *String, uint8_t *Addr)
76 int val, split = -1, end;
77 uint16_t hi[8], low[8];
79 for( j = 0; String[i] && j < 8; j ++ )
81 if(String[i] == ':') {
84 printf("Two '::'s\n");
94 for( k = 0; String[i] && String[i] != ':'; i++, k++ )
97 if('0' <= String[i] && String[i] <= '9')
98 val += String[i] - '0';
99 else if('A' <= String[i] && String[i] <= 'F')
100 val += String[i] - 'A' + 10;
101 else if('a' <= String[i] && String[i] <= 'f')
102 val += String[i] - 'a' + 10;
105 printf("%c unexpected\n", String[i]);
113 printf("val (0x%x) > 0xFFFF\n", val);
123 if( String[i] == ':' ) {
129 // Create final address
131 for( j = 0; j < split; j ++ )
133 Addr[j*2] = hi[j]>>8;
134 Addr[j*2+1] = hi[j]&0xFF;
137 for( ; j < 8 - (end - split); j++ )
144 for( ; j < 8; j ++, k++)
146 Addr[j*2] = hi[k]>>8;
147 Addr[j*2+1] = hi[k]&0xFF;
154 * \brief Parse an address from a string
155 * \param String String containing an IPv4/IPv6 address
156 * \param Addr Buffer for the address (must be >= 16 bytes)
157 * \return Address type
158 * \retval 0 Unknown address type
159 * \retval 4 IPv4 Address
160 * \retval 6 IPv6 Address
162 int Net_ParseAddress(const char *String, void *Addr)
164 if( Net_ParseIPv4Addr(String, Addr) )
167 if( Net_ParseIPv6Addr(String, Addr) )
173 static const char *Net_PrintIPv4Address(uint8_t *Address)
175 static __thread char ret[4*3+3+1]; // '255.255.255.255\0'
177 sprintf(ret, "%i.%i.%i.%i", Address[0], Address[1], Address[2], Address[3]);
182 static const char *Net_PrintIPv6Address(uint16_t *Address)
184 static __thread char ret[8*4+7+1]; // 'FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF\0'
186 // TODO: Zero compression
187 int zeroStart = 0, zeroEnd = 8;
188 for( i = 0; i < 8; i ++ ) {
193 sprintf(ret, "%x:%x:%x:%x:%x:%x:%x:%x",
194 Address[0], Address[1], Address[2], Address[3],
195 Address[4], Address[5], Address[6], Address[7]
201 const char *Net_PrintAddress(int AddressType, void *Address)
203 switch( AddressType )
208 return Net_PrintIPv4Address(Address);
211 return Net_PrintIPv6Address(Address);