summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/net/if_vlan.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c
index b83c14f85c1..364b3be8fd3 100644
--- a/sys/net/if_vlan.c
+++ b/sys/net/if_vlan.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_vlan.c,v 1.137 2015/09/10 16:41:30 mikeb Exp $ */
+/* $OpenBSD: if_vlan.c,v 1.138 2015/09/10 17:32:32 dlg Exp $ */
/*
* Copyright 1998 Massachusetts Institute of Technology
@@ -172,6 +172,24 @@ vlan_ifdetach(void *ptr)
vlan_clone_destroy(&ifv->ifv_if);
}
+static inline int
+vlan_mplstunnel(int ifidx)
+{
+#if NMPW > 0
+ struct ifnet *ifp;
+ int rv = 0;
+
+ ifp = if_get(ifidx);
+ if (ifp != NULL) {
+ rv = ifp->if_type == IFT_MPLSTUNNEL;
+ if_put(ifp);
+ }
+ return (rv);
+#else
+ return (0);
+#endif
+}
+
void
vlan_start(struct ifnet *ifp)
{
@@ -206,21 +224,18 @@ vlan_start(struct ifnet *ifp)
if (prio <= 1)
prio = !prio;
-#if NMPW > 0
- struct ifnet *ifpn = if_get(m->m_pkthdr.ph_ifidx);
/*
* If this packet came from a pseudowire it means it already
* has all tags it needs, so just output it.
*/
- if (ifpn && ifpn->if_type == IFT_MPLSTUNNEL) {
+ if (vlan_mplstunnel(m->m_pkthdr.ph_ifidx)) {
/* NOTHING */
- } else
-#endif /* NMPW */
+
/*
* If the underlying interface cannot do VLAN tag insertion
* itself, create an encapsulation header.
*/
- if ((p->if_capabilities & IFCAP_VLAN_HWTAGGING) &&
+ } else if ((p->if_capabilities & IFCAP_VLAN_HWTAGGING) &&
(ifv->ifv_type == ETHERTYPE_VLAN)) {
m->m_pkthdr.ether_vtag = ifv->ifv_tag +
(prio << EVL_PRIO_BITS);