Пример #1
0
/*
 * 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);
}
Пример #2
0
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);
}