1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
2 | #include <stdlib.h> |
3 | #include <stdio.h> |
4 | #include <linux/unistd.h> |
5 | #include <unistd.h> |
6 | #include <string.h> |
7 | #include <errno.h> |
8 | #include <linux/if_ether.h> |
9 | #include <net/if.h> |
10 | #include <linux/if_packet.h> |
11 | #include <arpa/inet.h> |
12 | |
13 | static inline int open_raw_sock(const char *name) |
14 | { |
15 | struct sockaddr_ll sll; |
16 | int sock; |
17 | |
18 | sock = socket(PF_PACKET, SOCK_RAW | SOCK_NONBLOCK | SOCK_CLOEXEC, htons(ETH_P_ALL)); |
19 | if (sock < 0) { |
20 | printf(format: "cannot create raw socket\n"); |
21 | return -1; |
22 | } |
23 | |
24 | memset(s: &sll, c: 0, n: sizeof(sll)); |
25 | sll.sll_family = AF_PACKET; |
26 | sll.sll_ifindex = if_nametoindex(ifname: name); |
27 | sll.sll_protocol = htons(ETH_P_ALL); |
28 | if (bind(fd: sock, addr: (struct sockaddr *)&sll, len: sizeof(sll)) < 0) { |
29 | printf(format: "bind to %s: %s\n", name, strerror(errno)); |
30 | close(fd: sock); |
31 | return -1; |
32 | } |
33 | |
34 | return sock; |
35 | } |
36 |