check if the packet is for us or if we're promisc before we cut the
authordlg <dlg@openbsd.org>
Wed, 27 May 2015 12:23:44 +0000 (12:23 +0000)
committerdlg <dlg@openbsd.org>
Wed, 27 May 2015 12:23:44 +0000 (12:23 +0000)
vlan header out of the packet.

fixes rx on top of trunks on top of nics that dont do hw vlan tagging.

ok mpi@

sys/net/if_vlan.c

index 76f20fe..e3dd261 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_vlan.c,v 1.126 2015/05/26 11:39:07 mpi Exp $       */
+/*     $OpenBSD: if_vlan.c,v 1.127 2015/05/27 12:23:44 dlg Exp $       */
 
 /*
  * Copyright 1998 Massachusetts Institute of Technology
@@ -331,19 +331,6 @@ vlan_input(struct mbuf *m)
                return (1);
        }
 
-       /*
-        * Having found a valid vlan interface corresponding to
-        * the given source interface and vlan tag, remove the
-        * encapsulation.
-        */
-       if (m->m_flags & M_VLANTAG) {
-               m->m_flags &= ~M_VLANTAG;
-       } else {
-               eh->ether_type = evl->evl_proto;
-               memmove((char *)eh + EVL_ENCAPLEN, eh, sizeof(*eh));
-               m_adj(m, EVL_ENCAPLEN);
-       }
-
        /*
         * Drop promiscuously received packets if we are not in
         * promiscuous mode.
@@ -358,6 +345,19 @@ vlan_input(struct mbuf *m)
                }
        }
 
+       /*
+        * Having found a valid vlan interface corresponding to
+        * the given source interface and vlan tag, remove the
+        * encapsulation.
+        */
+       if (m->m_flags & M_VLANTAG) {
+               m->m_flags &= ~M_VLANTAG;
+       } else {
+               eh->ether_type = evl->evl_proto;
+               memmove((char *)eh + EVL_ENCAPLEN, eh, sizeof(*eh));
+               m_adj(m, EVL_ENCAPLEN);
+       }
+
        ml_enqueue(&ml, m);
        if_input(&ifv->ifv_if, &ml);
        ifv->ifv_if.if_ipackets++;