svn commit: r206066 - stable/8/sys/netinet
Qing Li
qingli at FreeBSD.org
Fri Apr 2 04:58:18 UTC 2010
Author: qingli
Date: Fri Apr 2 04:58:17 2010
New Revision: 206066
URL: http://svn.freebsd.org/changeset/base/206066
Log:
MFC 201131
introduce a local variable rte acting as a cache of ro->ro_rt
within ip_output, achieving (in random order of importance):
- a reduction of the number of 'r's in the source code;
- improved legibility;
- a reduction of 64 bytes in the .text
Modified:
stable/8/sys/netinet/ip_output.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/net/ (props changed)
Modified: stable/8/sys/netinet/ip_output.c
==============================================================================
--- stable/8/sys/netinet/ip_output.c Fri Apr 2 04:42:02 2010 (r206065)
+++ stable/8/sys/netinet/ip_output.c Fri Apr 2 04:58:17 2010 (r206066)
@@ -128,6 +128,7 @@ ip_output(struct mbuf *m, struct mbuf *o
struct in_ifaddr *ia = NULL;
int isbroadcast, sw_csum;
struct route iproute;
+ struct rtentry *rte; /* cache for ro->ro_rt */
struct in_addr odst;
#ifdef IPFIREWALL_FORWARD
struct m_tag *fwd_tag = NULL;
@@ -205,18 +206,19 @@ 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 ||
+ rte = ro->ro_rt;
+ if (rte && ((rte->rt_flags & RTF_UP) == 0 ||
dst->sin_family != AF_INET ||
dst->sin_addr.s_addr != ip->ip_dst.s_addr)) {
if (!nortfree)
- RTFREE(ro->ro_rt);
- ro->ro_rt = (struct rtentry *)NULL;
+ RTFREE(rte);
+ rte = ro->ro_rt = (struct rtentry *)NULL;
ro->ro_lle = (struct llentry *)NULL;
}
#ifdef IPFIREWALL_FORWARD
- if (ro->ro_rt == NULL && fwd_tag == NULL) {
+ if (rte == NULL && fwd_tag == NULL) {
#else
- if (ro->ro_rt == NULL) {
+ if (rte == NULL) {
#endif
bzero(dst, sizeof(*dst));
dst->sin_family = AF_INET;
@@ -266,7 +268,7 @@ again:
* as this is probably required in all cases for correct
* operation (as it is for ARP).
*/
- if (ro->ro_rt == NULL)
+ if (rte == NULL) {
#ifdef RADIX_MPATH
rtalloc_mpath_fib(ro,
ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr),
@@ -275,7 +277,9 @@ again:
in_rtalloc_ign(ro, 0,
inp ? inp->inp_inc.inc_fibnum : M_GETFIB(m));
#endif
- if (ro->ro_rt == NULL) {
+ rte = ro->ro_rt;
+ }
+ if (rte == NULL) {
#ifdef IPSEC
/*
* There is no route for this packet, but it is
@@ -289,14 +293,14 @@ again:
error = EHOSTUNREACH;
goto bad;
}
- ia = ifatoia(ro->ro_rt->rt_ifa);
+ ia = ifatoia(rte->rt_ifa);
ifa_ref(&ia->ia_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);
+ ifp = rte->rt_ifp;
+ rte->rt_rmx.rmx_pksent++;
+ if (rte->rt_flags & RTF_GATEWAY)
+ dst = (struct sockaddr_in *)rte->rt_gateway;
+ if (rte->rt_flags & RTF_HOST)
+ isbroadcast = (rte->rt_flags & RTF_BROADCAST);
else
isbroadcast = in_broadcast(dst->sin_addr, ifp);
}
@@ -304,7 +308,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 (rte != NULL && (rte->rt_flags & (RTF_UP|RTF_HOST))) {
/*
* This case can happen if the user changed the MTU
* of an interface after enabling IP on it. Because
@@ -312,9 +316,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 (rte->rt_rmx.rmx_mtu > ifp->if_mtu)
+ rte->rt_rmx.rmx_mtu = ifp->if_mtu;
+ mtu = rte->rt_rmx.rmx_mtu;
} else {
mtu = ifp->if_mtu;
}
More information about the svn-src-stable-8
mailing list