diff options
author | Conrad Pankoff <deoxxa@fknsrs.biz> | 2019-08-28 21:53:01 +1000 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-08-29 06:25:06 +0200 |
commit | 93c16590f184bf247b1434258d8675cff2b069f2 (patch) | |
tree | 89d14f3a35ecee91214068fe41f1255a5f3dc4e6 /Kernel/Net/NetworkTask.cpp | |
parent | 41e9ad5ea092751779062fea5da098df09bb422e (diff) | |
download | serenity-93c16590f184bf247b1434258d8675cff2b069f2.zip |
Kernel: Remove specific devices from network code
By setting up the devices in init() and looping over the registered
network adapters in NetworkTask_main, we can remove the remaining
hard-coded adapter references from the network code.
This also assigns IPs according to the default range supplied by QEMU
in its slirp networking mode.
Diffstat (limited to 'Kernel/Net/NetworkTask.cpp')
-rw-r--r-- | Kernel/Net/NetworkTask.cpp | 78 |
1 files changed, 40 insertions, 38 deletions
diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index 28cef7f7aa..87fe7ce768 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -1,19 +1,19 @@ #include <Kernel/Lock.h> #include <Kernel/Net/ARP.h> -#include <Kernel/Net/E1000NetworkAdapter.h> #include <Kernel/Net/EtherType.h> #include <Kernel/Net/EthernetFrameHeader.h> #include <Kernel/Net/ICMP.h> #include <Kernel/Net/IPv4.h> #include <Kernel/Net/IPv4Socket.h> #include <Kernel/Net/LoopbackAdapter.h> -#include <Kernel/Net/RTL8139NetworkAdapter.h> +#include <Kernel/Net/Routing.h> #include <Kernel/Net/TCP.h> #include <Kernel/Net/TCPSocket.h> #include <Kernel/Net/UDP.h> #include <Kernel/Net/UDPSocket.h> #include <Kernel/Process.h> +//#define NETWORK_TASK_DEBUG //#define ETHERNET_DEBUG //#define ETHERNET_VERY_DEBUG //#define IPV4_DEBUG @@ -37,49 +37,51 @@ Lockable<HashMap<IPv4Address, MACAddress>>& arp_table() void NetworkTask_main() { - LoopbackAdapter::the(); - - auto e1000 = E1000NetworkAdapter::the(); - if (!e1000) - dbgprintf("E1000 network card not found!\n"); - if (e1000) - e1000->set_ipv4_address(IPv4Address(192, 168, 5, 2)); - - auto rtl8139 = RTL8139NetworkAdapter::the(); - if (!rtl8139) - dbgprintf("RTL8139 network card not found!\n"); - if (rtl8139) - rtl8139->set_ipv4_address(IPv4Address(192, 168, 13, 201)); - - auto dequeue_packet = [&]() -> Optional<KBuffer> { - auto packet = LoopbackAdapter::the().dequeue_packet(); - if (packet.has_value()) { - dbgprintf("Receive loopback packet (%d bytes)\n", packet.value().size()); - return packet.value(); + u8 octet = 15; + int pending_packets = 0; + NetworkAdapter::for_each([&octet, &pending_packets](auto& adapter) { + if (String(adapter.class_name()) == "LoopbackAdapter") { + adapter.set_ipv4_address({ 127, 0, 0, 1 }); + adapter.set_ipv4_netmask({ 255, 0, 0, 0 }); + adapter.set_ipv4_gateway({ 0, 0, 0, 0 }); + } else { + adapter.set_ipv4_address({ 10, 0, 2, octet++ }); + adapter.set_ipv4_netmask({ 255, 255, 255, 0 }); + adapter.set_ipv4_gateway({ 10, 0, 2, 2 }); } - if (e1000 && e1000->has_queued_packets()) - return e1000->dequeue_packet(); - if (rtl8139 && rtl8139->has_queued_packets()) - return rtl8139->dequeue_packet(); - return {}; + + kprintf("NetworkTask: %s network adapter found: hw=%s address=%s netmask=%s gateway=%s\n", + adapter.class_name(), + adapter.mac_address().to_string().characters(), + adapter.ipv4_address().to_string().characters(), + adapter.ipv4_netmask().to_string().characters(), + adapter.ipv4_gateway().to_string().characters()); + + adapter.set_on_receive([&pending_packets]() { + pending_packets++; + }); + }); + + auto dequeue_packet = [&pending_packets]() -> Optional<KBuffer> { + Optional<KBuffer> packet; + NetworkAdapter::for_each([&packet, &pending_packets](auto& adapter) { + if (packet.has_value() || !adapter.has_queued_packets()) + return; + packet = adapter.dequeue_packet(); + pending_packets--; +#ifdef NETWORK_TASK_DEBUG + kprintf("NetworkTask: Dequeued packet from %s (%d bytes)\n", adapter.name().characters(), packet.value().size()); +#endif + }); + return packet; }; kprintf("NetworkTask: Enter main loop.\n"); for (;;) { auto packet_maybe_null = dequeue_packet(); if (!packet_maybe_null.has_value()) { - (void)current->block_until("Networking", [] { - if (LoopbackAdapter::the().has_queued_packets()) - return true; - if (auto* e1000 = E1000NetworkAdapter::the()) { - if (e1000->has_queued_packets()) - return true; - } - if (auto* rtl8139 = RTL8139NetworkAdapter::the()) { - if (rtl8139->has_queued_packets()) - return true; - } - return false; + (void)current->block_until("Networking", [&pending_packets] { + return pending_packets > 0; }); continue; } |