# HG changeset patch # User asl # Date 1066758658 0 # Node ID 69a4719c04ad91f9c5808ace4f714ae4662b78a8 # Parent 83e860bfbcaafdaf7edb418ec9573b730424c85f * src/dhcp_prot.c (set_default_dhcp_tags): * src/bootp_support.c (show_bootp): Added support for TAG_NTP_SERVER diff --git a/packages/net/common/current/ChangeLog b/packages/net/common/current/ChangeLog --- a/packages/net/common/current/ChangeLog +++ b/packages/net/common/current/ChangeLog @@ -1,3 +1,8 @@ +2003-10-21 Andrew Lunn + + * src/dhcp_prot.c (set_default_dhcp_tags): + * src/bootp_support.c (show_bootp): Added support for TAG_NTP_SERVER + 2003-10-13 Jay Foster * include/dhcp.h: Added prototype for dhcp_set_hostname(). diff --git a/packages/net/common/current/src/bootp_support.c b/packages/net/common/current/src/bootp_support.c --- a/packages/net/common/current/src/bootp_support.c +++ b/packages/net/common/current/src/bootp_support.c @@ -68,6 +68,9 @@ #ifdef CYGINT_ISO_DNS #include #endif +#ifdef CYGPKG_NET_SNTP +#include +#endif #ifndef CYGPKG_LIBC_STDIO #define perror(s) diag_printf(#s ": %s\n", strerror(errno)) @@ -361,7 +364,15 @@ show_bootp(const char *intf, struct boot diag_printf(" %d",op[i]); diag_printf("\n"); break; - + case TAG_NTP_SERVER: + diag_printf(" NTP servers: "); + for ( i = 0 ; i < op[1]/4 ; i++) { + diag_printf("%d.%d.%d.%d ", + op[1+i*4+1], op[1+i*4+2], + op[1+i*4+3], op[1+i*4+4]); + } + diag_printf("\n"); + break; default: diag_printf("Unknown option: %x/%d.%d:", *op, *op, *(op+1)); for ( i = 2; i < 2 + op[1]; i++ ) @@ -536,6 +547,47 @@ init_net(const char *intf, struct bootp } } #endif + +#ifdef CYGNUM_NET_SNTP_UNICAST_MAXDHCP + { + struct in_addr dhcp_addrs[CYGNUM_NET_SNTP_UNICAST_MAXDHCP]; + + /* Removed any previously registered addresses */ + cyg_sntp_set_servers(NULL, 0); + + /* See if we received any NTP servers from DHCP */ + length = sizeof(dhcp_addrs); + if (get_bootp_option(bp, TAG_NTP_SERVER, &dhcp_addrs[0], &length)) + { + static struct sockaddr ntp_servers[CYGNUM_NET_SNTP_UNICAST_MAXDHCP]; + struct servent *service; + cyg_uint32 num; + + /* See how many addresses we got. The length should always + * be a multiple of 4, but cut off any extra bytes and + * use what we got. + */ + length /= sizeof(struct in_addr); + + /* Fill out a sockaddr array for the NTP client */ + service = getservbyname("ntp", "udp"); + CYG_CHECK_DATA_PTR(service, "NTP service not found."); + memset(&ntp_servers[0], 0, sizeof(ntp_servers)); + for (num = 0; num < length; num++) + { + struct sockaddr_in *saddr = (struct sockaddr_in *)&ntp_servers[num]; + + saddr->sin_len = sizeof(*saddr); + saddr->sin_family = AF_INET; + saddr->sin_port = service->s_port; /* Already network-endian */ + saddr->sin_addr = dhcp_addrs[num]; /* Already network-endian */ + } + + /* Configure the client with the array */ + cyg_sntp_set_servers(&ntp_servers[0], num); + } + } +#endif /* CYGNUM_NET_SNTP_UNICAST_MAXDHCP */ return true; } diff --git a/packages/net/common/current/src/dhcp_prot.c b/packages/net/common/current/src/dhcp_prot.c --- a/packages/net/common/current/src/dhcp_prot.c +++ b/packages/net/common/current/src/dhcp_prot.c @@ -56,6 +56,10 @@ #ifdef CYGPKG_NET_DHCP +#ifdef CYGPKG_NET_SNTP +#include +#endif /* CYGPKG_NET_SNTP */ + #if 0 #define perror( txt ) // nothing #endif @@ -544,6 +548,9 @@ static void set_default_dhcp_tags( struc TAG_DOMAIN_NAME , // domain name: hmt10.cambridge.redhat.com TAG_IP_BROADCAST , // IP broadcast: 10.16.19.255 #endif +#ifdef CYGNUM_NET_SNTP_UNICAST_MAXDHCP + TAG_NTP_SERVER , // NTP Server Addresses(es) +#endif #ifdef CYGOPT_NET_DHCP_PARM_REQ_LIST_ADDITIONAL CYGOPT_NET_DHCP_PARM_REQ_LIST_ADDITIONAL , #endif