Date: Wed, 4 Mar 2009 01:33:16 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r189332 - in user/kmacy/HEAD_fast_net_merge/sys: net netinet Message-ID: <200903040133.n241XGdk027097@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Wed Mar 4 01:33:16 2009 New Revision: 189332 URL: http://svn.freebsd.org/changeset/base/189332 Log: extend flowtable usage to other areas 186585, 186621, 186629, 186631 186585: - make ipv4 forwarding flowtable aware 186621: - initialize ro_dst at the beginning of ip_forward 186629: - make flowtable_lookup handle case of NULL mbuf 186631: - use flowtable_lookup in in_pcbladdr to avoid contending in calls to in_pcbconnect_setup when the laddr is not bound Modified: user/kmacy/HEAD_fast_net_merge/sys/net/flowtable.c user/kmacy/HEAD_fast_net_merge/sys/netinet/in_pcb.c user/kmacy/HEAD_fast_net_merge/sys/netinet/ip_input.c Modified: user/kmacy/HEAD_fast_net_merge/sys/net/flowtable.c ============================================================================== --- user/kmacy/HEAD_fast_net_merge/sys/net/flowtable.c Wed Mar 4 01:31:09 2009 (r189331) +++ user/kmacy/HEAD_fast_net_merge/sys/net/flowtable.c Wed Mar 4 01:33:16 2009 (r189332) @@ -334,26 +334,32 @@ ipv4_flow_lookup_hash_internal(struct mb uint32_t *key, uint16_t *flags, uint8_t *protop) { uint16_t sport = 0, dport = 0; - struct ip *ip = mtod(m, struct ip *); - uint8_t proto = ip->ip_p; - int iphlen = ip->ip_hl << 2; + struct ip *ip; + uint8_t proto = 0; + int iphlen; uint32_t hash; struct sockaddr_in *sin; struct tcphdr *th; struct udphdr *uh; struct sctphdr *sh; - key[0] = 0; - key[1] = ip->ip_src.s_addr; - key[2] = ip->ip_dst.s_addr; + if (flowtable_enable == 0) + return (0); sin = (struct sockaddr_in *)&ro->ro_dst; - sin->sin_family = AF_INET; - sin->sin_len = sizeof(*sin); - sin->sin_addr = ip->ip_dst; + KASSERT(sin->sin_family == AF_INET, + ("bad address passed")); + key[0] = 0; + key[1] = 0; + key[2] = sin->sin_addr.s_addr; - if (flowtable_enable == 0) - return (0); + if (m == NULL || (*flags & FL_HASH_PORTS) == 0) + goto skipports; + + ip = mtod(m, struct ip *); + proto = ip->ip_p; + iphlen = ip->ip_hl << 2; /* XXX options? */ + key[1] = ip->ip_src.s_addr; switch (proto) { case IPPROTO_TCP: @@ -394,8 +400,13 @@ ipv4_flow_lookup_hash_internal(struct mb ((uint16_t *)key)[0] = sport; ((uint16_t *)key)[1] = dport; +skipports: hash = hashword(key, 3, hashjitter + proto); - if (m->m_pkthdr.flowid == 0) +#ifdef notyet + if (m != NULL && (m->m_flags & M_FLOWID) == 0) +#else + if (m != NULL && m->m_pkthdr.flowid != 0) +#endif m->m_pkthdr.flowid = hash; CTR5(KTR_SPARE3, "proto=%d hash=%x key[0]=%x sport=%d dport=%d\n", proto, hash, key[0], sport, dport); @@ -564,7 +575,7 @@ flowtable_lookup(struct flowtable *ft, s struct flentry *fle; uint16_t flags; uint8_t proto = 0; - int cache = 1, error = 0; + int cache = 1, error = 0, fib = 0; struct rtentry *rt; struct llentry *lle; @@ -620,7 +631,10 @@ uncached: * of arpresolve with an rt_check variant that expected to * receive the route locked */ - ft->ft_rtalloc(ro, hash, M_GETFIB(m)); + if (m != NULL) + fib = M_GETFIB(m); + + ft->ft_rtalloc(ro, hash, fib); if (ro->ro_rt == NULL) error = ENETUNREACH; else { Modified: user/kmacy/HEAD_fast_net_merge/sys/netinet/in_pcb.c ============================================================================== --- user/kmacy/HEAD_fast_net_merge/sys/netinet/in_pcb.c Wed Mar 4 01:31:09 2009 (r189331) +++ user/kmacy/HEAD_fast_net_merge/sys/netinet/in_pcb.c Wed Mar 4 01:33:16 2009 (r189332) @@ -65,6 +65,7 @@ __FBSDID("$FreeBSD$"); #include <net/if_types.h> #include <net/if_llatbl.h> #include <net/route.h> +#include <net/flowtable.h> #include <netinet/in.h> #include <netinet/in_pcb.h> @@ -88,6 +89,7 @@ __FBSDID("$FreeBSD$"); #include <security/mac/mac_framework.h> +extern struct flowtable *ipv4_ft; #ifdef VIMAGE_GLOBALS /* * These configure the range of local port addresses assigned to @@ -643,11 +645,14 @@ in_pcbladdr(struct inpcb *inp, struct in * If route is known our src addr is taken from the i/f, * else punt. * + * XXX need to account for fibnum * Find out route to destination. */ if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0) + flowtable_lookup(ipv4_ft, NULL, &sro); +#if 0 in_rtalloc_ign(&sro, 0, inp->inp_inc.inc_fibnum); - +#endif /* * If we found a route, use the address corresponding to * the outgoing interface. @@ -811,8 +816,6 @@ in_pcbladdr(struct inpcb *inp, struct in } done: - if (sro.ro_rt != NULL) - RTFREE(sro.ro_rt); return (error); } Modified: user/kmacy/HEAD_fast_net_merge/sys/netinet/ip_input.c ============================================================================== --- user/kmacy/HEAD_fast_net_merge/sys/netinet/ip_input.c Wed Mar 4 01:31:09 2009 (r189331) +++ user/kmacy/HEAD_fast_net_merge/sys/netinet/ip_input.c Wed Mar 4 01:33:16 2009 (r189332) @@ -1349,8 +1349,10 @@ ip_forward(struct mbuf *m, int srcrt) struct in_ifaddr *ia = NULL; struct mbuf *mcopy; struct in_addr dest; + struct sockaddr_in *sin; struct route ro; int error, type = 0, code = 0, mtu = 0; + int flerror; if (m->m_flags & (M_BCAST|M_MCAST) || in_canforward(ip->ip_dst) == 0) { V_ipstat.ips_cantforward++; @@ -1368,8 +1370,18 @@ ip_forward(struct mbuf *m, int srcrt) #ifdef IPSTEALTH } #endif + bzero(&ro, sizeof(ro)); + sin = (struct sockaddr_in *)&ro.ro_dst; + sin->sin_family = AF_INET; + sin->sin_len = sizeof(*sin); + sin->sin_addr = ip->ip_dst; + + flerror = flowtable_lookup(ipv4_forward_ft, m, &ro); + if (flerror == 0) + ia = ifatoia(ro.ro_rt->rt_ifa); + else + ia = ip_rtaddr(ip->ip_dst, M_GETFIB(m)); - ia = ip_rtaddr(ip->ip_dst, M_GETFIB(m)); if (!srcrt && ia == NULL) { icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_HOST, 0, 0); return; @@ -1426,19 +1438,15 @@ ip_forward(struct mbuf *m, int srcrt) */ dest.s_addr = 0; if (!srcrt && V_ipsendredirects && ia->ia_ifp == m->m_pkthdr.rcvif) { - struct sockaddr_in *sin; struct rtentry *rt; - bzero(&ro, sizeof(ro)); - sin = (struct sockaddr_in *)&ro.ro_dst; - sin->sin_family = AF_INET; - sin->sin_len = sizeof(*sin); - sin->sin_addr = ip->ip_dst; - in_rtalloc_ign(&ro, 0, M_GETFIB(m)); + if (flerror != 0) + in_rtalloc_ign(&ro, 0, M_GETFIB(m)); rt = ro.ro_rt; - if (rt && (rt->rt_flags & (RTF_DYNAMIC|RTF_MODIFIED)) == 0 && + if (rt != NULL && + (rt->rt_flags & (RTF_DYNAMIC|RTF_MODIFIED)) == 0 && satosin(rt_key(rt))->sin_addr.s_addr != 0) { #define RTA(rt) ((struct in_ifaddr *)(rt->rt_ifa)) u_long src = ntohl(ip->ip_src.s_addr); @@ -1454,7 +1462,7 @@ ip_forward(struct mbuf *m, int srcrt) code = ICMP_REDIRECT_HOST; } } - if (rt) + if (rt && (flerror != 0)) RTFREE(rt); } @@ -1462,13 +1470,14 @@ ip_forward(struct mbuf *m, int srcrt) * Try to cache the route MTU from ip_output so we can consider it for * the ICMP_UNREACH_NEEDFRAG "Next-Hop MTU" field described in RFC1191. */ - bzero(&ro, sizeof(ro)); + if (flerror != 0) + bzero(&ro, sizeof(ro)); error = ip_output(m, NULL, &ro, IP_FORWARDING, NULL, NULL); if (error == EMSGSIZE && ro.ro_rt) mtu = ro.ro_rt->rt_rmx.rmx_mtu; - if (ro.ro_rt) + if (ro.ro_rt && flerror != 0) RTFREE(ro.ro_rt); if (error)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903040133.n241XGdk027097>