<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;}
/* 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-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'>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>