struct in6_addr *ntp;
size_t ntp_count;
char **ntp_fqdn;
+ struct in6_addr *sntp;
+ size_t sntp_count;
char *fqdn;
};
int dhcp6_lease_set_dns(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
int dhcp6_lease_add_domains(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
int dhcp6_lease_add_ntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
-int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen) ;
+int dhcp6_lease_add_sntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen) ;
int dhcp6_lease_set_fqdn(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
int dhcp6_lease_new(sd_dhcp6_lease **ret);
return 0;
}
-int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen) {
+int dhcp6_lease_add_sntp(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen) {
assert_return(lease, -EINVAL);
assert_return(optval, -EINVAL);
if (optlen == 0)
return 0;
- if (lease->ntp || lease->ntp_fqdn)
- return -EEXIST;
-
- /* Using deprecated SNTP information */
-
- return dhcp6_option_parse_addresses(optval, optlen, &lease->ntp, &lease->ntp_count);
+ /* SNTP option is defined in RFC4075, and deprecated by RFC5908. */
+ return dhcp6_option_parse_addresses(optval, optlen, &lease->sntp, &lease->sntp_count);
}
int sd_dhcp6_lease_get_ntp_addrs(sd_dhcp6_lease *lease, const struct in6_addr **ret) {
assert_return(lease, -EINVAL);
assert_return(ret, -EINVAL);
- if (!lease->ntp)
- return -ENOENT;
+ if (lease->ntp) {
+ *ret = lease->ntp;
+ return lease->ntp_count;
+ }
+
+ if (lease->sntp && !lease->ntp_fqdn) {
+ /* Fallback to the deprecated SNTP option. */
+ *ret = lease->sntp;
+ return lease->sntp_count;
+ }
- *ret = lease->ntp;
- return lease->ntp_count;
+ return -ENOENT;
}
int sd_dhcp6_lease_get_ntp_fqdn(sd_dhcp6_lease *lease, char ***ret) {
strv_free(lease->domains);
free(lease->ntp);
strv_free(lease->ntp_fqdn);
+ free(lease->sntp);
return mfree(lease);
}