diff --git a/kernel-src/include/kernel/net.h b/kernel-src/include/kernel/net.h index 4d52a571..f1fd592c 100644 --- a/kernel-src/include/kernel/net.h +++ b/kernel-src/include/kernel/net.h @@ -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; diff --git a/kernel-src/io/net/arp.c b/kernel-src/io/net/arp.c index 15128b42..1e37b895 100644 --- a/kernel-src/io/net/arp.c +++ b/kernel-src/io/net/arp.c @@ -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; } diff --git a/kernel-src/io/net/ipv4.c b/kernel-src/io/net/ipv4.c index 2e134ba2..abbc4bdb 100644 --- a/kernel-src/io/net/ipv4.c +++ b/kernel-src/io/net/ipv4.c @@ -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; } diff --git a/kernel-src/io/net/loopback.c b/kernel-src/io/net/loopback.c index 2f5bd924..1ff6305e 100644 --- a/kernel-src/io/net/loopback.c +++ b/kernel-src/io/net/loopback.c @@ -6,13 +6,10 @@ #include #include #include +#include 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() { diff --git a/kernel-src/io/net/rtl8169.c b/kernel-src/io/net/rtl8169.c index 3c956c4d..5aa1238f 100644 --- a/kernel-src/io/net/rtl8169.c +++ b/kernel-src/io/net/rtl8169.c @@ -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 diff --git a/kernel-src/io/net/vionet.c b/kernel-src/io/net/vionet.c index 4047ea34..b78fcebc 100644 --- a/kernel-src/io/net/vionet.c +++ b/kernel-src/io/net/vionet.c @@ -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) {