Index: sys/netgraph/netflow/netflow.c =================================================================== --- sys/netgraph/netflow/netflow.c +++ sys/netgraph/netflow/netflow.c @@ -51,14 +51,19 @@ #include #include #include +#include +#include #include #include +#include #include #include #include #include #include +#include + #include #include @@ -151,18 +156,6 @@ } } -static inline int -ip6_masklen(struct in6_addr *saddr, struct rt_addrinfo *info) -{ - const int nbits = sizeof(*saddr) * NBBY; - int mlen; - - if (info->rti_addrs & RTA_NETMASK) - bit_count((bitstr_t *)saddr, 0, nbits, &mlen); - else - mlen = nbits; - return (mlen); -} #endif /* @@ -325,9 +318,6 @@ int plen, uint8_t flags, uint8_t tcp_flags) { struct flow_entry *fle; - struct sockaddr_in sin, sin_mask; - struct sockaddr_dl rt_gateway; - struct rt_addrinfo info; mtx_assert(&hsh->mtx, MA_OWNED); @@ -354,57 +344,37 @@ * fill in out_ifx, dst_mask, nexthop, and dst_as in future releases. */ if ((flags & NG_NETFLOW_CONF_NODSTLOOKUP) == 0) { - bzero(&sin, sizeof(sin)); - sin.sin_len = sizeof(struct sockaddr_in); - sin.sin_family = AF_INET; - sin.sin_addr = fle->f.r.r_dst; + struct rtentry *rt; + struct route_nhop_data rnd; - rt_gateway.sdl_len = sizeof(rt_gateway); - sin_mask.sin_len = sizeof(struct sockaddr_in); - bzero(&info, sizeof(info)); + rt = fib4_lookup_rt(r->fib, fle->f.r.r_dst, 0, NHR_NONE, &rnd); + if (rt != NULL) { + struct in_addr addr; + uint32_t scopeid; + struct nhop_object *nh = rnd.rnd_nhop; + int plen; - info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&rt_gateway; - info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&sin_mask; - - if (rib_lookup_info(r->fib, (struct sockaddr *)&sin, NHR_REF, 0, - &info) == 0) { - fle->f.fle_o_ifx = info.rti_ifp->if_index; - - if (info.rti_flags & RTF_GATEWAY && - rt_gateway.sdl_family == AF_INET) - fle->f.next_hop = - ((struct sockaddr_in *)&rt_gateway)->sin_addr; - - if (info.rti_addrs & RTA_NETMASK) - fle->f.dst_mask = bitcount32(sin_mask.sin_addr.s_addr); - else if (info.rti_flags & RTF_HOST) - /* Give up. We can't determine mask :( */ - fle->f.dst_mask = 32; - - rib_free_info(&info); + rt_get_inet_prefix_plen(rt, &addr, &plen, &scopeid); + fle->f.fle_o_ifx = nh->nh_ifp->if_index; + if (nh->gw_sa.sa_len == AF_INET) + fle->f.next_hop = nh->gw4_sa.sin_addr; + fle->f.dst_mask = plen; } } /* Do route lookup on source address, to fill in src_mask. */ if ((flags & NG_NETFLOW_CONF_NOSRCLOOKUP) == 0) { - bzero(&sin, sizeof(sin)); - sin.sin_len = sizeof(struct sockaddr_in); - sin.sin_family = AF_INET; - sin.sin_addr = fle->f.r.r_src; + struct rtentry *rt; + struct route_nhop_data rnd; - sin_mask.sin_len = sizeof(struct sockaddr_in); - bzero(&info, sizeof(info)); + rt = fib4_lookup_rt(r->fib, fle->f.r.r_src, 0, NHR_NONE, &rnd); + if (rt != NULL) { + struct in_addr addr; + uint32_t scopeid; + int plen; - info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&sin_mask; - - if (rib_lookup_info(r->fib, (struct sockaddr *)&sin, 0, 0, - &info) == 0) { - if (info.rti_addrs & RTA_NETMASK) - fle->f.src_mask = - bitcount32(sin_mask.sin_addr.s_addr); - else if (info.rti_flags & RTF_HOST) - /* Give up. We can't determine mask :( */ - fle->f.src_mask = 32; + rt_get_inet_prefix_plen(rt, &addr, &plen, &scopeid); + fle->f.src_mask = plen; } } @@ -420,9 +390,6 @@ int plen, uint8_t flags, uint8_t tcp_flags) { struct flow6_entry *fle6; - struct sockaddr_in6 sin6, sin6_mask; - struct sockaddr_dl rt_gateway; - struct rt_addrinfo info; mtx_assert(&hsh6->mtx, MA_OWNED); @@ -450,50 +417,38 @@ * fill in out_ifx, dst_mask, nexthop, and dst_as in future releases. */ if ((flags & NG_NETFLOW_CONF_NODSTLOOKUP) == 0) { - bzero(&sin6, sizeof(struct sockaddr_in6)); - sin6.sin6_len = sizeof(struct sockaddr_in6); - sin6.sin6_family = AF_INET6; - sin6.sin6_addr = r->dst.r_dst6; + struct rtentry *rt; + struct route_nhop_data rnd; - rt_gateway.sdl_len = sizeof(rt_gateway); - sin6_mask.sin6_len = sizeof(struct sockaddr_in6); - bzero(&info, sizeof(info)); + rt = fib6_lookup_rt(r->fib, &fle6->f.r.dst.r_dst6, 0, NHR_NONE, &rnd); + if (rt != NULL) { + struct in6_addr addr; + uint32_t scopeid; + struct nhop_object *nh = rnd.rnd_nhop; + int plen; - info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&rt_gateway; - info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&sin6_mask; - - if (rib_lookup_info(r->fib, (struct sockaddr *)&sin6, NHR_REF, - 0, &info) == 0) { - fle6->f.fle_o_ifx = info.rti_ifp->if_index; - - if (info.rti_flags & RTF_GATEWAY && - rt_gateway.sdl_family == AF_INET6) - fle6->f.n.next_hop6 = - ((struct sockaddr_in6 *)&rt_gateway)->sin6_addr; - - fle6->f.dst_mask = - ip6_masklen(&sin6_mask.sin6_addr, &info); - - rib_free_info(&info); + rt_get_inet6_prefix_plen(rt, &addr, &plen, &scopeid); + fle6->f.fle_o_ifx = nh->nh_ifp->if_index; + if (nh->gw_sa.sa_len == AF_INET6) + fle6->f.n.next_hop6 = nh->gw6_sa.sin6_addr; + fle6->f.dst_mask = plen; } } if ((flags & NG_NETFLOW_CONF_NOSRCLOOKUP) == 0) { /* Do route lookup on source address, to fill in src_mask. */ - bzero(&sin6, sizeof(struct sockaddr_in6)); - sin6.sin6_len = sizeof(struct sockaddr_in6); - sin6.sin6_family = AF_INET6; - sin6.sin6_addr = r->src.r_src6; + struct rtentry *rt; + struct route_nhop_data rnd; - sin6_mask.sin6_len = sizeof(struct sockaddr_in6); - bzero(&info, sizeof(info)); + rt = fib6_lookup_rt(r->fib, &fle6->f.r.src.r_src6, 0, NHR_NONE, &rnd); + if (rt != NULL) { + struct in6_addr addr; + uint32_t scopeid; + int plen; - info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&sin6_mask; - - if (rib_lookup_info(r->fib, (struct sockaddr *)&sin6, 0, 0, - &info) == 0) - fle6->f.src_mask = - ip6_masklen(&sin6_mask.sin6_addr, &info); + rt_get_inet6_prefix_plen(rt, &addr, &plen, &scopeid); + fle6->f.src_mask = plen; + } } /* Push new flow at the and of hash. */