static int __ni_dhcp6_lease_ia_addr_to_xml(const ni_dhcp6_ia_addr_t *iadr, uint16_t type, xml_node_t *node) { ni_sockaddr_t addr; char *tmp = NULL; ni_sockaddr_set_ipv6(&addr, iadr->addr, 0); switch (type) { case NI_DHCP6_OPTION_IA_TA: case NI_DHCP6_OPTION_IA_NA: xml_node_new_element("address", node, ni_sockaddr_print(&addr)); break; case NI_DHCP6_OPTION_IA_PD: ni_string_printf(&tmp, "%s/%u", ni_sockaddr_print(&addr), iadr->plen); xml_node_new_element("prefix", node, tmp); ni_string_free(&tmp); break; default: return -1; } xml_node_new_element_uint("preferred-lft", node, iadr->preferred_lft); xml_node_new_element_uint("valid-lft", node, iadr->valid_lft); /* xml_node_new_element_uint("flags", node, iadr->flags); */ __ni_dhcp6_lease_status_to_xml(&iadr->status, node); return 0; }
void ni_ipv6_ra_rdnss_add_server(ni_ipv6_ra_rdnss_t *rdnss, const struct in6_addr *ipv6) { ni_sockaddr_t sockaddr; if (rdnss && ipv6) { ni_sockaddr_set_ipv6(&sockaddr, *ipv6, 0); ni_sockaddr_array_append(&rdnss->addrs, &sockaddr); } }
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; }
/* * dhcp6 lease data to xml */ static int __ni_dhcp6_lease_head_to_xml(const ni_addrconf_lease_t *lease, xml_node_t *node) { ni_sockaddr_t addr; xml_node_new_element("client-id", node, ni_duid_print_hex(&lease->dhcp6.client_id)); xml_node_new_element("server-id", node, ni_duid_print_hex(&lease->dhcp6.server_id)); ni_sockaddr_set_ipv6(&addr, lease->dhcp6.server_addr, 0); xml_node_new_element("server-address", node, ni_sockaddr_print(&addr)); xml_node_new_element_uint("server-preference", node, lease->dhcp6.server_pref); if (lease->dhcp6.rapid_commit) xml_node_new_element("rapid-commit", node, NULL); if (!ni_string_empty(lease->hostname)) xml_node_new_element("hostname", node, lease->hostname); return 0; }