]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp6: Support deprecated SNTP Configuration Option
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 10 Apr 2015 13:17:22 +0000 (16:17 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 21 Aug 2015 08:23:22 +0000 (11:23 +0300)
Although the SNTP option specified in RFC 4075 has been deprecated, some
servers are still sending NTP information with this option. Use the SNTP
information provided only if the NTP option is not present.

Update the test case as SNTP information is also requested.

src/libsystemd-network/dhcp6-lease-internal.h
src/libsystemd-network/dhcp6-protocol.h
src/libsystemd-network/sd-dhcp6-client.c
src/libsystemd-network/sd-dhcp6-lease.c
src/libsystemd-network/test-dhcp6-client.c

index ac7f84366d0be75089f91be0fe3e0b2f8246d281..037f580eb65bcf7cdab9707620a3914ec2a4e2e2 100644 (file)
@@ -71,6 +71,8 @@ int dhcp6_lease_set_dns(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen);
 int dhcp6_lease_set_domains(sd_dhcp6_lease *lease, uint8_t *optval,
                             size_t optlen);
 int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen);
+int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, uint8_t *optval,
+                         size_t optlen) ;
 
 int dhcp6_lease_new(sd_dhcp6_lease **ret);
 
index 9330f239b59e580f2d565177f4b16afb41e8897c..b3a28f88b4f8df112ab78605518c57cff0125b68 100644 (file)
@@ -123,7 +123,7 @@ enum {
         DHCP6_OPTION_DNS_SERVERS                = 23,  /* RFC 3646 */
         DHCP6_OPTION_DOMAIN_LIST                = 24,  /* RFC 3646 */
 
-        DHCP6_OPTION_SNTP_SERVERS               = 31,  /* RFC 4075 */
+        DHCP6_OPTION_SNTP_SERVERS               = 31,  /* RFC 4075, deprecated */
 
         /* option code 35 is unassigned */
 
index 986958d8adcdc90a9ac733432bc339308dbdd4c1..bc17c6adc504c83c24e3423e71f333d6e4d8e911 100644 (file)
@@ -73,6 +73,7 @@ static const uint16_t default_req_opts[] = {
         DHCP6_OPTION_DNS_SERVERS,
         DHCP6_OPTION_DOMAIN_LIST,
         DHCP6_OPTION_NTP_SERVER,
+        DHCP6_OPTION_SNTP_SERVERS,
 };
 
 const char * dhcp6_message_type_table[_DHCP6_MESSAGE_MAX] = {
@@ -774,6 +775,13 @@ static int client_parse_message(sd_dhcp6_client *client,
                                 return r;
 
                         break;
+
+                case DHCP6_OPTION_SNTP_SERVERS:
+                        r = dhcp6_lease_set_sntp(lease, optval, optlen);
+                        if (r < 0)
+                                return r;
+
+                        break;
                 }
 
         }
index 8631aabc4014b94bb99c9736cfc092a4a98f5dba..f0494b3c911b149bf6e0dbd92b28dbeb9ce9e394 100644 (file)
@@ -257,6 +257,10 @@ int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen)
         assert_return(lease, -EINVAL);
         assert_return(optval, -EINVAL);
 
+        free(lease->ntp);
+        lease->ntp_count = 0;
+        lease->ntp_allocated = 0;
+
         while ((r = dhcp6_option_parse(&optval, &optlen, &subopt, &sublen,
                                        &subval)) >= 0) {
                 int s;
@@ -299,6 +303,38 @@ int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen)
         return 0;
 }
 
+int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen) {
+        int r;
+
+        assert_return(lease, -EINVAL);
+        assert_return(optval, -EINVAL);
+
+        if (!optlen)
+                return 0;
+
+        if (lease->ntp || lease->ntp_fqdn) {
+                log_dhcp6_client(client, "NTP information already provided");
+
+                return 0;
+        }
+
+        log_dhcp6_client(client, "Using deprecated SNTP information");
+
+        r = dhcp6_option_parse_ip6addrs(optval, optlen, &lease->ntp,
+                                        lease->ntp_count,
+                                        &lease->ntp_allocated);
+        if (r < 0) {
+                log_dhcp6_client(client, "Invalid SNTP server option: %s",
+                                 strerror(-r));
+
+                return r;
+        }
+
+        lease->ntp_count = r;
+
+        return 0;
+}
+
 int sd_dhcp6_lease_get_ntp_addrs(sd_dhcp6_lease *lease,
                                  struct in6_addr **addrs) {
         assert_return(lease, -EINVAL);
index 761854714bdc6be7490ddf3718e89ed5ba31fabe..b61fd38adeff078b1893bf10ab6a3d136ea145eb 100644 (file)
@@ -73,7 +73,7 @@ static int test_client_basic(sd_event *e) {
         assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_CLIENTID) == -EINVAL);
         assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_DNS_SERVERS) == -EEXIST);
         assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_NTP_SERVER) == -EEXIST);
-        assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_SNTP_SERVERS) == 0);
+        assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_SNTP_SERVERS) == -EEXIST);
         assert_se(sd_dhcp6_client_set_request_option(client, DHCP6_OPTION_DOMAIN_LIST) == -EEXIST);
         assert_se(sd_dhcp6_client_set_request_option(client, 10) == -EINVAL);