ipv4: ids

This commit is contained in:
Matheus
2024-06-17 19:27:51 -03:00
parent e45b1aa911
commit eea9cab357
2 changed files with 5 additions and 2 deletions
+1
View File
@@ -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);
+4 -2
View File
@@ -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;