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