Prepare for multiple-interface support
We want to support inarp on any system interface. This change prepares
for that by splitting the interface into into a separate array.
We only have one element in that array at present.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
diff --git a/inarp.c b/inarp.c
index f24fb4a..31f7b51 100644
--- a/inarp.c
+++ b/inarp.c
@@ -46,11 +46,16 @@
struct in_addr dest_ip;
} __attribute__((packed));
-struct inarp_ctx {
- int socket;
- const char *ifname;
+struct interface {
int ifindex;
- struct eth_addr local_mac;
+ char ifname[IFNAMSIZ+1];
+ struct eth_addr eth_addr;
+};
+
+struct inarp_ctx {
+ int socket;
+ struct interface *interfaces;
+ unsigned int n_interfaces;
};
static int send_arp_packet(int fd,
@@ -189,6 +194,7 @@
struct arp_packet inarp_req;
struct in_addr local_ip;
struct inarp_ctx inarp;
+ struct interface *iface;
ssize_t len;
int ret;
@@ -197,27 +203,33 @@
return EXIT_FAILURE;
}
- memset(&inarp, 0, sizeof(inarp));
- inarp.ifname = argv[1];
-
- if (strlen(inarp.ifname) > IFNAMSIZ)
+ if (strlen(argv[1]) > IFNAMSIZ)
errx(EXIT_FAILURE, "Interface name '%s' is invalid",
- inarp.ifname);
+ argv[1]);
+
+ memset(&inarp, 0, sizeof(inarp));
+
+ /* prepare for a single interface */
+ inarp.interfaces = calloc(1, sizeof(inarp.interfaces[0]));
+ inarp.n_interfaces = 1;
+ iface = &inarp.interfaces[0];
+
+ strncpy(iface->ifname, argv[1], sizeof(iface->ifname));
inarp.socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP));
if (inarp.socket < 0)
err(EXIT_FAILURE, "Error opening ARP socket");
- ret = get_ifindex(inarp.socket, inarp.ifname, &inarp.ifindex);
+ ret = get_ifindex(inarp.socket, iface->ifname, &iface->ifindex);
if (ret)
exit(EXIT_FAILURE);
- ret = get_local_hwaddr(inarp.socket, inarp.ifname, &inarp.local_mac);
+ ret = get_local_hwaddr(inarp.socket, iface->ifname, &iface->eth_addr);
if (ret)
exit(EXIT_FAILURE);
- printf("%s MAC address: %s\n", inarp.ifname,
- eth_mac_to_str(&inarp.local_mac));
+ printf("%s MAC address: %s\n", iface->ifname,
+ eth_mac_to_str(&iface->eth_addr));
while (1) {
len = recvfrom(inarp.socket, &inarp_req, sizeof(inarp_req), 0,
@@ -237,13 +249,13 @@
continue;
/* ... for us? */
- if (memcmp(&inarp.local_mac, inarp_req.eh.h_dest, ETH_ALEN))
+ if (memcmp(&iface->eth_addr, inarp_req.eh.h_dest, ETH_ALEN))
continue;
printf("src mac: %s\n", eth_mac_to_str(&inarp_req.src_mac));
printf("src ip: %s\n", inet_ntoa(inarp_req.src_ip));
- ret = get_local_ipaddr(inarp.socket, inarp.ifname, &local_ip);
+ ret = get_local_ipaddr(inarp.socket, iface->ifname, &local_ip);
/* if we don't have a local IP address to send, just drop the
* request */
if (ret)
@@ -251,7 +263,7 @@
printf("local ip: %s\n", inet_ntoa(local_ip));
- send_arp_packet(inarp.socket, inarp.ifindex,
+ send_arp_packet(inarp.socket, iface->ifindex,
&inarp_req.dest_mac,
&local_ip,
&inarp_req.src_mac,