mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
eth: take size_t size in eth_process
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -40,7 +40,7 @@ static int loopback_sendpacket(netdev_t *netdev, netdesc_t desc, mac_t targetmac
|
||||
memcpy(desc.address, ðframe, 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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user