net: consume descriptor on tx

This commit is contained in:
Matheus
2026-09-09 22:39:34 -03:00
parent 8134c00b69
commit daebfd89b5
6 changed files with 9 additions and 14 deletions
+1
View File
@@ -44,6 +44,7 @@ typedef struct netdev_t {
short flags;
int (*allocdesc)(struct netdev_t *netdev, size_t requestedsize, netdesc_t *desc);
int (*freedesc)(struct netdev_t *netdev, netdesc_t *desc);
// consumes desc regardless of the returned status
int (*sendpacket)(struct netdev_t *_internal, netdesc_t desc, mac_t targetmac, int proto);
} netdev_t;
+1 -3
View File
@@ -146,8 +146,7 @@ static void send_reply(netdev_t *netdev, uint32_t ip, mac_t mac) {
memcpy((void *)((uintptr_t)desc.address + desc.curroffset), &frame, sizeof(frame));
e = netdev->sendpacket(netdev, desc, mac, ETH_PROTO_ARP);
netdev->freedesc(netdev, &desc);
netdev->sendpacket(netdev, desc, mac, ETH_PROTO_ARP);
}
static void handlerthreadfn() {
@@ -237,7 +236,6 @@ static int sendrequest(netdev_t *netdev, uint32_t ip) {
memcpy((void *)((uintptr_t)desc.address + desc.curroffset), &frame, sizeof(frame));
e = netdev->sendpacket(netdev, desc, NET_BROADCAST_MAC, ETH_PROTO_ARP);
netdev->freedesc(netdev, &desc);
return e;
}
-1
View File
@@ -215,7 +215,6 @@ int ipv4_sendpacket(void *buffer, size_t packetsize, uint32_t ip, int proto, net
memcpy((void *)((uintptr_t)fragdesc.address + fragdesc.curroffset + sizeof(ipv4frame_t)), (void *)((uintptr_t)buffer + i * devfragmentsize), fragmentlen);
e = dispatch_fragment(netdev, fragdesc, i * devfragmentsize, fragmentlen, id, ip, mac, proto, i == fragmentcount - 1);
netdev->freedesc(netdev, &fragdesc);
if (e)
return e;
}
+5 -8
View File
@@ -6,13 +6,10 @@
#include <hashtable.h>
#include <arch/cpu.h>
#include <kernel/init.h>
#include <kernel/interrupt.h>
static netdev_t loopbacknetdev;
static void rx_dpc(context_t *context, dpcarg_t arg) {
eth_process(&loopbacknetdev, arg);
}
// requested size doesn't account for ethernet header or the virtio header
static int loopback_allocdesc(netdev_t *netdev, size_t requestedsize, netdesc_t *desc) {
__assert(requestedsize <= netdev->mtu);
@@ -42,11 +39,11 @@ static int loopback_sendpacket(netdev_t *netdev, netdesc_t desc, mac_t targetmac
memcpy(&ethframe.destination, &broadcast, sizeof(mac_t));
memcpy(desc.address, &ethframe, sizeof(ethframe_t));
dpc_t dpc = {0};
dpc_prepare(&dpc, rx_dpc);
dpc_enqueue(&dpc, desc.address);
long ipl = interrupt_raiseipl(IPL_DPC);
eth_process(netdev, desc.address);
interrupt_loweripl(ipl);
return 0;
return netdev->freedesc(netdev, &desc);
}
netdev_t *loopback_device() {
+1 -1
View File
@@ -191,7 +191,7 @@ static int rtl8169_sendpacket(netdev_t *internal, netdesc_t desc, mac_t target,
spinlock_release_lower_ipl(&netdev->tx_lock, ipl);
sched_yield();
return 0;
return internal->freedesc(internal, &desc);
}
// requested size doesn't account for ethernet header
+1 -1
View File
@@ -148,7 +148,7 @@ static int vionet_sendpacket(netdev_t *internal, netdesc_t desc, mac_t targetmac
sched_yield();
interrupt_set(intstatus);
return 0;
return internal->freedesc(internal, &desc);
}
int vionet_newdevice(viodevice_t *viodevice) {