mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
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:
@@ -730,7 +730,12 @@ processOptions (unsigned char *optbuf, int optbufSize)
|
|||||||
dhcp_gotnetmask = 1;
|
dhcp_gotnetmask = 1;
|
||||||
break;
|
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;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
@@ -743,6 +748,32 @@ processOptions (unsigned char *optbuf, int optbufSize)
|
|||||||
}
|
}
|
||||||
break;
|
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:
|
case 6:
|
||||||
/* Domain Name servers */
|
/* Domain Name servers */
|
||||||
if (len % 4)
|
if (len % 4)
|
||||||
|
|||||||
@@ -35,6 +35,9 @@
|
|||||||
extern struct in_addr rtems_bsdnet_bootp_server_address;
|
extern struct in_addr rtems_bsdnet_bootp_server_address;
|
||||||
extern char *rtems_bsdnet_bootp_server_name;
|
extern char *rtems_bsdnet_bootp_server_name;
|
||||||
extern char *rtems_bsdnet_bootp_boot_file_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
|
* Manipulate routing tables
|
||||||
@@ -127,6 +130,7 @@ struct rtems_bsdnet_config {
|
|||||||
char *gateway; /* BOOTP */
|
char *gateway; /* BOOTP */
|
||||||
char *log_host; /* BOOTP */
|
char *log_host; /* BOOTP */
|
||||||
char *name_server[3]; /* BOOTP */
|
char *name_server[3]; /* BOOTP */
|
||||||
|
char *ntp_server[3]; /* BOOTP */
|
||||||
};
|
};
|
||||||
extern struct rtems_bsdnet_config rtems_bsdnet_config;
|
extern struct rtems_bsdnet_config rtems_bsdnet_config;
|
||||||
int rtems_bsdnet_initialize_network (void);
|
int rtems_bsdnet_initialize_network (void);
|
||||||
|
|||||||
@@ -77,6 +77,10 @@ char *rtems_bsdnet_domain_name;
|
|||||||
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
|
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
|
||||||
sizeof rtems_bsdnet_config.name_server[0]];
|
sizeof rtems_bsdnet_config.name_server[0]];
|
||||||
int rtems_bsdnet_nameserver_count;
|
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.
|
* Perform FreeBSD memory allocation.
|
||||||
@@ -733,6 +737,7 @@ rtems_bsdnet_setup (void)
|
|||||||
struct sockaddr_in broadcast;
|
struct sockaddr_in broadcast;
|
||||||
struct sockaddr_in gateway;
|
struct sockaddr_in gateway;
|
||||||
int i;
|
int i;
|
||||||
|
extern char *strdup (const char *cp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set local parameters
|
* Set local parameters
|
||||||
@@ -753,6 +758,13 @@ rtems_bsdnet_setup (void)
|
|||||||
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
|
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
|
||||||
= inet_addr (rtems_bsdnet_config.name_server[i]);
|
= 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
|
* Configure interfaces
|
||||||
|
|||||||
@@ -730,7 +730,12 @@ processOptions (unsigned char *optbuf, int optbufSize)
|
|||||||
dhcp_gotnetmask = 1;
|
dhcp_gotnetmask = 1;
|
||||||
break;
|
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;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
@@ -743,6 +748,32 @@ processOptions (unsigned char *optbuf, int optbufSize)
|
|||||||
}
|
}
|
||||||
break;
|
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:
|
case 6:
|
||||||
/* Domain Name servers */
|
/* Domain Name servers */
|
||||||
if (len % 4)
|
if (len % 4)
|
||||||
|
|||||||
@@ -35,6 +35,9 @@
|
|||||||
extern struct in_addr rtems_bsdnet_bootp_server_address;
|
extern struct in_addr rtems_bsdnet_bootp_server_address;
|
||||||
extern char *rtems_bsdnet_bootp_server_name;
|
extern char *rtems_bsdnet_bootp_server_name;
|
||||||
extern char *rtems_bsdnet_bootp_boot_file_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
|
* Manipulate routing tables
|
||||||
@@ -127,6 +130,7 @@ struct rtems_bsdnet_config {
|
|||||||
char *gateway; /* BOOTP */
|
char *gateway; /* BOOTP */
|
||||||
char *log_host; /* BOOTP */
|
char *log_host; /* BOOTP */
|
||||||
char *name_server[3]; /* BOOTP */
|
char *name_server[3]; /* BOOTP */
|
||||||
|
char *ntp_server[3]; /* BOOTP */
|
||||||
};
|
};
|
||||||
extern struct rtems_bsdnet_config rtems_bsdnet_config;
|
extern struct rtems_bsdnet_config rtems_bsdnet_config;
|
||||||
int rtems_bsdnet_initialize_network (void);
|
int rtems_bsdnet_initialize_network (void);
|
||||||
|
|||||||
@@ -77,6 +77,10 @@ char *rtems_bsdnet_domain_name;
|
|||||||
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
|
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
|
||||||
sizeof rtems_bsdnet_config.name_server[0]];
|
sizeof rtems_bsdnet_config.name_server[0]];
|
||||||
int rtems_bsdnet_nameserver_count;
|
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.
|
* Perform FreeBSD memory allocation.
|
||||||
@@ -733,6 +737,7 @@ rtems_bsdnet_setup (void)
|
|||||||
struct sockaddr_in broadcast;
|
struct sockaddr_in broadcast;
|
||||||
struct sockaddr_in gateway;
|
struct sockaddr_in gateway;
|
||||||
int i;
|
int i;
|
||||||
|
extern char *strdup (const char *cp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set local parameters
|
* Set local parameters
|
||||||
@@ -753,6 +758,13 @@ rtems_bsdnet_setup (void)
|
|||||||
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
|
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
|
||||||
= inet_addr (rtems_bsdnet_config.name_server[i]);
|
= 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
|
* Configure interfaces
|
||||||
|
|||||||
@@ -730,7 +730,12 @@ processOptions (unsigned char *optbuf, int optbufSize)
|
|||||||
dhcp_gotnetmask = 1;
|
dhcp_gotnetmask = 1;
|
||||||
break;
|
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;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
@@ -743,6 +748,32 @@ processOptions (unsigned char *optbuf, int optbufSize)
|
|||||||
}
|
}
|
||||||
break;
|
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:
|
case 6:
|
||||||
/* Domain Name servers */
|
/* Domain Name servers */
|
||||||
if (len % 4)
|
if (len % 4)
|
||||||
|
|||||||
@@ -35,6 +35,9 @@
|
|||||||
extern struct in_addr rtems_bsdnet_bootp_server_address;
|
extern struct in_addr rtems_bsdnet_bootp_server_address;
|
||||||
extern char *rtems_bsdnet_bootp_server_name;
|
extern char *rtems_bsdnet_bootp_server_name;
|
||||||
extern char *rtems_bsdnet_bootp_boot_file_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
|
* Manipulate routing tables
|
||||||
@@ -127,6 +130,7 @@ struct rtems_bsdnet_config {
|
|||||||
char *gateway; /* BOOTP */
|
char *gateway; /* BOOTP */
|
||||||
char *log_host; /* BOOTP */
|
char *log_host; /* BOOTP */
|
||||||
char *name_server[3]; /* BOOTP */
|
char *name_server[3]; /* BOOTP */
|
||||||
|
char *ntp_server[3]; /* BOOTP */
|
||||||
};
|
};
|
||||||
extern struct rtems_bsdnet_config rtems_bsdnet_config;
|
extern struct rtems_bsdnet_config rtems_bsdnet_config;
|
||||||
int rtems_bsdnet_initialize_network (void);
|
int rtems_bsdnet_initialize_network (void);
|
||||||
|
|||||||
@@ -77,6 +77,10 @@ char *rtems_bsdnet_domain_name;
|
|||||||
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
|
struct in_addr rtems_bsdnet_nameserver[sizeof rtems_bsdnet_config.name_server /
|
||||||
sizeof rtems_bsdnet_config.name_server[0]];
|
sizeof rtems_bsdnet_config.name_server[0]];
|
||||||
int rtems_bsdnet_nameserver_count;
|
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.
|
* Perform FreeBSD memory allocation.
|
||||||
@@ -733,6 +737,7 @@ rtems_bsdnet_setup (void)
|
|||||||
struct sockaddr_in broadcast;
|
struct sockaddr_in broadcast;
|
||||||
struct sockaddr_in gateway;
|
struct sockaddr_in gateway;
|
||||||
int i;
|
int i;
|
||||||
|
extern char *strdup (const char *cp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set local parameters
|
* Set local parameters
|
||||||
@@ -753,6 +758,13 @@ rtems_bsdnet_setup (void)
|
|||||||
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
|
rtems_bsdnet_nameserver[rtems_bsdnet_nameserver_count++].s_addr
|
||||||
= inet_addr (rtems_bsdnet_config.name_server[i]);
|
= 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
|
* Configure interfaces
|
||||||
|
|||||||
Reference in New Issue
Block a user