/* *=========================================================================== * ipnet_config_add_inet_addr *=========================================================================== * Description: * Parameters: * Returns: * */ IP_STATIC int ipnet_config_add_inet_addr(Ip_fd fd, char *ifname, char *option) { char *inet_addr; char *prefix_len; char *argv[] = { "ifconfig", "-silent", IP_NULL, "inet", "add", IP_NULL, IP_NULL, IP_NULL, IP_NULL }; int argc = 5; char inet_addr_str[IP_INET_ADDRSTRLEN]; char inet_prefix_len_str[8]; argv[2] = ifname; inet_addr = ipcom_strtok_r(option, " \t/", &option); if (inet_addr == IP_NULL) { IPCOM_LOG0(ERR, "inet address is missing or format is invalid"); return -IP_ERRNO_EINVAL; } if (ipcom_strcmp(inet_addr, "dhcp") == 0) { struct Ip_ifreq ifreq; use_dhcp: ipcom_strcpy(ifreq.ifr_name, ifname); ifreq.ifr_ifru.ifru_opt = 1; if (ipcom_socketioctl(fd, IP_SIOCXSDHCPRUNNING, &ifreq) < 0) { IPCOM_LOG1(ERR, "Failed to enable DHCP on %s", ifname); return ipcom_errno; } return 0; } #ifdef IPNET_USE_RARP if (ipcom_strcmp(inet_addr, "rarp") == 0) { struct Ip_ethreq ethreq; ipcom_strcpy(ethreq.ethr_name, ifname); ethreq.ethru.rarp = -1; if (ipcom_socketioctl(fd, IP_SIOCXETHSRARP, ðreq) < 0) { IPCOM_LOG1(ERR, "Failed to enable RARPP on %s", ifname); return ipcom_errno; } return 0; } #endif /* IPNET_USE_RARP */ if (ipcom_strcmp(inet_addr, "driver") == 0) { /* Get the IPv4 address to use from the driver */ struct Ip_ethreq ethreq; ipcom_strcpy(ethreq.ethr_name, ifname); if (ipcom_socketioctl(fd, IP_SIOCXETHGINET, ðreq) < 0) { IPCOM_LOG1(ERR, "Failed to read the IPv4 address from the driver for %s", ifname); return ipcom_errno; } if (ethreq.ethru.inet.addr.s_addr == 0xffffffff) goto use_dhcp; inet_addr = inet_addr_str; (void) ipcom_inet_ntop(IP_AF_INET, ðreq.ethru.inet.addr, inet_addr_str, sizeof(inet_addr_str)); prefix_len = inet_prefix_len_str; ipcom_snprintf(inet_prefix_len_str, sizeof(inet_prefix_len_str), "%d", ipcom_mask_to_prefixlen(ðreq.ethru.inet.mask, 32)); } else { prefix_len = ipcom_strtok_r(option, " \t/", &option); if (prefix_len == IP_NULL) { IPCOM_LOG0(ERR, "prefix len is missing or format is invalid"); return -IP_ERRNO_EINVAL; } } argv[argc++] = inet_addr; argv[argc++] = "prefixlen"; argv[argc++] = prefix_len; return ipnet_config_cmd_ifconfig(argc, argv); }
/* *=========================================================================== * ipcom_sockaddr_to_prefixlen *=========================================================================== * Description: Returns the number of leading '1' in the mask. * Parameters: sa - The mask. * Returns: * */ IP_PUBLIC int ipcom_sockaddr_to_prefixlen(struct Ip_sockaddr *sa) { int af; af = sa->sa_family; #ifdef IPCOM_USE_INET if (af == IP_AF_INET) { return ipcom_mask_to_prefixlen( &((struct Ip_sockaddr_in *) sa)->sin_addr, sizeof(struct Ip_in_addr) * 8); } #endif /* IPCOM_USE_INET */ #ifdef IPCOM_USE_INET6 if (af == IP_AF_INET6) { return ipcom_mask_to_prefixlen( &((struct Ip_sockaddr_in6 *) sa)->sin6_addr, sizeof(struct Ip_in6_addr) * 8); } #endif /* IPCOM_USE_INET6 */ IP_PANIC2(); return -IP_ERRNO_EAFNOSUPPORT; }