return json_variant_set_field_non_null(v, "NTP", array);
}
+static int domain_append_json(int family, const char *domain, NetworkConfigSource s, const union in_addr_union *p, sd_json_variant **array) {
+ assert(IN_SET(family, AF_UNSPEC, AF_INET, AF_INET6));
+ assert(domain);
+ assert(array);
+
+ return sd_json_variant_append_arraybo(
+ array,
+ SD_JSON_BUILD_PAIR_STRING("Domain", domain),
+ SD_JSON_BUILD_PAIR_STRING("ConfigSource", network_config_source_to_string(s)),
+ JSON_BUILD_PAIR_IN_ADDR_NON_NULL("ConfigProvider", p, family));
+}
+
static int sip_append_json(Link *link, sd_json_variant **v) {
_cleanup_(sd_json_variant_unrefp) sd_json_variant *array = NULL;
- const struct in_addr *sip;
- union in_addr_union s;
- int n_sip, r;
+ int r;
assert(link);
assert(v);
- if (!link->network || !link->network->dhcp_use_sip || !link->dhcp_lease)
+ if (!link->network)
return 0;
- n_sip = sd_dhcp_lease_get_sip(link->dhcp_lease, &sip);
- if (n_sip <= 0)
- return 0;
+ if (link->dhcp_lease && link->network->dhcp_use_sip) {
+ const struct in_addr *sip;
+ union in_addr_union s;
+ int n_sip;
- r = sd_dhcp_lease_get_server_identifier(link->dhcp_lease, &s.in);
- if (r < 0)
- return r;
+ n_sip = sd_dhcp_lease_get_sip(link->dhcp_lease, &sip);
+ if (n_sip <= 0)
+ return 0;
- for (int i = 0; i < n_sip; i++) {
- r = server_append_json_one_addr(AF_INET,
- &(union in_addr_union) { .in = sip[i], },
- NETWORK_CONFIG_SOURCE_DHCP4,
- &s,
- &array);
+ r = sd_dhcp_lease_get_server_identifier(link->dhcp_lease, &s.in);
if (r < 0)
return r;
+
+ for (int i = 0; i < n_sip; i++) {
+ r = server_append_json_one_addr(AF_INET,
+ &(union in_addr_union) { .in = sip[i], },
+ NETWORK_CONFIG_SOURCE_DHCP4,
+ &s,
+ &array);
+ if (r < 0)
+ return r;
+ }
+
}
- return json_variant_set_field_non_null(v, "SIP", array);
-}
+ if (link->dhcp6_lease && link->network->dhcp6_use_sip) {
+ const struct in6_addr *sip_addr;
+ union in_addr_union s;
+ char **domains;
+ int n_sip;
-static int domain_append_json(int family, const char *domain, NetworkConfigSource s, const union in_addr_union *p, sd_json_variant **array) {
- assert(IN_SET(family, AF_UNSPEC, AF_INET, AF_INET6));
- assert(domain);
- assert(array);
+ r = sd_dhcp6_lease_get_server_address(link->dhcp6_lease, &s.in6);
+ if (r < 0)
+ return r;
- return sd_json_variant_append_arraybo(
- array,
- SD_JSON_BUILD_PAIR_STRING("Domain", domain),
- SD_JSON_BUILD_PAIR_STRING("ConfigSource", network_config_source_to_string(s)),
- JSON_BUILD_PAIR_IN_ADDR_NON_NULL("ConfigProvider", p, family));
+ n_sip = sd_dhcp6_lease_get_sip_addrs(link->dhcp6_lease, &sip_addr);
+ for (int i = 0; i < n_sip; i++) {
+ r = server_append_json_one_addr(AF_INET6,
+ &(union in_addr_union) { .in6 = sip_addr[i], },
+ NETWORK_CONFIG_SOURCE_DHCP6,
+ &s,
+ &array);
+ if (r < 0)
+ return r;
+ }
+
+ if (sd_dhcp6_lease_get_sip_domains(link->dhcp6_lease, &domains) >= 0)
+ STRV_FOREACH(p, domains) {
+ r = domain_append_json(AF_INET6,
+ *p,
+ NETWORK_CONFIG_SOURCE_DHCP6,
+ &s,
+ &array);
+ if (r < 0)
+ return r;
+ }
+
+ }
+
+ return json_variant_set_field_non_null(v, "SIP", array);
}
static int domains_append_json(Link *link, bool is_route, sd_json_variant **v) {
DHCPv6.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp6_use_hostname)
DHCPv6.UseDomains, config_parse_use_domains, 0, offsetof(Network, dhcp6_use_domains)
DHCPv6.UseNTP, config_parse_tristate, 0, offsetof(Network, dhcp6_use_ntp)
+DHCPv6.UseSIP, config_parse_bool, 0, offsetof(Network, dhcp6_use_sip)
DHCPv6.UseCaptivePortal, config_parse_bool, 0, offsetof(Network, dhcp6_use_captive_portal)
DHCPv6.MUDURL, config_parse_mud_url, 0, offsetof(Network, dhcp6_mudurl)
DHCPv6.SendHostname, config_parse_dhcp_send_hostname, AF_INET6, 0
}
}
+ if (link->dhcp6_lease && link->network->dhcp6_use_sip) {
+ const struct in6_addr *addresses;
+ char **domains;
+
+ r = sd_dhcp6_lease_get_sip_addrs(link->dhcp6_lease, &addresses);
+ if (r >= 0) {
+ r = ordered_set_put_in6_addrv(s, addresses, r);
+ if (r < 0)
+ return r;
+ }
+
+ r = sd_dhcp6_lease_get_sip_domains(link->dhcp6_lease, &domains);
+ if (r >= 0) {
+ r = ordered_set_put_strdupv_full(s, &dns_name_hash_ops_free, domains);
+ if (r < 0)
+ return r;
+ }
+ }
+
return 0;
}
link->dhcp_lease,
link->network->dhcp_use_sip,
SD_DHCP_LEASE_SIP,
- NULL, false, NULL, NULL);
+ link->dhcp6_lease,
+ link->network->dhcp6_use_sip,
+ sd_dhcp6_lease_get_sip_addrs,
+ sd_dhcp6_lease_get_sip_domains);
/************************************************************/