From 77790c743574dd17e42961d45d57998e6cbf92dc Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sun, 10 Jul 2016 11:00:52 +0200 Subject: [PATCH] Use the RX thread --- kernel/include/network.hpp | 1 + kernel/include/semaphore.hpp | 4 ++-- kernel/src/network.cpp | 8 +++++++- kernel/src/rtl8139.cpp | 11 +++++++++-- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/kernel/include/network.hpp b/kernel/include/network.hpp index ba98e802..63760b8e 100644 --- a/kernel/include/network.hpp +++ b/kernel/include/network.hpp @@ -30,6 +30,7 @@ struct interface_descriptor { mutable mutex<> tx_lock; //To synchronize the queue mutable semaphore tx_sem; + mutable semaphore rx_sem; size_t rx_thread_pid; size_t tx_thread_pid; diff --git a/kernel/include/semaphore.hpp b/kernel/include/semaphore.hpp index 8fc7d9b7..48236133 100644 --- a/kernel/include/semaphore.hpp +++ b/kernel/include/semaphore.hpp @@ -16,8 +16,8 @@ struct semaphore { private: - spinlock lock; - size_t value; + mutable spinlock lock; + volatile size_t value; circular_buffer queue; public: diff --git a/kernel/src/network.cpp b/kernel/src/network.cpp index d4849965..fb4e961a 100644 --- a/kernel/src/network.cpp +++ b/kernel/src/network.cpp @@ -14,6 +14,7 @@ #include "physical_allocator.hpp" #include "scheduler.hpp" #include "logging.hpp" +#include "ethernet_layer.hpp" #include "fs/sysfs.hpp" @@ -29,7 +30,11 @@ void rx_thread(void* data){ logging::logf(logging::log_level::TRACE, "network: RX Thread for interface %u started (pid:%u)\n", interface.id, pid); while(true){ - scheduler::block_process(pid); + interface.rx_sem.acquire(); + + auto packet = interface.rx_queue.pop(); + network::ethernet::decode(interface, packet); + delete[] packet.payload; } } @@ -70,6 +75,7 @@ void network::init(){ interface.driver_data = nullptr; interface.tx_lock.init(1); interface.tx_sem.init(0); + interface.rx_sem.init(0); if(pci_device.vendor_id == 0x10EC && pci_device.device_id == 0x8139){ interface.enabled = true; diff --git a/kernel/src/rtl8139.cpp b/kernel/src/rtl8139.cpp index 229ee507..5b28472a 100644 --- a/kernel/src/rtl8139.cpp +++ b/kernel/src/rtl8139.cpp @@ -14,6 +14,7 @@ #include "paging.hpp" #include "semaphore.hpp" #include "paging.hpp" +#include "int_lock.hpp" #include "ethernet_layer.hpp" @@ -88,6 +89,7 @@ struct rtl8139_t { void packet_handler(interrupt::syscall_regs*, void* data){ auto& desc = *static_cast(data); + auto& interface = *desc.interface; // Get the interrupt status auto status = in_word(desc.iobase + ISR); @@ -126,9 +128,14 @@ void packet_handler(interrupt::syscall_regs*, void* data){ std::copy_n(packet_buffer, packet_payload, packet_only_length); network::ethernet::packet packet(packet_buffer, packet_only_length); - network::ethernet::decode(*desc.interface, packet); - delete[] packet_buffer; + direct_int_lock lock; + + logging::logf(logging::log_level::TRACE, "rtl8139: interface 1 %u\n", reinterpret_cast(&interface)); + interface.rx_queue.push(packet); + logging::logf(logging::log_level::TRACE, "rtl8139: interface 2 %u\n", reinterpret_cast(&interface)); + interface.rx_sem.release(); + logging::logf(logging::log_level::TRACE, "rtl8139: interface 3 %u\n", reinterpret_cast(&interface)); } cur_rx = (cur_rx + packet_length + 4 + 3) & ~3; //align on 4 bytes