summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2013-05-18 08:14:21 +0000
committermelifaro <melifaro@FreeBSD.org>2013-05-18 08:14:21 +0000
commit70dfcb99bbb283a1ac0af78ff6049ef0836c1703 (patch)
tree244d9c3c9613ab658224cc0cb12ce907fcd8259a /sys/net
parent02ed64411192c93329a587b0c5bbfb4bc8813a4c (diff)
downloadFreeBSD-src-70dfcb99bbb283a1ac0af78ff6049ef0836c1703.zip
FreeBSD-src-70dfcb99bbb283a1ac0af78ff6049ef0836c1703.tar.gz
Use separate function to update mbuf checksum flags instead of
duplicating the same code in different places. MFC after: 2 weeks
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if_ethersubr.c43
1 files changed, 19 insertions, 24 deletions
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c
index 6a42214..3fd6c9d 100644
--- a/sys/net/if_ethersubr.c
+++ b/sys/net/if_ethersubr.c
@@ -141,6 +141,22 @@ static MALLOC_DEFINE(M_ARPCOM, "arpcom", "802.* interface internals");
#define senderr(e) do { error = (e); goto bad;} while (0)
+static void
+update_mbuf_csumflags(struct mbuf *src, struct mbuf *dst)
+{
+ int csum_flags = 0;
+
+ if (src->m_pkthdr.csum_flags & CSUM_IP)
+ csum_flags |= (CSUM_IP_CHECKED|CSUM_IP_VALID);
+ if (src->m_pkthdr.csum_flags & CSUM_DELAY_DATA)
+ csum_flags |= (CSUM_DATA_VALID|CSUM_PSEUDO_HDR);
+ if (src->m_pkthdr.csum_flags & CSUM_SCTP)
+ csum_flags |= CSUM_SCTP_VALID;
+ dst->m_pkthdr.csum_flags |= csum_flags;
+ if (csum_flags & CSUM_DATA_VALID)
+ dst->m_pkthdr.csum_data = 0xffff;
+}
+
/*
* Ethernet output routine.
* Encapsulate a packet of type family for the local net.
@@ -300,15 +316,7 @@ ether_output(struct ifnet *ifp, struct mbuf *m,
}
if (lle != NULL && (lle->la_flags & LLE_IFADDR)) {
- int csum_flags = 0;
- if (m->m_pkthdr.csum_flags & CSUM_IP)
- csum_flags |= (CSUM_IP_CHECKED|CSUM_IP_VALID);
- if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA)
- csum_flags |= (CSUM_DATA_VALID|CSUM_PSEUDO_HDR);
- if (m->m_pkthdr.csum_flags & CSUM_SCTP)
- csum_flags |= CSUM_SCTP_VALID;
- m->m_pkthdr.csum_flags |= csum_flags;
- m->m_pkthdr.csum_data = 0xffff;
+ update_mbuf_csumflags(m, m);
return (if_simloop(ifp, m, dst->sa_family, 0));
}
@@ -341,15 +349,6 @@ ether_output(struct ifnet *ifp, struct mbuf *m,
*/
if ((ifp->if_flags & IFF_SIMPLEX) && loop_copy &&
((t = pf_find_mtag(m)) == NULL || !t->routed)) {
- int csum_flags = 0;
-
- if (m->m_pkthdr.csum_flags & CSUM_IP)
- csum_flags |= (CSUM_IP_CHECKED|CSUM_IP_VALID);
- if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA)
- csum_flags |= (CSUM_DATA_VALID|CSUM_PSEUDO_HDR);
- if (m->m_pkthdr.csum_flags & CSUM_SCTP)
- csum_flags |= CSUM_SCTP_VALID;
-
if (m->m_flags & M_BCAST) {
struct mbuf *n;
@@ -366,17 +365,13 @@ ether_output(struct ifnet *ifp, struct mbuf *m,
* See PR kern/105943 for a proposed general solution.
*/
if ((n = m_dup(m, M_NOWAIT)) != NULL) {
- n->m_pkthdr.csum_flags |= csum_flags;
- if (csum_flags & CSUM_DATA_VALID)
- n->m_pkthdr.csum_data = 0xffff;
+ update_mbuf_csumflags(m, n);
(void)if_simloop(ifp, n, dst->sa_family, hlen);
} else
ifp->if_iqdrops++;
} else if (bcmp(eh->ether_dhost, eh->ether_shost,
ETHER_ADDR_LEN) == 0) {
- m->m_pkthdr.csum_flags |= csum_flags;
- if (csum_flags & CSUM_DATA_VALID)
- m->m_pkthdr.csum_data = 0xffff;
+ update_mbuf_csumflags(m, m);
(void) if_simloop(ifp, m, dst->sa_family, hlen);
return (0); /* XXX */
}
OpenPOWER on IntegriCloud