From eea9cab3570b5f1137410efed196dc65a13bb2b2 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 17 Jun 2024 19:27:51 -0300 Subject: [PATCH] ipv4: ids --- kernel-src/include/kernel/net.h | 1 + kernel-src/io/net/ipv4.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel-src/include/kernel/net.h b/kernel-src/include/kernel/net.h index ade466a6..dfdd3e78 100644 --- a/kernel-src/include/kernel/net.h +++ b/kernel-src/include/kernel/net.h @@ -27,6 +27,7 @@ typedef struct netdev_t { mac_t mac; size_t mtu; uint32_t ip; + int ipcurrid; // XXX This is defined as something per peer. However, having only one of these *should* work for most cases hashtable_t arpcache; int (*allocdesc)(struct netdev_t *netdev, size_t requestedsize, netdesc_t *desc); int (*freedesc)(struct netdev_t *netdev, netdesc_t *desc); diff --git a/kernel-src/io/net/ipv4.c b/kernel-src/io/net/ipv4.c index 0b6d9e80..83bdbc44 100644 --- a/kernel-src/io/net/ipv4.c +++ b/kernel-src/io/net/ipv4.c @@ -108,7 +108,7 @@ static int dispatch_fragment(netdev_t *netdev, netdesc_t fragdesc, .version_length = VERSION_LENGTH(4, 5), .servicetype_ecn = 0, .packetlen = cpu_to_be_w(fragmentlen + sizeof(ipv4frame_t)), - .id = cpu_to_be_w(0x1234), // TODO proper id allocation per netdev + .id = cpu_to_be_w(id), .flags_fragoffset = cpu_to_be_w(FLAGS_FRAGOFFSET(!last ? FLAG_MF : 0, fragmentoffset)), .timetolive = 0xff, .protocol = proto, @@ -202,6 +202,8 @@ int ipv4_sendpacket(void *buffer, size_t packetsize, uint32_t ip, int proto, net size_t devfragmentsize = mtuheader - (mtuheader % 8); size_t fragmentcount = packetsize / devfragmentsize + 1; + int id = __atomic_fetch_add(&netdev->ipcurrid, 1, __ATOMIC_SEQ_CST); + for (int i = 0; i < fragmentcount; ++i) { size_t fragmentlen = (i == fragmentcount - 1) ? packetsize - devfragmentsize * (fragmentcount - 1) : devfragmentsize; netdesc_t fragdesc; @@ -211,7 +213,7 @@ 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, 0x1234, ip, mac, proto, i == fragmentcount - 1); + e = dispatch_fragment(netdev, fragdesc, i * devfragmentsize, fragmentlen, id, ip, mac, proto, i == fragmentcount - 1); netdev->freedesc(netdev, &fragdesc); if (e) return e;