svn commit: r287047 - in projects/routing/sys: net netinet

Alexander V. Chernikov melifaro at freebsd.org
Mon Aug 24 07:28:58 UTC 2015


24.08.2015, 10:25, "Julian Elischer" <julian at freebsd.org>:
> On 8/24/15 2:15 AM, Alexander V. Chernikov wrote:
>>  Author: melifaro
>>  Date: Sun Aug 23 18:15:18 2015
>>  New Revision: 287047
>>  URL: https://svnweb.freebsd.org/changeset/base/287047
>>
>>  Log:
>>     Rename ip_sendmbuf to fib4_sendmbuf() and move it to
>>      rt_nhops api. Convert IPv4 SAS to use new routing api.
>>
>>  Modified:
>>     projects/routing/sys/net/rt_nhops.c
>>     projects/routing/sys/net/rt_nhops.h
>>     projects/routing/sys/netinet/in_pcb.c
>>     projects/routing/sys/netinet/ip_output.c
>
> I object to some small aspects of this. you are moving
> inet specific code out of the inet files into the
> protocol independent files. please don't do this..
> and if they are in Proto-indep. files htey need to be guarded by
> #ifdef INET
> (or whatever it is.). better to leave them in the inet files I think..
Yes, you're right. The original idea besides rt_nhops.c was just to have new file not to interfere with anything existing.
Now when I have some sort of established API I plan to move all those af-dependent functions to somewhere like
netinet/in_fib.c / netinet6/in6_fib.c
Does this look good for you?

>
>>  Modified: projects/routing/sys/net/rt_nhops.c
>>  ==============================================================================
>>  --- projects/routing/sys/net/rt_nhops.c Sun Aug 23 18:14:30 2015 (r287046)
>>  +++ projects/routing/sys/net/rt_nhops.c Sun Aug 23 18:15:18 2015 (r287047)
>>  @@ -315,7 +315,8 @@ fib4_lookup_prepend(uint32_t fibnum, str
>>                     * It should be already presented if we're
>>                     * sending data via known gateway.
>>                     */
>>  - error = arpresolve_fast(lifp, gw, m->m_flags, eh->ether_dhost);
>>  + error = arpresolve_fast(lifp, gw, m ? m->m_flags : 0,
>>  + eh->ether_dhost);
>>                    if (error == 0) {
>>                            memcpy(&eh->ether_shost, IF_LLADDR(lifp), ETHER_ADDR_LEN);
>>                            eh->ether_type = htons(ETHERTYPE_IP);
>>  @@ -332,6 +333,46 @@ fib4_lookup_prepend(uint32_t fibnum, str
>>            return (0);
>>    }
>>
>>  +int
>>  +fib4_sendmbuf(struct ifnet *ifp, struct mbuf *m, struct nhop_data *nh,
>>  + struct in_addr dst)
>>  +{
>>  + int error;
>>  +
>>  + if (nh != NULL && (nh->nh_flags & NH_FLAGS_L2_INCOMPLETE) == 0) {
>>  +
>>  + /*
>>  + * Fast path case. Most packets should
>>  + * be sent from here.
>>  + * TODO: Make special ifnet
>>  + * 'if_output_frame' handler for that.
>>  + */
>>  + struct route_compat rc;
>>  + struct ether_header *eh;
>>  + rc.ro_flags = AF_INET << 8 | RT_NHOP;
>>  + rc.ro_nh = nh;
>>  +
>>  + M_PREPEND(m, nh->nh_count, M_NOWAIT);
>>  + if (m == NULL)
>>  + return (ENOBUFS);
>>  + eh = mtod(m, struct ether_header *);
>>  + memcpy(eh, nh->d.data, nh->nh_count);
>>  + error = (*ifp->if_output)(ifp, m,
>>  + NULL, (struct route *)&rc);
>>  + } else {
>>  + struct sockaddr_in gw_out;
>>  + memset(&gw_out, 0, sizeof(gw_out));
>>  + gw_out.sin_len = sizeof(gw_out);
>>  + gw_out.sin_family = AF_INET;
>>  + gw_out.sin_addr = nh ? nh->d.gw4 : dst;
>>  + error = (*ifp->if_output)(ifp, m,
>>  + (const struct sockaddr *)&gw_out, NULL);
>>  + }
>>  +
>>  + return (error);
>>  +}
>>  +
>>  +
>>    static void
>>    fib4_rte_to_nh_extended(struct rtentry *rte, struct in_addr dst,
>>        struct nhop4_extended *pnh4)
>>
>>  Modified: projects/routing/sys/net/rt_nhops.h
>>  ==============================================================================
>>  --- projects/routing/sys/net/rt_nhops.h Sun Aug 23 18:14:30 2015 (r287046)
>>  +++ projects/routing/sys/net/rt_nhops.h Sun Aug 23 18:15:18 2015 (r287047)
>>  @@ -198,6 +198,9 @@ void fib4_choose_prepend(uint32_t fibnum
>>    int fib4_lookup_prepend(uint32_t fibnum, struct in_addr dst, struct mbuf *m,
>>        struct nhop_data *nh, struct nhop4_extended *nh_ext);
>>
>>  +int fib4_sendmbuf(struct ifnet *ifp, struct mbuf *m, struct nhop_data *nh,
>>  + struct in_addr dst);
>>  +
>>    void fib6_free_nh(uint32_t fibnum, struct nhop_data *nh);
>>    void fib6_choose_prepend(uint32_t fibnum, struct nhop_data *nh_src,
>>        uint32_t flowid, struct nhop_data *nh, struct nhop6_extended *nh_ext);
>>
>>  Modified: projects/routing/sys/netinet/in_pcb.c
>>  ==============================================================================
>>  --- projects/routing/sys/netinet/in_pcb.c Sun Aug 23 18:14:30 2015 (r287046)
>>  +++ projects/routing/sys/netinet/in_pcb.c Sun Aug 23 18:15:18 2015 (r287047)
>>  @@ -93,6 +93,7 @@ __FBSDID("$FreeBSD$");
>>    #include <netinet6/in6_var.h>
>>    #include <netinet6/ip6_var.h>
>>    #endif /* INET6 */
>>  +#include <net/rt_nhops.h>
>>
>>    #ifdef IPSEC
>>  @@ -756,8 +757,10 @@ in_pcbladdr(struct inpcb *inp, struct in
>>    {
>>            struct ifaddr *ifa;
>>            struct sockaddr *sa;
>>  - struct sockaddr_in *sin;
>>  - struct route sro;
>>  + struct sockaddr_in *sin, sin_storage;
>>  + struct nhop_data nhd, *pnhd;
>>  + struct nhop4_extended nh_ext;
>>  + u_int fibnum;
>>            int error;
>>
>>            KASSERT(laddr != NULL, ("%s: laddr NULL", __func__));
>>  @@ -770,9 +773,8 @@ in_pcbladdr(struct inpcb *inp, struct in
>>                    return (0);
>>
>>            error = 0;
>>  - bzero(&sro, sizeof(sro));
>>
>>  - sin = (struct sockaddr_in *)&sro.ro_dst;
>>  + sin = &sin_storage;
>>            sin->sin_family = AF_INET;
>>            sin->sin_len = sizeof(struct sockaddr_in);
>>            sin->sin_addr.s_addr = faddr->s_addr;
>>  @@ -783,8 +785,17 @@ in_pcbladdr(struct inpcb *inp, struct in
>>             *
>>             * Find out route to destination.
>>             */
>>  + fibnum = inp->inp_inc.inc_fibnum;
>>  + pnhd = &nhd;
>>  + memset(&nhd, 0, sizeof(nhd));
>>  + memset(&nh_ext, 0, sizeof(nh_ext));
>>            if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0)
>>  - in_rtalloc_ign(&sro, 0, inp->inp_inc.inc_fibnum);
>>  + error = fib4_lookup_prepend(fibnum, *faddr,
>>  + NULL, &nhd, &nh_ext);
>>  + if (error != 0) {
>>  + pnhd = NULL;
>>  + error = 0;
>>  + }
>>
>>            /*
>>             * If we found a route, use the address corresponding to
>>  @@ -794,7 +805,7 @@ in_pcbladdr(struct inpcb *inp, struct in
>>             * network and try to find a corresponding interface to take
>>             * the source address from.
>>             */
>>  - if (sro.ro_rt == NULL || sro.ro_rt->rt_ifp == NULL) {
>>  + if (pnhd == NULL) {
>>                    struct in_ifaddr *ia;
>>                    struct ifnet *ifp;
>>
>>  @@ -850,23 +861,22 @@ in_pcbladdr(struct inpcb *inp, struct in
>>             * belonging to this jail. If so use it.
>>             * 3. as a last resort return the 'default' jail address.
>>             */
>>  - if ((sro.ro_rt->rt_ifp->if_flags & IFF_LOOPBACK) == 0) {
>>  + if ((nh_ext.nh_ifp->if_flags & IFF_LOOPBACK) == 0) {
>>                    struct in_ifaddr *ia;
>>                    struct ifnet *ifp;
>>  + struct in_addr addr;
>>
>>                    /* If not jailed, use the default returned. */
>>                    if (cred == NULL || !prison_flag(cred, PR_IP4)) {
>>  - ia = (struct in_ifaddr *)sro.ro_rt->rt_ifa;
>>  - laddr->s_addr = ia->ia_addr.sin_addr.s_addr;
>>  + laddr->s_addr = nh_ext.nh_src.s_addr;
>>                            goto done;
>>                    }
>>
>>                    /* Jailed. */
>>                    /* 1. Check if the iface address belongs to the jail. */
>>  - sin = (struct sockaddr_in *)sro.ro_rt->rt_ifa->ifa_addr;
>>  - if (prison_check_ip4(cred, &sin->sin_addr) == 0) {
>>  - ia = (struct in_ifaddr *)sro.ro_rt->rt_ifa;
>>  - laddr->s_addr = ia->ia_addr.sin_addr.s_addr;
>>  + addr = nh_ext.nh_src;
>>  + if (prison_check_ip4(cred, &addr) == 0) {
>>  + laddr->s_addr = nh_ext.nh_src.s_addr;
>>                            goto done;
>>                    }
>>
>>  @@ -875,7 +885,7 @@ in_pcbladdr(struct inpcb *inp, struct in
>>                     * belonging to this jail.
>>                     */
>>                    ia = NULL;
>>  - ifp = sro.ro_rt->rt_ifp;
>>  + ifp = nh_ext.nh_ifp;
>>                    IF_ADDR_RLOCK(ifp);
>>                    TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
>>                            sa = ifa->ifa_addr;
>>  @@ -908,7 +918,7 @@ in_pcbladdr(struct inpcb *inp, struct in
>>             * In case of jails, check that it is an address of the jail
>>             * and if we cannot find, fall back to the 'default' jail address.
>>             */
>>  - if ((sro.ro_rt->rt_ifp->if_flags & IFF_LOOPBACK) != 0) {
>>  + if ((nh_ext.nh_ifp->if_flags & IFF_LOOPBACK) != 0) {
>>                    struct sockaddr_in sain;
>>                    struct in_ifaddr *ia;
>>
>>  @@ -969,8 +979,8 @@ in_pcbladdr(struct inpcb *inp, struct in
>>            }
>>
>>    done:
>>  - if (sro.ro_rt != NULL)
>>  - RTFREE(sro.ro_rt);
>>  + if (pnhd != NULL)
>>  + fib4_free_nh(fibnum, pnhd);
>>            return (error);
>>    }
>>
>>  Modified: projects/routing/sys/netinet/ip_output.c
>>  ==============================================================================
>>  --- projects/routing/sys/netinet/ip_output.c Sun Aug 23 18:14:30 2015 (r287046)
>>  +++ projects/routing/sys/netinet/ip_output.c Sun Aug 23 18:15:18 2015 (r287047)
>>  @@ -102,9 +102,6 @@ SYSCTL_INT(_net_inet_ip, OID_AUTO, mbuf_
>>    #endif
>>
>>    static void ip_mloopback (struct ifnet *, struct mbuf *, int);
>>  -static inline int ip_sendmbuf(struct ifnet *ifp, struct mbuf *m,
>>  - struct nhop_data *nh, struct in_addr dst);
>>  -
>>
>>    extern int in_mcast_loop;
>>    extern struct protosw inetsw[];
>>  @@ -651,7 +648,7 @@ sendit:
>>                     */
>>                    m_clrprotoflags(m);
>>                    IP_PROBE(send, NULL, NULL, ip, ifp, ip, NULL);
>>  - error = ip_sendmbuf(ifp, m, nh, dst);
>>  + error = fib4_sendmbuf(ifp, m, nh, dst);
>>                    goto done;
>>            }
>>
>>  @@ -688,7 +685,7 @@ sendit:
>>                            m_clrprotoflags(m);
>>
>>                            IP_PROBE(send, NULL, NULL, ip, ifp, ip, NULL);
>>  - error = ip_sendmbuf(ifp, m, nh, dst);
>>  + error = fib4_sendmbuf(ifp, m, nh, dst);
>>                    } else
>>                            m_freem(m);
>>            }
>>  @@ -706,45 +703,6 @@ bad:
>>            goto done;
>>    }
>>
>>  -static inline int
>>  -ip_sendmbuf(struct ifnet *ifp, struct mbuf *m, struct nhop_data *nh,
>>  - struct in_addr dst)
>>  -{
>>  - int error;
>>  -
>>  - if (nh != NULL && (nh->nh_flags & NH_FLAGS_L2_INCOMPLETE) == 0) {
>>  -
>>  - /*
>>  - * Fast path case. Most packets should
>>  - * be sent from here.
>>  - * TODO: Make special ifnet
>>  - * 'if_output_frame' handler for that.
>>  - */
>>  - struct route_compat rc;
>>  - struct ether_header *eh;
>>  - rc.ro_flags = AF_INET << 8 | RT_NHOP;
>>  - rc.ro_nh = nh;
>>  -
>>  - M_PREPEND(m, nh->nh_count, M_NOWAIT);
>>  - if (m == NULL)
>>  - return (ENOBUFS);
>>  - eh = mtod(m, struct ether_header *);
>>  - memcpy(eh, nh->d.data, nh->nh_count);
>>  - error = (*ifp->if_output)(ifp, m,
>>  - NULL, (struct route *)&rc);
>>  - } else {
>>  - struct sockaddr_in gw_out;
>>  - memset(&gw_out, 0, sizeof(gw_out));
>>  - gw_out.sin_len = sizeof(gw_out);
>>  - gw_out.sin_family = AF_INET;
>>  - gw_out.sin_addr = nh ? nh->d.gw4 : dst;
>>  - error = (*ifp->if_output)(ifp, m,
>>  - (const struct sockaddr *)&gw_out, NULL);
>>  - }
>>  -
>>  - return (error);
>>  -}
>>  -
>>    /*
>>     * Create a chain of fragments which fit the given mtu. m_frag points to the
>>     * mbuf to be fragmented; on return it points to the chain with the fragments.


More information about the svn-src-projects mailing list