]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
3c731eba AS |
2 | #include <stdlib.h> |
3 | #include <stdio.h> | |
4 | #include <linux/unistd.h> | |
5 | #include <unistd.h> | |
6 | #include <string.h> | |
3c731eba | 7 | #include <errno.h> |
ee12996c | 8 | #include <linux/if_ether.h> |
03f4723e AS |
9 | #include <net/if.h> |
10 | #include <linux/if_packet.h> | |
11 | #include <arpa/inet.h> | |
3c731eba | 12 | |
9899694a | 13 | static inline int open_raw_sock(const char *name) |
03f4723e AS |
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("cannot create raw socket\n"); | |
21 | return -1; | |
22 | } | |
23 | ||
24 | memset(&sll, 0, sizeof(sll)); | |
25 | sll.sll_family = AF_PACKET; | |
26 | sll.sll_ifindex = if_nametoindex(name); | |
27 | sll.sll_protocol = htons(ETH_P_ALL); | |
28 | if (bind(sock, (struct sockaddr *)&sll, sizeof(sll)) < 0) { | |
29 | printf("bind to %s: %s\n", name, strerror(errno)); | |
30 | close(sock); | |
31 | return -1; | |
32 | } | |
33 | ||
34 | return sock; | |
35 | } |