From 74f5353c0ac526e57acb8db53662db6508a63355 Mon Sep 17 00:00:00 2001 From: brian Date: Sun, 15 Oct 2000 18:49:17 +0000 Subject: BPF wants packets in host byte order whereas TUN_IFHEAD wants them in network byte order. When we've got TUN_IFHEAD set, swap the AF byte order before passing a packet to bpf_mtap(). --- sys/net/if_tun.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'sys/net') diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c index 4b47ec6..f7a2f86 100644 --- a/sys/net/if_tun.c +++ b/sys/net/if_tun.c @@ -361,7 +361,7 @@ tunoutput(ifp, m0, dst, rt) * try to free it or keep a pointer to it). */ struct mbuf m; - u_int af = dst->sa_family; + uint32_t af = dst->sa_family; m.m_next = m0; m.m_len = 4; @@ -618,7 +618,7 @@ tunwrite(dev, uio, flag) struct ifnet *ifp = &tp->tun_if; struct mbuf *top, **mp, *m; int error=0, tlen, mlen; - u_int32_t family; + uint32_t family; TUNDEBUG("%s%d: tunwrite\n", ifp->if_name, ifp->if_unit); @@ -665,13 +665,20 @@ tunwrite(dev, uio, flag) top->m_pkthdr.rcvif = ifp; if (ifp->if_bpf) { - if (tp->tun_flags & TUN_IFHEAD) + if (tp->tun_flags & TUN_IFHEAD) { /* * Conveniently, we already have a 4-byte address * family prepended to our packet ! + * Inconveniently, it's in the wrong byte order ! */ + if ((top = m_pullup(top, sizeof(family))) == NULL) + return ENOBUFS; + *mtod(top, u_int32_t *) = + ntohl(*mtod(top, u_int32_t *)); bpf_mtap(ifp, top); - else { + *mtod(top, u_int32_t *) = + htonl(*mtod(top, u_int32_t *)); + } else { /* * We need to prepend the address family as * a four byte field. Cons up a dummy header @@ -680,7 +687,7 @@ tunwrite(dev, uio, flag) * try to free it or keep a pointer to it). */ struct mbuf m; - u_int af = AF_INET; + uint32_t af = AF_INET; m.m_next = top; m.m_len = 4; -- cgit v1.1