|
91 | 91 | #define DHCP_OPTION_ROUTER 3 |
92 | 92 | #define DHCP_OPTION_DNS_SERVER 6 |
93 | 93 | #define DHCP_OPTION_HOST_NAME 12 |
| 94 | +#define DHCP_OPTION_NTP_SERVER 42 |
94 | 95 | #define DHCP_OPTION_REQ_IPADDR 50 |
95 | 96 | #define DHCP_OPTION_LEASE_TIME 51 |
96 | 97 | #define DHCP_OPTION_MSG_TYPE 53 |
@@ -210,10 +211,11 @@ static FAR uint8_t *dhcpc_addclientid(FAR uint8_t *clientid, |
210 | 211 | static FAR uint8_t *dhcpc_addreqoptions(FAR uint8_t *optptr) |
211 | 212 | { |
212 | 213 | *optptr++ = DHCP_OPTION_REQ_LIST; |
213 | | - *optptr++ = 3; |
| 214 | + *optptr++ = 4; |
214 | 215 | *optptr++ = DHCP_OPTION_SUBNET_MASK; |
215 | 216 | *optptr++ = DHCP_OPTION_ROUTER; |
216 | 217 | *optptr++ = DHCP_OPTION_DNS_SERVER; |
| 218 | + *optptr++ = DHCP_OPTION_NTP_SERVER; |
217 | 219 | return optptr; |
218 | 220 | } |
219 | 221 |
|
@@ -411,6 +413,39 @@ static uint8_t dhcpc_parseoptions(FAR struct dhcpc_state *presult, |
411 | 413 | } |
412 | 414 | break; |
413 | 415 |
|
| 416 | + case DHCP_OPTION_NTP_SERVER: |
| 417 | + |
| 418 | + /* Get the NTP server addresses in network order. |
| 419 | + * DHCP option 42 can contain multiple IPv4 addresses, |
| 420 | + * each 4 bytes long. |
| 421 | + */ |
| 422 | + |
| 423 | + if (optptr + 2 <= end) |
| 424 | + { |
| 425 | + uint8_t optlen = *(optptr + 1); |
| 426 | + uint8_t num_ntp = optlen / 4; |
| 427 | + uint8_t i; |
| 428 | + |
| 429 | + if (num_ntp > CONFIG_NETUTILS_DHCPC_NTP_SERVERS) |
| 430 | + { |
| 431 | + num_ntp = CONFIG_NETUTILS_DHCPC_NTP_SERVERS; |
| 432 | + } |
| 433 | + |
| 434 | + presult->num_ntpaddr = 0; |
| 435 | + for (i = 0; i < num_ntp && (optptr + 2 + i * 4 + 4) <= end; |
| 436 | + i++) |
| 437 | + { |
| 438 | + memcpy(&presult->ntpaddr[i].s_addr, optptr + 2 + i * 4, |
| 439 | + 4); |
| 440 | + presult->num_ntpaddr++; |
| 441 | + } |
| 442 | + } |
| 443 | + else |
| 444 | + { |
| 445 | + nerr("Packet too short (NTP address missing)\n"); |
| 446 | + } |
| 447 | + break; |
| 448 | + |
414 | 449 | case DHCP_OPTION_MSG_TYPE: |
415 | 450 |
|
416 | 451 | /* Get message type */ |
@@ -999,6 +1034,21 @@ int dhcpc_request(FAR void *handle, FAR struct dhcpc_state *presult) |
999 | 1034 | } |
1000 | 1035 | } |
1001 | 1036 |
|
| 1037 | + /* Print all NTP servers received */ |
| 1038 | + |
| 1039 | + if (presult->num_ntpaddr > 0) |
| 1040 | + { |
| 1041 | + uint8_t i; |
| 1042 | + for (i = 0; i < presult->num_ntpaddr; i++) |
| 1043 | + { |
| 1044 | + ninfo("Got NTP server %d: %u.%u.%u.%u\n", i, |
| 1045 | + ip4_addr1(presult->ntpaddr[i].s_addr), |
| 1046 | + ip4_addr2(presult->ntpaddr[i].s_addr), |
| 1047 | + ip4_addr3(presult->ntpaddr[i].s_addr), |
| 1048 | + ip4_addr4(presult->ntpaddr[i].s_addr)); |
| 1049 | + } |
| 1050 | + } |
| 1051 | + |
1002 | 1052 | ninfo("Got default router %u.%u.%u.%u\n", |
1003 | 1053 | ip4_addr1(presult->default_router.s_addr), |
1004 | 1054 | ip4_addr2(presult->default_router.s_addr), |
|
0 commit comments