<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Aptos;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Aptos",sans-serif;
mso-ligatures:standardcontextual;
mso-fareast-language:EN-US;}
span.EmailStyle20
{mso-style-type:personal-compose;
font-family:"Aptos",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">The previous code incorrectly parsed the VLAN ID and priority.<o:p></o:p></p>
<p class="MsoNormal">If the 16-bits of VLAN ID and priority/CFI on the wire was<o:p></o:p></p>
<p class="MsoNormal">0123456789ABCDEF the code parsed it as 456789ABCDEF3012. There<o:p></o:p></p>
<p class="MsoNormal">were macros defined to handle this conversion but they were not<o:p></o:p></p>
<p class="MsoNormal">used.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This fix takes an approach similar to the Linux netvsc driver and<o:p></o:p></p>
<p class="MsoNormal">defines an explicit structure to use for parsing.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Fixes: 4e9c73e96e83 ("net/netvsc: add Hyper-V network device")<o:p></o:p></p>
<p class="MsoNormal">Cc: sthemmin@microsoft.com<o:p></o:p></p>
<p class="MsoNormal">Cc: stable@dpdk.org<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Signed-off-by: Alan Elder <alan.elder@microsoft.com><o:p></o:p></p>
<p class="MsoNormal">---<o:p></o:p></p>
<p class="MsoNormal">.mailmap | 1 +<o:p></o:p></p>
<p class="MsoNormal">drivers/net/netvsc/hn_rxtx.c | 23 +++++++++++++++++------<o:p></o:p></p>
<p class="MsoNormal">drivers/net/netvsc/ndis.h | 23 +++++++++++++----------<o:p></o:p></p>
<p class="MsoNormal">3 files changed, 31 insertions(+), 16 deletions(-)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff --git a/.mailmap b/.mailmap<o:p></o:p></p>
<p class="MsoNormal">index a0756974e2..eca02318d6 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/.mailmap<o:p></o:p></p>
<p class="MsoNormal">+++ b/.mailmap<o:p></o:p></p>
<p class="MsoNormal">@@ -33,6 +33,7 @@ Alain Leon <xerebz@gmail.com><o:p></o:p></p>
<p class="MsoNormal">Alan Brady <alan.brady@intel.com><o:p></o:p></p>
<p class="MsoNormal">Alan Carew <alan.carew@intel.com><o:p></o:p></p>
<p class="MsoNormal">Alan Dewar <alan.dewar@att.com> <adewar@brocade.com><o:p></o:p></p>
<p class="MsoNormal">+Alan Elder <alan.elder@microsoft.com><o:p></o:p></p>
<p class="MsoNormal">Alan Liu <zaoxingliu@gmail.com><o:p></o:p></p>
<p class="MsoNormal">Alan Winkowski <walan@marvell.com><o:p></o:p></p>
<p class="MsoNormal">Alejandro Lucero <alejandro.lucero@netronome.com><o:p></o:p></p>
<p class="MsoNormal">diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c<o:p></o:p></p>
<p class="MsoNormal">index e4f5015aa3..e3b9899f1e 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/net/netvsc/hn_rxtx.c<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/net/netvsc/hn_rxtx.c<o:p></o:p></p>
<p class="MsoNormal">@@ -42,8 +42,13 @@<o:p></o:p></p>
<p class="MsoNormal">#define HN_TXD_CACHE_SIZE 32 /* per cpu tx_descriptor pool cache */<o:p></o:p></p>
<p class="MsoNormal">#define HN_RXQ_EVENT_DEFAULT 2048<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+#define HN_VLAN_PRIO_MASK 0xe000 /* Priority Code Point */<o:p></o:p></p>
<p class="MsoNormal">+#define HN_VLAN_PRIO_SHIFT 13<o:p></o:p></p>
<p class="MsoNormal">+#define HN_VLAN_CFI_MASK 0x1000 /* Canonical Format Indicator / Drop Eligible Indicator */<o:p></o:p></p>
<p class="MsoNormal">+#define HN_VLAN_VID_MASK 0x0fff /* VLAN Identifier */<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">struct hn_rxinfo {<o:p></o:p></p>
<p class="MsoNormal">- uint32_t vlan_info;<o:p></o:p></p>
<p class="MsoNormal">+ struct ndis_pkt_vlan_info vlan_info;<o:p></o:p></p>
<p class="MsoNormal"> uint32_t csum_info;<o:p></o:p></p>
<p class="MsoNormal"> uint32_t hash_info;<o:p></o:p></p>
<p class="MsoNormal"> uint32_t hash_value;<o:p></o:p></p>
<p class="MsoNormal">@@ -477,7 +482,7 @@ hn_rndis_rxinfo(const void *info_data, unsigned int info_dlen,<o:p></o:p></p>
<p class="MsoNormal"> case NDIS_PKTINFO_TYPE_VLAN:<o:p></o:p></p>
<p class="MsoNormal"> if (unlikely(dlen < NDIS_VLAN_INFO_SIZE))<o:p></o:p></p>
<p class="MsoNormal"> return -EINVAL;<o:p></o:p></p>
<p class="MsoNormal">- info->vlan_info = *((const uint32_t *)data);<o:p></o:p></p>
<p class="MsoNormal">+ info->vlan_info = *((const struct ndis_pkt_vlan_info *)data);<o:p></o:p></p>
<p class="MsoNormal"> mask |= HN_RXINFO_VLAN;<o:p></o:p></p>
<p class="MsoNormal"> break;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -611,8 +616,10 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,<o:p></o:p></p>
<p class="MsoNormal"> RTE_PTYPE_L3_MASK |<o:p></o:p></p>
<p class="MsoNormal"> RTE_PTYPE_L4_MASK);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">- if (info->vlan_info != HN_NDIS_VLAN_INFO_INVALID) {<o:p></o:p></p>
<p class="MsoNormal">- m->vlan_tci = info->vlan_info;<o:p></o:p></p>
<p class="MsoNormal">+ if (info->vlan_info.value != HN_NDIS_VLAN_INFO_INVALID) {<o:p></o:p></p>
<p class="MsoNormal">+ m->vlan_tci = info->vlan_info.vlanid |<o:p></o:p></p>
<p class="MsoNormal">+ (info->vlan_info.pri << HN_VLAN_PRIO_SHIFT) |<o:p></o:p></p>
<p class="MsoNormal">+ (info->vlan_info.cfi ? HN_VLAN_CFI_MASK : 0);<o:p></o:p></p>
<p class="MsoNormal"> m->ol_flags |= RTE_MBUF_F_RX_VLAN_STRIPPED | RTE_MBUF_F_RX_VLAN;<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> /* NDIS always strips tag, put it back if necessary */<o:p></o:p></p>
<p class="MsoNormal">@@ -669,7 +676,7 @@ static void hn_rndis_rx_data(struct hn_rx_queue *rxq,<o:p></o:p></p>
<p class="MsoNormal"> unsigned int pktinfo_off, pktinfo_len;<o:p></o:p></p>
<p class="MsoNormal"> const struct rndis_packet_msg *pkt = data;<o:p></o:p></p>
<p class="MsoNormal"> struct hn_rxinfo info = {<o:p></o:p></p>
<p class="MsoNormal">- .vlan_info = HN_NDIS_VLAN_INFO_INVALID,<o:p></o:p></p>
<p class="MsoNormal">+ .vlan_info.value = HN_NDIS_VLAN_INFO_INVALID,<o:p></o:p></p>
<p class="MsoNormal"> .csum_info = HN_NDIS_RXCSUM_INFO_INVALID,<o:p></o:p></p>
<p class="MsoNormal"> .hash_info = HN_NDIS_HASH_INFO_INVALID,<o:p></o:p></p>
<p class="MsoNormal"> };<o:p></o:p></p>
<p class="MsoNormal">@@ -1332,7 +1339,11 @@ static void hn_encap(struct rndis_packet_msg *pkt,<o:p></o:p></p>
<p class="MsoNormal"> if (m->ol_flags & RTE_MBUF_F_TX_VLAN) {<o:p></o:p></p>
<p class="MsoNormal"> pi_data = hn_rndis_pktinfo_append(pkt, NDIS_VLAN_INFO_SIZE,<o:p></o:p></p>
<p class="MsoNormal"> NDIS_PKTINFO_TYPE_VLAN);<o:p></o:p></p>
<p class="MsoNormal">- *pi_data = m->vlan_tci;<o:p></o:p></p>
<p class="MsoNormal">+ struct ndis_pkt_vlan_info *vlan = (struct ndis_pkt_vlan_info *)pi_data;<o:p></o:p></p>
<p class="MsoNormal">+ vlan->value = 0;<o:p></o:p></p>
<p class="MsoNormal">+ vlan->vlanid = (m->vlan_tci & HN_VLAN_VID_MASK);<o:p></o:p></p>
<p class="MsoNormal">+ vlan->cfi = (!!(m->vlan_tci & HN_VLAN_CFI_MASK));<o:p></o:p></p>
<p class="MsoNormal">+ vlan->pri = ((m->vlan_tci & HN_VLAN_PRIO_MASK) >> HN_VLAN_PRIO_SHIFT);<o:p></o:p></p>
<p class="MsoNormal"> }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> if (m->ol_flags & RTE_MBUF_F_TX_TCP_SEG) {<o:p></o:p></p>
<p class="MsoNormal">diff --git a/drivers/net/netvsc/ndis.h b/drivers/net/netvsc/ndis.h<o:p></o:p></p>
<p class="MsoNormal">index d97a397a86..a1e587c738 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/drivers/net/netvsc/ndis.h<o:p></o:p></p>
<p class="MsoNormal">+++ b/drivers/net/netvsc/ndis.h<o:p></o:p></p>
<p class="MsoNormal">@@ -316,16 +316,19 @@ struct ndis_offload {<o:p></o:p></p>
<p class="MsoNormal"> */<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> /* VLAN */<o:p></o:p></p>
<p class="MsoNormal">-#define NDIS_VLAN_INFO_SIZE sizeof(uint32_t)<o:p></o:p></p>
<p class="MsoNormal">-#define NDIS_VLAN_INFO_PRI_MASK 0x0007<o:p></o:p></p>
<p class="MsoNormal">-#define NDIS_VLAN_INFO_CFI_MASK 0x0008<o:p></o:p></p>
<p class="MsoNormal">-#define NDIS_VLAN_INFO_ID_MASK 0xfff0<o:p></o:p></p>
<p class="MsoNormal">-#define NDIS_VLAN_INFO_MAKE(id, pri, cfi) \<o:p></o:p></p>
<p class="MsoNormal">- (((pri) & NDIS_VLAN_INFO_PRI_MASK) | \<o:p></o:p></p>
<p class="MsoNormal">- (((cfi) & 0x1) << 3) | (((id) & 0xfff) << 4))<o:p></o:p></p>
<p class="MsoNormal">-#define NDIS_VLAN_INFO_ID(inf) (((inf) & NDIS_VLAN_INFO_ID_MASK) >> 4)<o:p></o:p></p>
<p class="MsoNormal">-#define NDIS_VLAN_INFO_CFI(inf) (((inf) & NDIS_VLAN_INFO_CFI_MASK) >> 3)<o:p></o:p></p>
<p class="MsoNormal">-#define NDIS_VLAN_INFO_PRI(inf) ((inf) & NDIS_VLAN_INFO_PRI_MASK)<o:p></o:p></p>
<p class="MsoNormal">+struct ndis_pkt_vlan_info {<o:p></o:p></p>
<p class="MsoNormal">+ union {<o:p></o:p></p>
<p class="MsoNormal">+ struct {<o:p></o:p></p>
<p class="MsoNormal">+ uint32_t pri:3; /* User Priority */<o:p></o:p></p>
<p class="MsoNormal">+ uint32_t cfi:1; /* Canonical Format ID / DEI */<o:p></o:p></p>
<p class="MsoNormal">+ uint32_t vlanid:12; /* VLAN ID */<o:p></o:p></p>
<p class="MsoNormal">+ uint32_t reserved:16;<o:p></o:p></p>
<p class="MsoNormal">+ };<o:p></o:p></p>
<p class="MsoNormal">+ uint32_t value;<o:p></o:p></p>
<p class="MsoNormal">+ };<o:p></o:p></p>
<p class="MsoNormal">+};<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#define NDIS_VLAN_INFO_SIZE sizeof(struct ndis_pkt_vlan_info)<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> /* Reception checksum */<o:p></o:p></p>
<p class="MsoNormal">#define NDIS_RXCSUM_INFO_SIZE sizeof(uint32_t)<o:p></o:p></p>
<p class="MsoNormal">-- <o:p></o:p></p>
<p class="MsoNormal">2.25.1<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>