diff options
author | Ian Moffett <ian@osmora.org> | 2025-09-25 14:23:36 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-09-25 14:23:36 -0400 |
commit | afcdcf6ae6d95eb828733994c7de30f8ab095dcc (patch) | |
tree | e45ee28dc7bff6da7ab0d5f6a3e2b27c6ac36aa8 /src/dgram/dgram_link.c | |
parent | 25872d593fc4f9d2845ef6f676ce4ec3d55e9aac (diff) |
dgram: Add support for data reception
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/dgram/dgram_link.c')
-rw-r--r-- | src/dgram/dgram_link.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/dgram/dgram_link.c b/src/dgram/dgram_link.c index eec8697..47646d6 100644 --- a/src/dgram/dgram_link.c +++ b/src/dgram/dgram_link.c @@ -79,3 +79,72 @@ dgram_send(struct onet_link *link, mac_addr_t dst, void *buf, uint16_t len) free(p); return len; } + +rx_len_t +dgram_recv(struct onet_link *link, void *buf, uint16_t len) +{ + socklen_t addr_len; + struct sockaddr_ll saddr; + struct ether_hdr *hdr; + size_t dgram_len, recv_len; + uint16_t proto; + mac_addr_t dest_mac; + char *p; + + if (link == NULL || buf == NULL) { + return -1; + } + + if (len == 0) { + return -1; + } + + /* Allocate an RX buffer */ + dgram_len = DGRAM_LEN(len); + p = malloc(dgram_len); + if (p == NULL) { + return -1; + } + + addr_len = sizeof(struct sockaddr_ll); + saddr.sll_ifindex = link->iface_idx; + saddr.sll_halen = HW_ADDR_LEN; + + /* + * Wait until we get a packet for us with the right + * protocol ID. + */ + for (;;) { + recv_len = recvfrom( + link->sockfd, p, dgram_len, + 0, (struct sockaddr *)&saddr, + &addr_len + ); + + hdr = (void *)p; + proto = ntohs(hdr->proto); + dest_mac = mac_swap(hdr->dest); + + if (recv_len != dgram_len) { + continue; + } + + if (proto != PROTO_ID) { + continue; + } + + /* If this is for everyone, take it */ + if (dest_mac == MAC_BROADCAST) { + break; + } + + /* If this is for us, take it */ + if (dest_mac == link->hwaddr) { + break; + } + } + + memcpy(buf, DGRAM_DATA(p), len); + free(p); + return dgram_len; +} |