Fix arp checking

linux-2.6.19 headers NOW don't work with c99 which is just wrong, so
dhcpcd no longer builds against these kernel headers. You get a nice
error though :)
This commit is contained in:
Roy Marples 2006-12-21 16:51:16 +00:00
parent 12e81a3f6c
commit cace389870
6 changed files with 33 additions and 16 deletions

View File

@ -1,3 +1,8 @@
Fix arp checking
linux-2.6.19 headers NOW don't work with c99 which is just wrong, so
dhcpcd no longer builds against these kernel headers. You get a nice
error though :)
dhcpcd-3.0.7 dhcpcd-3.0.7
Allow Linux to use Token Ring again as Linux does not have any more hardware Allow Linux to use Token Ring again as Linux does not have any more hardware
specific code. BPF needs a patch for Token Ring support. specific code. BPF needs a patch for Token Ring support.

View File

@ -1,6 +1,6 @@
# Should work for both GNU make and BSD make # Should work for both GNU make and BSD make
VERSION = 3.0.7 VERSION = 3.0.8_pre1
INSTALL ?= install INSTALL ?= install

20
arp.c
View File

@ -121,16 +121,20 @@ int arp_check (interface_t *iface, struct in_addr address)
{ {
union union
{ {
unsigned char buffer[sizeof (struct arphdr)]; unsigned char buffer[buflen];
struct arphdr hdr; struct arphdr hdr;
} reply; } reply;
union union
{ {
unsigned char *c; unsigned char *c;
struct in_addr a; struct in_addr *a;
} ra; } rp;
union
memset (reply.buffer, 0, sizeof (struct arphdr)); {
unsigned char *c;
struct ether_addr *a;
} rh;
memset (reply.buffer, 0, sizeof (reply.buffer));
if ((bytes = get_packet (iface, reply.buffer, arp.buffer, if ((bytes = get_packet (iface, reply.buffer, arp.buffer,
&buflen, &bufpos)) < 0) &buflen, &bufpos)) < 0)
break; break;
@ -151,10 +155,10 @@ int arp_check (interface_t *iface, struct in_addr address)
if ((unsigned) bytes < sizeof (reply.hdr) + 2 * (4 + reply.hdr.ar_hln)) if ((unsigned) bytes < sizeof (reply.hdr) + 2 * (4 + reply.hdr.ar_hln))
continue; continue;
ra.c = (unsigned char *) ar_spa (&reply.hdr); rp.c = (unsigned char *) ar_spa (&reply.hdr);
rh.c = (unsigned char *) ar_sha (&reply.hdr);
logger (LOG_ERR, "ARPOP_REPLY received from %s (%s)", logger (LOG_ERR, "ARPOP_REPLY received from %s (%s)",
inet_ntoa (ra.a), inet_ntoa (*rp.a), ether_ntoa (rh.a));
ether_ntoa ((struct ether_addr *) ar_sha (&reply.hdr)));
close (iface->fd); close (iface->fd);
iface->fd = -1; iface->fd = -1;
return 1; return 1;

View File

@ -464,15 +464,19 @@ int dhcp_run (const options_t *options)
SOCKET_MODE (SOCKET_OPEN); SOCKET_MODE (SOCKET_OPEN);
SEND_MESSAGE (DHCP_DECLINE); SEND_MESSAGE (DHCP_DECLINE);
SOCKET_MODE (SOCKET_CLOSED); SOCKET_MODE (SOCKET_CLOSED);
free_dhcp (dhcp); free_dhcp (dhcp);
memset (dhcp, 0, sizeof (dhcp)); memset (dhcp, 0, sizeof (dhcp_t));
if (daemonised) if (daemonised)
configure (options, iface, dhcp); configure (options, iface, dhcp);
xid = 0; xid = 0;
timeout = 0;
state = STATE_INIT; state = STATE_INIT;
/* RFC 2131 says that we should wait for 10 seconds /* RFC 2131 says that we should wait for 10 seconds
before doing anything else */ before doing anything else */
logger (LOG_INFO, "sleeping for 10 seconds");
sleep (10); sleep (10);
continue; continue;
} }

4
dhcp.c
View File

@ -253,7 +253,7 @@ size_t send_message (const interface_t *iface, const dhcp_t *dhcp,
make_dhcp_packet (&packet, (unsigned char *) &message, message_length, make_dhcp_packet (&packet, (unsigned char *) &message, message_length,
from, to); from, to);
logger (LOG_DEBUG, "Sending %s with xid %d", dhcp_message[(int) type], xid); logger (LOG_DEBUG, "sending %s with xid %d", dhcp_message[(int) type], xid);
return send_packet (iface, ETHERTYPE_IP, (unsigned char *) &packet, return send_packet (iface, ETHERTYPE_IP, (unsigned char *) &packet,
message_length + sizeof (struct ip) + message_length + sizeof (struct ip) +
sizeof (struct udphdr)); sizeof (struct udphdr));
@ -409,7 +409,7 @@ static route_t *decodeCSR(unsigned char *p, int len)
void free_dhcp (dhcp_t *dhcp) void free_dhcp (dhcp_t *dhcp)
{ {
if (!dhcp) if (! dhcp)
return; return;
if (dhcp->routes) if (dhcp->routes)

View File

@ -26,14 +26,18 @@
#include <arpa/inet.h> #include <arpa/inet.h>
/* Netlink suff */ /* Check linux version before including headers which break us */
#ifdef __linux__ #ifdef __linux__
#include <asm/types.h> /* Needed for 2.4 kernels */
#include <features.h> #include <features.h>
#include <linux/version.h> #include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION (2,6,19) #if LINUX_VERSION_CODE == KERNEL_VERSION (2,6,19)
#include <linux/if_addr.h> #error "linux 2.6.19 headers are so badly broken, use something else"
#endif #endif
#endif
/* Netlink suff */
#ifdef __linux__
#include <asm/types.h> /* Needed for 2.4 kernels */
#include <linux/netlink.h> #include <linux/netlink.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <netinet/ether.h> #include <netinet/ether.h>