2012-02-26 01:35:09 +02:00
|
|
|
commit efedf0ad42d7d8989b62ec7c158b0a0a1f3b4197
|
|
|
|
Author: Sebastien Bourdeauducq <sebastien@milkymist.org>
|
|
|
|
Date: Fri Feb 24 23:04:56 2012 +0100
|
|
|
|
|
|
|
|
Fix incorrect processing of DNS info from DHCP (revised patch)
|
|
|
|
|
2012-05-14 07:36:46 +03:00
|
|
|
Index: rtems/cpukit/libnetworking/rtems/rtems_dhcp.c
|
|
|
|
===================================================================
|
|
|
|
--- rtems.orig/cpukit/libnetworking/rtems/rtems_dhcp.c 2012-05-14 12:34:47.363444000 +0800
|
|
|
|
+++ rtems/cpukit/libnetworking/rtems/rtems_dhcp.c 2012-05-14 12:35:04.922660000 +0800
|
|
|
|
@@ -205,6 +205,35 @@
|
2012-02-26 01:35:09 +02:00
|
|
|
DHCP_DNS,
|
|
|
|
DHCP_HOST,
|
|
|
|
DHCP_DOMAIN_NAME };
|
|
|
|
+#define NUM_NAMESERVERS \
|
|
|
|
+ (sizeof rtems_bsdnet_config.name_server / sizeof rtems_bsdnet_config.name_server[0])
|
|
|
|
+static struct in_addr rtems_dhcpd_nameserver[NUM_NAMESERVERS];
|
|
|
|
+static int rtems_dhcpd_nameserver_count = 0;
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Clean any DNS entries add by a DHCP request.
|
|
|
|
+ */
|
|
|
|
+static void
|
|
|
|
+clean_dns_entries (void)
|
|
|
|
+{
|
|
|
|
+ int e;
|
|
|
|
+ for (e = 0; e < rtems_dhcpd_nameserver_count; ++e)
|
|
|
|
+ {
|
|
|
|
+ int n;
|
|
|
|
+ for (n = 0; n < rtems_bsdnet_nameserver_count; ++ n)
|
|
|
|
+ {
|
|
|
|
+ if (memcmp (&rtems_dhcpd_nameserver[e], &rtems_bsdnet_nameserver[n], 4) == 0)
|
|
|
|
+ {
|
|
|
|
+ if (n < (NUM_NAMESERVERS - 1))
|
|
|
|
+ memmove (&rtems_bsdnet_nameserver[n],
|
|
|
|
+ &rtems_bsdnet_nameserver[n + 1],
|
|
|
|
+ (NUM_NAMESERVERS - n - 1) * 4);
|
|
|
|
+ --rtems_bsdnet_nameserver_count;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ rtems_dhcpd_nameserver_count = 0;
|
|
|
|
+}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Format an IP address in dotted decimal.
|
2012-05-14 07:36:46 +03:00
|
|
|
@@ -363,10 +392,12 @@
|
2012-02-26 01:35:09 +02:00
|
|
|
{
|
|
|
|
int dlen = 0;
|
|
|
|
while ((dlen < len) &&
|
|
|
|
- (rtems_bsdnet_nameserver_count <
|
|
|
|
- sizeof rtems_bsdnet_config.name_server /
|
|
|
|
- sizeof rtems_bsdnet_config.name_server[0]))
|
|
|
|
+ (rtems_dhcpd_nameserver_count < NUM_NAMESERVERS) &&
|
|
|
|
+ (rtems_bsdnet_nameserver_count < NUM_NAMESERVERS))
|
|
|
|
{
|
|
|
|
+ memcpy (&rtems_dhcpd_nameserver
|
|
|
|
+ [rtems_dhcpd_nameserver_count], p + dlen, 4);
|
|
|
|
+ rtems_dhcpd_nameserver_count++;
|
|
|
|
memcpy (&rtems_bsdnet_nameserver
|
|
|
|
[rtems_bsdnet_nameserver_count], p + dlen, 4);
|
|
|
|
rtems_bsdnet_nameserver_count++;
|
2012-05-14 07:36:46 +03:00
|
|
|
@@ -743,6 +774,15 @@
|
2012-02-26 01:35:09 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We have an ack. Clear the DNS entries that have been assigned by a previous
|
|
|
|
+ * DHCP request.
|
|
|
|
+ */
|
|
|
|
+ clean_dns_entries ();
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Process this requests options.
|
|
|
|
+ */
|
|
|
|
process_options (&dhcp_req.vend[4], sizeof (dhcp_req.vend) - 4);
|
|
|
|
|
|
|
|
if (dhcp_message_type != DHCP_ACK)
|
2012-05-14 07:36:46 +03:00
|
|
|
@@ -857,6 +897,8 @@
|
2012-02-26 01:35:09 +02:00
|
|
|
struct sockaddr_dl *sdl = NULL;
|
|
|
|
struct proc *procp = NULL;
|
|
|
|
|
|
|
|
+ clean_dns_entries();
|
|
|
|
+
|
|
|
|
/*
|
|
|
|
* If we are to update the files create the root
|
|
|
|
* file structure.
|