35 lines · 814 B · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 */#include <stdlib.h>#include <stdio.h>#include <linux/unistd.h>#include <unistd.h>#include <string.h>#include <errno.h>#include <linux/if_ether.h>#include <net/if.h>#include <linux/if_packet.h>#include <arpa/inet.h> static inline int open_raw_sock(const char *name){	struct sockaddr_ll sll;	int sock; 	sock = socket(PF_PACKET, SOCK_RAW | SOCK_NONBLOCK | SOCK_CLOEXEC, htons(ETH_P_ALL));	if (sock < 0) {		printf("cannot create raw socket\n");		return -1;	} 	memset(&sll, 0, sizeof(sll));	sll.sll_family = AF_PACKET;	sll.sll_ifindex = if_nametoindex(name);	sll.sll_protocol = htons(ETH_P_ALL);	if (bind(sock, (struct sockaddr *)&sll, sizeof(sll)) < 0) {		printf("bind to %s: %s\n", name, strerror(errno));		close(sock);		return -1;	} 	return sock;}