mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
eth: take size_t size in eth_process
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#ifndef _ETH_H
|
#ifndef _ETH_H
|
||||||
#define _ETH_H
|
#define _ETH_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <kernel/net.h>
|
#include <kernel/net.h>
|
||||||
|
|
||||||
@@ -13,6 +14,6 @@ typedef struct {
|
|||||||
#define ETH_PROTO_IP 0x0800
|
#define ETH_PROTO_IP 0x0800
|
||||||
#define ETH_PROTO_ARP 0x0806
|
#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
|
#endif
|
||||||
|
|||||||
@@ -3,7 +3,10 @@
|
|||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
|
|
||||||
// runs on dpc context, called by the individual driver dpcs on a receive.
|
// 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;
|
ethframe_t *frame = buffer;
|
||||||
|
|
||||||
mac_t dst, src;
|
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));
|
memcpy(desc.address, ðframe, sizeof(ethframe_t));
|
||||||
|
|
||||||
long ipl = interrupt_raiseipl(IPL_DPC);
|
long ipl = interrupt_raiseipl(IPL_DPC);
|
||||||
eth_process(netdev, desc.address);
|
eth_process(netdev, desc.address, desc.size);
|
||||||
interrupt_loweripl(ipl);
|
interrupt_loweripl(ipl);
|
||||||
|
|
||||||
return netdev->freedesc(netdev, &desc);
|
return netdev->freedesc(netdev, &desc);
|
||||||
|
|||||||
@@ -54,6 +54,7 @@
|
|||||||
#define RX_DESCRIPTOR_COUNT 1024
|
#define RX_DESCRIPTOR_COUNT 1024
|
||||||
#define TX_DESCRIPTOR_COUNT 1024
|
#define TX_DESCRIPTOR_COUNT 1024
|
||||||
#define RX_BUFFER_SIZE 1524
|
#define RX_BUFFER_SIZE 1524
|
||||||
|
#define RX_FCS_SIZE 4
|
||||||
|
|
||||||
#define DESCRIPTOR_OWN (1 << 15)
|
#define DESCRIPTOR_OWN (1 << 15)
|
||||||
#define DESCRIPTOR_EOR (1 << 14)
|
#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];
|
volatile descriptor_t *descriptor = &dev->rx_ring[dev->rx_next];
|
||||||
void *buffer = MAKE_HHDM((void *)(descriptor->addr_low | ((uint64_t)descriptor->addr_high << 32)));
|
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;
|
uint16_t eor = descriptor->flags & DESCRIPTOR_EOR;
|
||||||
descriptor->length = RX_BUFFER_SIZE;
|
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);
|
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 u80211_kernel_receive_callback(u80211_device_t *device, void *buffer, size_t size) {
|
||||||
(void)size;
|
eth_process(device->driver_data, buffer, size);
|
||||||
eth_process(device->driver_data, buffer);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,8 +45,11 @@ static void rx_dpc(context_t *context, dpcarg_t arg) {
|
|||||||
while (netdev->rxqueue.lastusedindex != VIO_QUEUE_DEV_IDX(&netdev->rxqueue)) {
|
while (netdev->rxqueue.lastusedindex != VIO_QUEUE_DEV_IDX(&netdev->rxqueue)) {
|
||||||
int idx = netdev->rxqueue.lastusedindex++ % netdev->rxqueue.size;
|
int idx = netdev->rxqueue.lastusedindex++ % netdev->rxqueue.size;
|
||||||
int buffidx = VIO_QUEUE_DEV_RING(&netdev->rxqueue)[idx].index;
|
int buffidx = VIO_QUEUE_DEV_RING(&netdev->rxqueue)[idx].index;
|
||||||
void *ethbufferphys = (void *)(buffers[buffidx].address + sizeof(vioframe_t));
|
size_t size = VIO_QUEUE_DEV_RING(&netdev->rxqueue)[idx].length;
|
||||||
eth_process((netdev_t *)netdev, MAKE_HHDM(ethbufferphys));
|
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;
|
VIO_QUEUE_DRV_RING(&netdev->rxqueue)[VIO_QUEUE_DRV_IDX(&netdev->rxqueue)++ % netdev->rxqueue.size] = buffidx;
|
||||||
*netdev->rxqueue.notify = 0;
|
*netdev->rxqueue.notify = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user