Lines Matching refs:inarp

71 	void inarp_log(struct inarp_ctx *inarp,  in inarp_log()  argument
77 if (priority > LOG_INFO && !inarp->debug) in inarp_log()
81 if (inarp->syslog) { in inarp_log()
101 static int send_arp_packet(struct inarp_ctx *inarp, in send_arp_packet() argument
144 rc = sendto(inarp->arp_sd, &arp, sizeof(arp), 0, in send_arp_packet()
147 inarp_log(inarp, LOG_NOTICE, in send_arp_packet()
175 static int get_local_ipaddr(struct inarp_ctx *inarp, in get_local_ipaddr() argument
182 rc = do_ifreq(inarp->arp_sd, SIOCGIFADDR, ifname, &ifreq); in get_local_ipaddr()
184 inarp_log(inarp, LOG_WARNING, in get_local_ipaddr()
191 inarp_log(inarp, LOG_WARNING, in get_local_ipaddr()
202 static struct interface *find_interface_by_ifindex(struct inarp_ctx *inarp, in find_interface_by_ifindex() argument
207 for (i = 0; i < inarp->n_interfaces; i++) { in find_interface_by_ifindex()
208 struct interface *iface = &inarp->interfaces[i]; in find_interface_by_ifindex()
216 static int init_netlink(struct inarp_ctx *inarp) in init_netlink() argument
226 inarp->nl_sd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE); in init_netlink()
227 if (inarp->nl_sd < 0) { in init_netlink()
228 inarp_log(inarp, LOG_ERR, "Error opening netlink socket: %m"); in init_netlink()
236 rc = bind(inarp->nl_sd, (struct sockaddr *)&addr, sizeof(addr)); in init_netlink()
238 inarp_log(inarp, LOG_ERR, in init_netlink()
251 rc = send(inarp->nl_sd, &msg, sizeof(msg), MSG_NOSIGNAL); in init_netlink()
253 inarp_log(inarp, LOG_ERR, "Failed to query current links: %m"); in init_netlink()
260 close(inarp->nl_sd); in init_netlink()
264 static void netlink_nlmsg_dellink(struct inarp_ctx *inarp, in netlink_nlmsg_dellink() argument
272 inarp_log(inarp, LOG_NOTICE, "dropping interface: %s, [%s]", in netlink_nlmsg_dellink()
276 i = iface - inarp->interfaces; in netlink_nlmsg_dellink()
279 inarp->n_interfaces--; in netlink_nlmsg_dellink()
280 inarp->interfaces = realloc(inarp->interfaces, in netlink_nlmsg_dellink()
281 inarp->n_interfaces * sizeof(*iface)); in netlink_nlmsg_dellink()
283 sizeof(*iface) * (inarp->n_interfaces - i)); in netlink_nlmsg_dellink()
286 static void netlink_nlmsg_newlink(struct inarp_ctx *inarp, in netlink_nlmsg_newlink() argument
297 inarp->n_interfaces++; in netlink_nlmsg_newlink()
298 inarp->interfaces = realloc(inarp->interfaces, in netlink_nlmsg_newlink()
299 inarp->n_interfaces * sizeof(*iface)); in netlink_nlmsg_newlink()
300 iface = &inarp->interfaces[inarp->n_interfaces-1]; in netlink_nlmsg_newlink()
322 inarp_log(inarp, LOG_NOTICE, "%s interface: %s, [%s]", in netlink_nlmsg_newlink()
328 static void netlink_nlmsg(struct inarp_ctx *inarp, struct nlmsghdr *nlmsg) in netlink_nlmsg() argument
337 iface = find_interface_by_ifindex(inarp, ifmsg->ifi_index); in netlink_nlmsg()
341 netlink_nlmsg_dellink(inarp, iface); in netlink_nlmsg()
344 netlink_nlmsg_newlink(inarp, iface, ifmsg, len); in netlink_nlmsg()
351 static void netlink_recv(struct inarp_ctx *inarp) in netlink_recv() argument
357 len = recv(inarp->nl_sd, &buf, sizeof(buf), 0); in netlink_recv()
359 inarp_log(inarp, LOG_NOTICE, "Error receiving netlink msg"); in netlink_recv()
366 netlink_nlmsg(inarp, nlmsg); in netlink_recv()
369 static void arp_recv(struct inarp_ctx *inarp) in arp_recv() argument
379 len = recvfrom(inarp->arp_sd, &inarp_req, in arp_recv()
385 inarp_log(inarp, LOG_WARNING, in arp_recv()
399 iface = find_interface_by_ifindex(inarp, addr.sll_ifindex); in arp_recv()
415 inarp_log(inarp, LOG_DEBUG, in arp_recv()
419 rc = get_local_ipaddr(inarp, iface->ifname, &local_ip); in arp_recv()
424 inarp_log(inarp, LOG_DEBUG, in arp_recv()
429 send_arp_packet(inarp, iface->ifindex, in arp_recv()
438 struct inarp_ctx inarp; in main() local
441 memset(&inarp, 0, sizeof(inarp)); in main()
443 inarp.syslog = true; in main()
447 inarp.debug = true; in main()
449 inarp.syslog = false; in main()
452 if (inarp.syslog) in main()
455 inarp.arp_sd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)); in main()
456 if (inarp.arp_sd < 0) { in main()
457 inarp_log(&inarp, LOG_ERR, "Error opening ARP socket"); in main()
461 ret = init_netlink(&inarp); in main()
468 pollfds[0].fd = inarp.arp_sd; in main()
470 pollfds[1].fd = inarp.nl_sd; in main()
475 inarp_log(&inarp, LOG_ERR, "poll failed, exiting"); in main()
480 arp_recv(&inarp); in main()
483 netlink_recv(&inarp); in main()
487 close(inarp.arp_sd); in main()
488 close(inarp.nl_sd); in main()