Use SIOCxARP instead of libnl for Linux ARP stuff (WIP)
authorJoseph C. Lehner <joseph.c.lehner@gmail.com>
Mon, 10 Sep 2018 18:30:28 +0000 (20:30 +0200)
committerJoseph C. Lehner <joseph.c.lehner@gmail.com>
Mon, 10 Sep 2018 18:30:37 +0000 (20:30 +0200)
ethsock.c

index d8a732673fbb5b5fc82d76c8c231abe829bbe925..088ec9c08d1c5c0800d4ebbcedac220001b4d7ee 100644 (file)
--- a/ethsock.c
+++ b/ethsock.c
@@ -253,6 +253,33 @@ out:
 
 static bool intf_add_del_arp(const char *intf, uint32_t ipaddr, uint8_t *hwaddr, bool add)
 {
+#if 0
+       struct arpreq arp;
+       memset(&arp, 0, sizeof(arp));
+       arp.arp_ha.sa_family = ARPHRD_ETHER;
+       memcpy(&arp.arp_ha.sa_data, hwaddr, 6);
+       arp.arp_flags = ATF_PERM | ATF_COM;
+
+       struct sockaddr_in *in = (struct sockaddr_in*)&req.arp_pa;
+       in->sin_addr.s_addr = htonl(ipaddr);
+       in->sin_family = AF_INET;
+
+       int fd = socket(AF_INET, SOCK_DGRAM, 0);
+       if (fd < 0) {
+               perror("socket");
+               return false;
+       }
+
+       bool ret = true;
+
+       if (ioctl(fd, add ? SIOCSARP : SIOCDARP, &req) < 0) {
+               perror(add ? "ioctl(SIOCSARP)" : "ioctl(SIOCDARP");
+               ret = false;
+       }
+
+       close(fd);
+       return ret;
+#else
        struct nl_sock *sk;
        struct rtnl_neigh *neigh;
        struct nl_addr *mac, *ip;
@@ -303,6 +330,7 @@ out:
        nl_socket_free(sk);
 
        return !err;
+#endif
 }
 
 #endif