summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/net/if_pflog.c43
1 files changed, 18 insertions, 25 deletions
diff --git a/sys/net/if_pflog.c b/sys/net/if_pflog.c
index e36f628935d..869d207d207 100644
--- a/sys/net/if_pflog.c
+++ b/sys/net/if_pflog.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_pflog.c,v 1.88 2020/07/10 13:26:42 patrick Exp $ */
+/* $OpenBSD: if_pflog.c,v 1.89 2020/07/30 03:30:04 dlg Exp $ */
/*
* The authors of this code are John Ioannidis (ji@tla.org),
* Angelos D. Keromytis (kermit@csd.uch.gr) and
@@ -88,17 +88,10 @@ struct if_clone pflog_cloner =
int npflogifs = 0;
struct ifnet **pflogifs = NULL; /* for fast access */
-struct mbuf *pflog_mhdr = NULL, *pflog_mptr = NULL;
void
pflogattach(int npflog)
{
- if (pflog_mhdr == NULL)
- if ((pflog_mhdr = m_get(M_DONTWAIT, MT_HEADER)) == NULL)
- panic("pflogattach: no mbuf");
- if (pflog_mptr == NULL)
- if ((pflog_mptr = m_get(M_DONTWAIT, MT_DATA)) == NULL)
- panic("pflogattach: no mbuf");
if_clone_attach(&pflog_cloner);
}
@@ -291,7 +284,9 @@ pflog_packet(struct pf_pdesc *pd, u_int8_t reason, struct pf_rule *rm,
void
pflog_mtap(caddr_t if_bpf, struct pfloghdr *pfloghdr, struct mbuf *m)
{
- struct mbuf *mp, *mhdr, *mptr;
+ struct mbuf mhdr;
+ struct m_hdr mptr;
+ struct mbuf *mp;
u_char *mdst;
int afto, hlen, off;
@@ -300,26 +295,23 @@ pflog_mtap(caddr_t if_bpf, struct pfloghdr *pfloghdr, struct mbuf *m)
u_int16_t osport = 0, odport = 0;
u_int8_t proto = 0;
- mhdr = pflog_mhdr;
- mptr = pflog_mptr;
-
afto = pfloghdr->af != pfloghdr->naf;
/*
* temporary mbuf will hold an ip/ip6 header and 8 bytes
* of the protocol header
*/
- m_inithdr(mhdr);
- mhdr->m_len = 0; /* XXX not done in m_inithdr() */
+ m_inithdr(&mhdr);
+ mhdr.m_len = 0; /* XXX not done in m_inithdr() */
#ifdef INET6
/* offset for a new header */
if (afto && pfloghdr->af == AF_INET)
- mhdr->m_data += sizeof(struct ip6_hdr) -
+ mhdr.m_data += sizeof(struct ip6_hdr) -
sizeof(struct ip);
#endif /* INET6 */
- mdst = mtod(mhdr, char *);
+ mdst = mtod(&mhdr, char *);
switch (pfloghdr->af) {
case AF_INET: {
struct ip *h;
@@ -360,18 +352,18 @@ pflog_mtap(caddr_t if_bpf, struct pfloghdr *pfloghdr, struct mbuf *m)
hlen += 8;
}
- mhdr->m_len += hlen;
- mhdr->m_pkthdr.len = mhdr->m_len;
+ mhdr.m_len = hlen;
+ mhdr.m_pkthdr.len = hlen;
/* create a chain mhdr -> mptr, mptr->m_data = (m->m_data+hlen) */
mp = m_getptr(m, hlen, &off);
if (mp != NULL) {
- bcopy(mp, mptr, sizeof(*mptr));
- mptr->m_data += off;
- mptr->m_len -= off;
- mptr->m_flags &= ~M_PKTHDR;
- mhdr->m_next = mptr;
- mhdr->m_pkthdr.len += m->m_pkthdr.len - hlen;
+ mptr.mh_flags = 0;
+ mptr.mh_data = mp->m_data + off;
+ mptr.mh_len = mp->m_len - off;
+ mptr.mh_next = mp->m_next;
+
+ mhdr.m_next = (struct mbuf *)&mptr;
}
/*
@@ -379,7 +371,7 @@ pflog_mtap(caddr_t if_bpf, struct pfloghdr *pfloghdr, struct mbuf *m)
* counting the packet here again.
*/
if (pf_setup_pdesc(&pd, pfloghdr->af, pfloghdr->dir, NULL,
- mhdr, NULL) != PF_PASS)
+ &mhdr, NULL) != PF_PASS)
goto copy;
pd.naf = pfloghdr->naf;
@@ -416,6 +408,7 @@ pflog_mtap(caddr_t if_bpf, struct pfloghdr *pfloghdr, struct mbuf *m)
#endif /* INET6 */
m = pd.m;
+ KASSERT(m == &mhdr);
copy:
bpf_mtap_hdr(if_bpf, pfloghdr, sizeof(*pfloghdr), m,
BPF_DIRECTION_OUT);