<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;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#467886;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Aptos",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:11.0pt;
mso-fareast-language:EN-US;}
@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"><span style="mso-fareast-language:EN-GB">The previous code incorrectly parsed the VLAN ID and priority.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">If the 16-bits of VLAN ID and priority/CFI on the wire was<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">0123456789ABCDEF the code parsed it as 456789ABCDEF3012. There<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">were macros defined to handle this conversion but they were not<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">used.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">This fix takes an approach similar to the Linux netvsc driver and<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">defines an explicit structure to use for parsing.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">Fixes: 4e9c73e96e83 ("net/netvsc: add Hyper-V network device")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">Cc: </span><a href="mailto:sthemmin@microsoft.com"><span style="mso-fareast-language:EN-GB">sthemmin@microsoft.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">Cc: </span><a href="mailto:stable@dpdk.org"><span style="mso-fareast-language:EN-GB">stable@dpdk.org</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">Signed-off-by: Alan Elder
</span><a href="mailto:alan.elder@microsoft.com"><span style="mso-fareast-language:EN-GB">alan.elder@microsoft.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">---<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> .mailmap | 1 +<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> drivers/net/netvsc/hn_rxtx.c | 23 +++++++++++++++++------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> drivers/net/netvsc/ndis.h | 23 +++++++++++++----------<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> 3 files changed, 31 insertions(+), 16 deletions(-)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">diff --git a/.mailmap b/.mailmap<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">index 864d33ee46..0fde0fa509 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">--- a/.mailmap<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+++ b/.mailmap<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">@@ -32,6 +32,7 @@ Akihiko Odaki
</span><a href="mailto:akihiko.odaki@daynix.com"><span style="mso-fareast-language:EN-GB">akihiko.odaki@daynix.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> Alain Leon </span>
<a href="mailto:xerebz@gmail.com"><span style="mso-fareast-language:EN-GB">xerebz@gmail.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> Alan Carew </span>
<a href="mailto:alan.carew@intel.com"><span style="mso-fareast-language:EN-GB">alan.carew@intel.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> Alan Dewar </span>
<a href="mailto:alan.dewar@att.com"><span style="mso-fareast-language:EN-GB">alan.dewar@att.com</span></a><span style="mso-fareast-language:EN-GB">
</span><a href="mailto:adewar@brocade.com"><span style="mso-fareast-language:EN-GB">adewar@brocade.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+Alan Elder </span>
<a href="mailto:alan.elder@microsoft.com"><span style="mso-fareast-language:EN-GB">alan.elder@microsoft.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> Alan Liu </span><a href="mailto:zaoxingliu@gmail.com"><span style="mso-fareast-language:EN-GB">zaoxingliu@gmail.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> Alan Winkowski </span>
<a href="mailto:walan@marvell.com"><span style="mso-fareast-language:EN-GB">walan@marvell.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> Alejandro Lucero </span>
<a href="mailto:alejandro.lucero@netronome.com"><span style="mso-fareast-language:EN-GB">alejandro.lucero@netronome.com</span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">index bc6f60c64a..949780abd5 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">--- a/drivers/net/netvsc/hn_rxtx.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+++ b/drivers/net/netvsc/hn_rxtx.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">@@ -42,8 +42,13 @@<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> #define HN_TXD_CACHE_SIZE 32 /* per cpu tx_descriptor pool cache */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> #define HN_RXQ_EVENT_DEFAULT 2048<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+#define HN_VLAN_PRIO_MASK 0xe000 /* Priority Code Point */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+#define HN_VLAN_PRIO_SHIFT 13<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+#define HN_VLAN_CFI_MASK 0x1000 /* Canonical Format Indicator / Drop Eligible Indicator */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+#define HN_VLAN_VID_MASK 0x0fff /* VLAN Identifier */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> struct hn_rxinfo {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">- uint32_t vlan_info;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ struct ndis_pkt_vlan_info vlan_info;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> uint32_t csum_info;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> uint32_t hash_info;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> uint32_t hash_value;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">@@ -477,7 +482,7 @@ hn_rndis_rxinfo(const void *info_data, unsigned int info_dlen,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> case NDIS_PKTINFO_TYPE_VLAN:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> if (unlikely(dlen < NDIS_VLAN_INFO_SIZE))<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> return -EINVAL;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">- info->vlan_info = *((const uint32_t *)data);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ info->vlan_info = *((const struct ndis_pkt_vlan_info *)data);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> mask |= HN_RXINFO_VLAN;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">@@ -611,8 +616,10 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> RTE_PTYPE_L3_MASK |<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> RTE_PTYPE_L4_MASK);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">- if (info->vlan_info != HN_NDIS_VLAN_INFO_INVALID) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">- m->vlan_tci = info->vlan_info;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ if (info->vlan_info.value != HN_NDIS_VLAN_INFO_INVALID) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ m->vlan_tci = info->vlan_info.vlanid |<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ (info->vlan_info.pri << HN_VLAN_PRIO_SHIFT) |<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ (info->vlan_info.cfi ? HN_VLAN_CFI_MASK : 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> m->ol_flags |= RTE_MBUF_F_RX_VLAN_STRIPPED | RTE_MBUF_F_RX_VLAN;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> /* NDIS always strips tag, put it back if necessary */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">@@ -669,7 +676,7 @@ static void hn_rndis_rx_data(struct hn_rx_queue *rxq,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> unsigned int pktinfo_off, pktinfo_len;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> const struct rndis_packet_msg *pkt = data;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> struct hn_rxinfo info = {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">- .vlan_info = HN_NDIS_VLAN_INFO_INVALID,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ .vlan_info.value = HN_NDIS_VLAN_INFO_INVALID,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> .csum_info = HN_NDIS_RXCSUM_INFO_INVALID,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> .hash_info = HN_NDIS_HASH_INFO_INVALID,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> };<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">@@ -1332,7 +1339,11 @@ static void hn_encap(struct rndis_packet_msg *pkt,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> if (m->ol_flags & RTE_MBUF_F_TX_VLAN) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> pi_data = hn_rndis_pktinfo_append(pkt, NDIS_VLAN_INFO_SIZE,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> NDIS_PKTINFO_TYPE_VLAN);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">- *pi_data = m->vlan_tci;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ struct ndis_pkt_vlan_info *vlan = (struct ndis_pkt_vlan_info *)pi_data;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ vlan->value = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ vlan->vlanid = (m->vlan_tci & HN_VLAN_VID_MASK);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ vlan->cfi = (!!(m->vlan_tci & HN_VLAN_CFI_MASK));<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ vlan->pri = ((m->vlan_tci & HN_VLAN_PRIO_MASK) >> HN_VLAN_PRIO_SHIFT);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> if (m->ol_flags & RTE_MBUF_F_TX_TCP_SEG) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">diff --git a/drivers/net/netvsc/ndis.h b/drivers/net/netvsc/ndis.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">index d97a397a86..a1e587c738 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">--- a/drivers/net/netvsc/ndis.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+++ b/drivers/net/netvsc/ndis.h<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">@@ -316,16 +316,19 @@ struct ndis_offload {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> /* VLAN */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-#define NDIS_VLAN_INFO_SIZE sizeof(uint32_t)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-#define NDIS_VLAN_INFO_PRI_MASK 0x0007<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-#define NDIS_VLAN_INFO_CFI_MASK 0x0008<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-#define NDIS_VLAN_INFO_ID_MASK 0xfff0<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-#define NDIS_VLAN_INFO_MAKE(id, pri, cfi) \<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">- (((pri) & NDIS_VLAN_INFO_PRI_MASK) | \<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">- (((cfi) & 0x1) << 3) | (((id) & 0xfff) << 4))<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-#define NDIS_VLAN_INFO_ID(inf) (((inf) & NDIS_VLAN_INFO_ID_MASK) >> 4)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-#define NDIS_VLAN_INFO_CFI(inf) (((inf) & NDIS_VLAN_INFO_CFI_MASK) >> 3)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-#define NDIS_VLAN_INFO_PRI(inf) ((inf) & NDIS_VLAN_INFO_PRI_MASK)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+struct ndis_pkt_vlan_info {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ union {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ struct {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ uint32_t pri:3; /* User Priority */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ uint32_t cfi:1; /* Canonical Format ID / DEI */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ uint32_t vlanid:12; /* VLAN ID */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ uint32_t reserved:16;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ };<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ uint32_t value;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+ };<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">+#define NDIS_VLAN_INFO_SIZE sizeof(struct ndis_pkt_vlan_info)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> /* Reception checksum */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"> #define NDIS_RXCSUM_INFO_SIZE sizeof(uint32_t)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">-- <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB">2.25.1<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>