diff options
Diffstat (limited to 'shared/n-dhcp4/src/util/packet.h')
| -rw-r--r-- | shared/n-dhcp4/src/util/packet.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/shared/n-dhcp4/src/util/packet.h b/shared/n-dhcp4/src/util/packet.h new file mode 100644 index 00000000..98dabf7f --- /dev/null +++ b/shared/n-dhcp4/src/util/packet.h @@ -0,0 +1,61 @@ +#pragma once + +/* + * Packet Sockets + */ + +#include <c-stdaux.h> +#include <inttypes.h> +#include <linux/if_packet.h> +#include <netinet/in.h> +#include <stdlib.h> +#include <unistd.h> + +/* + * `struct sockaddr_ll` is too small to fit the Infiniband hardware address. + * Introduce `struct packet_sockaddr_ll` which is the same as the original, + * except the `sl_addr` field is extended to fit all the supported hardware + * addresses. + */ +struct packet_sockaddr_ll { + unsigned short sll_family; + __be16 sll_protocol; + int sll_ifindex; + unsigned short sll_hatype; + unsigned char sll_pkttype; + unsigned char sll_halen; + unsigned char sll_addr[32]; /* MAX_ADDR_LEN */ +}; + +uint16_t packet_internet_checksum(const uint8_t *data, size_t len); +uint16_t packet_internet_checksum_udp(const struct in_addr *src_addr, + const struct in_addr *dst_addr, + uint16_t src_port, + uint16_t dst_port, + const uint8_t *data, + size_t size, + uint16_t checksum); + +int packet_sendto_udp(int sockfd, + const void *buf, + size_t n_buf, + size_t *n_transmittedp, + const struct sockaddr_in *src_paddr, + const struct packet_sockaddr_ll *dest_haddr, + const struct sockaddr_in *dest_paddr); +int packet_recvfrom_udp(int sockfd, + void *buf, + size_t n_buf, + size_t *n_transmittedp, + struct sockaddr_in *src); + +int packet_shutdown(int sockfd); + +/* inline helpers */ + +static inline int packet_recv_udp(int sockfd, + void *buf, + size_t n_buf, + size_t *n_transmittedp) { + return packet_recvfrom_udp(sockfd, buf, n_buf, n_transmittedp, NULL); +} |