int main(int argc, char** argv) { struct ip_addr addr; struct ip_addr mask; /* Test 1 */ IP64_ADDR(&addr,0,0,0,0); IP64_MASKADDR(&mask,0,0,0,0); printf("0.0.0.0/0.0.0.0 %u %u %u %u %u %u %u %u\n", addr.addr[0], addr.addr[1], addr.addr[2], addr.addr[3], mask.addr[0], mask.addr[1], mask.addr[2], mask.addr[3]); /* Test 2 */ IP64_ADDR(&addr,192,168,250,20); IP64_MASKADDR(&mask,192, 168, 250, 20); printf("192.168.250.20/192.168.250.20 %u %u %u %u %u %u %u %u\n", addr.addr[0], addr.addr[1], addr.addr[2], addr.addr[3], mask.addr[0], mask.addr[1], mask.addr[2], mask.addr[3]); /* Test 3 */ IP64_ADDR(&addr,255,255,255,255); IP64_MASKADDR(&mask,255, 255, 255, 255); printf("255.255.255.255/255.255.255.255 %u %u %u %u %u %u %u %u\n", addr.addr[0], addr.addr[1], addr.addr[2], addr.addr[3], mask.addr[0], mask.addr[1], mask.addr[2], mask.addr[3]); /* TODO: IPV6 tests */ return 0; }
static void readip(char *arg,struct netif *nif,int af) { char *bit=rindex(arg,'/'); if (bit == 0) printlog(LOG_ERR,"IP addresses must include the netmask i.e. addr/maskbits"); else { int bitno=atoi(bit+1); *bit=0; struct addrinfo *res,hint; struct ip_addr ipaddr,netmask; int err; memset(&hint,0,sizeof(hint)); hint.ai_family=af; if ((err=getaddrinfo(arg,NULL,&hint,&res))!=0) printlog(LOG_ERR,"IP address %s error %s",arg,gai_strerror(err)); else { switch(res->ai_family) { case PF_INET: { struct sockaddr_in *in=(struct sockaddr_in *)res->ai_addr; int addrh=ntohl(in->sin_addr.s_addr); unsigned char i,addr[4]; for (i=0;i<4;i++,addrh>>=8) addr[3-i]=addrh; IP64_ADDR(&ipaddr, addr[0],addr[1],addr[2],addr[3]); bitno2mask(addr,bitno,4); IP64_MASKADDR(&netmask, addr[0],addr[1],addr[2],addr[3]); lwip_add_addr(nif,&ipaddr,&netmask); } break; case PF_INET6: { struct sockaddr_in6 *in=(struct sockaddr_in6 *)res->ai_addr; unsigned char *addr=in->sin6_addr.s6_addr; sockaddr2ip_6addr(&ipaddr,addr); bitno2mask(addr,bitno,16); sockaddr2ip_6addr(&netmask,addr); lwip_add_addr(nif,&ipaddr,&netmask); } break; default: printlog(LOG_ERR,"Unsupported Address Family: %s",arg); } freeaddrinfo(res); } } }