summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/network.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/network.c b/src/network.c
index 122676d..bb2d395 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1,5 +1,6 @@
#include "junk/network.h"
#include <arpa/inet.h>
+#include <linux/if_link.h>
#include <net/if.h>
#include <errno.h>
#include <linux/if_arp.h>
@@ -14,6 +15,7 @@
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
+#include <ifaddrs.h>
#define TAG "network"
@@ -156,7 +158,26 @@ int eth_arp_send(int sockfd, arp_packet *packet) {
memset(&addrinfo, 0, sizeof addrinfo);
addrinfo.sll_family = AF_PACKET;
addrinfo.sll_protocol = htonl(ETH_P_ARP);
- addrinfo.sll_ifindex = if_nametoindex("enp6s0");
+ struct ifaddrs *ifaddr;
+ if (getifaddrs(&ifaddr) == -1) {
+ perror("getifaddrs");
+ }
+
+ for (struct ifaddrs* ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
+ if (ifa->ifa_addr == NULL) {
+ continue;
+ }
+ int family = ifa->ifa_addr->sa_family;
+ if (family == AF_PACKET) {
+ struct sockaddr_ll* hwaddr = (struct sockaddr_ll*)ifa->ifa_addr;
+ if (memcmp(hwaddr->sll_addr, packet->sender_hardware_address, 6) == 0) {
+ fprintf(stderr, "Found intf ifindex %d\n", hwaddr->sll_ifindex);
+ addrinfo.sll_ifindex = hwaddr->sll_ifindex;
+ }
+ }
+ }
+
+
addrinfo.sll_hatype = htonl(ARPHRD_ETHER);
addrinfo.sll_pkttype = PACKET_BROADCAST;
addrinfo.sll_halen = 6;