eth: take size_t size in eth_process

This commit is contained in:
Matheus
2026-09-10 15:38:50 -03:00
parent 6adea26cb5
commit 895c6d9345
6 changed files with 16 additions and 8 deletions
+2 -1
View File
@@ -1,6 +1,7 @@
#ifndef _ETH_H
#define _ETH_H
#include <stddef.h>
#include <stdint.h>
#include <kernel/net.h>
@@ -13,6 +14,6 @@ typedef struct {
#define ETH_PROTO_IP 0x0800
#define ETH_PROTO_ARP 0x0806
void eth_process(netdev_t *netdev, void *buffer);
void eth_process(netdev_t *netdev, void *buffer, size_t size);
#endif
+4 -1
View File
@@ -3,7 +3,10 @@
#include <logging.h>
// runs on dpc context, called by the individual driver dpcs on a receive.
void eth_process(netdev_t *netdev, void *buffer) {
void eth_process(netdev_t *netdev, void *buffer, size_t size) {
if (size < sizeof(ethframe_t))
return;
ethframe_t *frame = buffer;
mac_t dst, src;
+1 -1
View File
@@ -40,7 +40,7 @@ static int loopback_sendpacket(netdev_t *netdev, netdesc_t desc, mac_t targetmac
memcpy(desc.address, &ethframe, sizeof(ethframe_t));
long ipl = interrupt_raiseipl(IPL_DPC);
eth_process(netdev, desc.address);
eth_process(netdev, desc.address, desc.size);
interrupt_loweripl(ipl);
return netdev->freedesc(netdev, &desc);
+3 -1
View File
@@ -54,6 +54,7 @@
#define RX_DESCRIPTOR_COUNT 1024
#define TX_DESCRIPTOR_COUNT 1024
#define RX_BUFFER_SIZE 1524
#define RX_FCS_SIZE 4
#define DESCRIPTOR_OWN (1 << 15)
#define DESCRIPTOR_EOR (1 << 14)
@@ -133,7 +134,8 @@ static void rtl8169_dpc_rx(context_t *, dpcarg_t arg) {
volatile descriptor_t *descriptor = &dev->rx_ring[dev->rx_next];
void *buffer = MAKE_HHDM((void *)(descriptor->addr_low | ((uint64_t)descriptor->addr_high << 32)));
eth_process(&dev->netdev, buffer);
if (descriptor->length >= RX_FCS_SIZE)
eth_process(&dev->netdev, buffer, descriptor->length - RX_FCS_SIZE);
uint16_t eor = descriptor->flags & DESCRIPTOR_EOR;
descriptor->length = RX_BUFFER_SIZE;
+1 -2
View File
@@ -299,6 +299,5 @@ static void u80211_kernel_interface_init(void) {
INIT_ROUTINE_DEFINE(u80211, INIT_ROUTINE_FLAGS_NONE, u80211_kernel_interface_init, work_queue);
void u80211_kernel_receive_callback(u80211_device_t *device, void *buffer, size_t size) {
(void)size;
eth_process(device->driver_data, buffer);
eth_process(device->driver_data, buffer, size);
}
+5 -2
View File
@@ -45,8 +45,11 @@ static void rx_dpc(context_t *context, dpcarg_t arg) {
while (netdev->rxqueue.lastusedindex != VIO_QUEUE_DEV_IDX(&netdev->rxqueue)) {
int idx = netdev->rxqueue.lastusedindex++ % netdev->rxqueue.size;
int buffidx = VIO_QUEUE_DEV_RING(&netdev->rxqueue)[idx].index;
void *ethbufferphys = (void *)(buffers[buffidx].address + sizeof(vioframe_t));
eth_process((netdev_t *)netdev, MAKE_HHDM(ethbufferphys));
size_t size = VIO_QUEUE_DEV_RING(&netdev->rxqueue)[idx].length;
if (size >= sizeof(vioframe_t)) {
void *phys = (void *)(buffers[buffidx].address + sizeof(vioframe_t));
eth_process((netdev_t *)netdev, MAKE_HHDM(phys), size - sizeof(vioframe_t));
}
VIO_QUEUE_DRV_RING(&netdev->rxqueue)[VIO_QUEUE_DRV_IDX(&netdev->rxqueue)++ % netdev->rxqueue.size] = buffidx;
*netdev->rxqueue.notify = 0;
}