Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F157274322
D26409.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D26409.diff
View Options
Index: head/sys/net/if_ethersubr.c
===================================================================
--- head/sys/net/if_ethersubr.c
+++ head/sys/net/if_ethersubr.c
@@ -1388,6 +1388,13 @@
}
/*
+ * If PCP is set in mbuf, use it
+ */
+ if ((*mp)->m_flags & M_VLANTAG) {
+ pcp = EVL_PRIOFTAG((*mp)->m_pkthdr.ether_vtag);
+ }
+
+ /*
* If underlying interface can do VLAN tag insertion itself,
* just pass the packet along. However, we need some way to
* tell the interface where the packet came from so that it
Index: head/sys/netinet/in.h
===================================================================
--- head/sys/netinet/in.h
+++ head/sys/netinet/in.h
@@ -483,6 +483,10 @@
/* The following option is private; do not use it from user applications. */
#define IP_MSFILTER 74 /* set/get filter list */
+/* The following option deals with the 802.1Q Ethernet Priority Code Point */
+#define IP_VLAN_PCP 75 /* int; set/get PCP used for packet, */
+ /* -1 use interface default */
+
/* Protocol Independent Multicast API [RFC3678] */
#define MCAST_JOIN_GROUP 80 /* join an any-source group */
#define MCAST_LEAVE_GROUP 81 /* leave all sources for group */
Index: head/sys/netinet/in_pcb.h
===================================================================
--- head/sys/netinet/in_pcb.h
+++ head/sys/netinet/in_pcb.h
@@ -748,6 +748,13 @@
#define INP_SUPPORTS_MBUFQ 0x00004000 /* Supports the mbuf queue method of LRO */
#define INP_MBUF_QUEUE_READY 0x00008000 /* The transport is pacing, inputs can be queued */
#define INP_DONT_SACK_QUEUE 0x00010000 /* If a sack arrives do not wake me */
+#define INP_2PCP_SET 0x00020000 /* If the Eth PCP should be set explicitly */
+#define INP_2PCP_BIT0 0x00040000 /* Eth PCP Bit 0 */
+#define INP_2PCP_BIT1 0x00080000 /* Eth PCP Bit 1 */
+#define INP_2PCP_BIT2 0x00100000 /* Eth PCP Bit 2 */
+#define INP_2PCP_BASE INP_2PCP_BIT0
+#define INP_2PCP_MASK (INP_2PCP_BIT0 | INP_2PCP_BIT1 | INP_2PCP_BIT2)
+#define INP_2PCP_SHIFT 18 /* shift PCP field in/out of inp_flags2 */
/*
* Flags passed to in_pcblookup*() functions.
*/
Index: head/sys/netinet/ip_output.c
===================================================================
--- head/sys/netinet/ip_output.c
+++ head/sys/netinet/ip_output.c
@@ -62,7 +62,9 @@
#include <net/if.h>
#include <net/if_var.h>
+#include <net/if_vlan_var.h>
#include <net/if_llatbl.h>
+#include <net/ethernet.h>
#include <net/netisr.h>
#include <net/pfil.h>
#include <net/route.h>
@@ -324,6 +326,7 @@
int hlen = sizeof (struct ip);
int mtu = 0;
int error = 0;
+ int vlan_pcp = -1;
struct sockaddr_in *dst, sin;
const struct sockaddr_in *gw;
struct in_ifaddr *ia = NULL;
@@ -345,6 +348,9 @@
m->m_pkthdr.flowid = inp->inp_flowid;
M_HASHTYPE_SET(m, inp->inp_flowtype);
}
+ if ((inp->inp_flags2 & INP_2PCP_SET) != 0)
+ vlan_pcp = (inp->inp_flags2 & INP_2PCP_MASK) >>
+ INP_2PCP_SHIFT;
#ifdef NUMA
m->m_pkthdr.numa_domain = inp->inp_numa_domain;
#endif
@@ -717,6 +723,9 @@
}
}
+ if (vlan_pcp > -1)
+ EVL_APPLY_PRI(m, vlan_pcp);
+
/* IN_LOOPBACK must not appear on the wire - RFC1122. */
if (IN_LOOPBACK(ntohl(ip->ip_dst.s_addr)) ||
IN_LOOPBACK(ntohl(ip->ip_src.s_addr))) {
@@ -1210,6 +1219,7 @@
#ifdef RSS
case IP_RECVRSSBUCKETID:
#endif
+ case IP_VLAN_PCP:
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
@@ -1305,6 +1315,28 @@
OPTSET2(INP_RECVRSSBUCKETID, optval);
break;
#endif
+ case IP_VLAN_PCP:
+ if ((optval >= -1) && (optval <=
+ (INP_2PCP_MASK >> INP_2PCP_SHIFT))) {
+ if (optval == -1) {
+ INP_WLOCK(inp);
+ inp->inp_flags2 &=
+ ~(INP_2PCP_SET |
+ INP_2PCP_MASK);
+ INP_WUNLOCK(inp);
+ } else {
+ INP_WLOCK(inp);
+ inp->inp_flags2 |=
+ INP_2PCP_SET;
+ inp->inp_flags2 &=
+ ~INP_2PCP_MASK;
+ inp->inp_flags2 |=
+ optval << INP_2PCP_SHIFT;
+ INP_WUNLOCK(inp);
+ }
+ } else
+ error = EINVAL;
+ break;
}
break;
#undef OPTSET
@@ -1425,6 +1457,7 @@
case IP_RSSBUCKETID:
case IP_RECVRSSBUCKETID:
#endif
+ case IP_VLAN_PCP:
switch (sopt->sopt_name) {
case IP_TOS:
optval = inp->inp_ip_tos;
@@ -1511,6 +1544,14 @@
#endif
case IP_BINDMULTI:
optval = OPTBIT2(INP_BINDMULTI);
+ break;
+ case IP_VLAN_PCP:
+ if (OPTBIT2(INP_2PCP_SET)) {
+ optval = (inp->inp_flags2 &
+ INP_2PCP_MASK) >> INP_2PCP_SHIFT;
+ } else {
+ optval = -1;
+ }
break;
}
error = sooptcopyout(sopt, &optval, sizeof optval);
Index: head/sys/netinet6/in6.h
===================================================================
--- head/sys/netinet6/in6.h
+++ head/sys/netinet6/in6.h
@@ -511,6 +511,10 @@
* set/get multicast source filter list.
*/
+/* The following option deals with the 802.1Q Ethernet Priority Code Point */
+#define IPV6_VLAN_PCP 75 /* int; set/get PCP used for packet, */
+ /* -1 use interface default */
+
/* to define items, should talk with KAME guys first, for *BSD compatibility */
#define IPV6_RTHDR_LOOSE 0 /* this hop need not be a neighbor. XXX old spec */
Index: head/sys/netinet6/ip6_output.c
===================================================================
--- head/sys/netinet6/ip6_output.c
+++ head/sys/netinet6/ip6_output.c
@@ -92,7 +92,9 @@
#include <net/if.h>
#include <net/if_var.h>
+#include <net/if_vlan_var.h>
#include <net/if_llatbl.h>
+#include <net/ethernet.h>
#include <net/netisr.h>
#include <net/route.h>
#include <net/route/nhop.h>
@@ -436,6 +438,7 @@
u_char *nexthdrp;
int tlen, len;
int error = 0;
+ int vlan_pcp = -1;
struct in6_ifaddr *ia = NULL;
u_long mtu;
int alwaysfrag, dontfrag;
@@ -460,6 +463,9 @@
m->m_pkthdr.flowid = inp->inp_flowid;
M_HASHTYPE_SET(m, inp->inp_flowtype);
}
+ if ((inp->inp_flags2 & INP_2PCP_SET) != 0)
+ vlan_pcp = (inp->inp_flags2 & INP_2PCP_MASK) >>
+ INP_2PCP_SHIFT;
#ifdef NUMA
m->m_pkthdr.numa_domain = inp->inp_numa_domain;
#endif
@@ -1098,6 +1104,8 @@
}
passout:
+ if (vlan_pcp > -1)
+ EVL_APPLY_PRI(m, vlan_pcp);
/*
* Send the packet to the outgoing interface.
* If necessary, do IPv6 fragmentation before sending.
@@ -1265,6 +1273,8 @@
counter_u64_add(ia->ia_ifa.ifa_obytes,
m->m_pkthdr.len);
}
+ if (vlan_pcp > -1)
+ EVL_APPLY_PRI(m, vlan_pcp);
error = ip6_output_send(inp, ifp, origifp, m, dst, ro,
true);
} else
@@ -1752,6 +1762,7 @@
#ifdef RSS
case IPV6_RSS_LISTEN_BUCKET:
#endif
+ case IPV6_VLAN_PCP:
if (optname == IPV6_BINDANY && td != NULL) {
error = priv_check(td,
PRIV_NETINET_BINDANY);
@@ -1945,6 +1956,29 @@
}
break;
#endif
+ case IPV6_VLAN_PCP:
+ if ((optval >= -1) && (optval <=
+ (INP_2PCP_MASK >> INP_2PCP_SHIFT))) {
+ if (optval == -1) {
+ INP_WLOCK(inp);
+ inp->inp_flags2 &=
+ ~(INP_2PCP_SET |
+ INP_2PCP_MASK);
+ INP_WUNLOCK(inp);
+ } else {
+ INP_WLOCK(inp);
+ inp->inp_flags2 |=
+ INP_2PCP_SET;
+ inp->inp_flags2 &=
+ ~INP_2PCP_MASK;
+ inp->inp_flags2 |=
+ optval <<
+ INP_2PCP_SHIFT;
+ INP_WUNLOCK(inp);
+ }
+ } else
+ error = EINVAL;
+ break;
}
break;
@@ -2168,6 +2202,7 @@
case IPV6_RECVRSSBUCKETID:
#endif
case IPV6_BINDMULTI:
+ case IPV6_VLAN_PCP:
switch (optname) {
case IPV6_RECVHOPOPTS:
optval = OPTBIT(IN6P_HOPOPTS);
@@ -2264,7 +2299,18 @@
case IPV6_BINDMULTI:
optval = OPTBIT2(INP_BINDMULTI);
break;
+
+ case IPV6_VLAN_PCP:
+ if (OPTBIT2(INP_2PCP_SET)) {
+ optval = (inp->inp_flags2 &
+ INP_2PCP_MASK) >>
+ INP_2PCP_SHIFT;
+ } else {
+ optval = -1;
+ }
+ break;
}
+
if (error)
break;
error = sooptcopyout(sopt, &optval,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, May 20, 10:42 PM (7 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33360466
Default Alt Text
D26409.diff (7 KB)
Attached To
Mode
D26409: Add IP(V6)_VLAN_PCP to adjust 802.1 priority per-flow.
Attached
Detach File
Event Timeline
Log In to Comment