diff options
-rw-r--r-- | sbin/ifconfig/ifvlan.c | 37 | ||||
-rw-r--r-- | sys/net/if.h | 2 | ||||
-rw-r--r-- | sys/net/if_vlan.c | 102 | ||||
-rw-r--r-- | sys/net/if_vlan_var.h | 27 | ||||
-rw-r--r-- | sys/sys/priv.h | 1 |
5 files changed, 12 insertions, 157 deletions
diff --git a/sbin/ifconfig/ifvlan.c b/sbin/ifconfig/ifvlan.c index 3b37160..107b87b 100644 --- a/sbin/ifconfig/ifvlan.c +++ b/sbin/ifconfig/ifvlan.c @@ -1,10 +1,6 @@ /* - * Copyright (c) 1999 Bill Paul <wpaul@ctr.columbia.edu> - * Copyright (c) 2012 ADARA Networks, Inc. - * All rights reserved. - * - * Portions of this software were developed by Robert N. M. Watson under - * contract to ADARA Networks, Inc. + * Copyright (c) 1999 + * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -82,14 +78,10 @@ vlan_status(int s) { struct vlanreq vreq; - if (getvlan(s, &ifr, &vreq) == -1) - return; - printf("\tvlan: %d", vreq.vlr_tag); - if (ioctl(s, SIOCGVLANPCP, (caddr_t)&ifr) != -1) - printf(" vlanpcp: %u", ifr.ifr_vlan_pcp); - printf(" parent interface: %s", vreq.vlr_parent[0] == '\0' ? - "<none>" : vreq.vlr_parent); - printf("\n"); + if (getvlan(s, &ifr, &vreq) != -1) + printf("\tvlan: %d parent interface: %s\n", + vreq.vlr_tag, vreq.vlr_parent[0] == '\0' ? + "<none>" : vreq.vlr_parent); } static void @@ -157,22 +149,6 @@ DECL_CMD_FUNC(setvlandev, val, d) } static -DECL_CMD_FUNC(setvlanpcp, val, d) -{ - u_long ul; - char *endp; - - ul = strtoul(val, &endp, 0); - if (*endp != '\0') - errx(1, "invalid value for vlanpcp"); - if (ul > 7) - errx(1, "value for vlanpcp out of range"); - ifr.ifr_vlan_pcp = ul; - if (ioctl(s, SIOCSVLANPCP, (caddr_t)&ifr) == -1) - err(1, "SIOCSVLANPCP"); -} - -static DECL_CMD_FUNC(unsetvlandev, val, d) { struct vlanreq vreq; @@ -193,7 +169,6 @@ DECL_CMD_FUNC(unsetvlandev, val, d) static struct cmd vlan_cmds[] = { DEF_CLONE_CMD_ARG("vlan", setvlantag), DEF_CLONE_CMD_ARG("vlandev", setvlandev), - DEF_CMD_ARG("vlanpcp", setvlanpcp), /* NB: non-clone cmds */ DEF_CMD_ARG("vlan", setvlantag), DEF_CMD_ARG("vlandev", setvlandev), diff --git a/sys/net/if.h b/sys/net/if.h index 5da596a..e86840a 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -393,7 +393,6 @@ struct ifreq { caddr_t ifru_data; int ifru_cap[2]; u_int ifru_fib; - u_char ifru_vlan_pcp; } ifr_ifru; #define ifr_addr ifr_ifru.ifru_addr /* address */ #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ @@ -411,7 +410,6 @@ struct ifreq { #define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */ #define ifr_index ifr_ifru.ifru_index /* interface index */ #define ifr_fib ifr_ifru.ifru_fib /* interface fib */ -#define ifr_vlan_pcp ifr_ifru.ifru_vlan_pcp /* VLAN priority */ }; #define _SIZEOF_ADDR_IFREQ(ifr) \ diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c index 0838287..ffa5349 100644 --- a/sys/net/if_vlan.c +++ b/sys/net/if_vlan.c @@ -1,9 +1,5 @@ /*- * Copyright 1998 Massachusetts Institute of Technology - * Copyright 2012 ADARA Networks, Inc. - * - * Portions of this software were developed by Robert N. M. Watson under - * contract to ADARA Networks, Inc. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby @@ -55,7 +51,6 @@ __FBSDID("$FreeBSD$"); #include <sys/malloc.h> #include <sys/mbuf.h> #include <sys/module.h> -#include <sys/priv.h> #include <sys/rmlock.h> #include <sys/queue.h> #include <sys/socket.h> @@ -119,8 +114,6 @@ struct ifvlan { int ifvm_mintu; /* min transmission unit */ uint16_t ifvm_proto; /* encapsulation ethertype */ uint16_t ifvm_tag; /* tag to apply on packets leaving if */ - uint16_t ifvm_vid; /* VLAN ID */ - uint8_t ifvm_pcp; /* Priority Code Point (PCP). */ } ifv_mib; SLIST_HEAD(, vlan_mc_entry) vlan_mc_listhead; #ifndef VLAN_ARRAY @@ -128,9 +121,7 @@ struct ifvlan { #endif }; #define ifv_proto ifv_mib.ifvm_proto -#define ifv_tag ifv_mib.ifvm_tag -#define ifv_vid ifv_mib.ifvm_vid -#define ifv_pcp ifv_mib.ifvm_pcp +#define ifv_vid ifv_mib.ifvm_tag #define ifv_encaplen ifv_mib.ifvm_encaplen #define ifv_mtufudge ifv_mib.ifvm_mtufudge #define ifv_mintu ifv_mib.ifvm_mintu @@ -156,15 +147,6 @@ static VNET_DEFINE(int, soft_pad); SYSCTL_INT(_net_link_vlan, OID_AUTO, soft_pad, CTLFLAG_RW | CTLFLAG_VNET, &VNET_NAME(soft_pad), 0, "pad short frames before tagging"); -/* - * For now, make preserving PCP via an mbuf tag optional, as it increases - * per-packet memory allocations and frees. In the future, it would be - * preferable to reuse ether_vtag for this, or similar. - */ -static int vlan_mtag_pcp = 0; -SYSCTL_INT(_net_link_vlan, OID_AUTO, mtag_pcp, CTLFLAG_RW, &vlan_mtag_pcp, 0, - "Retain VLAN PCP information as packets are passed up the stack"); - static const char vlanname[] = "vlan"; static MALLOC_DEFINE(M_VLAN, vlanname, "802.1Q Virtual LAN Interface"); @@ -715,16 +697,6 @@ vlan_devat(struct ifnet *ifp, uint16_t vid) } /* - * Recalculate the cached VLAN tag exposed via the MIB. - */ -static void -vlan_tag_recalculate(struct ifvlan *ifv) -{ - - ifv->ifv_tag = EVL_MAKETAG(ifv->ifv_vid, ifv->ifv_pcp, 0); -} - -/* * VLAN support can be loaded as a module. The only place in the * system that's intimately aware of this is ether_input. We hook * into this code through vlan_input_p which is defined there and @@ -1037,8 +1009,6 @@ vlan_transmit(struct ifnet *ifp, struct mbuf *m) { struct ifvlan *ifv; struct ifnet *p; - struct m_tag *mtag; - uint16_t tag; int error, len, mcast; ifv = ifp->if_softc; @@ -1094,16 +1064,11 @@ vlan_transmit(struct ifnet *ifp, struct mbuf *m) * knows how to find the VLAN tag to use, so we attach a * packet tag that holds it. */ - if (vlan_mtag_pcp && (mtag = m_tag_locate(m, MTAG_8021Q, - MTAG_8021Q_PCP_OUT, NULL)) != NULL) - tag = EVL_MAKETAG(ifv->ifv_vid, *(uint8_t *)(mtag + 1), 0); - else - tag = ifv->ifv_tag; if (p->if_capenable & IFCAP_VLAN_HWTAGGING) { - m->m_pkthdr.ether_vtag = tag; + m->m_pkthdr.ether_vtag = ifv->ifv_vid; m->m_flags |= M_VLANTAG; } else { - m = ether_vlanencap(m, tag); + m = ether_vlanencap(m, ifv->ifv_vid); if (m == NULL) { if_printf(ifp, "unable to prepend VLAN header\n"); if_inc_counter(ifp, IFCOUNTER_OERRORS, 1); @@ -1138,8 +1103,7 @@ vlan_input(struct ifnet *ifp, struct mbuf *m) struct ifvlantrunk *trunk = ifp->if_vlantrunk; struct ifvlan *ifv; TRUNK_LOCK_READER; - struct m_tag *mtag; - uint16_t vid, tag; + uint16_t vid; KASSERT(trunk != NULL, ("%s: no trunk", __func__)); @@ -1148,7 +1112,7 @@ vlan_input(struct ifnet *ifp, struct mbuf *m) * Packet is tagged, but m contains a normal * Ethernet frame; the tag is stored out-of-band. */ - tag = m->m_pkthdr.ether_vtag; + vid = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag); m->m_flags &= ~M_VLANTAG; } else { struct ether_vlan_header *evl; @@ -1164,7 +1128,7 @@ vlan_input(struct ifnet *ifp, struct mbuf *m) return; } evl = mtod(m, struct ether_vlan_header *); - tag = ntohs(evl->evl_tag); + vid = EVL_VLANOFTAG(ntohs(evl->evl_tag)); /* * Remove the 802.1q header by copying the Ethernet @@ -1188,8 +1152,6 @@ vlan_input(struct ifnet *ifp, struct mbuf *m) } } - vid = EVL_VLANOFTAG(tag); - TRUNK_RLOCK(trunk); ifv = vlan_gethash(trunk, vid); if (ifv == NULL || !UP_AND_RUNNING(ifv->ifv_ifp)) { @@ -1200,28 +1162,6 @@ vlan_input(struct ifnet *ifp, struct mbuf *m) } TRUNK_RUNLOCK(trunk); - if (vlan_mtag_pcp) { - /* - * While uncommon, it is possible that we will find a 802.1q - * packet encapsulated inside another packet that also had an - * 802.1q header. For example, ethernet tunneled over IPSEC - * arriving over ethernet. In that case, we replace the - * existing 802.1q PCP m_tag value. - */ - mtag = m_tag_locate(m, MTAG_8021Q, MTAG_8021Q_PCP_IN, NULL); - if (mtag == NULL) { - mtag = m_tag_alloc(MTAG_8021Q, MTAG_8021Q_PCP_IN, - sizeof(uint8_t), M_NOWAIT); - if (mtag == NULL) { - m_freem(m); - if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); - return; - } - m_tag_prepend(m, mtag); - } - *(uint8_t *)(mtag + 1) = EVL_PRIOFTAG(tag); - } - m->m_pkthdr.rcvif = ifv->ifv_ifp; if_inc_counter(ifv->ifv_ifp, IFCOUNTER_IPACKETS, 1); @@ -1278,8 +1218,6 @@ exists: } ifv->ifv_vid = vid; /* must set this before vlan_inshash() */ - ifv->ifv_pcp = 0; /* Default: best effort delivery. */ - vlan_tag_recalculate(ifv); error = vlan_inshash(trunk, ifv); if (error) goto done; @@ -1767,34 +1705,6 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } break; - case SIOCGVLANPCP: -#ifdef VIMAGE - if (ifp->if_vnet != ifp->if_home_vnet) { - error = EPERM; - break; - } -#endif - ifr->ifr_vlan_pcp = ifv->ifv_pcp; - break; - - case SIOCSVLANPCP: -#ifdef VIMAGE - if (ifp->if_vnet != ifp->if_home_vnet) { - error = EPERM; - break; - } -#endif - error = priv_check(curthread, PRIV_NET_SETVLANPCP); - if (error) - break; - if (ifr->ifr_vlan_pcp > 7) { - error = EINVAL; - break; - } - ifv->ifv_pcp = ifr->ifr_vlan_pcp; - vlan_tag_recalculate(ifv); - break; - default: error = EINVAL; break; diff --git a/sys/net/if_vlan_var.h b/sys/net/if_vlan_var.h index 6b20d14..ed4753e 100644 --- a/sys/net/if_vlan_var.h +++ b/sys/net/if_vlan_var.h @@ -73,23 +73,6 @@ struct vlanreq { #define SIOCSETVLAN SIOCSIFGENERIC #define SIOCGETVLAN SIOCGIFGENERIC -#define SIOCGVLANPCP _IOWR('i', 152, struct ifreq) /* Get VLAN PCP */ -#define SIOCSVLANPCP _IOW('i', 153, struct ifreq) /* Set VLAN PCP */ - -/* - * Names for 802.1q priorities ("802.1p"). Notice that in this scheme, - * (0 < 1), allowing default 0-tagged traffic to take priority over background - * tagged traffic. - */ -#define IEEE8021Q_PCP_BK 1 /* Background (lowest) */ -#define IEEE8021Q_PCP_BE 0 /* Best effort (default) */ -#define IEEE8021Q_PCP_EE 2 /* Excellent effort */ -#define IEEE8021Q_PCP_CA 3 /* Critical applications */ -#define IEEE8021Q_PCP_VI 4 /* Video, < 100ms latency */ -#define IEEE8021Q_PCP_VO 5 /* Video, < 10ms latency */ -#define IEEE8021Q_PCP_IC 6 /* Internetwork control */ -#define IEEE8021Q_PCP_NC 7 /* Network control (highest) */ - #ifdef _KERNEL /* * Drivers that are capable of adding and removing the VLAN header @@ -127,16 +110,6 @@ struct vlanreq { * if_capabilities. */ -/* - * The 802.1q code may also tag mbufs with the PCP (priority) field for use in - * other layers of the stack, in which case an m_tag will be used. This is - * semantically quite different from use of the ether_vtag field, which is - * defined only between the device driver and VLAN layer. - */ -#define MTAG_8021Q 1326104895 -#define MTAG_8021Q_PCP_IN 0 /* Input priority. */ -#define MTAG_8021Q_PCP_OUT 1 /* Output priority. */ - #define VLAN_CAPABILITIES(_ifp) do { \ if ((_ifp)->if_vlantrunk != NULL) \ (*vlan_trunk_cap_p)(_ifp); \ diff --git a/sys/sys/priv.h b/sys/sys/priv.h index 86ea05e..b1eaece 100644 --- a/sys/sys/priv.h +++ b/sys/sys/priv.h @@ -342,7 +342,6 @@ #define PRIV_NET_SETIFDESCR 418 /* Set interface description. */ #define PRIV_NET_SETIFFIB 419 /* Set interface fib. */ #define PRIV_NET_VXLAN 420 /* Administer vxlan. */ -#define PRIV_NET_SETVLANPCP 421 /* Set VLAN priority. */ /* * 802.11-related privileges. |