mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
net: consume descriptor on tx
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(ðframe.destination, &broadcast, sizeof(mac_t));
|
||||
memcpy(desc.address, ðframe, 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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user