memcmp(hw_s, ifn->hwaddr, ifn->hwlen) == 0)
break;
}
- if (ifn)
+ if (ifn) {
+#if 0
+ logger(ifp->ctx, LOG_DEBUG,
+ "%s: ignoring ARP from self", ifp->name);
+#endif
continue;
+ }
/* Copy out the HW and IP addresses */
memcpy(&arm.sha, hw_s, ar.ar_hln);
memcpy(&arm.sip.s_addr, hw_s + ar.ar_hln, ar.ar_pln);
}
}
-static void
+int
arp_open(struct interface *ifp)
{
struct iarp_state *state;
if (state->fd == -1) {
logger(ifp->ctx, LOG_ERR, "%s: %s: %m",
__func__, ifp->name);
- return;
+ return -1;
}
eloop_event_add(ifp->ctx->eloop, state->fd, arp_packet, ifp);
}
+ return state->fd;
}
static void
arp_announce(struct arp_state *astate)
{
- arp_open(astate->iface);
+ if (arp_open(astate->iface) == -1) {
+ logger(astate->iface->ctx, LOG_ERR,
+ "%s: %s: %m", __func__, astate->iface->name);
+ return;
+ }
astate->claims = 0;
arp_announce1(astate);
}
arp_probe(struct arp_state *astate)
{
- arp_open(astate->iface);
+ if (arp_open(astate->iface) == -1) {
+ logger(astate->iface->ctx, LOG_ERR,
+ "%s: %s: %m", __func__, astate->iface->name);
+ return;
+ }
astate->probes = 0;
logger(astate->iface->ctx, LOG_DEBUG, "%s: probing for %s",
astate->iface->name, inet_ntoa(astate->addr));
((const struct iarp_state *)(ifp)->if_data[IF_DATA_ARP])
#ifdef INET
+int arp_open(struct interface *);
ssize_t arp_request(const struct interface *, in_addr_t, in_addr_t);
void arp_report_conflicted(const struct arp_state *, const struct arp_msg *);
void arp_announce(struct arp_state *);