Skip to content

Commit 73e6651

Browse files
HHHartmannmarcelstoer
authored andcommitted
Add support for DCHP NTP server (option 42) (#2709)
* Add DHCP option 42 / NTP * Update dhcp.c * resolve merge conflict * add lineend at end of file * fix merge conflict resolution error
1 parent 6d9c5a4 commit 73e6651

File tree

3 files changed

+55
-26
lines changed

3 files changed

+55
-26
lines changed

app/include/lwip/dhcp.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ struct dhcp
5353
ip_addr_t offered_ip_addr;
5454
ip_addr_t offered_sn_mask;
5555
ip_addr_t offered_gw_addr;
56+
ip_addr_t offered_ntp_addr;
5657

5758
u32_t offered_t0_lease; /* lease period (in seconds) */
5859
u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */
@@ -207,6 +208,9 @@ void dhcp_fine_tmr(void);
207208
#define DHCP_OPTION_TCP_TTL 37
208209
#define DHCP_OPTION_END 255
209210

211+
/* time */
212+
#define DHCP_OPTION_NTP 42
213+
210214
/**add options for support more router by liuHan**/
211215
#define DHCP_OPTION_DOMAIN_NAME 15
212216
#define DHCP_OPTION_PRD 31

app/lwip/core/dhcp.c

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ static const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
119119
#define DHCP_OPTION_IDX_T2 5
120120
#define DHCP_OPTION_IDX_SUBNET_MASK 6
121121
#define DHCP_OPTION_IDX_ROUTER 7
122-
#define DHCP_OPTION_IDX_DNS_SERVER 8
122+
#define DHCP_OPTION_IDX_NTP 8
123+
#define DHCP_OPTION_IDX_DNS_SERVER 9
123124
#define DHCP_OPTION_IDX_MAX (DHCP_OPTION_IDX_DNS_SERVER + DNS_MAX_SERVERS)
124125

125126
/** Holds the decoded option values, only valid while in dhcp_recv.
@@ -292,19 +293,20 @@ dhcp_select(struct netif *netif)
292293
dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
293294
dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->server_ip_addr)));
294295

295-
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 12/*num options*/);
296+
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 13/*num options*/);
296297
dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
297298
dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
298299
dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
299300
dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
301+
dhcp_option_byte(dhcp, DHCP_OPTION_NTP);
300302
dhcp_option_byte(dhcp, DHCP_OPTION_DOMAIN_NAME);
301-
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TINS);
302-
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TINT);
303-
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TIS);
304-
dhcp_option_byte(dhcp, DHCP_OPTION_PRD);
305-
dhcp_option_byte(dhcp, DHCP_OPTION_STATIC_ROUTER);
306-
dhcp_option_byte(dhcp, DHCP_OPTION_CLASSLESS_STATIC_ROUTER);
307-
dhcp_option_byte(dhcp, DHCP_OPTION_VSN);
303+
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TINS);
304+
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TINT);
305+
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TIS);
306+
dhcp_option_byte(dhcp, DHCP_OPTION_PRD);
307+
dhcp_option_byte(dhcp, DHCP_OPTION_STATIC_ROUTER);
308+
dhcp_option_byte(dhcp, DHCP_OPTION_CLASSLESS_STATIC_ROUTER);
309+
dhcp_option_byte(dhcp, DHCP_OPTION_VSN);
308310

309311
#if LWIP_NETIF_HOSTNAME
310312
if (netif->hostname != NULL) {
@@ -383,7 +385,7 @@ dhcp_fine_tmr()
383385
if (netif->dhcp != NULL) {
384386
/*add DHCP retries processing by LiuHan*/
385387
if (DHCP_MAXRTX != 0) {
386-
if (netif->dhcp->tries >= DHCP_MAXRTX){
388+
if (netif->dhcp->tries >= DHCP_MAXRTX){
387389
os_printf("DHCP timeout\n");
388390
if (netif->dhcp_event != NULL)
389391
netif->dhcp_event();
@@ -536,6 +538,7 @@ dhcp_handle_ack(struct netif *netif)
536538
#if LWIP_DHCP_BOOTP_FILE
537539
ip_addr_set_zero(&dhcp->offered_si_addr);
538540
#endif /* LWIP_DHCP_BOOTP_FILE */
541+
ip_addr_set_zero(&dhcp->offered_ntp_addr);
539542

540543
/* lease time given? */
541544
if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {
@@ -593,6 +596,10 @@ dhcp_handle_ack(struct netif *netif)
593596
n++;
594597
}
595598
#endif /* LWIP_DNS */
599+
600+
if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_NTP)) {
601+
ip4_addr_set_u32(&dhcp->offered_ntp_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_NTP)));
602+
}
596603
}
597604

598605
/** Set a statically allocated struct dhcp to work with.
@@ -915,19 +922,20 @@ dhcp_discover(struct netif *netif)
915922
}
916923
}
917924
#endif /* LWIP_NETIF_HOSTNAME */
918-
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 12/*num options*/);
925+
dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 13/*num options*/);
919926
dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
920927
dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
921928
dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
922929
dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
930+
dhcp_option_byte(dhcp, DHCP_OPTION_NTP);
923931
dhcp_option_byte(dhcp, DHCP_OPTION_DOMAIN_NAME);
924-
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TINS);
925-
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TINT);
926-
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TIS);
927-
dhcp_option_byte(dhcp, DHCP_OPTION_PRD);
928-
dhcp_option_byte(dhcp, DHCP_OPTION_STATIC_ROUTER);
929-
dhcp_option_byte(dhcp, DHCP_OPTION_CLASSLESS_STATIC_ROUTER);
930-
dhcp_option_byte(dhcp, DHCP_OPTION_VSN);
932+
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TINS);
933+
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TINT);
934+
dhcp_option_byte(dhcp, DHCP_OPTION_NB_TIS);
935+
dhcp_option_byte(dhcp, DHCP_OPTION_PRD);
936+
dhcp_option_byte(dhcp, DHCP_OPTION_STATIC_ROUTER);
937+
dhcp_option_byte(dhcp, DHCP_OPTION_CLASSLESS_STATIC_ROUTER);
938+
dhcp_option_byte(dhcp, DHCP_OPTION_VSN);
931939

932940
dhcp_option_trailer(dhcp);
933941

@@ -1253,6 +1261,7 @@ dhcp_release(struct netif *netif)
12531261
#if LWIP_DHCP_BOOTP_FILE
12541262
ip_addr_set_zero(&dhcp->offered_si_addr);
12551263
#endif /* LWIP_DHCP_BOOTP_FILE */
1264+
ip_addr_set_zero(&dhcp->offered_ntp_addr);
12561265
dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;
12571266

12581267
/* create and initialize the DHCP message header */
@@ -1463,6 +1472,10 @@ dhcp_parse_reply(struct dhcp *dhcp, struct pbuf *p)
14631472
LWIP_ASSERT("len >= decode_len", len >= decode_len);
14641473
decode_idx = DHCP_OPTION_IDX_DNS_SERVER;
14651474
break;
1475+
case(DHCP_OPTION_NTP):
1476+
LWIP_ASSERT("len == 4", len == 4);
1477+
decode_idx = DHCP_OPTION_IDX_NTP;
1478+
break;
14661479
case(DHCP_OPTION_LEASE_TIME):
14671480
LWIP_ASSERT("len == 4", len == 4);
14681481
decode_idx = DHCP_OPTION_IDX_LEASE_TIME;

app/modules/sntp.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
#include "osapi.h"
4040
#include "lwip/udp.h"
4141
#include <stdlib.h>
42+
#include "lwip/inet.h"
43+
#include "lwip/dhcp.h"
4244
#include "user_modules.h"
4345
#include "lwip/dns.h"
4446
#include "task/task.h"
@@ -48,6 +50,8 @@
4850
#include "rtc/rtctime.h"
4951
#endif
5052

53+
struct netif * eagle_lwip_getif(uint8 index);
54+
5155
#define max(a,b) ((a < b) ? b : a)
5256

5357
#define NTP_PORT 123
@@ -805,15 +809,23 @@ static int sntp_sync (lua_State *L)
805809
server_count++;
806810
}
807811
} else if (server_count == 0) {
808-
// default to ntp pool
809812
lua_newtable(L);
810-
int i;
811-
for (i = 0; i < 4; i++) {
812-
lua_pushnumber(L, i + 1);
813-
char buf[64];
814-
sprintf(buf, "%d.nodemcu.pool.ntp.org", i);
815-
lua_pushstring(L, buf);
816-
lua_settable(L, -3);
813+
struct netif *iface = (struct netif *)eagle_lwip_getif(0x00);
814+
if (iface->dhcp && iface->dhcp->offered_ntp_addr.addr) {
815+
ip_addr_t ntp_addr = iface->dhcp->offered_ntp_addr;
816+
lua_pushnumber(L, 1);
817+
lua_pushstring(L, inet_ntoa(ntp_addr));
818+
lua_settable(L, -3);
819+
} else {
820+
// default to ntp pool
821+
int i;
822+
for (i = 0; i < 4; i++) {
823+
lua_pushnumber(L, i + 1);
824+
char buf[64];
825+
sprintf(buf, "%d.nodemcu.pool.ntp.org", i);
826+
lua_pushstring(L, buf);
827+
lua_settable(L, -3);
828+
}
817829
}
818830
luaL_unref (L, LUA_REGISTRYINDEX, state->list_ref);
819831
state->list_ref = luaL_ref(L, LUA_REGISTRYINDEX);

0 commit comments

Comments
 (0)