Patch from Eric Norum <eric@cls.usask.ca> to add NTP BOOTP support because

EPICS needs a synchronized time-of-day clock.  This patch is the changes
needed to get NTP server information from a BOOTP server.

This patch also adds NTP server information to the network configuration
structure, too.
This commit is contained in:
Joel Sherrill
1999-11-09 03:43:47 +00:00
parent 84bf329159
commit a0af97d2bf
9 changed files with 144 additions and 3 deletions

View File

@@ -730,7 +730,12 @@ processOptions (unsigned char *optbuf, int optbufSize)
dhcp_gotnetmask = 1;
break;
case 2: /* Time offset, unused */
case 2: /* Time offset */
/* Time offset */
if (len!=4)
panic("bootpc: time offset len is %d",len);
bcopy (p, &rtems_bsdnet_timeoffset, 4);
rtems_bsdnet_timeoffset = ntohl (rtems_bsdnet_timeoffset);
break;
case 3:
@@ -743,6 +748,32 @@ processOptions (unsigned char *optbuf, int optbufSize)
}
break;
/*
* Some old BOOTP daemons don't support the NTP server (42) tag,
* but do support the RFC 868 time server (4) tag. Cheat here
* and assume they mean the same thing.
*/
case 4:
case 42:
/* Time servers */
if (len % 4)
panic ("bootpc: time server Len is %d", len);
{
int tlen = 0;
while ((tlen < len) &&
(rtems_bsdnet_ntpserver_count < sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0])) {
bcopy (p+tlen,
&rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count],
4);
printip("Time Server",
rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count]);
rtems_bsdnet_ntpserver_count++;
tlen += 4;
}
}
break;
case 6:
/* Domain Name servers */
if (len % 4)

View File

@@ -35,6 +35,9 @@
extern struct in_addr rtems_bsdnet_bootp_server_address;
extern char *rtems_bsdnet_bootp_server_name;
extern char *rtems_bsdnet_bootp_boot_file_name;
extern struct in_addr rtems_bsdnet_ntpserver[];
extern int rtems_bsdnet_ntpserver_count;
extern long rtems_bsdnet_timeoffset;
/*
* Manipulate routing tables
@@ -127,6 +130,7 @@ struct rtems_bsdnet_config {
char *gateway; /* BOOTP */
char *log_host; /* BOOTP */
char *name_server[3]; /* BOOTP */
char *ntp_server[3]; /* BOOTP */
};
extern struct rtems_bsdnet_config rtems_bsdnet_config;
int rtems_bsdnet_initialize_network (void);

View File

@@ -77,6 +77,10 @@ char *rtems_bsdnet_domain_name;
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
sizeof rtems_bsdnet_config.name_server[0]];
int rtems_bsdnet_nameserver_count;
struct in_addr rtems_bsdnet_ntpserver[sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0]];
int rtems_bsdnet_ntpserver_count;
long rtems_bsdnet_timeoffset;
/*
* Perform FreeBSD memory allocation.
@@ -733,6 +737,7 @@ rtems_bsdnet_setup (void)
struct sockaddr_in broadcast;
struct sockaddr_in gateway;
int i;
extern char *strdup (const char *cp);
/*
* Set local parameters
@@ -753,6 +758,13 @@ rtems_bsdnet_setup (void)
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
= inet_addr (rtems_bsdnet_config.name_server[i]);
}
for (i = 0 ; i < sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0] ; i++) {
if (!rtems_bsdnet_config.ntp_server[i])
break;
rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count++].s_addr
= inet_addr (rtems_bsdnet_config.ntp_server[i]);
}
/*
* Configure interfaces

View File

@@ -730,7 +730,12 @@ processOptions (unsigned char *optbuf, int optbufSize)
dhcp_gotnetmask = 1;
break;
case 2: /* Time offset, unused */
case 2: /* Time offset */
/* Time offset */
if (len!=4)
panic("bootpc: time offset len is %d",len);
bcopy (p, &rtems_bsdnet_timeoffset, 4);
rtems_bsdnet_timeoffset = ntohl (rtems_bsdnet_timeoffset);
break;
case 3:
@@ -743,6 +748,32 @@ processOptions (unsigned char *optbuf, int optbufSize)
}
break;
/*
* Some old BOOTP daemons don't support the NTP server (42) tag,
* but do support the RFC 868 time server (4) tag. Cheat here
* and assume they mean the same thing.
*/
case 4:
case 42:
/* Time servers */
if (len % 4)
panic ("bootpc: time server Len is %d", len);
{
int tlen = 0;
while ((tlen < len) &&
(rtems_bsdnet_ntpserver_count < sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0])) {
bcopy (p+tlen,
&rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count],
4);
printip("Time Server",
rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count]);
rtems_bsdnet_ntpserver_count++;
tlen += 4;
}
}
break;
case 6:
/* Domain Name servers */
if (len % 4)

View File

@@ -35,6 +35,9 @@
extern struct in_addr rtems_bsdnet_bootp_server_address;
extern char *rtems_bsdnet_bootp_server_name;
extern char *rtems_bsdnet_bootp_boot_file_name;
extern struct in_addr rtems_bsdnet_ntpserver[];
extern int rtems_bsdnet_ntpserver_count;
extern long rtems_bsdnet_timeoffset;
/*
* Manipulate routing tables
@@ -127,6 +130,7 @@ struct rtems_bsdnet_config {
char *gateway; /* BOOTP */
char *log_host; /* BOOTP */
char *name_server[3]; /* BOOTP */
char *ntp_server[3]; /* BOOTP */
};
extern struct rtems_bsdnet_config rtems_bsdnet_config;
int rtems_bsdnet_initialize_network (void);

View File

@@ -77,6 +77,10 @@ char *rtems_bsdnet_domain_name;
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
sizeof rtems_bsdnet_config.name_server[0]];
int rtems_bsdnet_nameserver_count;
struct in_addr rtems_bsdnet_ntpserver[sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0]];
int rtems_bsdnet_ntpserver_count;
long rtems_bsdnet_timeoffset;
/*
* Perform FreeBSD memory allocation.
@@ -733,6 +737,7 @@ rtems_bsdnet_setup (void)
struct sockaddr_in broadcast;
struct sockaddr_in gateway;
int i;
extern char *strdup (const char *cp);
/*
* Set local parameters
@@ -753,6 +758,13 @@ rtems_bsdnet_setup (void)
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
= inet_addr (rtems_bsdnet_config.name_server[i]);
}
for (i = 0 ; i < sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0] ; i++) {
if (!rtems_bsdnet_config.ntp_server[i])
break;
rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count++].s_addr
= inet_addr (rtems_bsdnet_config.ntp_server[i]);
}
/*
* Configure interfaces

View File

@@ -730,7 +730,12 @@ processOptions (unsigned char *optbuf, int optbufSize)
dhcp_gotnetmask = 1;
break;
case 2: /* Time offset, unused */
case 2: /* Time offset */
/* Time offset */
if (len!=4)
panic("bootpc: time offset len is %d",len);
bcopy (p, &rtems_bsdnet_timeoffset, 4);
rtems_bsdnet_timeoffset = ntohl (rtems_bsdnet_timeoffset);
break;
case 3:
@@ -743,6 +748,32 @@ processOptions (unsigned char *optbuf, int optbufSize)
}
break;
/*
* Some old BOOTP daemons don't support the NTP server (42) tag,
* but do support the RFC 868 time server (4) tag. Cheat here
* and assume they mean the same thing.
*/
case 4:
case 42:
/* Time servers */
if (len % 4)
panic ("bootpc: time server Len is %d", len);
{
int tlen = 0;
while ((tlen < len) &&
(rtems_bsdnet_ntpserver_count < sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0])) {
bcopy (p+tlen,
&rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count],
4);
printip("Time Server",
rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count]);
rtems_bsdnet_ntpserver_count++;
tlen += 4;
}
}
break;
case 6:
/* Domain Name servers */
if (len % 4)

View File

@@ -35,6 +35,9 @@
extern struct in_addr rtems_bsdnet_bootp_server_address;
extern char *rtems_bsdnet_bootp_server_name;
extern char *rtems_bsdnet_bootp_boot_file_name;
extern struct in_addr rtems_bsdnet_ntpserver[];
extern int rtems_bsdnet_ntpserver_count;
extern long rtems_bsdnet_timeoffset;
/*
* Manipulate routing tables
@@ -127,6 +130,7 @@ struct rtems_bsdnet_config {
char *gateway; /* BOOTP */
char *log_host; /* BOOTP */
char *name_server[3]; /* BOOTP */
char *ntp_server[3]; /* BOOTP */
};
extern struct rtems_bsdnet_config rtems_bsdnet_config;
int rtems_bsdnet_initialize_network (void);

View File

@@ -77,6 +77,10 @@ char *rtems_bsdnet_domain_name;
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
sizeof rtems_bsdnet_config.name_server[0]];
int rtems_bsdnet_nameserver_count;
struct in_addr rtems_bsdnet_ntpserver[sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0]];
int rtems_bsdnet_ntpserver_count;
long rtems_bsdnet_timeoffset;
/*
* Perform FreeBSD memory allocation.
@@ -733,6 +737,7 @@ rtems_bsdnet_setup (void)
struct sockaddr_in broadcast;
struct sockaddr_in gateway;
int i;
extern char *strdup (const char *cp);
/*
* Set local parameters
@@ -753,6 +758,13 @@ rtems_bsdnet_setup (void)
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
= inet_addr (rtems_bsdnet_config.name_server[i]);
}
for (i = 0 ; i < sizeof rtems_bsdnet_config.ntp_server /
sizeof rtems_bsdnet_config.ntp_server[0] ; i++) {
if (!rtems_bsdnet_config.ntp_server[i])
break;
rtems_bsdnet_ntpserver[rtems_bsdnet_ntpserver_count++].s_addr
= inet_addr (rtems_bsdnet_config.ntp_server[i]);
}
/*
* Configure interfaces