avoid byteswapping at runtime in tun(4)

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

avoid byteswapping at runtime in tun(4)

David Gwynne-5
this has reads from tun load the AF out of the data rather than point to
it, then has the switch statement compare to the swapped AF values.

ok?

Index: if_tun.c
===================================================================
RCS file: /cvs/src/sys/net/if_tun.c,v
retrieving revision 1.184
diff -u -p -r1.184 if_tun.c
--- if_tun.c 3 Feb 2019 23:04:49 -0000 1.184
+++ if_tun.c 4 Feb 2019 00:18:54 -0000
@@ -833,7 +833,7 @@ int
 tun_dev_write(struct tun_softc *tp, struct uio *uio, int ioflag)
 {
  struct ifnet *ifp;
- u_int32_t *th;
+ u_int32_t th;
  struct mbuf *top, **mp, *m;
  int error = 0, tlen;
  size_t mlen;
@@ -842,7 +842,7 @@ tun_dev_write(struct tun_softc *tp, stru
  TUNDEBUG(("%s: tunwrite\n", ifp->if_xname));
 
  if (uio->uio_resid == 0 || uio->uio_resid > ifp->if_mtu +
-    (tp->tun_flags & TUN_LAYER2 ? ETHER_HDR_LEN : sizeof(*th))) {
+    (tp->tun_flags & TUN_LAYER2 ? ETHER_HDR_LEN : sizeof(th))) {
  TUNDEBUG(("%s: len=%d!\n", ifp->if_xname, uio->uio_resid));
  return (EMSGSIZE);
  }
@@ -917,11 +917,11 @@ tun_dev_write(struct tun_softc *tp, stru
  }
 #endif
 
- th = mtod(top, u_int32_t *);
+ th = *mtod(top, u_int32_t *);
  /* strip the tunnel header */
- top->m_data += sizeof(*th);
- top->m_len  -= sizeof(*th);
- top->m_pkthdr.len -= sizeof(*th);
+ top->m_data += sizeof(th);
+ top->m_len  -= sizeof(th);
+ top->m_pkthdr.len -= sizeof(th);
  top->m_pkthdr.ph_rtableid = ifp->if_rdomain;
  top->m_pkthdr.ph_ifidx = ifp->if_index;
 
@@ -930,17 +930,17 @@ tun_dev_write(struct tun_softc *tp, stru
 
  NET_LOCK();
 
- switch (ntohl(*th)) {
- case AF_INET:
+ switch (th) {
+ case htonl(AF_INET):
  ipv4_input(ifp, top);
  break;
 #ifdef INET6
- case AF_INET6:
+ case htonl(AF_INET6):
  ipv6_input(ifp, top);
  break;
 #endif
 #ifdef MPLS
- case AF_MPLS:
+ case htonl(AF_MPLS):
  mpls_input(ifp, top);
  break;
 #endif