aboutsummaryrefslogtreecommitdiff
path: root/sys/net/if_ethersubr.c
diff options
context:
space:
mode:
authorZhenlei Huang <zlei@FreeBSD.org>2023-09-06 10:15:14 +0000
committerZhenlei Huang <zlei@FreeBSD.org>2023-09-06 10:15:14 +0000
commit49d6743da15fe378782e43776df8b4fd4f84c8d0 (patch)
tree3a996b89e6a817afdd479f09ac4e9a37d593d633 /sys/net/if_ethersubr.c
parentcb1a0aab4f3ca169509ab86a67a4630e72790869 (diff)
Diffstat (limited to 'sys/net/if_ethersubr.c')
-rw-r--r--sys/net/if_ethersubr.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c
index ab274eeb88bf..2cbe0ea98f27 100644
--- a/sys/net/if_ethersubr.c
+++ b/sys/net/if_ethersubr.c
@@ -123,6 +123,8 @@ static int ether_resolvemulti(struct ifnet *, struct sockaddr **,
struct sockaddr *);
static int ether_requestencap(struct ifnet *, struct if_encap_req *);
+static inline bool ether_do_pcp(struct ifnet *, struct mbuf *);
+
#define senderr(e) do { error = (e); goto bad;} while (0)
static void
@@ -470,11 +472,7 @@ ether_set_pcp(struct mbuf **mp, struct ifnet *ifp, uint8_t pcp)
int
ether_output_frame(struct ifnet *ifp, struct mbuf *m)
{
- uint8_t pcp;
-
- pcp = ifp->if_pcp;
- if (pcp != IFNET_PCP_NONE && ifp->if_type != IFT_L2VLAN &&
- !ether_set_pcp(&m, ifp, pcp))
+ if (ether_do_pcp(ifp, m) && !ether_set_pcp(&m, ifp, ifp->if_pcp))
return (0);
if (PFIL_HOOKED_OUT(V_link_pfil_head))
@@ -1400,6 +1398,19 @@ SYSCTL_INT(_net_link_vlan, OID_AUTO, mtag_pcp, CTLFLAG_RW | CTLFLAG_VNET,
&VNET_NAME(vlan_mtag_pcp), 0,
"Retain VLAN PCP information as packets are passed up the stack");
+static inline bool
+ether_do_pcp(struct ifnet *ifp, struct mbuf *m)
+{
+ if (ifp->if_type == IFT_L2VLAN)
+ return (false);
+ if (ifp->if_pcp != IFNET_PCP_NONE || (m->m_flags & M_VLANTAG) != 0)
+ return (true);
+ if (V_vlan_mtag_pcp &&
+ m_tag_locate(m, MTAG_8021Q, MTAG_8021Q_PCP_OUT, NULL) != NULL)
+ return (true);
+ return (false);
+}
+
bool
ether_8021q_frame(struct mbuf **mp, struct ifnet *ife, struct ifnet *p,
const struct ether_8021q_tag *qtag)