Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "lwip/opt.h"
00040 #include "lwip/ip_addr.h"
00041 #include "lwip/netif.h"
00042
00043
00044 const ip_addr_t ip_addr_any = { IPADDR_ANY };
00045 const ip_addr_t ip_addr_broadcast = { IPADDR_BROADCAST };
00046
00047
00048
00049
00050
00051
00052
00053
00054 u8_t
00055 ip4_addr_isbroadcast(u32_t addr, const struct netif *netif)
00056 {
00057 ip_addr_t ipaddr;
00058 ip4_addr_set_u32(&ipaddr, addr);
00059
00060
00061 if ((~addr == IPADDR_ANY) ||
00062 (addr == IPADDR_ANY)) {
00063 return 1;
00064
00065 } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {
00066
00067
00068 return 0;
00069
00070 } else if (addr == ip4_addr_get_u32(&netif->ip_addr)) {
00071 return 0;
00072
00073 } else if (ip_addr_netcmp(&ipaddr, &(netif->ip_addr), &(netif->netmask))
00074
00075 && ((addr & ~ip4_addr_get_u32(&netif->netmask)) ==
00076 (IPADDR_BROADCAST & ~ip4_addr_get_u32(&netif->netmask)))) {
00077
00078 return 1;
00079 } else {
00080 return 0;
00081 }
00082 }
00083
00084
00085
00086
00087
00088
00089 u8_t
00090 ip4_addr_netmask_valid(u32_t netmask)
00091 {
00092 u32_t mask;
00093 u32_t nm_hostorder = lwip_htonl(netmask);
00094
00095
00096 for (mask = 1UL << 31 ; mask != 0; mask >>= 1) {
00097 if ((nm_hostorder & mask) == 0) {
00098 break;
00099 }
00100 }
00101
00102 for (; mask != 0; mask >>= 1) {
00103 if ((nm_hostorder & mask) != 0) {
00104
00105 return 0;
00106 }
00107 }
00108
00109 return 1;
00110 }
00111
00112
00113 #ifndef isprint
00114 #define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up)
00115 #define isprint(c) in_range(c, 0x20, 0x7f)
00116 #define isdigit(c) in_range(c, '0', '9')
00117 #define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))
00118 #define islower(c) in_range(c, 'a', 'z')
00119 #define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
00120 #endif
00121
00122
00123
00124
00125
00126
00127
00128
00129 u32_t
00130 ipaddr_addr(const char *cp)
00131 {
00132 ip_addr_t val;
00133
00134 if (ipaddr_aton(cp, &val)) {
00135 return ip4_addr_get_u32(&val);
00136 }
00137 return (IPADDR_NONE);
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 int
00152 ipaddr_aton(const char *cp, ip_addr_t *addr)
00153 {
00154 u32_t val;
00155 u8_t base;
00156 char c;
00157 u32_t parts[4];
00158 u32_t *pp = parts;
00159
00160 c = *cp;
00161 for (;;) {
00162
00163
00164
00165
00166
00167 if (!isdigit(c))
00168 return (0);
00169 val = 0;
00170 base = 10;
00171 if (c == '0') {
00172 c = *++cp;
00173 if (c == 'x' || c == 'X') {
00174 base = 16;
00175 c = *++cp;
00176 } else
00177 base = 8;
00178 }
00179 for (;;) {
00180 if (isdigit(c)) {
00181 val = (val * base) + (int)(c - '0');
00182 c = *++cp;
00183 } else if (base == 16 && isxdigit(c)) {
00184 val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
00185 c = *++cp;
00186 } else
00187 break;
00188 }
00189 if (c == '.') {
00190
00191
00192
00193
00194
00195
00196 if (pp >= parts + 3) {
00197 return (0);
00198 }
00199 *pp++ = val;
00200 c = *++cp;
00201 } else
00202 break;
00203 }
00204
00205
00206
00207 if (c != '\0' && !isspace(c)) {
00208 return (0);
00209 }
00210
00211
00212
00213
00214 switch (pp - parts + 1) {
00215
00216 case 0:
00217 return (0);
00218
00219 case 1:
00220 break;
00221
00222 case 2:
00223 if (val > 0xffffffUL) {
00224 return (0);
00225 }
00226 val |= parts[0] << 24;
00227 break;
00228
00229 case 3:
00230 if (val > 0xffff) {
00231 return (0);
00232 }
00233 val |= (parts[0] << 24) | (parts[1] << 16);
00234 break;
00235
00236 case 4:
00237 if (val > 0xff) {
00238 return (0);
00239 }
00240 val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
00241 break;
00242 default:
00243 LWIP_ASSERT("unhandled", 0);
00244 break;
00245 }
00246 if (addr) {
00247 ip4_addr_set_u32(addr, htonl(val));
00248 }
00249 return (1);
00250 }
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 char *
00261 ipaddr_ntoa(const ip_addr_t *addr)
00262 {
00263 static char str[16];
00264 return ipaddr_ntoa_r(addr, str, 16);
00265 }
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276 char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)
00277 {
00278 u32_t s_addr;
00279 char inv[3];
00280 char *rp;
00281 u8_t *ap;
00282 u8_t rem;
00283 u8_t n;
00284 u8_t i;
00285 int len = 0;
00286
00287 s_addr = ip4_addr_get_u32(addr);
00288
00289 rp = buf;
00290 ap = (u8_t *)&s_addr;
00291 for(n = 0; n < 4; n++) {
00292 i = 0;
00293 do {
00294 rem = *ap % (u8_t)10;
00295 *ap /= (u8_t)10;
00296 inv[i++] = '0' + rem;
00297 } while(*ap);
00298 while(i--) {
00299 if (len++ >= buflen) {
00300 return NULL;
00301 }
00302 *rp++ = inv[i];
00303 }
00304 if (len++ >= buflen) {
00305 return NULL;
00306 }
00307 *rp++ = '.';
00308 ap++;
00309 }
00310 *--rp = 0;
00311 return buf;
00312 }