Module Name:    src
Committed By:   rmind
Date:           Fri May 23 23:38:48 UTC 2014

Modified Files:
        src/sys/netinet: ip_input.c

Log Message:
ip_input(), ip_savecontrol(): cache m->m_pkthdr.rcvif in a variable.


To generate a diff of this commit:
cvs rdiff -u -r1.313 -r1.314 src/sys/netinet/ip_input.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet/ip_input.c
diff -u src/sys/netinet/ip_input.c:1.313 src/sys/netinet/ip_input.c:1.314
--- src/sys/netinet/ip_input.c:1.313	Fri May 23 19:35:24 2014
+++ src/sys/netinet/ip_input.c	Fri May 23 23:38:48 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_input.c,v 1.313 2014/05/23 19:35:24 rmind Exp $	*/
+/*	$NetBSD: ip_input.c,v 1.314 2014/05/23 23:38:48 rmind Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.313 2014/05/23 19:35:24 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.314 2014/05/23 23:38:48 rmind Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -385,9 +385,11 @@ ip_input(struct mbuf *m)
 	int downmatch;
 	int checkif;
 	int srcrt = 0;
+	ifnet_t *ifp;
 
 	MCLAIM(m, &ip_rx_mowner);
 	KASSERT((m->m_flags & M_PKTHDR) != 0);
+	ifp = m->m_pkthdr.rcvif;
 
 	/*
 	 * If no IP addresses have been set yet but the interfaces
@@ -445,14 +447,14 @@ ip_input(struct mbuf *m)
 	/* 127/8 must not appear on wire - RFC1122 */
 	if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET ||
 	    (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) {
-		if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0) {
+		if ((ifp->if_flags & IFF_LOOPBACK) == 0) {
 			IP_STATINC(IP_STAT_BADADDR);
 			goto bad;
 		}
 	}
 
 	switch (m->m_pkthdr.csum_flags &
-		((m->m_pkthdr.rcvif->if_csum_flags_rx & M_CSUM_IPv4) |
+		((ifp->if_csum_flags_rx & M_CSUM_IPv4) |
 		 M_CSUM_IPv4_BAD)) {
 	case M_CSUM_IPv4|M_CSUM_IPv4_BAD:
 		INET_CSUM_COUNTER_INCR(&ip_hwcsum_bad);
@@ -468,8 +470,8 @@ ip_input(struct mbuf *m)
 		 * Must compute it ourselves.  Maybe skip checksum on
 		 * loopback interfaces.
 		 */
-		if (__predict_true(!(m->m_pkthdr.rcvif->if_flags &
-				     IFF_LOOPBACK) || ip_do_loopback_cksum)) {
+		if (__predict_true(!(ifp->if_flags & IFF_LOOPBACK) ||
+		    ip_do_loopback_cksum)) {
 			INET_CSUM_COUNTER_INCR(&ip_swcsum);
 			if (in_cksum(m, hlen) != 0)
 				goto badcsum;
@@ -519,21 +521,15 @@ ip_input(struct mbuf *m)
 	 * Note that filters must _never_ set this flag, as another filter
 	 * in the list may have previously cleared it.
 	 */
-	/*
-	 * let ipfilter look at packet on the wire,
-	 * not the decapsulated packet.
-	 */
 #if defined(IPSEC)
 	if (!ipsec_indone(m))
 #else
 	if (1)
 #endif
 	{
-		struct in_addr odst;
+		struct in_addr odst = ip->ip_dst;
 
-		odst = ip->ip_dst;
-		if (pfil_run_hooks(inet_pfil_hook, &m, m->m_pkthdr.rcvif,
-		    PFIL_IN) != 0)
+		if (pfil_run_hooks(inet_pfil_hook, &m, ifp, PFIL_IN) != 0)
 			return;
 		if (m == NULL)
 			return;
@@ -591,8 +587,7 @@ ip_input(struct mbuf *m)
 	 * we get finer grain control.
 	 */
 	checkif = ip_checkinterface && (ipforwarding == 0) &&
-	    (m->m_pkthdr.rcvif != NULL) &&
-	    ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0);
+	    ifp && (ifp->if_flags & IFF_LOOPBACK) == 0;
 
 	/*
 	 * Check our list of addresses, to see if the packet is for us.
@@ -604,7 +599,7 @@ ip_input(struct mbuf *m)
 	downmatch = 0;
 	LIST_FOREACH(ia, &IN_IFADDR_HASH(ip->ip_dst.s_addr), ia_hash) {
 		if (in_hosteq(ia->ia_addr.sin_addr, ip->ip_dst)) {
-			if (checkif && ia->ia_ifp != m->m_pkthdr.rcvif)
+			if (checkif && ia->ia_ifp != ifp)
 				continue;
 			if ((ia->ia_ifp->if_flags & IFF_UP) != 0)
 				break;
@@ -614,8 +609,8 @@ ip_input(struct mbuf *m)
 	}
 	if (ia != NULL)
 		goto ours;
-	if (m->m_pkthdr.rcvif && m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) {
-		IFADDR_FOREACH(ifa, m->m_pkthdr.rcvif) {
+	if (ifp && ifp->if_flags & IFF_BROADCAST) {
+		IFADDR_FOREACH(ifa, ifp) {
 			if (ifa->ifa_addr->sa_family != AF_INET)
 				continue;
 			ia = ifatoia(ifa);
@@ -654,7 +649,7 @@ ip_input(struct mbuf *m)
 			 * as expected when ip_mforward() is called from
 			 * ip_output().)
 			 */
-			if (ip_mforward(m, m->m_pkthdr.rcvif) != 0) {
+			if (ip_mforward(m, ifp) != 0) {
 				IP_STATINC(IP_STAT_CANTFORWARD);
 				m_freem(m);
 				return;
@@ -674,7 +669,7 @@ ip_input(struct mbuf *m)
 		 * See if we belong to the destination multicast group on the
 		 * arrival interface.
 		 */
-		IN_LOOKUP_MULTI(ip->ip_dst, m->m_pkthdr.rcvif, inm);
+		IN_LOOKUP_MULTI(ip->ip_dst, ifp, inm);
 		if (inm == NULL) {
 			IP_STATINC(IP_STAT_CANTFORWARD);
 			m_freem(m);
@@ -1320,6 +1315,7 @@ ip_savecontrol(struct inpcb *inp, struct
     struct mbuf *m)
 {
 	struct socket *so = inp->inp_socket;
+	ifnet_t *ifp = m->m_pkthdr.rcvif;
 	int inpflags = inp->inp_flags;
 
 	if (so->so_options & SO_TIMESTAMP
@@ -1352,7 +1348,7 @@ ip_savecontrol(struct inpcb *inp, struct
 	if (inpflags & INP_RECVPKTINFO) {
 		struct in_pktinfo ipi;
 		ipi.ipi_addr = ip->ip_src;
-		ipi.ipi_ifindex = m->m_pkthdr.rcvif->if_index;
+		ipi.ipi_ifindex = ifp->if_index;
 		*mp = sbcreatecontrol((void *) &ipi,
 		    sizeof(ipi), IP_RECVPKTINFO, IPPROTO_IP);
 		if (*mp)
@@ -1361,7 +1357,7 @@ ip_savecontrol(struct inpcb *inp, struct
 	if (inpflags & INP_PKTINFO) {
 		struct in_pktinfo ipi;
 		ipi.ipi_addr = ip->ip_dst;
-		ipi.ipi_ifindex = m->m_pkthdr.rcvif->if_index;
+		ipi.ipi_ifindex = ifp->if_index;
 		*mp = sbcreatecontrol((void *) &ipi,
 		    sizeof(ipi), IP_PKTINFO, IPPROTO_IP);
 		if (*mp)
@@ -1370,8 +1366,8 @@ ip_savecontrol(struct inpcb *inp, struct
 	if (inpflags & INP_RECVIF) {
 		struct sockaddr_dl sdl;
 
-		sockaddr_dl_init(&sdl, sizeof(sdl), m->m_pkthdr.rcvif ?
-		    m->m_pkthdr.rcvif->if_index : 0, 0, NULL, 0, NULL, 0);
+		sockaddr_dl_init(&sdl, sizeof(sdl), ifp ?
+		    ifp->if_index : 0, 0, NULL, 0, NULL, 0);
 		*mp = sbcreatecontrol(&sdl, sdl.sdl_len, IP_RECVIF, IPPROTO_IP);
 		if (*mp)
 			mp = &(*mp)->m_next;

Reply via email to