Lines Matching refs:neigh_handler
121 static struct nl_addr *get_neigh_mac(struct get_neigh_handler *neigh_handler) in get_neigh_mac() argument
129 neigh = rtnl_neigh_get(neigh_handler->neigh_cache, in get_neigh_mac()
130 neigh_handler->oif, in get_neigh_mac()
131 neigh_handler->dst); in get_neigh_mac()
145 struct get_neigh_handler *neigh_handler = in get_neigh_cb_event() local
150 (struct nl_object *)neigh_handler->filter_neigh)) { in get_neigh_cb_event()
153 if (neigh_handler->found_ll_addr == NULL) { in get_neigh_cb_event()
157 neigh_handler->found_ll_addr = in get_neigh_cb_event()
165 struct get_neigh_handler *neigh_handler = in get_neigh_cb() local
168 if (nl_msg_parse(msg, &get_neigh_cb_event, neigh_handler) < 0) in get_neigh_cb()
174 static void set_neigh_filter(struct get_neigh_handler *neigh_handler, in set_neigh_filter() argument
176 neigh_handler->filter_neigh = filter; in set_neigh_filter()
197 static int create_socket(struct get_neigh_handler *neigh_handler, in create_socket() argument
208 err = nl_addr_fill_sockaddr(neigh_handler->src, in create_socket()
217 err = nl_addr_fill_sockaddr(neigh_handler->dst, in create_socket()
226 neigh_handler->oif); in create_socket()
250 static int create_timer(struct get_neigh_handler *neigh_handler) in create_timer() argument
252 int user_timeout = neigh_handler->timeout/NUM_OF_TRIES; in create_timer()
264 if (neigh_handler->timeout) { in create_timer()
298 struct get_neigh_handler *neigh_handler) in process_get_neigh_mac() argument
301 struct nl_addr *ll_addr = get_neigh_mac(neigh_handler); in process_get_neigh_mac()
316 err = nl_socket_add_membership(neigh_handler->sock, in process_get_neigh_mac()
321 neigh_filter = create_filter_neigh_for_dst(neigh_handler->dst, in process_get_neigh_mac()
322 neigh_handler->oif); in process_get_neigh_mac()
326 set_neigh_filter(neigh_handler, neigh_filter); in process_get_neigh_mac()
328 nl_socket_disable_seq_check(neigh_handler->sock); in process_get_neigh_mac()
329 nl_socket_modify_cb(neigh_handler->sock, NL_CB_VALID, NL_CB_CUSTOM, in process_get_neigh_mac()
330 &get_neigh_cb, neigh_handler); in process_get_neigh_mac()
332 fd = nl_socket_get_fd(neigh_handler->sock); in process_get_neigh_mac()
334 err = create_socket(neigh_handler, &addr_dst, &sock_fd); in process_get_neigh_mac()
343 timer_fd = create_timer(neigh_handler); in process_get_neigh_mac()
360 nl_recvmsgs_default(neigh_handler->sock); in process_get_neigh_mac()
361 if (neigh_handler->found_ll_addr) in process_get_neigh_mac()
364 nl_cache_refill(neigh_handler->sock, in process_get_neigh_mac()
365 neigh_handler->neigh_cache); in process_get_neigh_mac()
366 ll_addr = get_neigh_mac(neigh_handler); in process_get_neigh_mac()
395 return ll_addr ? ll_addr : neigh_handler->found_ll_addr; in process_get_neigh_mac()
513 struct get_neigh_handler *neigh_handler = in get_route_cb_parser() local
530 nl_addr_put(neigh_handler->dst); in get_route_cb_parser()
531 neigh_handler->dst = nl_addr_clone(gateway); in get_route_cb_parser()
542 if (!neigh_handler->src && src) in get_route_cb_parser()
543 neigh_handler->src = nl_addr_clone(src); in get_route_cb_parser()
545 if (neigh_handler->oif < 0 && oif > 0) in get_route_cb_parser()
546 neigh_handler->oif = oif; in get_route_cb_parser()
552 link = rtnl_link_get(neigh_handler->link_cache, in get_route_cb_parser()
553 neigh_handler->oif); in get_route_cb_parser()
563 neigh_handler->found_ll_addr = nl_addr_clone(lladdr); in get_route_cb_parser()
567 neigh_handler->dst, in get_route_cb_parser()
568 &neigh_handler->found_ll_addr); in get_route_cb_parser()
576 if (neigh_handler->src) { in get_route_cb_parser()
577 nl_addr_put(neigh_handler->src); in get_route_cb_parser()
578 neigh_handler->src = NULL; in get_route_cb_parser()
584 struct get_neigh_handler *neigh_handler = in get_route_cb() local
588 err = nl_msg_parse(msg, &get_route_cb_parser, neigh_handler); in get_route_cb()
594 if (!neigh_handler->dst || !neigh_handler->src || in get_route_cb()
595 neigh_handler->oif <= 0) { in get_route_cb()
600 if (NULL != neigh_handler->found_ll_addr) in get_route_cb()
603 neigh_handler->found_ll_addr = in get_route_cb()
604 process_get_neigh_mac(neigh_handler); in get_route_cb()
607 return neigh_handler->found_ll_addr ? 0 : -1; in get_route_cb()
610 int neigh_get_oif_from_src(struct get_neigh_handler *neigh_handler) in neigh_get_oif_from_src() argument
616 err = nl_addr_info(neigh_handler->src, &src_info); in neigh_get_oif_from_src()
637 int neigh_init_resources(struct get_neigh_handler *neigh_handler, int timeout) in neigh_init_resources() argument
642 neigh_handler->sock = nl_socket_alloc(); in neigh_init_resources()
643 if (neigh_handler->sock == NULL) { in neigh_init_resources()
648 err = nl_connect(neigh_handler->sock, NETLINK_ROUTE); in neigh_init_resources()
652 err = rtnl_link_alloc_cache(neigh_handler->sock, AF_UNSPEC, in neigh_init_resources()
653 &neigh_handler->link_cache); in neigh_init_resources()
660 nl_cache_mngt_provide(neigh_handler->link_cache); in neigh_init_resources()
662 err = rtnl_route_alloc_cache(neigh_handler->sock, AF_UNSPEC, 0, in neigh_init_resources()
663 &neigh_handler->route_cache); in neigh_init_resources()
670 nl_cache_mngt_provide(neigh_handler->route_cache); in neigh_init_resources()
672 err = rtnl_neigh_alloc_cache(neigh_handler->sock, in neigh_init_resources()
673 &neigh_handler->neigh_cache); in neigh_init_resources()
679 nl_cache_mngt_provide(neigh_handler->neigh_cache); in neigh_init_resources()
682 neigh_handler->timeout = timeout; in neigh_init_resources()
683 neigh_handler->oif = -1; in neigh_init_resources()
684 neigh_handler->filter_neigh = NULL; in neigh_init_resources()
685 neigh_handler->found_ll_addr = NULL; in neigh_init_resources()
686 neigh_handler->dst = NULL; in neigh_init_resources()
687 neigh_handler->src = NULL; in neigh_init_resources()
688 neigh_handler->vid = -1; in neigh_init_resources()
693 nl_cache_mngt_unprovide(neigh_handler->route_cache); in neigh_init_resources()
694 nl_cache_free(neigh_handler->route_cache); in neigh_init_resources()
695 neigh_handler->route_cache = NULL; in neigh_init_resources()
697 nl_cache_mngt_unprovide(neigh_handler->link_cache); in neigh_init_resources()
698 nl_cache_free(neigh_handler->link_cache); in neigh_init_resources()
699 neigh_handler->link_cache = NULL; in neigh_init_resources()
701 nl_close(neigh_handler->sock); in neigh_init_resources()
703 nl_socket_free(neigh_handler->sock); in neigh_init_resources()
704 neigh_handler->sock = NULL; in neigh_init_resources()
708 uint16_t neigh_get_vlan_id_from_dev(struct get_neigh_handler *neigh_handler) in neigh_get_vlan_id_from_dev() argument
713 link = rtnl_link_get(neigh_handler->link_cache, neigh_handler->oif); in neigh_get_vlan_id_from_dev()
725 void neigh_set_vlan_id(struct get_neigh_handler *neigh_handler, uint16_t vid) in neigh_set_vlan_id() argument
728 neigh_handler->vid = vid; in neigh_set_vlan_id()
731 int neigh_set_dst(struct get_neigh_handler *neigh_handler, in neigh_set_dst() argument
734 neigh_handler->dst = nl_addr_build(family, buf, size); in neigh_set_dst()
735 return neigh_handler->dst == NULL; in neigh_set_dst()
738 int neigh_set_src(struct get_neigh_handler *neigh_handler, in neigh_set_src() argument
741 neigh_handler->src = nl_addr_build(family, buf, size); in neigh_set_src()
742 return neigh_handler->src == NULL; in neigh_set_src()
745 void neigh_set_oif(struct get_neigh_handler *neigh_handler, int oif) in neigh_set_oif() argument
747 neigh_handler->oif = oif; in neigh_set_oif()
750 int neigh_get_ll(struct get_neigh_handler *neigh_handler, void *addr_buff, in neigh_get_ll() argument
754 if (neigh_handler->found_ll_addr == NULL) in neigh_get_ll()
757 neigh_len = nl_addr_get_len(neigh_handler->found_ll_addr); in neigh_get_ll()
762 memcpy(addr_buff, nl_addr_get_binary_addr(neigh_handler->found_ll_addr), in neigh_get_ll()
768 void neigh_free_resources(struct get_neigh_handler *neigh_handler) in neigh_free_resources() argument
771 if (neigh_handler->filter_neigh != NULL) { in neigh_free_resources()
772 rtnl_neigh_put(neigh_handler->filter_neigh); in neigh_free_resources()
773 neigh_handler->filter_neigh = NULL; in neigh_free_resources()
776 if (neigh_handler->src != NULL) { in neigh_free_resources()
777 nl_addr_put(neigh_handler->src); in neigh_free_resources()
778 neigh_handler->src = NULL; in neigh_free_resources()
781 if (neigh_handler->dst != NULL) { in neigh_free_resources()
782 nl_addr_put(neigh_handler->dst); in neigh_free_resources()
783 neigh_handler->dst = NULL; in neigh_free_resources()
786 if (neigh_handler->found_ll_addr != NULL) { in neigh_free_resources()
787 nl_addr_put(neigh_handler->found_ll_addr); in neigh_free_resources()
788 neigh_handler->found_ll_addr = NULL; in neigh_free_resources()
791 if (neigh_handler->neigh_cache != NULL) { in neigh_free_resources()
792 nl_cache_mngt_unprovide(neigh_handler->neigh_cache); in neigh_free_resources()
793 nl_cache_free(neigh_handler->neigh_cache); in neigh_free_resources()
794 neigh_handler->neigh_cache = NULL; in neigh_free_resources()
797 if (neigh_handler->route_cache != NULL) { in neigh_free_resources()
798 nl_cache_mngt_unprovide(neigh_handler->route_cache); in neigh_free_resources()
799 nl_cache_free(neigh_handler->route_cache); in neigh_free_resources()
800 neigh_handler->route_cache = NULL; in neigh_free_resources()
803 if (neigh_handler->link_cache != NULL) { in neigh_free_resources()
804 nl_cache_mngt_unprovide(neigh_handler->link_cache); in neigh_free_resources()
805 nl_cache_free(neigh_handler->link_cache); in neigh_free_resources()
806 neigh_handler->link_cache = NULL; in neigh_free_resources()
809 if (neigh_handler->sock != NULL) { in neigh_free_resources()
810 nl_close(neigh_handler->sock); in neigh_free_resources()
811 nl_socket_free(neigh_handler->sock); in neigh_free_resources()
812 neigh_handler->sock = NULL; in neigh_free_resources()
816 int process_get_neigh(struct get_neigh_handler *neigh_handler) in process_get_neigh() argument
820 .rtm_family = nl_addr_get_family(neigh_handler->dst), in process_get_neigh()
821 .rtm_dst_len = nl_addr_get_prefixlen(neigh_handler->dst), in process_get_neigh()
832 nla_put_addr(m, RTA_DST, neigh_handler->dst); in process_get_neigh()
834 if (neigh_handler->oif > 0) in process_get_neigh()
835 nla_put_u32(m, RTA_OIF, neigh_handler->oif); in process_get_neigh()
837 err = nl_send_auto_complete(neigh_handler->sock, m); in process_get_neigh()
842 nl_socket_modify_cb(neigh_handler->sock, NL_CB_VALID, in process_get_neigh()
843 NL_CB_CUSTOM, &get_route_cb, neigh_handler); in process_get_neigh()
845 err = nl_recvmsgs_default(neigh_handler->sock); in process_get_neigh()