Date: Mon, 27 Oct 2008 05:23:40 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r184321 - in user/kmacy/HEAD_fast_xmit/sys: net netinet Message-ID: <200810270523.m9R5Neq1026477@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Mon Oct 27 05:23:40 2008 New Revision: 184321 URL: http://svn.freebsd.org/changeset/base/184321 Log: Hook rtentry_info use in to ip_output and ether_output in a non-disruptive albeit extremely hackish way Modified: user/kmacy/HEAD_fast_xmit/sys/net/if_ethersubr.c user/kmacy/HEAD_fast_xmit/sys/net/radix_mpath.h user/kmacy/HEAD_fast_xmit/sys/net/route.h user/kmacy/HEAD_fast_xmit/sys/netinet/if_ether.c user/kmacy/HEAD_fast_xmit/sys/netinet/ip_input.c user/kmacy/HEAD_fast_xmit/sys/netinet/ip_output.c user/kmacy/HEAD_fast_xmit/sys/netinet/ip_var.h Modified: user/kmacy/HEAD_fast_xmit/sys/net/if_ethersubr.c ============================================================================== --- user/kmacy/HEAD_fast_xmit/sys/net/if_ethersubr.c Mon Oct 27 05:19:26 2008 (r184320) +++ user/kmacy/HEAD_fast_xmit/sys/net/if_ethersubr.c Mon Oct 27 05:23:40 2008 (r184321) @@ -55,6 +55,7 @@ #include <net/if_arp.h> #include <net/netisr.h> #include <net/route.h> +#include <net/flowtable.h> #include <net/if_llc.h> #include <net/if_dl.h> #include <net/if_types.h> @@ -160,7 +161,8 @@ ether_output(struct ifnet *ifp, struct m u_char esrc[ETHER_ADDR_LEN], edst[ETHER_ADDR_LEN]; struct ether_header *eh; struct pf_mtag *t; - int loop_copy = 1; + struct rtentry_info *ri = NULL; + int riset = 0, loop_copy = 1; int hlen; /* link layer header length */ #ifdef MAC @@ -168,6 +170,17 @@ ether_output(struct ifnet *ifp, struct m if (error) senderr(error); #endif + /* + * XXX rather hackish interface to ip_output + * to pass an rtentry_info in + * + */ + if (dst == NULL) { + ri = (struct rtentry_info *)rt0; + dst = (struct sockaddr *)&ri->ri_dst; + riset = 1; + rt0 = NULL; + } M_PROFILE(m); if (ifp->if_flags & IFF_MONITOR) @@ -180,7 +193,11 @@ ether_output(struct ifnet *ifp, struct m switch (dst->sa_family) { #ifdef INET case AF_INET: - error = arpresolve(ifp, rt0, m, dst, edst); + error = 0; + if (riset && (ri->ri_flags && RTF_DESTEN_VALID)) + memcpy(edst, ri->ri_desten, ETHER_ADDR_LEN); + else + error = arpresolve(ifp, rt0, m, dst, edst); if (error) return (error == EWOULDBLOCK ? 0 : error); type = htons(ETHERTYPE_IP); Modified: user/kmacy/HEAD_fast_xmit/sys/net/radix_mpath.h ============================================================================== --- user/kmacy/HEAD_fast_xmit/sys/net/radix_mpath.h Mon Oct 27 05:19:26 2008 (r184320) +++ user/kmacy/HEAD_fast_xmit/sys/net/radix_mpath.h Mon Oct 27 05:23:40 2008 (r184321) @@ -58,11 +58,6 @@ int rt_mpath_deldup(struct rtentry *, st int rn4_mpath_inithead(void **, int); int rn6_mpath_inithead(void **, int); -uint32_t ipv4_flow_alloc(struct mbuf *m, struct route *ro); -void ipv4_flow_free(uint32_t hash); - -uint32_t ipv4_flow_lookup_hash(struct mbuf *m); -void ipv4_flow_free_all(struct rtentry *rt); #endif #endif /* _NET_RADIX_MPATH_H_ */ Modified: user/kmacy/HEAD_fast_xmit/sys/net/route.h ============================================================================== --- user/kmacy/HEAD_fast_xmit/sys/net/route.h Mon Oct 27 05:19:26 2008 (r184320) +++ user/kmacy/HEAD_fast_xmit/sys/net/route.h Mon Oct 27 05:23:40 2008 (r184321) @@ -148,9 +148,7 @@ struct rtentry { #ifdef _KERNEL /* XXX ugly, user apps use this definition but don't have a mtx def */ struct mtx rt_mtx; /* mutex for routing entry */ -#ifdef RADIX_MPATH - uint32_t rt_flow_head; -#endif + time_t rt_llinfo_uptime; /* last time the rt_llinfo changed */ #endif }; @@ -199,6 +197,7 @@ struct ortentry { #define RTF_BROADCAST 0x400000 /* route represents a bcast address */ #define RTF_MULTICAST 0x800000 /* route represents a mcast address */ /* 0x1000000 and up unassigned */ +#define RTF_DESTEN_VALID 0x80000000 /* rtentry_info L2 addr is valid */ /* Mask of RTF flags that are allowed to be modified by RTM_CHANGE. */ #define RTF_FMASK \ Modified: user/kmacy/HEAD_fast_xmit/sys/netinet/if_ether.c ============================================================================== --- user/kmacy/HEAD_fast_xmit/sys/netinet/if_ether.c Mon Oct 27 05:19:26 2008 (r184320) +++ user/kmacy/HEAD_fast_xmit/sys/netinet/if_ether.c Mon Oct 27 05:23:40 2008 (r184321) @@ -216,6 +216,7 @@ arp_rtrequest(int req, struct rtentry *r */ R_Zalloc(la, struct llinfo_arp *, sizeof(*la)); rt->rt_llinfo = (caddr_t)la; + rt->rt_llinfo_uptime = time_uptime; if (la == 0) { log(LOG_DEBUG, "%s: malloc failed\n", __func__); break; @@ -299,6 +300,7 @@ arp_rtrequest(int req, struct rtentry *r callout_stop(&la->la_timer); rt->rt_llinfo = NULL; rt->rt_flags &= ~RTF_LLINFO; + rt->rt_llinfo_uptime = time_uptime; RT_REMREF(rt); if (la->la_hold) m_freem(la->la_hold); Modified: user/kmacy/HEAD_fast_xmit/sys/netinet/ip_input.c ============================================================================== --- user/kmacy/HEAD_fast_xmit/sys/netinet/ip_input.c Mon Oct 27 05:19:26 2008 (r184320) +++ user/kmacy/HEAD_fast_xmit/sys/netinet/ip_input.c Mon Oct 27 05:23:40 2008 (r184321) @@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$"); #include <net/if_dl.h> #include <net/route.h> #include <net/netisr.h> +#include <net/flowtable.h> #include <netinet/in.h> #include <netinet/in_systm.h> @@ -211,6 +212,7 @@ SYSCTL_V_INT(V_NET, vnet_inet, _net_inet ip_fw_chk_t *ip_fw_chk_ptr = NULL; ip_dn_io_t *ip_dn_io_ptr = NULL; int fw_one_pass = 1; +struct flowtable *ipv4_ft; static void ip_freef(struct ipqhead *, struct ipq *); @@ -277,6 +279,8 @@ ip_init(void) ipintrq.ifq_maxlen = ipqmaxlen; mtx_init(&ipintrq.ifq_mtx, "ip_inq", NULL, MTX_DEF); netisr_register(NETISR_IP, ip_input, &ipintrq, 0); + + ipv4_ft = flowtable_alloc(2048, FL_LOCAL_XMIT|FL_PCPU); } void Modified: user/kmacy/HEAD_fast_xmit/sys/netinet/ip_output.c ============================================================================== --- user/kmacy/HEAD_fast_xmit/sys/netinet/ip_output.c Mon Oct 27 05:19:26 2008 (r184320) +++ user/kmacy/HEAD_fast_xmit/sys/netinet/ip_output.c Mon Oct 27 05:23:40 2008 (r184321) @@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$"); #ifdef RADIX_MPATH #include <net/radix_mpath.h> #endif +#include <net/flowtable.h> #include <netinet/in.h> #include <netinet/in_systm.h> @@ -97,6 +98,9 @@ static void ip_mloopback extern struct protosw inetsw[]; +extern struct flowtable *ipv4_ft; + + /* * IP output. The packet in mbuf chain m contains a skeletal IP * header (with len, off, ttl, proto, tos, src, dst). @@ -120,20 +124,27 @@ ip_output(struct mbuf *m, struct mbuf *o struct sockaddr_in *dst = NULL; /* keep compiler happy */ struct in_ifaddr *ia = NULL; int isbroadcast, sw_csum; - struct route iproute; + struct rtentry_info ipri, *ri; struct in_addr odst; #ifdef IPFIREWALL_FORWARD struct m_tag *fwd_tag = NULL; #endif M_ASSERTPKTHDR(m); - - if (ro == NULL) { - ro = &iproute; - bzero(ro, sizeof (*ro)); + if (inp != NULL) { + INP_LOCK_ASSERT(inp); + M_SETFIB(m, inp->inp_inc.inc_fibnum); } - if (inp != NULL) - INP_LOCK_ASSERT(inp); + if (flags & IP_RTINFO) /* ugly interface overload */ + ri = (struct rtentry_info *)ro; + else { + ri = &ipri; + bzero(ri, sizeof (*ri)); + if (ro) + route_to_rtentry_info(ro, NULL, ri); + else if (flowtable_lookup(ipv4_ft, m, ri)) + return (ENETUNREACH); + } if (opt) { len = 0; @@ -163,32 +174,9 @@ ip_output(struct mbuf *m, struct mbuf *o hlen = ip->ip_hl << 2; } - dst = (struct sockaddr_in *)&ro->ro_dst; + dst = (struct sockaddr_in *)&ri->ri_dst; again: /* - * If there is a cached route, - * check that it is to the same destination - * and is still up. If not, free it and try again. - * The address family should also be checked in case of sharing the - * cache with IPv6. - */ - if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 || - dst->sin_family != AF_INET || - dst->sin_addr.s_addr != ip->ip_dst.s_addr)) { - RTFREE(ro->ro_rt); - ro->ro_rt = (struct rtentry *)NULL; - } -#ifdef IPFIREWALL_FORWARD - if (ro->ro_rt == NULL && fwd_tag == NULL) { -#else - if (ro->ro_rt == NULL) { -#endif - bzero(dst, sizeof(*dst)); - dst->sin_family = AF_INET; - dst->sin_len = sizeof(*dst); - dst->sin_addr = ip->ip_dst; - } - /* * If routing to interface only, short circuit routing lookup. * The use of an all-ones broadcast address implies this; an * interface is specified by the broadcast address of an interface, @@ -231,7 +219,14 @@ again: * as this is probably required in all cases for correct * operation (as it is for ARP). */ - if (ro->ro_rt == NULL) + if ((ri->ri_flags & RTF_UP) == 0) { + error = flowtable_lookup(ipv4_ft, m, ri); + if (error) + goto bad; + + } +#ifdef nomore + #ifdef RADIX_MPATH rtalloc_mpath_fib(ro, ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr), @@ -245,13 +240,11 @@ again: error = EHOSTUNREACH; goto bad; } - ia = ifatoia(ro->ro_rt->rt_ifa); - ifp = ro->ro_rt->rt_ifp; - ro->ro_rt->rt_rmx.rmx_pksent++; - if (ro->ro_rt->rt_flags & RTF_GATEWAY) - dst = (struct sockaddr_in *)ro->ro_rt->rt_gateway; - if (ro->ro_rt->rt_flags & RTF_HOST) - isbroadcast = (ro->ro_rt->rt_flags & RTF_BROADCAST); +#endif + ia = ifatoia(ri->ri_ifa); + ifp = ri->ri_ifp; + if (ri->ri_flags & RTF_HOST) + isbroadcast = (ri->ri_flags & RTF_BROADCAST); else isbroadcast = in_broadcast(dst->sin_addr, ifp); } @@ -259,7 +252,7 @@ again: * Calculate MTU. If we have a route that is up, use that, * otherwise use the interface's MTU. */ - if (ro->ro_rt != NULL && (ro->ro_rt->rt_flags & (RTF_UP|RTF_HOST))) { + if (ri->ri_flags & (RTF_UP|RTF_HOST)) { /* * This case can happen if the user changed the MTU * of an interface after enabling IP on it. Because @@ -267,9 +260,9 @@ again: * them, there is no way for one to update all its * routes when the MTU is changed. */ - if (ro->ro_rt->rt_rmx.rmx_mtu > ifp->if_mtu) - ro->ro_rt->rt_rmx.rmx_mtu = ifp->if_mtu; - mtu = ro->ro_rt->rt_rmx.rmx_mtu; + if (ri->ri_mtu > ifp->if_mtu) + ri->ri_mtu = ifp->if_mtu; + mtu = ri->ri_mtu; } else { mtu = ifp->if_mtu; } @@ -278,12 +271,6 @@ again: m->m_flags |= M_MCAST; /* - * IP destination address is multicast. Make sure "dst" - * still points to the address in "ro". (It may have been - * changed to point to a gateway address, above.) - */ - dst = (struct sockaddr_in *)&ro->ro_dst; - /* * See if the caller provided any multicast options */ if (imo != NULL) { @@ -430,6 +417,10 @@ again: } sendit: +/* + * XXX we've broken IPSEC + * + */ #ifdef IPSEC switch(ip_ipsec_output(&m, inp, &flags, &error, &ro, &iproute, &dst, &ia, &ifp)) { case 1: @@ -498,7 +489,7 @@ sendit: /* Or forward to some other address? */ fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL); if (fwd_tag) { - dst = (struct sockaddr_in *)&ro->ro_dst; + dst = (struct sockaddr_in *)&ri->ri_dst; bcopy((fwd_tag+1), dst, sizeof(struct sockaddr_in)); m->m_flags |= M_SKIP_FIREWALL; m_tag_delete(m, fwd_tag); @@ -562,8 +553,17 @@ passout: */ m->m_flags &= ~(M_PROTOFLAGS); - error = (*ifp->if_output)(ifp, m, - (struct sockaddr *)dst, ro->ro_rt); + /* + * XXX rather hackish interface to ether_output + * to pass an rtentry_info in + * + */ + if (ifp->if_output == ether_output) + error = (*ifp->if_output)(ifp, m, + NULL, (struct rtentry *)ri); + else + error = (*ifp->if_output)(ifp, m, + (struct sockaddr *)dst, NULL); goto done; } @@ -596,8 +596,17 @@ passout: */ m->m_flags &= ~(M_PROTOFLAGS); - error = (*ifp->if_output)(ifp, m, - (struct sockaddr *)dst, ro->ro_rt); + /* + * XXX rather hackish interface to ether_output + * to pass an rtentry_info in + * + */ + if (ifp->if_output == ether_output) + error = (*ifp->if_output)(ifp, m, + NULL, (struct rtentry *)ri); + else + error = (*ifp->if_output)(ifp, m, + (struct sockaddr *)dst, NULL); } else m_freem(m); } @@ -606,9 +615,6 @@ passout: V_ipstat.ips_fragmented++; done: - if (ro == &iproute && ro->ro_rt) { - RTFREE(ro->ro_rt); - } return (error); bad: m_freem(m); Modified: user/kmacy/HEAD_fast_xmit/sys/netinet/ip_var.h ============================================================================== --- user/kmacy/HEAD_fast_xmit/sys/netinet/ip_var.h Mon Oct 27 05:19:26 2008 (r184320) +++ user/kmacy/HEAD_fast_xmit/sys/netinet/ip_var.h Mon Oct 27 05:23:40 2008 (r184321) @@ -158,6 +158,7 @@ struct ipstat { #define IP_SENDTOIF 0x8 /* send on specific ifnet */ #define IP_ROUTETOIF SO_DONTROUTE /* 0x10 bypass routing tables */ #define IP_ALLOWBROADCAST SO_BROADCAST /* 0x20 can send broadcast packets */ +#define IP_RTINFO 0x80 /* ip_output is passed an rtentry_info */ /* * mbuf flag used by ip_fastfwd
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810270523.m9R5Neq1026477>