<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:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" 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 12 (filtered medium)">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal;
font-family:"Calibri","sans-serif";
color:windowtext;}
span.EmailStyle18
{mso-style-type:personal;
font-family:"Calibri","sans-serif";
color:#1F497D;}
span.EmailStyle19
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:#1F497D;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
{page:Section1;}
-->
</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-US link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal><span style='color:#1F497D'>Applied at 7083<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>
<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Alex Naslednikov <br>
<b>Sent:</b> Wednesday, January 26, 2011 4:16 PM<br>
<b>To:</b> Alex Naslednikov; ofw@lists.openfabrics.org<br>
<b>Subject:</b> [ofw][patch][IPoIB_NDIS6_CM] Network discovery support for IPv6<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><span style='color:#1F497D'>Network discovery support for
IPv6</span><o:p></o:p></p>
<p class=MsoNormal> Signed-off by: Galina Tcharny (galina at
mellanox.co.il)<o:p></o:p></p>
<p class=MsoNormal><span style='color:#1F497D'>Index: inc/kernel/ip_packet.h<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>===================================================================<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>---
inc/kernel/ip_packet.h
(revision 3080)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+++
inc/kernel/ip_packet.h (working copy)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -49,6 +49,7 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> #define
ETH_PROT_TYPE_RARP
CL_HTON16(0x8035)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> #define
ETH_PROT_VLAN_TAG
CL_HTON16(0x8100)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define IPV6_ADDR_LENGTH
16<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> #define
ETH_IS_LOCALLY_ADMINISTERED(addr) \<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
(BOOLEAN)(((PUCHAR)(addr))[0] & ((UCHAR)0x02))<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -637,7 +638,70 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
}
PACK_SUFFIX type;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> }
PACK_SUFFIX eth_pkt_t;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> #include
<complib/cl_packoff.h><o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#include
<complib/cl_packon.h><o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define ICMPV6_MSG_TYPE_NBR_SOL
135<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define ICMPV6_MSG_TYPE_NBR_ADV
136<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+typedef struct _icmpv6_hdr <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
uint8_t type; <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
uint8_t code; <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
net16_t
checksum;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+} icmpv6_hdr_t;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+typedef struct _icmpv6_pkt<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
icmpv6_hdr_t hdr;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
union<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
struct _icmpv6_neighbor_sol<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
net32_t
reserved;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
uint8_t
target_addr[IPV6_ADDR_LENGTH];<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
} sol;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
struct _icmpv6_neighbor_adv<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
net32_t
flags;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
uint8_t
target_addr[IPV6_ADDR_LENGTH];<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
} adv;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
} u;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+} icmpv6_pkt_t;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define ICMPV6_OPTION_SRC_LINK_ADDR
1<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define
ICMPV6_OPTION_TARGET_LINK_ADDR
2<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define
ICMPV6_IPOIB_LINK_ADDR_OPTION_LENGTH
24<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define
ICMPV6_IPOIB_LINK_ADDR_OPTION_ADDR_LENGTH
(ICMPV6_IPOIB_LINK_ADDR_OPTION_LENGTH - 2)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define
ICMPV6_ETH_LINK_ADDR_OPTION_LENGTH
8<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#define
ICMPV6_ETH_LINK_ADDR_OPTION_ADDR_LENGTH
(ICMPV6_ETH_LINK_ADDR_OPTION_LENGTH - 2)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+typedef struct _icmpv6_option<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
uint8_t option_type;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
uint8_t option_length; // length of the entire
option in 8-byte blocks == 1(MAC Option)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
union<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
struct _icmpv6_src_link_addr<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
uint8_t
mac_addr[ICMPV6_IPOIB_LINK_ADDR_OPTION_ADDR_LENGTH];<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
} saddr;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
struct _icmpv6_target_link_addr<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
uint8_t mac_addr[ICMPV6_IPOIB_LINK_ADDR_OPTION_ADDR_LENGTH];<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
} taddr;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
} u;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+} icmpv6_option_t;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+#include
<complib/cl_packoff.h><o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> #endif /*
_IP_PACKET_H_ */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>Index:
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>===================================================================<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
(revision 3080)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
(working copy)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -305,6 +305,15 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
ipoib_endpt_t* const
p_dst );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> static ib_api_status_t<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+__recv_icmpv6(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ib_wc_t* const
p_wc,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_pkt_t* const
p_ipoib,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_endpt_t** const
pp_src,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_endpt_t* const
p_dst );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+static ib_api_status_t<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> __recv_mgr_prepare_NBL(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
ipoib_port_t*
const
p_port,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
ipoib_recv_desc_t* const
p_desc,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -377,6 +386,13 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
size_t
buf_len,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
OUT
ipoib_send_NB_SG*
const
s_buf );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+static NDIS_STATUS<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+__send_mgr_filter_icmpv6(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
const ipv6_hdr_t*
const
p_ipv6_hdr,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
MDL*
p_mdl,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
size_t
buf_len,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
OUT
ipoib_send_NB_SG*
s_buf);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> static inline void <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> __send_complete_net_buffer(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
ipoib_send_NB_SG *s_buf, <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -419,6 +435,8 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
NET_BUFFER
*p_netbuf);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+unsigned short
ipchksum(unsigned short *ip, int len);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> static inline void<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
ipoib_print_ip_hdr( <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
ip_hdr_t*
const
p_ip_hdr )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -647,6 +665,13 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> __leave_error_mcast_cb(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
void
*context );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+static ib_api_status_t<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+__endpt_update(
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_endpt_t**
const
pp_src,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
const ipoib_hw_addr_t*
p_new_hw_addr,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ib_wc_t*
const
p_wc<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> #if DBG<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> char *ref_cnt_str(int
type);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -2877,6 +2902,12 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
status = IB_INVALID_SETTING;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
break;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( p_ipoib->type.ipv6.hdr.next_header == IP_PROT_ICMPV6 )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
status = __recv_icmpv6( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
break;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
if( p_ipoib->type.ipv6.hdr.next_header != IP_PROT_UDP )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -3328,8 +3359,6 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
ib_api_status_t
status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
arp_pkt_t
*p_arp;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
const ipoib_arp_pkt_t *p_ib_arp;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
ib_gid_t
gid;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
mac_addr_t
mac;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
ipoib_hw_addr_t
null_hw = {0};<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
uint8_t
cm_capable = 0;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
boolean_t
queue_rc_conn = FALSE;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -3375,110 +3404,13 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
if( !*pp_src )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
*pp_src = __endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/*<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
* If the endpoint exists for the GID, make sure<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
* the dlid and qpn match the arp.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*/<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
if( *pp_src )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
if( memcmp( &(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t)
) )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/*<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
* GIDs for the endpoint are different. The ARP must<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
* have been proxied. Dereference it.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*/<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
else if( (*pp_src)->dlid && (*pp_src)->dlid != p_wc->recv.ud.remote_lid
)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
else if ( ! ((*pp_src)->dlid))<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
else if( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw )
&&<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
p_wc->recv.ud.remote_qp != ipoib_addr_get_qpn( &p_ib_arp->src_hw ) )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
else if( (*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
status = __endpt_update(p_port, pp_src, &p_ib_arp->src_hw, p_wc);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/* Do we need to create an endpoint for this GID? */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
if( !*pp_src )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if(status != IB_SUCCESS)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/* Copy the src GID to allow aligned access */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
memcpy( &gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
status = ipoib_mac_from_guid( gid.unicast.interface_id,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
p_port->p_adapter->params.guid_mask,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
&mac );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
if (status == IB_INVALID_GUID_MASK)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
("Invalid GUID mask received, rejecting it") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
ipoib_create_log( p_port->p_adapter->h_adapter,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
GUID_MASK_LOG_INDEX,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
EVENT_IPOIB_WRONG_PARAMETER_WRN );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
else if( status != IB_SUCCESS )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
/*<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
* Create the endpoint.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*/<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
*pp_src = ipoib_endpt_create( p_port,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
&p_ib_arp->src_hw.gid,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
p_wc->recv.ud.remote_lid,
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
if( !*pp_src )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
("ipoib_endpt_create failed\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-#if DBG<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
ipoib_port_ref( p_port, ref_endpt_track );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-#endif<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
cl_obj_lock( &p_port->obj );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
if( status != IB_SUCCESS )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
("__endpt_mgr_insert return %s \n",<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ARP,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
("Created EP %p %s CM_cap %s cstate[%s] %s\n",<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
(*pp_src),<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
(*pp_src)->tag,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
(cm_capable == IPOIB_CM_FLAG_RC ? "1" : "0"),<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
cm_get_state_str(endpt_cm_get_state((*pp_src))),<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
mk_mac_str(&(*pp_src)->mac)) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
CL_ASSERT( !memcmp(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -3642,7 +3574,90 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
return IB_SUCCESS;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> }<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+static ib_api_status_t<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+__recv_icmpv6(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_port_t*
const
p_port,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ib_wc_t* const
p_wc,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_endpt_t** const
pp_src,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_endpt_t* const
p_dst )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ib_api_status_t
status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ipv6_hdr_t
*p_ipv6_hdr;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
icmpv6_pkt_t
*p_icmpv6_pkt;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
icmpv6_option_t
*p_icmpv6_opt;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( !p_dst )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Unknown destination endpoint\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return IB_INVALID_SETTING;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_icmpv6_pkt = (icmpv6_pkt_t *) (&p_ipoib->type.ipv6.hdr + 1);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if(p_icmpv6_pkt->hdr.type != ICMPV6_MSG_TYPE_NBR_ADV &&<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_icmpv6_pkt->hdr.type != ICMPV6_MSG_TYPE_NBR_SOL)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
goto recv_gen;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_ipv6_hdr = &p_ipoib->type.ipv6.hdr;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if(CL_NTOH16(p_ipv6_hdr->payload_length) != sizeof(icmpv6_pkt_t) +<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
sizeof(icmpv6_option_t))<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Malformed ICMPv6 neighbor discovery packet\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return IB_INVALID_SETTING;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_icmpv6_opt = (icmpv6_option_t *) (p_icmpv6_pkt + 1);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if(p_icmpv6_opt->option_type != ICMPV6_OPTION_SRC_LINK_ADDR &&<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_icmpv6_opt->option_type != ICMPV6_OPTION_TARGET_LINK_ADDR)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Invalid ICMPv6 option type\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return IB_INVALID_SETTING;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if(p_icmpv6_opt->option_length != ICMPV6_IPOIB_LINK_ADDR_OPTION_LENGTH / 8)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Invalid ICMPv6 option length\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return IB_INVALID_SETTING;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
status = __endpt_update(p_port, pp_src, (ipoib_hw_addr_t *)
p_icmpv6_opt->u.saddr.mac_addr, p_wc);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if(status != IB_SUCCESS)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_ipv6_hdr->payload_length = cl_hton16(CL_NTOH16(p_ipv6_hdr->payload_length)
+ <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ICMPV6_ETH_LINK_ADDR_OPTION_LENGTH - ICMPV6_IPOIB_LINK_ADDR_OPTION_LENGTH);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_icmpv6_opt->option_length = ICMPV6_ETH_LINK_ADDR_OPTION_LENGTH / 8;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
cl_memcpy(p_icmpv6_opt->u.saddr.mac_addr, &(*pp_src)->mac,
sizeof(mac_addr_t));<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+recv_gen:
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
status = __recv_gen( p_ipoib, p_eth, *pp_src, p_dst );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( status != IB_SUCCESS )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("__recv_gen returned %s.\n", <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return IB_SUCCESS;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> static ib_api_status_t<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> __recv_mgr_prepare_NBL(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
ipoib_port_t*
const
p_port,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -5193,15 +5208,24 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
buf_len );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
break; // required if ICMP/ICMPV6 can go RC?<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
break;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
case IP_PROT_ICMP:<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
break;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
case IP_PROT_ICMPV6:<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
status = __send_mgr_filter_icmpv6( (ipv6_hdr_t*) p_ip_hdr,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_mdl,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
(buf_len - hdr_size), s_buf);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( status != NDIS_STATUS_PENDING ) {<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
break;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
case IPPROTO_HOPOPTS:<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-
break;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>-<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
default:<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
break;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -5256,6 +5280,100 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> }<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> static NDIS_STATUS<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+__send_mgr_filter_icmpv6(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
const ipv6_hdr_t*
const
p_ipv6_hdr,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
MDL*
p_mdl,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
size_t
buf_len,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
OUT
ipoib_send_NB_SG*
s_buf)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
icmpv6_pkt_t *p_icmpv6_orig_pkt;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
icmpv6_pkt_t *p_icmpv6_new_pkt;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( !buf_len )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( !p_mdl )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Failed to get DHCP buffer.\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return NDIS_STATUS_FAILURE;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
NdisQueryMdl( p_mdl, &p_icmpv6_orig_pkt, &buf_len, NormalPagePriority
);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( !p_icmpv6_orig_pkt )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Failed to query DHCP buffer.\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return NDIS_STATUS_FAILURE;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
else<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_icmpv6_orig_pkt = (icmpv6_pkt_t*)(p_ipv6_hdr + 1);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( buf_len < sizeof(icmpv6_hdr_t) )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/* This buffer is done for. Get the next buffer. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Buffer too small for ICMPv6 packet.\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if(p_icmpv6_orig_pkt->hdr.type != ICMPV6_MSG_TYPE_NBR_ADV &&<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_icmpv6_orig_pkt->hdr.type != ICMPV6_MSG_TYPE_NBR_SOL)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return NDIS_STATUS_PENDING;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/* Allocate our scratch buffer. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
NdisAllocateFromNPagedLookasideList(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( !s_buf->p_send_buf )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Failed to query ARP packet buffer.\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return NDIS_STATUS_RESOURCES;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ipv6_hdr_t *p_new_ipv6 = &s_buf->p_send_buf->ipv6.hdr;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
cl_memcpy(p_new_ipv6, p_ipv6_hdr, sizeof(ipv6_hdr_t));<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_icmpv6_new_pkt = (icmpv6_pkt_t *) (p_new_ipv6 + 1);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
cl_memcpy(p_icmpv6_new_pkt, p_icmpv6_orig_pkt, buf_len);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
icmpv6_option_t *p_new_option = (icmpv6_option_t *) (p_icmpv6_new_pkt + 1);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_new_option->option_type = (p_icmpv6_orig_pkt->hdr.type ==
ICMPV6_MSG_TYPE_NBR_SOL) ?<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ICMPV6_OPTION_SRC_LINK_ADDR : ICMPV6_OPTION_TARGET_LINK_ADDR;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_new_option->option_length = ICMPV6_IPOIB_LINK_ADDR_OPTION_LENGTH / 8;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ipoib_hw_addr_t* link_addr = (ipoib_hw_addr_t *)
p_new_option->u.saddr.mac_addr;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ipoib_addr_set_qpn( link_addr, s_buf->p_port->ib_mgr.qpn );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ib_gid_set_default( &link_addr->gid,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_new_ipv6->payload_length = cl_hton16(sizeof(icmpv6_pkt_t) +
sizeof(icmpv6_option_t));<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( s_buf->p_send_buf
);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_wr[0].local_ds[1].length = sizeof(ipv6_hdr_t) +
sizeof(icmpv6_pkt_t) + sizeof(icmpv6_option_t);<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_wr[0].local_ds[1].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return STATUS_SUCCESS;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+static NDIS_STATUS<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> __send_mgr_filter_igmp_v2(<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
ipoib_port_t*
const
p_port,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>
IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>@@ -9289,6 +9407,118 @@<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> }<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+static ib_api_status_t<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+__endpt_update(
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ipoib_endpt_t**
const
pp_src,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
const ipoib_hw_addr_t*
p_new_hw_addr,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IN
ib_wc_t*
const
p_wc<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ib_api_status_t status = IB_ERROR;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ib_gid_t gid;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
mac_addr_t mac;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/*<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
* If the endpoint exists for the GID, make sure<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
* the dlid and qpn match the arp.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*/<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( *pp_src )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( cl_memcmp( &(*pp_src)->dgid, &p_new_hw_addr->gid,
sizeof(ib_gid_t) ) )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/*<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
* GIDs for the endpoint are different. The ARP must<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
* have been proxied. Dereference it.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*/<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
else if( (*pp_src)->dlid && (*pp_src)->dlid !=
p_wc->recv.ud.remote_lid )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
else if ( ! ((*pp_src)->dlid))<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
else if( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( (*pp_src)->qpn != ipoib_addr_get_qpn( p_new_hw_addr ) &&<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_wc->recv.ud.remote_qp != ipoib_addr_get_qpn( p_new_hw_addr ) )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
else if( (*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*pp_src = NULL;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/* Do we need to create an endpoint for this GID? */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( !*pp_src )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/* Copy the src GID to allow aligned access */<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
cl_memcpy( &gid, &p_new_hw_addr->gid, sizeof(ib_gid_t) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
status = ipoib_mac_from_guid( gid.unicast.interface_id,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_port->p_adapter->params.guid_mask,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
&mac );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if (status == IB_INVALID_GUID_MASK)<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("Invalid GUID mask received, rejecting it") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ipoib_create_log( p_port->p_adapter->h_adapter,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
GUID_MASK_LOG_INDEX,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
EVENT_IPOIB_WRONG_PARAMETER_WRN );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
else if( status != IB_SUCCESS )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
/*<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
* Create the endpoint.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*/<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
*pp_src = ipoib_endpt_create( &p_new_hw_addr->gid,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_wc->recv.ud.remote_lid,
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
ipoib_addr_get_qpn( p_new_hw_addr ) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( !*pp_src )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("ipoib_endpt_create failed\n") );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
cl_obj_lock( &p_port->obj );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
if( status != IB_SUCCESS )<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
{<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
("__endpt_mgr_insert return %s \n",<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return status;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+
return IB_SUCCESS;<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+}<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>+<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> /* <o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> * Put all IP
fragments into separate WRs and chain together.<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'> * The last WR will
be set to generate CQ Event.</span><o:p></o:p></p>
<p class=MsoNormal><b>Alexander (XaleX) Naslednikov<o:p></o:p></b></p>
<p class=MsoNormal><b>SW Networking Team<o:p></o:p></b></p>
<p class=MsoNormal><b>Mellanox Technologies<o:p></o:p></b></p>
<p class=MsoNormal><o:p> </o:p></p>
</div>
</body>
</html>