From 8a819b17e4ebb40461954432b6b8cfb29946b32f Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Fri, 20 Apr 2007 04:40:53 +0000 Subject: [PATCH] retrieve the incoming interface on the domain_receive_adapter(). This should fix potential issues with packets addressed to the IP broadcast address, such as in with some DHCP implementations. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20767 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/net/net_stack.h | 3 ++- src/add-ons/kernel/network/datalink_protocols/arp/arp.cpp | 2 +- src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp | 4 ---- src/add-ons/kernel/network/stack/datalink.cpp | 2 +- src/add-ons/kernel/network/stack/interfaces.cpp | 4 +++- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/headers/private/net/net_stack.h b/headers/private/net/net_stack.h index bd1fd6728d..4b6eb36ce4 100644 --- a/headers/private/net/net_stack.h +++ b/headers/private/net/net_stack.h @@ -35,7 +35,8 @@ struct net_timer { }; typedef int32 (*net_deframe_func)(struct net_device *device, struct net_buffer *buffer); -typedef status_t (*net_receive_func)(void *cookie, struct net_buffer *buffer); +typedef status_t (*net_receive_func)(void *cookie, struct net_device *, + struct net_buffer *buffer); enum { B_DEVICE_GOING_UP = 1, diff --git a/src/add-ons/kernel/network/datalink_protocols/arp/arp.cpp b/src/add-ons/kernel/network/datalink_protocols/arp/arp.cpp index be80b38cd2..691593fa33 100644 --- a/src/add-ons/kernel/network/datalink_protocols/arp/arp.cpp +++ b/src/add-ons/kernel/network/datalink_protocols/arp/arp.cpp @@ -401,7 +401,7 @@ handle_arp_reply(net_buffer *buffer, arp_header &header) static status_t -arp_receive(void *cookie, net_buffer *buffer) +arp_receive(void *cookie, net_device *device, net_buffer *buffer) { TRACE(("ARP receive\n")); diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp index 97e9e53807..09987e5c0e 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp +++ b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp @@ -1487,12 +1487,8 @@ ipv4_receive_data(net_buffer *buffer) if (header.destination == INADDR_BROADCAST) { buffer->flags |= MSG_BCAST; - // TODO set incoming interface. we should have some notion from which - // device interface this buffer is coming from. - buffer->interface = NULL; } else if (IN_MULTICAST(header.destination)) { buffer->flags |= MSG_MCAST; - buffer->interface = NULL; } else { uint32 matchedAddressType = 0; // test if the packet is really for us diff --git a/src/add-ons/kernel/network/stack/datalink.cpp b/src/add-ons/kernel/network/stack/datalink.cpp index e823d01156..78ab15cbcd 100644 --- a/src/add-ons/kernel/network/stack/datalink.cpp +++ b/src/add-ons/kernel/network/stack/datalink.cpp @@ -74,7 +74,7 @@ device_reader_thread(void *_interface) net_device_handler *handler = iterator.Next(); if (handler->type == type) { - status = handler->func(handler->cookie, buffer); + status = handler->func(handler->cookie, device, buffer); if (status == B_OK) break; } diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index dc31f62df6..e26ee903c1 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -56,9 +56,11 @@ find_device_interface(const char *name) static status_t -domain_receive_adapter(void *cookie, net_buffer *buffer) +domain_receive_adapter(void *cookie, net_device *device, net_buffer *buffer) { net_domain_private *domain = (net_domain_private *)cookie; + + buffer->interface = find_interface(domain, device->index); return domain->module->receive_data(buffer); }