Hi,
Instead of calculating the mbuf packet header length here and there,
put the algorithm in a function m_calchdrlen().
ok?
bluhm
Index: share/man/man9/mbuf.9
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/share/man/man9/mbuf.9,v
retrieving revision 1.112
diff -u -p -r1.112 mbuf.9
--- share/man/man9/mbuf.9 10 Sep 2018 12:47:02 -0000 1.112
+++ share/man/man9/mbuf.9 10 Sep 2018 13:36:24 -0000
@@ -37,6 +37,7 @@
.Nm m_gethdr ,
.Nm m_removehdr ,
.Nm m_resethdr ,
+.Nm m_calchdrlen ,
.Nm MGETHDR ,
.Nm m_prepend ,
.Nm M_PREPEND ,
@@ -83,6 +84,8 @@
.Fn m_removehdr "struct mbuf *m"
.Ft void
.Fn m_resethdr "struct mbuf *m"
+.Ft void
+.Fn m_calchdrlen "struct mbuf *m"
.Ft struct mbuf *
.Fn m_gethdr "int how" "int type"
.Fn MGETHDR "struct mbuf *m" "int how" "int type"
@@ -502,6 +505,9 @@ Delete all
data and all tags attached to a
.Fa mbuf .
Keep the data and mbuf chain, initialize the packet header.
+.It Fn m_calchdrlen "struct mbuf *m"
+Set the packet header length to the sum of all length values in the
+mbuf chain.
.It Fn m_gethdr "int how" "int type"
Return a pointer to an mbuf of the type specified after initializing
it to contain a packet header.
Index: sys/kern/uipc_mbuf.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_mbuf.c,v
retrieving revision 1.257
diff -u -p -r1.257 uipc_mbuf.c
--- sys/kern/uipc_mbuf.c 10 Sep 2018 12:47:02 -0000 1.257
+++ sys/kern/uipc_mbuf.c 10 Sep 2018 12:58:58 -0000
@@ -327,6 +327,18 @@ m_resethdr(struct mbuf *m)
m->m_pkthdr.ph_loopcnt = loopcnt;
}
+void
+m_calchdrlen(struct mbuf *m)
+{
+ struct mbuf *n;
+ int plen = 0;
+
+ KASSERT(m->m_flags & M_PKTHDR);
+ for (n = m; n; n = n->m_next)
+ plen += n->m_len;
+ m->m_pkthdr.len = plen;
+}
+
struct mbuf *
m_getclr(int nowait, int type)
{
Index: sys/net/pf_norm.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/pf_norm.c,v
retrieving revision 1.215
diff -u -p -r1.215 pf_norm.c
--- sys/net/pf_norm.c 10 Sep 2018 12:47:02 -0000 1.215
+++ sys/net/pf_norm.c 10 Sep 2018 13:11:47 -0000
@@ -805,16 +805,7 @@ pf_reassemble(struct mbuf **m0, int dir,
hdrlen = frent->fe_hdrlen;
m = *m0 = pf_join_fragment(frag);
frag = NULL;
-
- {
- int plen = 0;
-
- KASSERT(m->m_flags & M_PKTHDR);
- for (m = *m0; m; m = m->m_next)
- plen += m->m_len;
- m = *m0;
- m->m_pkthdr.len = plen;
- }
+ m_calchdrlen(m);
ip = mtod(m, struct ip *);
ip->ip_len = htons(hdrlen + total);
@@ -907,15 +898,7 @@ pf_reassemble6(struct mbuf **m0, struct
if (frag6_deletefraghdr(m, hdrlen) != 0)
goto fail;
- {
- int plen = 0;
-
- KASSERT(m->m_flags & M_PKTHDR);
- for (m = *m0; m; m = m->m_next)
- plen += m->m_len;
- m = *m0;
- m->m_pkthdr.len = plen;
- }
+ m_calchdrlen(m);
if ((mtag = m_tag_get(PACKET_TAG_PF_REASSEMBLED, sizeof(struct
pf_fragment_tag), M_NOWAIT)) == NULL)
Index: sys/netinet/ip_input.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.339
diff -u -p -r1.339 ip_input.c
--- sys/netinet/ip_input.c 10 Sep 2018 12:47:02 -0000 1.339
+++ sys/netinet/ip_input.c 10 Sep 2018 13:11:09 -0000
@@ -964,14 +964,7 @@ insert:
pool_put(&ipq_pool, fp);
m->m_len += (ip->ip_hl << 2);
m->m_data -= (ip->ip_hl << 2);
- {
- int plen = 0;
-
- KASSERT(m->m_flags & M_PKTHDR);
- for (t = m; t; t = t->m_next)
- plen += t->m_len;
- m->m_pkthdr.len = plen;
- }
+ m_calchdrlen(m);
return (m);
dropfrag:
Index: sys/netinet6/frag6.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/frag6.c,v
retrieving revision 1.84
diff -u -p -r1.84 frag6.c
--- sys/netinet6/frag6.c 10 Sep 2018 12:47:02 -0000 1.84
+++ sys/netinet6/frag6.c 10 Sep 2018 13:11:07 -0000
@@ -431,14 +431,7 @@ frag6_input(struct mbuf **mp, int *offp,
pool_put(&ip6q_pool, q6);
- {
- int plen = 0;
-
- KASSERT(m->m_flags & M_PKTHDR);
- for (t = m; t; t = t->m_next)
- plen += t->m_len;
- m->m_pkthdr.len = plen;
- }
+ m_calchdrlen(m);
/*
* Restore NXT to the original.
Index: sys/nfs/krpc_subr.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/nfs/krpc_subr.c,v
retrieving revision 1.34
diff -u -p -r1.34 krpc_subr.c
--- sys/nfs/krpc_subr.c 30 Jul 2018 12:22:14 -0000 1.34
+++ sys/nfs/krpc_subr.c 10 Sep 2018 13:20:15 -0000
@@ -339,13 +339,7 @@ krpc_call(struct sockaddr_in *sa, u_int
/*
* Setup packet header
*/
- len = 0;
- m = mhead;
- while (m) {
- len += m->m_len;
- m = m->m_next;
- }
- mhead->m_pkthdr.len = len;
+ m_calchdrlen(mhead);
mhead->m_pkthdr.ph_ifidx = 0;
/*
Index: sys/nfs/nfs_socket.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/nfs/nfs_socket.c,v
retrieving revision 1.130
diff -u -p -r1.130 nfs_socket.c
--- sys/nfs/nfs_socket.c 30 Jul 2018 12:22:14 -0000 1.130
+++ sys/nfs/nfs_socket.c 10 Sep 2018 13:27:32 -0000
@@ -855,7 +855,6 @@ nfs_request(struct vnode *vp, int procnu
int t1, i, error = 0;
int trylater_delay;
struct nfsreq *rep;
- int mrest_len;
struct nfsm_info info;
rep = pool_get(&nfsreqpl, PR_WAITOK);
@@ -864,17 +863,11 @@ nfs_request(struct vnode *vp, int procnu
rep->r_procp = infop->nmi_procp;
rep->r_procnum = procnum;
- mrest_len = 0;
- m = infop->nmi_mreq;
- while (m) {
- mrest_len += m->m_len;
- m = m->m_next;
- }
-
/* empty mbuf for AUTH_UNIX header */
rep->r_mreq = m_gethdr(M_WAIT, MT_DATA);
rep->r_mreq->m_next = infop->nmi_mreq;
- rep->r_mreq->m_pkthdr.len = mrest_len;
+ rep->r_mreq->m_len = 0;
+ m_calchdrlen(rep->r_mreq);
trylater_delay = NFS_MINTIMEO;
Index: sys/sys/mbuf.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/sys/mbuf.h,v
retrieving revision 1.237
diff -u -p -r1.237 mbuf.h
--- sys/sys/mbuf.h 10 Sep 2018 12:47:02 -0000 1.237
+++ sys/sys/mbuf.h 10 Sep 2018 12:59:39 -0000
@@ -443,6 +443,7 @@ struct mbuf *m_gethdr(int, int);
struct mbuf *m_inithdr(struct mbuf *);
void m_removehdr(struct mbuf *);
void m_resethdr(struct mbuf *);
+void m_calchdrlen(struct mbuf *);
int m_defrag(struct mbuf *, int);
struct mbuf *m_prepend(struct mbuf *, int, int);
struct mbuf *m_pulldown(struct mbuf *, int, int, int *);