void ni_server_trace_interface_addr_events(ni_netdev_t *dev, ni_event_t event, const ni_address_t *ap) { ni_stringbuf_t flags = NI_STRINGBUF_INIT_DYNAMIC; ni_address_format_flags(&flags, ap->family, ap->flags, NULL); ni_debug_verbose(NI_LOG_DEBUG2, NI_TRACE_IPV6|NI_TRACE_EVENTS, "%s: %s event: %s flags[%u] %s", dev->name, ni_event_type_to_name(event), ni_sockaddr_prefix_print(&ap->local_addr, ap->prefixlen), ap->flags, flags.string ? flags.string : ""); ni_stringbuf_destroy(&flags); }
int ni_addrconf_lease_routes_data_to_xml(const ni_addrconf_lease_t *lease, xml_node_t *node) { ni_route_table_t *tab; ni_route_nexthop_t *nh; xml_node_t *route, *hop; ni_route_t *rp; unsigned int count = 0; unsigned int i; /* A very limitted view */ for (tab = lease->routes; tab; tab = tab->next) { if (tab->tid != 254) /* RT_TABLE_MAIN for now */ continue; for (i = 0; i < tab->routes.count; ++i) { if (!(rp = tab->routes.data[i])) continue; route = xml_node_new("route", NULL); if (ni_sockaddr_is_specified(&rp->destination)) { xml_node_new_element("destination", route, ni_sockaddr_prefix_print(&rp->destination, rp->prefixlen)); } for (nh = &rp->nh; nh; nh = nh->next) { if (!ni_sockaddr_is_specified(&nh->gateway)) continue; hop = xml_node_new("nexthop", route); xml_node_new_element("gateway", hop, ni_sockaddr_print(&nh->gateway)); } if (route->children) { xml_node_add_child(node, route); count++; } else { xml_node_free(route); } } } return count ? 0 : 1; }
int ni_addrconf_lease_addrs_data_to_xml(const ni_addrconf_lease_t *lease, xml_node_t *node) { unsigned int count = 0; xml_node_t *anode; ni_address_t *ap; for (ap = lease->addrs; ap; ap = ap->next) { if (lease->family != ap->local_addr.ss_family || !ni_sockaddr_is_specified(&ap->local_addr)) continue; count++; anode = xml_node_new("address", node); xml_node_new_element("local", anode, ni_sockaddr_prefix_print (&ap->local_addr, ap->prefixlen)); if (ap->peer_addr.ss_family == ap->family) { xml_node_new_element("peer", anode, ni_sockaddr_print (&ap->peer_addr)); } if (ap->anycast_addr.ss_family == ap->family) { xml_node_new_element("anycast", anode, ni_sockaddr_print (&ap->anycast_addr)); } if (ap->bcast_addr.ss_family == ap->family) { xml_node_new_element("broadcast", anode, ni_sockaddr_print (&ap->bcast_addr)); } if (ap->family == AF_INET && ap->label) xml_node_new_element("label", anode, ap->label); if (ap->ipv6_cache_info.preferred_lft || ap->ipv6_cache_info.valid_lft) { xml_node_t *cnode = xml_node_new("cache-info", anode); xml_node_new_element_uint("preferred-lifetime", cnode, ap->ipv6_cache_info.preferred_lft); xml_node_new_element_uint("valid-lifetime", cnode, ap->ipv6_cache_info.valid_lft); } } return count ? 0 : 1; }
static xml_node_t * __ni_compat_generate_static_address_list(xml_node_t *ifnode, ni_address_t *addr_list, unsigned int af) { ni_address_t *ap; const char *afname; xml_node_t *aconf = NULL; afname = ni_addrfamily_type_to_name(af); if (!afname) { ni_error("%s: unknown address family %u", __func__, af); return NULL; } for (ap = addr_list; ap; ap = ap->next) { xml_node_t *anode; if (ap->family != af) continue; if (aconf == NULL) { char buffer[64]; snprintf(buffer, sizeof(buffer), "%s:static", afname); aconf = xml_node_create(ifnode, buffer); } anode = xml_node_new("address", aconf); xml_node_new_element("local", anode, ni_sockaddr_prefix_print(&ap->local_addr, ap->prefixlen)); if (ap->peer_addr.ss_family != AF_UNSPEC) xml_node_new_element("peer", anode, ni_sockaddr_print(&ap->peer_addr)); if (ap->bcast_addr.ss_family != AF_UNSPEC) xml_node_new_element("broadcast", anode, ni_sockaddr_print(&ap->bcast_addr)); if (ap->label) xml_node_new_element("label", anode, ap->label); } return aconf; }
void __ni_compat_generate_static_route(xml_node_t *aconf, const ni_route_t *rp, const char *ifname) { xml_node_t *rnode, *mnode, *knode; char *tmp = NULL; const char *ptr; rnode = xml_node_new("route", aconf); if (rp->destination.ss_family != AF_UNSPEC && rp->prefixlen != 0) { xml_node_new_element("destination", rnode, ni_sockaddr_prefix_print(&rp->destination, rp->prefixlen)); } __ni_compat_generate_static_route_hops(rnode, &rp->nh, ifname); knode = NULL; if (rp->table != RT_TABLE_UNSPEC && rp->table != RT_TABLE_MAIN) { if (!(ptr = ni_route_table_type_to_name(rp->table))) ptr = ni_sprint_uint(rp->table); if (knode == NULL) knode = xml_node_new("kern", rnode); xml_node_new_element("table", knode, ptr); } if (rp->type != RTN_UNSPEC && rp->type != RTN_UNICAST) { if (!(ptr = ni_route_type_type_to_name(rp->type))) ptr = ni_sprint_uint(rp->type); if (knode == NULL) knode = xml_node_new("kern", rnode); xml_node_new_element("type", knode, ptr); } if (rp->scope != RT_SCOPE_UNIVERSE) { if (!(ptr = ni_route_scope_type_to_name(rp->scope))) ptr = ni_sprint_uint(rp->scope); if (knode == NULL) knode = xml_node_new("kern", rnode); xml_node_new_element("scope", knode, ptr); } if (rp->protocol != RTPROT_UNSPEC && rp->protocol != RTPROT_BOOT) { if (!(ptr = ni_route_protocol_type_to_name(rp->protocol))) ptr = ni_sprint_uint(rp->protocol); if (knode == NULL) knode = xml_node_new("kern", rnode); xml_node_new_element("protocol", knode, ptr); } if (rp->priority > 0) { xml_node_new_element("priority", rnode, ni_sprint_uint(rp->priority)); } if (ni_sockaddr_is_specified(&rp->pref_src)) { xml_node_new_element("source", rnode, ni_sockaddr_print(&rp->pref_src)); } if (rp->realm > 0) { /* Hmm */ xml_node_new_element("realm", rnode, ni_sprint_uint(rp->realm)); } if (rp->mark > 0 && ni_string_printf(&tmp, "0x%02x", rp->mark)) { xml_node_new_element("mark", rnode, tmp); ni_string_free(&tmp); } if (rp->flags > 0) { ni_string_array_t names = NI_STRING_ARRAY_INIT; xml_node_t *fnode = NULL; unsigned int i; ni_route_flags_get_names(rp->flags, &names); for (i = 0; i < names.count; ++i) { if (fnode == NULL) fnode = xml_node_new("flags", rnode); xml_node_new(names.data[i], fnode); } } if (rp->tos > 0 && ni_string_printf(&tmp, "0x%02x", rp->tos)) { xml_node_new_element("tos", rnode, tmp); ni_string_free(&tmp); } mnode = xml_node_new("metrics", NULL); __ni_compat_generate_static_route_metrics(mnode, rp); if (mnode->children || mnode->attrs.count || mnode->cdata) xml_node_add_child(rnode, mnode); else xml_node_free(mnode); }