From nobody Wed Aug 30 10:10:12 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4RbKmP0wh9z4rxsD; Wed, 30 Aug 2023 10:10:13 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RbKmP0P5Kz3YVr; Wed, 30 Aug 2023 10:10:13 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1693390213; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ZKMxYE3p7xnCsU2xw776HZ77NDYAV7+tKhcGSfXB7mc=; b=kI2P//q3OgbImenUcHI4Sqt9TtnvUOxIvDIoWKgED+ag8AJosR+xLlCssENvIuXGjvzXv7 oKgXFub20LXVFwk3FSArriHbAVodrWDU7BRaZ+wcoyFgpPaL33UdWPglLDvrQghJBGi/Sw KnnTrIzaCL2m6iI7AIUo9hwdJBJuqzk9TfnnlODWJC9CvMBz74Y1u4C5nB+51qkr18C5tA nKnQzGN9qjI4ELWr+gJ97uCvCXpS3sqdiEchCrNh3jBU9geE9puXDD18EH2VqN+T/rFap1 daq3UEq5pduwJ6ccYNwe6sOQTl+eDN9AgwGOZreMeIvGuMLOZzq/Qcb31q9l4A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1693390213; a=rsa-sha256; cv=none; b=iK50Wdbl9NW9fartj+eLPgr44bTO/Y5VCXbHkaZUnqQ9dTFgIcbE9YV7ro03RXzsGN7hl9 /ryCNTZYE3ejMpEOQZlNOtnRUL2IAelb+5+poLjnj/4UmM2qrBdjkGHHF1yyHCRWoPgiL0 YgWD4v4/NTHlb4L3Q3w0kF1zS/dvcFA64iXw12bSjoCcjFYFgHw5ofqnxlHbXZkEGEgKX3 KOEsM/8YVqm9FrvAfzDxMWiVoBCkdfjR0VIYV2B9ZhmSCcNyDCuDNPIJhxPKLHyiP4Mjjt kLZx6rEA2WU94D7MoAvb+hWAw65ZAbCA4Xo2tFSR9eO6t0Vzh5UNIK+dF1ZC3w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1693390213; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ZKMxYE3p7xnCsU2xw776HZ77NDYAV7+tKhcGSfXB7mc=; b=dac33K6qGR3usdsuVhRIswgpZz/eIbgCsnZ+Gz9hGT3Io0Kh3T7gOwl7nqYEXEg5dSuMCq KUjkkPC+dfR102LmJJf6DVbcXR9yYt12E0X3VDgWp3NLOi8NH2Vqqd2bH57X2ag8Erg27P krmssDZK320fDXHQ6WHH8QJCG/6AxJzIah+RHtXjMmw2UTJ3jnKm7JhS3Hu556rHMWKaac O0LeNqTosM7c5KThM46NZKmhZbvWGX89OWBVG1JHBuaLoi0PvHNqHaLoanErb2LA4+y/Rv Xvd6voHwCsSD/jqLAZ+6suTxPvLOfcsW/KlioefPCz3qJ0ENGQ5L649iASHUAA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4RbKmN6SWYzW9q; Wed, 30 Aug 2023 10:10:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 37UAAC5i021439; Wed, 30 Aug 2023 10:10:12 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 37UAACGk021430; Wed, 30 Aug 2023 10:10:12 GMT (envelope-from git) Date: Wed, 30 Aug 2023 10:10:12 GMT Message-Id: <202308301010.37UAACGk021430@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Zhenlei Huang Subject: git: 96c4b704ec16 - stable/13 - net: Do not overwrite if_vlan's PCP List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: zlei X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 96c4b704ec169044aa98867965e046a4728bcba1 Auto-Submitted: auto-generated The branch stable/13 has been updated by zlei: URL: https://cgit.FreeBSD.org/src/commit/?id=96c4b704ec169044aa98867965e046a4728bcba1 commit 96c4b704ec169044aa98867965e046a4728bcba1 Author: Zhenlei Huang AuthorDate: 2023-08-23 09:48:12 +0000 Commit: Zhenlei Huang CommitDate: 2023-08-30 10:09:25 +0000 net: Do not overwrite if_vlan's PCP In commit c7cffd65c5d8 the function ether_8021q_frame() was slightly refactored to use pointer of struct ether_8021q_tag as parameter qtag to include the new option proto. It is wrong to write to qtag->pcp as it will effectively change the memory that qtag points to. Unfortunately the transmit routine of if_vlan parses pointer of the member ifv_qtag of its softc which stores vlan interface's PCP internally, when transmitting mbufs that contains PCP the vlan interface's PCP will get overwritten. Fix by operating on a local copy of qtag->pcp. Also mark 'struct ether_8021q_tag' as const so that compilers can pick up such kind of bug. PR: 273304 Reviewed by: kp Fixes: c7cffd65c5d85 Add support for stacked VLANs (IEEE 802.1ad, AKA Q-in-Q) MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D39505 (cherry picked from commit 838c8c47860a0203130bd558d507a0565a2eba8f) --- sys/net/ethernet.h | 2 +- sys/net/if_ethersubr.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/sys/net/ethernet.h b/sys/net/ethernet.h index b935c024541c..7a763c15ff26 100644 --- a/sys/net/ethernet.h +++ b/sys/net/ethernet.h @@ -448,7 +448,7 @@ void ether_vlan_mtap(struct bpf_if *, struct mbuf *, void *, u_int); struct mbuf *ether_vlanencap_proto(struct mbuf *, uint16_t, uint16_t); bool ether_8021q_frame(struct mbuf **mp, struct ifnet *ife, - struct ifnet *p, struct ether_8021q_tag *); + struct ifnet *p, const struct ether_8021q_tag *); void ether_gen_addr(struct ifnet *ifp, struct ether_addr *hwaddr); static __inline struct mbuf *ether_vlanencap(struct mbuf *m, uint16_t tag) diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 64cca2452871..87faf9f26df4 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -1355,11 +1355,12 @@ SYSCTL_INT(_net_link_vlan, OID_AUTO, mtag_pcp, CTLFLAG_RW, bool ether_8021q_frame(struct mbuf **mp, struct ifnet *ife, struct ifnet *p, - struct ether_8021q_tag *qtag) + const struct ether_8021q_tag *qtag) { struct m_tag *mtag; int n; uint16_t tag; + uint8_t pcp = qtag->pcp; static const char pad[8]; /* just zeros */ /* @@ -1392,7 +1393,7 @@ ether_8021q_frame(struct mbuf **mp, struct ifnet *ife, struct ifnet *p, * If PCP is set in mbuf, use it */ if ((*mp)->m_flags & M_VLANTAG) { - qtag->pcp = EVL_PRIOFTAG((*mp)->m_pkthdr.ether_vtag); + pcp = EVL_PRIOFTAG((*mp)->m_pkthdr.ether_vtag); } /* @@ -1406,7 +1407,7 @@ ether_8021q_frame(struct mbuf **mp, struct ifnet *ife, struct ifnet *p, MTAG_8021Q_PCP_OUT, NULL)) != NULL) tag = EVL_MAKETAG(qtag->vid, *(uint8_t *)(mtag + 1), 0); else - tag = EVL_MAKETAG(qtag->vid, qtag->pcp, 0); + tag = EVL_MAKETAG(qtag->vid, pcp, 0); if ((p->if_capenable & IFCAP_VLAN_HWTAGGING) && (qtag->proto == ETHERTYPE_VLAN)) { (*mp)->m_pkthdr.ether_vtag = tag;