| 1 |
|
| 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("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 | }
|