diff options
Diffstat (limited to 'src/dgram/dgram_link.c')
-rw-r--r-- | src/dgram/dgram_link.c | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/src/dgram/dgram_link.c b/src/dgram/dgram_link.c index 13741b5..1ebe353 100644 --- a/src/dgram/dgram_link.c +++ b/src/dgram/dgram_link.c @@ -38,8 +38,28 @@ #include "dgram.h" #include "crc.h" -tx_len_t -dgram_send(struct onet_link *link, mac_addr_t dst, void *buf, uint16_t len) +/* + * Represents datagram parameters to use for + * dgram_do_send() + * + * @dst: Destination MAC address + * @buf: Buffer to use + * @len: Length to transmit + */ +struct dgram_params { + mac_addr_t dst; + void *buf; + uint16_t len; +}; + +/* + * Send data through a link using specific parameters + * + * @link: Link to transmit through + * @params: Parameters to use + */ +static tx_len_t +dgram_do_send(struct onet_link *link, struct dgram_params *params) { struct sockaddr_ll saddr; struct ether_hdr *eth; @@ -47,7 +67,7 @@ dgram_send(struct onet_link *link, mac_addr_t dst, void *buf, uint16_t len) size_t dgram_len; char *p, *data; - dgram_len = DGRAM_LEN(len); + dgram_len = DGRAM_LEN(params->len); p = malloc(dgram_len); if (p == NULL) { return -1; @@ -58,11 +78,11 @@ dgram_send(struct onet_link *link, mac_addr_t dst, void *buf, uint16_t len) dgram = DGRAM_HDR(p); /* Copy data to send buffer */ - memset(data, 0, len); - memcpy(data, buf, len); + memset(data, 0, params->len); + memcpy(data, params->buf, params->len); /* Hardware address needs to be big endian */ - dst = mac_swap((void *)&dst); + params->dst = mac_swap((void *)¶ms->dst); /* * Set up link layer sockaddr, load up the frame, datagram @@ -70,15 +90,26 @@ dgram_send(struct onet_link *link, mac_addr_t dst, void *buf, uint16_t len) */ saddr.sll_ifindex = link->iface_idx; saddr.sll_halen = HW_ADDR_LEN; - ether_load_route(link->hwaddr, dst, eth); - dgram_load(len, 50, dgram); + ether_load_route(link->hwaddr, params->dst, eth); + dgram_load(params->len, 50, dgram); sendto( link->sockfd, p, dgram_len, 0, (struct sockaddr *)&saddr, sizeof(struct sockaddr_ll) ); free(p); - return len; + return params->len; +} + +tx_len_t +dgram_send(struct onet_link *link, mac_addr_t dst, void *buf, uint16_t len) +{ + struct dgram_params params; + + params.dst = dst; + params.buf = buf; + params.len = len; + return dgram_do_send(link, ¶ms); } rx_len_t |