Exemplo n.º 1
0
static int
__ni_addrconf_lease_route_from_xml(ni_route_t *rp, const xml_node_t *node)
{
	const xml_node_t *child;
	ni_sockaddr_t addr;
	unsigned int plen;

	for (child = node->children; child; child = child->next) {
		if (ni_string_eq(child->name, "destination") && child->cdata) {
			if (!ni_sockaddr_prefix_parse(child->cdata, &addr, &plen))
				return -1;
			if (rp->family != addr.ss_family)
				return -1;
			if ((rp->family == AF_INET  && plen > 32) ||
			    (rp->family == AF_INET6 && plen > 128))
				return -1;
			rp->destination = addr;
			rp->prefixlen = plen;
		} else
		if (ni_string_eq(child->name, "nexthop")) {
			if (__ni_addrconf_lease_route_nh_from_xml(rp, child) != 0)
				return -1;
		}
	}
	return 0;
}
Exemplo n.º 2
0
static int
__ni_dhcp6_lease_ia_addr_from_xml(ni_dhcp6_ia_addr_t *iadr, unsigned int type,
					const xml_node_t *node)
{
	const xml_node_t *child;
	const char *name;
	ni_sockaddr_t addr;
	unsigned int value;

	name = (type == NI_DHCP6_OPTION_IA_PD) ? "prefix" : "address";
	for (child = node->children; child; child = child->next) {
		if (ni_string_eq(child->name, name) && child->cdata) {
			if (type == NI_DHCP6_OPTION_IA_PD) {
				if (!ni_sockaddr_prefix_parse(child->cdata,
							&addr, &value)
					|| value == 0 || value > 128
					|| addr.ss_family != AF_INET6)
					return -1;
				iadr->addr = addr.six.sin6_addr;
				iadr->plen = value;
			} else {
				if (ni_sockaddr_parse(&addr, child->cdata,
							AF_INET6) != 0)
					return -1;
				iadr->addr = addr.six.sin6_addr;
				iadr->plen = 0;
			}
		} else
		if (ni_string_eq(child->name, "preferred-lft") && child->cdata) {
			if (ni_parse_uint(child->cdata, &value, 10) != 0)
				return -1;
			iadr->preferred_lft = value;
		} else
		if (ni_string_eq(child->name, "valid-lft") && child->cdata) {
			if (ni_parse_uint(child->cdata, &value, 10) != 0)
				return -1;
			iadr->valid_lft = value;
		} else
		if (ni_string_eq(child->name, "status")) {
			if (__ni_dhcp6_lease_status_from_xml(&iadr->status, child) < 0)
				return -1;
		}
	}

	ni_sockaddr_set_ipv6(&addr, iadr->addr, 0);
	if (ni_sockaddr_is_ipv6_specified(&addr))
		return 0;
	else
		return 1;
}
Exemplo n.º 3
0
static int
__ni_addrconf_lease_addr_from_xml(ni_address_t **ap_list, unsigned int family,
					const xml_node_t *node)
{
	const xml_node_t *child;
	ni_sockaddr_t addr;
	unsigned int plen;
	ni_address_t *ap;

	if (!(child = xml_node_get_child(node, "local")))
		return 1;

	if (ni_sockaddr_prefix_parse(child->cdata, &addr, &plen))
		return -1;

	if (family != addr.ss_family ||
	    (family == AF_INET  && plen > 32) ||
	    (family == AF_INET6 && plen > 128))
		return -1;

	if (!(ap = ni_address_new(family, plen, &addr, NULL)))
		return -1;

	if ((child = xml_node_get_child(node, "peer"))) {
		if (ni_sockaddr_parse(&ap->peer_addr, child->cdata, family) != 0)
			goto failure;
	}
	if ((child = xml_node_get_child(node, "anycast"))) {
		if (ni_sockaddr_parse(&ap->anycast_addr, child->cdata, family) != 0)
			goto failure;
	}
	if ((child = xml_node_get_child(node, "broadcast"))) {
		if (ni_sockaddr_parse(&ap->bcast_addr, child->cdata, family) != 0)
			goto failure;
	}

	if (family == AF_INET && (child = xml_node_get_child(node, "label"))) {
		ni_string_dup(&ap->label, child->cdata);
	}

	if ((child = xml_node_get_child(node, "cache-info"))) {
		xml_node_t *cnode;
		unsigned int lft;

		if ((cnode = xml_node_get_child(child, "preferred-lifetime"))) {
			if (ni_parse_uint(child->cdata, &lft, 10) != 0)
				goto failure;
			ap->ipv6_cache_info.preferred_lft = lft;
		}
		if ((cnode = xml_node_get_child(child, "valid-lifetime"))) {
			if (ni_parse_uint(child->cdata, &lft, 10) != 0)
				goto failure;
			ap->ipv6_cache_info.valid_lft = lft;
		}
	}

	ni_address_list_append(ap_list, ap);
	return 0;

failure:
	ni_address_free(ap);
	return -1;
}