<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>