From eaf517212a28192593f4880702b1c23911fe35d0 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Sun, 8 Apr 2007 21:34:21 +0000 Subject: [PATCH] introduced an ipv4_datagram datalink_module to handle the registration of the IPv4 reader instead of doing it in the ARP module. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20620 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- build/jam/HaikuImage | 2 +- .../kernel/network/datalink_protocols/Jamfile | 1 + .../network/datalink_protocols/arp/arp.cpp | 7 - .../datalink_protocols/ipv4_datagram/Jamfile | 25 ++++ .../ipv4_datagram/ipv4_datagram.cpp | 131 ++++++++++++++++++ src/add-ons/kernel/network/stack/stack.cpp | 1 + 6 files changed, 159 insertions(+), 8 deletions(-) create mode 100644 src/add-ons/kernel/network/datalink_protocols/ipv4_datagram/Jamfile create mode 100644 src/add-ons/kernel/network/datalink_protocols/ipv4_datagram/ipv4_datagram.cpp diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index e6a33a1abe..9390806c93 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -66,7 +66,7 @@ BEOS_SYSTEM_SERVERS = registrar debug_server syslog_daemon media_server ; BEOS_NETWORK_DEVICES = ethernet loopback ; -BEOS_NETWORK_DATALINK_PROTOCOLS = ethernet_frame arp loopback_frame ; +BEOS_NETWORK_DATALINK_PROTOCOLS = ethernet_frame arp loopback_frame ipv4_datagram ; #BEOS_NETWORK_PPP = ipcp modem pap pppoe ; BEOS_NETWORK_PROTOCOLS = ipv4 tcp udp icmp ; diff --git a/src/add-ons/kernel/network/datalink_protocols/Jamfile b/src/add-ons/kernel/network/datalink_protocols/Jamfile index dd429227ba..e6abcb0297 100644 --- a/src/add-ons/kernel/network/datalink_protocols/Jamfile +++ b/src/add-ons/kernel/network/datalink_protocols/Jamfile @@ -2,4 +2,5 @@ SubDir HAIKU_TOP src add-ons kernel network datalink_protocols ; SubInclude HAIKU_TOP src add-ons kernel network datalink_protocols arp ; SubInclude HAIKU_TOP src add-ons kernel network datalink_protocols ethernet_frame ; +SubInclude HAIKU_TOP src add-ons kernel network datalink_protocols ipv4_datagram ; SubInclude HAIKU_TOP src add-ons kernel network datalink_protocols loopback_frame ; 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 7e0447532b..0c8a90ae08 100644 --- a/src/add-ons/kernel/network/datalink_protocols/arp/arp.cpp +++ b/src/add-ons/kernel/network/datalink_protocols/arp/arp.cpp @@ -782,13 +782,6 @@ arp_init_protocol(struct net_interface *interface, net_datalink_protocol **_prot status_t status = sStackModule->register_device_handler(interface->device, ETHER_FRAME_TYPE | ETHER_TYPE_ARP, &arp_receive, NULL); - if (status == B_OK) { - // We also register the domain as a handler for deframed packets; - // while the ethernet_frame module is not really connected to our - // domain, we are. - status = sStackModule->register_domain_device_handler(interface->device, - ETHER_FRAME_TYPE | ETHER_TYPE_IP, interface->domain); - } if (status < B_OK) return status; diff --git a/src/add-ons/kernel/network/datalink_protocols/ipv4_datagram/Jamfile b/src/add-ons/kernel/network/datalink_protocols/ipv4_datagram/Jamfile new file mode 100644 index 0000000000..19b73758c5 --- /dev/null +++ b/src/add-ons/kernel/network/datalink_protocols/ipv4_datagram/Jamfile @@ -0,0 +1,25 @@ +SubDir HAIKU_TOP src add-ons kernel network datalink_protocols ipv4_datagram ; + +SetSubDirSupportedPlatformsBeOSCompatible ; + +if $(TARGET_PLATFORM) != haiku { + UseHeaders [ FStandardOSHeaders ] : true ; + # Needed for and maybe other stuff. + UseHeaders [ FDirName $(HAIKU_TOP) headers posix ] : true ; + # We need the public network headers also when not compiling for Haiku. + # Unfortunately we get more than we want, namely all POSIX headers. +} + +UsePrivateHeaders kernel net ; + +KernelAddon ipv4_datagram : + ipv4_datagram.cpp +; + +# Installation +HaikuInstall install-networking : /boot/home/config/add-ons/kernel/haiku_network/datalink_protocols + : ipv4_datagram ; + +Package haiku-networkingkit-cvs : + haiku : + boot home config add-ons kernel haiku_network datalink_protocols ; diff --git a/src/add-ons/kernel/network/datalink_protocols/ipv4_datagram/ipv4_datagram.cpp b/src/add-ons/kernel/network/datalink_protocols/ipv4_datagram/ipv4_datagram.cpp new file mode 100644 index 0000000000..eee76dac2f --- /dev/null +++ b/src/add-ons/kernel/network/datalink_protocols/ipv4_datagram/ipv4_datagram.cpp @@ -0,0 +1,131 @@ +/* + * Copyright 2007, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Hugo Santos, hugosantos@gmail.com + */ + + +#include +#include +#include +#include + +#include + +#include // for ETHER_TYPE_IP +#include + +#include + + +static net_stack_module_info *sStackModule; +// TODO ETHER_FRAME_TYPE doesn't belong there, we need Layer 2 +// independence. +static const int32 kIPv4FrameType = ETHER_FRAME_TYPE | ETHER_TYPE_IP; + + +static status_t +ipv4_datalink_init(net_interface *interface, net_datalink_protocol **_protocol) +{ + dprintf("ipv4_datalink_init(%s)\n", interface->name); + + if (interface->domain->family != AF_INET) + return B_BAD_TYPE; + + // While the loopback doesn't get a header to mux protocols, + // we let it do all of the registration work. + if (interface->device->type == IFT_LOOP) + return B_BAD_TYPE; + + net_datalink_protocol *protocol = new (std::nothrow) net_datalink_protocol; + if (protocol == NULL) + return B_NO_MEMORY; + + // We register ETHER_TYPE_IP as most datalink protocols use it + // to identify IP datagrams. In the future we may limit this. + + status_t status = sStackModule->register_domain_device_handler( + interface->device, kIPv4FrameType, interface->domain); + if (status < B_OK) + delete protocol; + else + *_protocol = protocol; + + return status; +} + + +static status_t +ipv4_datalink_uninit(net_datalink_protocol *protocol) +{ + sStackModule->unregister_device_handler(protocol->interface->device, + kIPv4FrameType); + delete protocol; + return B_OK; +} + + +static status_t +ipv4_datalink_send_data(net_datalink_protocol *protocol, net_buffer *buffer) +{ + return protocol->next->module->send_data(protocol->next, buffer); +} + + +static status_t +ipv4_datalink_up(net_datalink_protocol *protocol) +{ + return protocol->next->module->interface_up(protocol->next); +} + + +static void +ipv4_datalink_down(net_datalink_protocol *protocol) +{ + // TODO Clear routes here instead? + protocol->next->module->interface_down(protocol->next); +} + + +static status_t +ipv4_datalink_control(net_datalink_protocol *protocol, int32 op, + void *argument, size_t length) +{ + return protocol->next->module->control(protocol->next, op, argument, length); +} + + +static status_t +ipv4_datalink_std_ops(int32 op, ...) +{ + switch (op) { + case B_MODULE_INIT: + return get_module(NET_STACK_MODULE_NAME, (module_info **)&sStackModule); + + case B_MODULE_UNINIT: + return put_module(NET_STACK_MODULE_NAME); + } + + return B_ERROR; +} + +net_datalink_protocol_module_info gIPv4DataLinkModule = { + { + "network/datalink_protocols/ipv4_datagram/v1", + 0, + ipv4_datalink_std_ops + }, + ipv4_datalink_init, + ipv4_datalink_uninit, + ipv4_datalink_send_data, + ipv4_datalink_up, + ipv4_datalink_down, + ipv4_datalink_control, +}; + +module_info *modules[] = { + (module_info *)&gIPv4DataLinkModule, + NULL +}; diff --git a/src/add-ons/kernel/network/stack/stack.cpp b/src/add-ons/kernel/network/stack/stack.cpp index 1b8d087364..2c68ae04e3 100644 --- a/src/add-ons/kernel/network/stack/stack.cpp +++ b/src/add-ons/kernel/network/stack/stack.cpp @@ -795,6 +795,7 @@ init_stack() register_domain_datalink_protocols(AF_INET, IFT_LOOP, "network/datalink_protocols/loopback_frame/v1", NULL); register_domain_datalink_protocols(AF_INET, IFT_ETHER, + "network/datalink_protocols/ipv4_datagram/v1", "network/datalink_protocols/arp/v1", "network/datalink_protocols/ethernet_frame/v1", NULL);