From 4af59e7e3397570a0f5aeb13a1b43be054c06348 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 10 Jul 2009 01:15:51 +0000 Subject: [PATCH] - Use the target hardware address to find the correct DHCP_ADAPTER for the received packet svn path=/trunk/; revision=41838 --- reactos/base/services/dhcp/adapter.c | 17 +++++++++++++++++ reactos/base/services/dhcp/dispatch.c | 12 +++++++++++- reactos/base/services/dhcp/include/rosdhcp.h | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/reactos/base/services/dhcp/adapter.c b/reactos/base/services/dhcp/adapter.c index 329abaa5b0e..3459a7263ee 100644 --- a/reactos/base/services/dhcp/adapter.c +++ b/reactos/base/services/dhcp/adapter.c @@ -355,6 +355,23 @@ PDHCP_ADAPTER AdapterFindInfo( struct interface_info *ip ) { return NULL; } +PDHCP_ADAPTER AdapterFindByHardwareAddress( u_int8_t haddr[16], u_int8_t hlen ) { + PDHCP_ADAPTER Adapter; + PLIST_ENTRY ListEntry; + + for(ListEntry = AdapterList.Flink; + ListEntry != &AdapterList; + ListEntry = ListEntry->Flink) { + Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry ); + if (Adapter->DhclientInfo.hw_address.hlen == hlen && + !memcmp(Adapter->DhclientInfo.hw_address.haddr, + haddr, + hlen)) return Adapter; + } + + return NULL; +} + PDHCP_ADAPTER AdapterGetFirst() { if( IsListEmpty( &AdapterList ) ) return NULL; else { return CONTAINING_RECORD diff --git a/reactos/base/services/dhcp/dispatch.c b/reactos/base/services/dhcp/dispatch.c index b88d5e26956..cc6575dca7b 100644 --- a/reactos/base/services/dhcp/dispatch.c +++ b/reactos/base/services/dhcp/dispatch.c @@ -231,6 +231,7 @@ got_one(struct protocol *l) struct dhcp_packet packet; } u; struct interface_info *ip = l->local; + PDHCP_ADAPTER adapter; if ((result = receive_packet(ip, u.packbuf, sizeof(u), &from, &hfrom)) == -1) { @@ -257,7 +258,16 @@ got_one(struct protocol *l) ifrom.len = 4; memcpy(ifrom.iabuf, &from.sin_addr, ifrom.len); - (*bootp_packet_handler)(ip, &u.packet, result, + + adapter = AdapterFindByHardwareAddress(u.packet.chaddr, + u.packet.hlen); + + if (!adapter) { + warning("Discarding packet with a non-matching target physical address\n"); + return; + } + + (*bootp_packet_handler)(&adapter->DhclientInfo, &u.packet, result, from.sin_port, ifrom, &hfrom); } } diff --git a/reactos/base/services/dhcp/include/rosdhcp.h b/reactos/base/services/dhcp/include/rosdhcp.h index 7f71a53ae9b..092b877888e 100644 --- a/reactos/base/services/dhcp/include/rosdhcp.h +++ b/reactos/base/services/dhcp/include/rosdhcp.h @@ -76,6 +76,7 @@ extern PDHCP_ADAPTER AdapterGetFirst(); extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER); extern PDHCP_ADAPTER AdapterFindIndex( unsigned int AdapterIndex ); extern PDHCP_ADAPTER AdapterFindInfo( struct interface_info *info ); +extern PDHCP_ADAPTER AdapterFindByHardwareAddress( u_int8_t haddr[16], u_int8_t hlen ); extern VOID ApiInit(); extern VOID ApiLock(); extern VOID ApiUnlock();