Werner's Miscellanea
Sign in or create your account | Project List | Help
Werner's Miscellanea Git Source Tree
Root/
| 1 | commit efedf0ad42d7d8989b62ec7c158b0a0a1f3b4197 |
| 2 | Author: Sebastien Bourdeauducq <sebastien@milkymist.org> |
| 3 | Date: Fri Feb 24 23:04:56 2012 +0100 |
| 4 | |
| 5 | Fix incorrect processing of DNS info from DHCP (revised patch) |
| 6 | |
| 7 | Index: rtems/cpukit/libnetworking/rtems/rtems_dhcp.c |
| 8 | =================================================================== |
| 9 | --- rtems.orig/cpukit/libnetworking/rtems/rtems_dhcp.c 2012-05-14 12:34:47.363444000 +0800 |
| 10 | +++ rtems/cpukit/libnetworking/rtems/rtems_dhcp.c 2012-05-14 12:35:04.922660000 +0800 |
| 11 | @@ -205,6 +205,35 @@ |
| 12 | DHCP_DNS, |
| 13 | DHCP_HOST, |
| 14 | DHCP_DOMAIN_NAME }; |
| 15 | +#define NUM_NAMESERVERS \ |
| 16 | + (sizeof rtems_bsdnet_config.name_server / sizeof rtems_bsdnet_config.name_server[0]) |
| 17 | +static struct in_addr rtems_dhcpd_nameserver[NUM_NAMESERVERS]; |
| 18 | +static int rtems_dhcpd_nameserver_count = 0; |
| 19 | + |
| 20 | +/* |
| 21 | + * Clean any DNS entries add by a DHCP request. |
| 22 | + */ |
| 23 | +static void |
| 24 | +clean_dns_entries (void) |
| 25 | +{ |
| 26 | + int e; |
| 27 | + for (e = 0; e < rtems_dhcpd_nameserver_count; ++e) |
| 28 | + { |
| 29 | + int n; |
| 30 | + for (n = 0; n < rtems_bsdnet_nameserver_count; ++ n) |
| 31 | + { |
| 32 | + if (memcmp (&rtems_dhcpd_nameserver[e], &rtems_bsdnet_nameserver[n], 4) == 0) |
| 33 | + { |
| 34 | + if (n < (NUM_NAMESERVERS - 1)) |
| 35 | + memmove (&rtems_bsdnet_nameserver[n], |
| 36 | + &rtems_bsdnet_nameserver[n + 1], |
| 37 | + (NUM_NAMESERVERS - n - 1) * 4); |
| 38 | + --rtems_bsdnet_nameserver_count; |
| 39 | + } |
| 40 | + } |
| 41 | + } |
| 42 | + rtems_dhcpd_nameserver_count = 0; |
| 43 | +} |
| 44 | |
| 45 | /* |
| 46 | * Format an IP address in dotted decimal. |
| 47 | @@ -363,10 +392,12 @@ |
| 48 | { |
| 49 | int dlen = 0; |
| 50 | while ((dlen < len) && |
| 51 | - (rtems_bsdnet_nameserver_count < |
| 52 | - sizeof rtems_bsdnet_config.name_server / |
| 53 | - sizeof rtems_bsdnet_config.name_server[0])) |
| 54 | + (rtems_dhcpd_nameserver_count < NUM_NAMESERVERS) && |
| 55 | + (rtems_bsdnet_nameserver_count < NUM_NAMESERVERS)) |
| 56 | { |
| 57 | + memcpy (&rtems_dhcpd_nameserver |
| 58 | + [rtems_dhcpd_nameserver_count], p + dlen, 4); |
| 59 | + rtems_dhcpd_nameserver_count++; |
| 60 | memcpy (&rtems_bsdnet_nameserver |
| 61 | [rtems_bsdnet_nameserver_count], p + dlen, 4); |
| 62 | rtems_bsdnet_nameserver_count++; |
| 63 | @@ -743,6 +774,15 @@ |
| 64 | continue; |
| 65 | } |
| 66 | |
| 67 | + /* |
| 68 | + * We have an ack. Clear the DNS entries that have been assigned by a previous |
| 69 | + * DHCP request. |
| 70 | + */ |
| 71 | + clean_dns_entries (); |
| 72 | + |
| 73 | + /* |
| 74 | + * Process this requests options. |
| 75 | + */ |
| 76 | process_options (&dhcp_req.vend[4], sizeof (dhcp_req.vend) - 4); |
| 77 | |
| 78 | if (dhcp_message_type != DHCP_ACK) |
| 79 | @@ -857,6 +897,8 @@ |
| 80 | struct sockaddr_dl *sdl = NULL; |
| 81 | struct proc *procp = NULL; |
| 82 | |
| 83 | + clean_dns_entries(); |
| 84 | + |
| 85 | /* |
| 86 | * If we are to update the files create the root |
| 87 | * file structure. |
| 88 |
Branches:
master
