/* * Configure addresses on link. `buf' is a string of comma-separated * IP addresses. */ static ipadm_status_t i_ipadm_ngz_addr(ipadm_handle_t iph, char *link, char *buf) { ipadm_status_t ipstatus; ipadm_addrobj_t ipaddr; char *cp; for (cp = strtok(buf, ","); cp != NULL; cp = strtok(NULL, ",")) { ipstatus = ipadm_create_addrobj(IPADM_ADDR_STATIC, link, &ipaddr); if (ipstatus != IPADM_SUCCESS) return (ipstatus); /* * ipadm_set_addr does the appropriate name resolution and * sets up the ipadm_static_addr field. */ ipstatus = ipadm_set_addr(ipaddr, cp, AF_UNSPEC); if (ipstatus != IPADM_SUCCESS) { ipadm_destroy_addrobj(ipaddr); return (ipstatus); } ipstatus = ipadm_create_addr(iph, ipaddr, (IPADM_OPT_ACTIVE | IPADM_OPT_UP)); if (ipstatus != IPADM_SUCCESS) { ipadm_destroy_addrobj(ipaddr); return (ipstatus); } ipadm_destroy_addrobj(ipaddr); } return (IPADM_SUCCESS); }
int raiseIf(char *ifname, char *addr, char *netmask) { ipadm_status_t status; ipadm_addrobj_t ipaddr; char cidraddr[BUFSIZ]; int prefixlen; struct sockaddr_in mask_sin; dlog("RAISE[%s] addr=%s, netmask=%s\n", ifname, addr, netmask); mask_sin.sin_family = AF_INET; if (inet_pton(AF_INET, netmask, &mask_sin.sin_addr) != 1) { dlog("WARN raiseIf: invalid netmask address: %s\n", strerror(errno)); return (-1); } prefixlen = mask2plen((struct sockaddr *)&mask_sin); (void) snprintf(cidraddr, sizeof (cidraddr), "%s/%d", addr, prefixlen); if ((status = ipadm_create_addrobj(IPADM_ADDR_STATIC, ifname, &ipaddr)) != IPADM_SUCCESS) { dlog("WARN ipadm_create_addrobj error %d: addr %s (%s), " "interface %s: %s\n", status, addr, cidraddr, ifname, ipadm_status2str(status)); return (-2); } if ((status = ipadm_set_addr(ipaddr, cidraddr, AF_INET)) != IPADM_SUCCESS) { dlog("WARN ipadm_set_addr error %d: addr %s (%s), interface %s: %s\n", status, addr, cidraddr, ifname, ipadm_status2str(status)); return (-3); } if ((status = ipadm_create_addr(iph, ipaddr, IPADM_OPT_ACTIVE | IPADM_OPT_UP)) != IPADM_SUCCESS) { dlog("WARN ipadm_create_addr error for %s: %s\n", ifname, ipadm_status2str(status)); ipadm_destroy_addrobj(ipaddr); return (-4); } upIPv6Addr(ifname); ipadm_destroy_addrobj(ipaddr); return (0); }