<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-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;}
@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>IPv6 initial commit, DHCP flow is not supported yet<o:p></o:p></p>
<p class=MsoNormal>Signed-off by: Alexander Naslednikov (xalex at
mellanox.co.il)<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Index: inc/kernel/ip_packet.h<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>--- inc/kernel/ip_packet.h (revision 2982)<o:p></o:p></p>
<p class=MsoNormal>+++ inc/kernel/ip_packet.h (working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -200,6 +200,7 @@<o:p></o:p></p>
<p class=MsoNormal> #define IP_PROT_UDP 17<o:p></o:p></p>
<p class=MsoNormal> #define IP_PROT_IGMP 2<o:p></o:p></p>
<p class=MsoNormal> #define IP_PROT_ICMP 1<o:p></o:p></p>
<p class=MsoNormal>+#define IP_PROT_ICMPV6 58<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #include <complib/cl_packon.h><o:p></o:p></p>
<p class=MsoNormal>@@ -263,7 +264,73 @@<o:p></o:p></p>
<p class=MsoNormal> *********/<o:p></o:p></p>
<p class=MsoNormal> #include <complib/cl_packoff.h><o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+#include <complib/cl_packon.h><o:p></o:p></p>
<p class=MsoNormal>+/****s* IB Network Drivers/ipv6_hdr_t<o:p></o:p></p>
<p class=MsoNormal>+* NAME<o:p></o:p></p>
<p class=MsoNormal>+* ipv6_hdr_t<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+* DESCRIPTION<o:p></o:p></p>
<p class=MsoNormal>+* Defines the IPV6 header for IPV6 packets.<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+* SYNOPSIS<o:p></o:p></p>
<p class=MsoNormal>+*/<o:p></o:p></p>
<p class=MsoNormal>+typedef struct _ipv6_hdr<o:p></o:p></p>
<p class=MsoNormal>+{<o:p></o:p></p>
<p class=MsoNormal>+ uint32_t ver_tc_fl;<o:p></o:p></p>
<p class=MsoNormal>+ uint16_t payload_length;<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t next_header;<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t hop_limit;<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t src_addr[16];<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t dest_addr[16];<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+} PACK_SUFFIX ipv6_hdr_t;<o:p></o:p></p>
<p class=MsoNormal>+/*<o:p></o:p></p>
<p class=MsoNormal>+* FIELDS<o:p></o:p></p>
<p class=MsoNormal>+* ver_tc_fl<o:p></o:p></p>
<p class=MsoNormal>+* This field contains of 3
subfields:<o:p></o:p></p>
<p class=MsoNormal>+* 1.Version (4 bits) <o:p></o:p></p>
<p class=MsoNormal>+* The constant 6 (bit sequence
0110).<o:p></o:p></p>
<p class=MsoNormal>+* 2.Traffic Class (8 bits) <o:p></o:p></p>
<p class=MsoNormal>+* The bits of this field hold two
values. The 6 most-significant bits are used <o:p></o:p></p>
<p class=MsoNormal>+* for DSCP, which is used to
classify packets. The remaining two bits <o:p></o:p></p>
<p class=MsoNormal>+* are used for ECN; priority
values subdivide into ranges: traffic where <o:p></o:p></p>
<p class=MsoNormal>+* the source provides congestion
control and non-congestion control traffic.<o:p></o:p></p>
<p class=MsoNormal>+* 3.Flow Label (20 bits) <o:p></o:p></p>
<p class=MsoNormal>+* Originally created for giving
real-time applications special service.<o:p></o:p></p>
<p class=MsoNormal>+* Flow Label specifications and
minimum requirements are described, <o:p></o:p></p>
<p class=MsoNormal>+* and first uses of this field
are emerging.<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+* payload_length;<o:p></o:p></p>
<p class=MsoNormal>+* The size of the payload in
octets, including any extension headers. <o:p></o:p></p>
<p class=MsoNormal>+* The length is set to zero when
a Hop-by-Hop extension header carries <o:p></o:p></p>
<p class=MsoNormal>+* a Jumbo Payload option.<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+* next_header<o:p></o:p></p>
<p class=MsoNormal>+* Specifies the type of the next
header. This field usually specifies the<o:p></o:p></p>
<p class=MsoNormal>+* transport layer protocol used
by a packet's payload. When extension headers<o:p></o:p></p>
<p class=MsoNormal>+* are present in the packet this
field indicates which extension header follows. <o:p></o:p></p>
<p class=MsoNormal>+* The values are shared with those
used for the IPv4 protocol field, <o:p></o:p></p>
<p class=MsoNormal>+* as both fields have the same
function <o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+* hop_limit<o:p></o:p></p>
<p class=MsoNormal>+* Replaces the time to live field
of IPv4. This value is decremented by <o:p></o:p></p>
<p class=MsoNormal>+* one at each intermediate node
the packet visits. When the counter reaches <o:p></o:p></p>
<p class=MsoNormal>+* 0 the packet is discarded<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+* src_addr<o:p></o:p></p>
<p class=MsoNormal>+* The IPv6 address of the sending
node.<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+* dest_addr<o:p></o:p></p>
<p class=MsoNormal>+* The IPv6 address of the
destination node(s).<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+*<o:p></o:p></p>
<p class=MsoNormal>+* SEE ALSO<o:p></o:p></p>
<p class=MsoNormal>+* IB Network Drivers, eth_hdr_t, arp_pkt_t,
tcp_hdr_t, udp_hdr_t<o:p></o:p></p>
<p class=MsoNormal>+*********/<o:p></o:p></p>
<p class=MsoNormal>+#include <complib/cl_packoff.h><o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal> #include <complib/cl_packon.h><o:p></o:p></p>
<p class=MsoNormal> /****s* IB Network Drivers/tcp_hdr_t<o:p></o:p></p>
<p class=MsoNormal> * NAME<o:p></o:p></p>
<p class=MsoNormal>@@ -432,8 +499,11 @@<o:p></o:p></p>
<p class=MsoNormal> *********/<o:p></o:p></p>
<p class=MsoNormal> #include <complib/cl_packoff.h><o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>-#define DHCP_PORT_SERVER CL_HTON16(67)<o:p></o:p></p>
<p class=MsoNormal>-#define DHCP_PORT_CLIENT CL_HTON16(68)<o:p></o:p></p>
<p class=MsoNormal>+#define DHCP_PORT_SERVER CL_HTON16(67)<o:p></o:p></p>
<p class=MsoNormal>+#define DHCP_PORT_CLIENT CL_HTON16(68)<o:p></o:p></p>
<p class=MsoNormal>+#define DHCP_IPV6_PORT_SERVER_OR_AGENT CL_HTON16(547)<o:p></o:p></p>
<p class=MsoNormal>+#define DHCP_IPV6_PORT_CLIENT CL_HTON16(546)<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal> #define DHCP_PORT_PROXY_SERVER CL_HTON16(4011)<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> #define DHCP_REQUEST 1<o:p></o:p></p>
<p class=MsoNormal>@@ -534,7 +604,11 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> typedef struct _ip_pkt<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>- ip_hdr_t hdr;<o:p></o:p></p>
<p class=MsoNormal>+ union<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ ip_hdr_t hdr;<o:p></o:p></p>
<p class=MsoNormal>+ ipv6_hdr_t hdr_ipv6;<o:p></o:p></p>
<p class=MsoNormal>+ } PACK_SUFFIX ;<o:p></o:p></p>
<p class=MsoNormal> union _ip_payload<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> tcp_hdr_t tcp;<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_debug.h<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>--- ulp/ipoib_NDIS6_CM/kernel/ipoib_debug.h (revision
2982)<o:p></o:p></p>
<p class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_debug.h (working
copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -205,6 +205,7 @@<o:p></o:p></p>
<p class=MsoNormal> BuildSendDesc,<o:p></o:p></p>
<p class=MsoNormal> SendMgrFilter,<o:p></o:p></p>
<p class=MsoNormal> FilterIp,<o:p></o:p></p>
<p class=MsoNormal>+ FilterIpV6,<o:p></o:p></p>
<p class=MsoNormal> QueryIp,<o:p></o:p></p>
<p class=MsoNormal> SendTcp,<o:p></o:p></p>
<p class=MsoNormal> FilterUdp,<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>--- ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp (revision
2982)<o:p></o:p></p>
<p class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp (working
copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -3303,7 +3303,6 @@<o:p></o:p></p>
<p class=MsoNormal> shutter_shut(
&p_adapter->recv_shutter );<o:p></o:p></p>
<p class=MsoNormal> // Notify
that shutter was already shut<o:p></o:p></p>
<p class=MsoNormal> p_adapter->ipoib_state
|= IPOIB_RESET_OR_DOWN;<o:p></o:p></p>
<p class=MsoNormal>- ASSERT(
p_adapter->ipoib_state == IPOIB_RUNNING ); <o:p></o:p></p>
<p class=MsoNormal> IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_SHUTTER,<o:p></o:p></p>
<p class=MsoNormal> ("ipoib_state
was IPOIB_RUNNING and IPOIB_RESET_OR_DOWN flag was set\n") );<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>--- ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp (revision
2982)<o:p></o:p></p>
<p class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp (working
copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -349,9 +349,10 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></p>
<p class=MsoNormal>- IN const ip_hdr_t*
const p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+ IN const void*
const p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal> IN MDL* p_mdl,<o:p></o:p></p>
<p class=MsoNormal> IN size_t buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN uint8_t prot,<o:p></o:p></p>
<p class=MsoNormal> IN OUT ipoib_send_NB_SG*
const s_buf);<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal>@@ -609,11 +610,17 @@<o:p></o:p></p>
<p class=MsoNormal> /* function returns pointer to payload that is going after
IP header.<o:p></o:p></p>
<p class=MsoNormal> * asssuming that payload and IP header are in the same
buffer<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal>-static void* GetIpPayloadPtr(const ip_hdr_t* const p_ip_hdr)<o:p></o:p></p>
<p class=MsoNormal>+static inline void* GetIpPayloadPtr(const ip_hdr_t*
const p_ip_hdr)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> return (void*)((uint8_t*)p_ip_hdr +
IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>+static inline void* GetIpv6PayloadPtr(const ipv6_hdr_t*
const p_ipv6_hdr)<o:p></o:p></p>
<p class=MsoNormal>+{<o:p></o:p></p>
<p class=MsoNormal>+ return (void*)((uint8_t*)p_ipv6_hdr +
p_ipv6_hdr->payload_length);<o:p></o:p></p>
<p class=MsoNormal>+}<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>
<p class=MsoNormal> *<o:p></o:p></p>
<p class=MsoNormal> * Implementation<o:p></o:p></p>
<p class=MsoNormal>@@ -2522,6 +2529,67 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> switch( p_ipoib->hdr.type
)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>+ case ETH_PROT_TYPE_IPV6:<o:p></o:p></p>
<p class=MsoNormal>+ if( len <
(sizeof(ipoib_hdr_t) + sizeof(ipv6_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+ ("Received
IP packet < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>+ status
= IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if(
p_ipoib->type.ip.hdr_ipv6.next_header != IP_PROT_UDP )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /*
Unfiltered. Setup the ethernet header and report. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
RecvTcp );<o:p></o:p></p>
<p class=MsoNormal>+ status
= __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RecvTcp );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ //ASSERT(
p_ipoib->type.ip.hdr_ipv6.payload_length == sizeof(ipv6_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+ /* First
packet of a UDP transfer. */<o:p></o:p></p>
<p class=MsoNormal>+ if( len <<o:p></o:p></p>
<p class=MsoNormal>+ (sizeof(ipoib_hdr_t)
+ sizeof(ipv6_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+ ("Received
UDP packet < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>+ status
= IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+ /* Check if
DHCP conversion is required. */<o:p></o:p></p>
<p class=MsoNormal>+ if(
(p_ipoib->type.ip.prot.udp.hdr.dst_port ==
DHCP_IPV6_PORT_SERVER_OR_AGENT&&<o:p></o:p></p>
<p class=MsoNormal>+ p_ipoib->type.ip.prot.udp.hdr.src_port
== DHCP_IPV6_PORT_CLIENT) ||<o:p></o:p></p>
<p class=MsoNormal>+ (p_ipoib->type.ip.prot.udp.hdr.dst_port
== DHCP_IPV6_PORT_CLIENT &&<o:p></o:p></p>
<p class=MsoNormal>+ p_ipoib->type.ip.prot.udp.hdr.src_port
== DHCP_IPV6_PORT_SERVER_OR_AGENT))<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ //TODO
should be DHCP IPv6<o:p></o:p></p>
<p class=MsoNormal>+ if(
len < (sizeof(ipoib_hdr_t) + sizeof(ipv6_hdr_t) +<o:p></o:p></p>
<p class=MsoNormal>+ sizeof(udp_hdr_t)
/*+ DHCP_MIN_SIZE*/) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal>+ ("Received
DHCP < min size\n") );<o:p></o:p></p>
<p class=MsoNormal>+ status
= IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ /*
UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
RecvDhcp );<o:p></o:p></p>
<p class=MsoNormal>+ //TODO
implement this function<o:p></o:p></p>
<p class=MsoNormal>+ //status
= __recv_dhcp_ipv6( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+ status
= IB_INVALID_SETTING;<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /*
Unfiltered. Setup the ethernet header and report. */<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start(
RecvUdp );<o:p></o:p></p>
<p class=MsoNormal>+ status
= __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RecvUdp );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> case ETH_PROT_TYPE_IP:<o:p></o:p></p>
<p class=MsoNormal> if( len <
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>@@ -3479,6 +3547,11 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> switch( p_eth_hdr->type )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>+ case ETH_PROT_TYPE_IPV6:<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_start( FilterIpV6 );<o:p></o:p></p>
<p class=MsoNormal>+ status = __send_mgr_filter_ip(
p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterIpV6 );<o:p></o:p></p>
<p class=MsoNormal>+ break;<o:p></o:p></p>
<p class=MsoNormal> case ETH_PROT_TYPE_IP:<o:p></o:p></p>
<p class=MsoNormal> cl_perf_start( FilterIp );<o:p></o:p></p>
<p class=MsoNormal> status =
__send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>
<p class=MsoNormal>@@ -4294,10 +4367,12 @@<o:p></o:p></p>
<p class=MsoNormal> IN ipoib_send_NB_SG *s_buf
)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> NDIS_STATUS status;<o:p></o:p></p>
<p class=MsoNormal>- ip_hdr_t *p_ip_hdr;<o:p></o:p></p>
<p class=MsoNormal>+ PVOID p_ip_hdr;<o:p></o:p></p>
<p class=MsoNormal> uint32_t ip_packet_len;<o:p></o:p></p>
<p class=MsoNormal> size_t iph_size_in_bytes;<o:p></o:p></p>
<p class=MsoNormal> size_t iph_options_size;<o:p></o:p></p>
<p class=MsoNormal>+ uint8_t prot;<o:p></o:p></p>
<p class=MsoNormal>+ size_t hdr_size;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> PERF_DECLARE( QueryIp );<o:p></o:p></p>
<p class=MsoNormal> PERF_DECLARE( SendTcp );<o:p></o:p></p>
<p class=MsoNormal>@@ -4328,23 +4403,33 @@<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> else<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>- p_ip_hdr =
(ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal>+ p_ip_hdr =
(PVOID) (p_eth_hdr + 1);<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal>-<o:p></o:p></p>
<p class=MsoNormal>- if( buf_len < sizeof(ip_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal>+ if ( p_eth_hdr->type == ETH_PROT_TYPE_IPV6
) <o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>+ prot = ((ipv6_hdr_t *)
p_ip_hdr)->next_header;<o:p></o:p></p>
<p class=MsoNormal>+ hdr_size = sizeof(ipv6_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else //IPv4<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ prot = ((ip_hdr_t *)
p_ip_hdr)->prot;<o:p></o:p></p>
<p class=MsoNormal>+ hdr_size = sizeof(ip_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ if( buf_len < hdr_size )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal> /* This buffer is done for.
Get the next buffer. */<o:p></o:p></p>
<p class=MsoNormal> IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>
<p class=MsoNormal> ("Buffer
too small for IP packet.\n") );<o:p></o:p></p>
<p class=MsoNormal> return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>- switch( p_ip_hdr->prot )<o:p></o:p></p>
<p class=MsoNormal>+ switch( prot )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> case IP_PROT_UDP:<o:p></o:p></p>
<p class=MsoNormal> cl_perf_start( FilterUdp );<o:p></o:p></p>
<p class=MsoNormal> status =
__send_mgr_filter_udp( p_ip_hdr, p_mdl,<o:p></o:p></p>
<p class=MsoNormal>- (buf_len
- sizeof(ip_hdr_t)), s_buf );<o:p></o:p></p>
<p class=MsoNormal>+ (buf_len
- hdr_size), prot, s_buf );<o:p></o:p></p>
<p class=MsoNormal> cl_perf_stop(
&p_port->p_adapter->perf, FilterUdp );<o:p></o:p></p>
<p class=MsoNormal> if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></p>
<p class=MsoNormal> { /* not DHCP packet, keep
going */<o:p></o:p></p>
<p class=MsoNormal>@@ -4366,7 +4451,7 @@<o:p></o:p></p>
<p class=MsoNormal> 2. ip options<o:p></o:p></p>
<p class=MsoNormal> So to get
the IGMP packet we need to skip the ip options NDIS_BUFFER<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal>- iph_size_in_bytes
= (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></p>
<p class=MsoNormal>+ iph_size_in_bytes
= (((ip_hdr_t*)p_ip_hdr)->ver_hl & 0xf) * 4;<o:p></o:p></p>
<p class=MsoNormal> iph_options_size
= iph_size_in_bytes - buf_len;<o:p></o:p></p>
<p class=MsoNormal> buf_len -=
sizeof(ip_hdr_t);//without ipheader<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>@@ -4376,7 +4461,7 @@<o:p></o:p></p>
<p class=MsoNormal> We anyway pass it to
__send_mgr_filter_igmp_v2().<o:p></o:p></p>
<p class=MsoNormal> */<o:p></o:p></p>
<p class=MsoNormal> status =
__send_mgr_filter_igmp_v2( s_buf->p_port,<o:p></o:p></p>
<p class=MsoNormal>- p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+ (ip_hdr_t*)
p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal> iph_options_size,<o:p></o:p></p>
<p class=MsoNormal> p_mdl,<o:p></o:p></p>
<p class=MsoNormal> buf_len
);<o:p></o:p></p>
<p class=MsoNormal>@@ -4384,6 +4469,7 @@<o:p></o:p></p>
<p class=MsoNormal> return
status;<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> case IP_PROT_ICMP:<o:p></o:p></p>
<p class=MsoNormal>+ case IP_PROT_ICMPV6:<o:p></o:p></p>
<p class=MsoNormal> p_desc->send_dir =
SEND_UD_QP;<o:p></o:p></p>
<p class=MsoNormal> default:<o:p></o:p></p>
<p class=MsoNormal> break;<o:p></o:p></p>
<p class=MsoNormal>@@ -4400,7 +4486,7 @@<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>- ip_packet_len = cl_ntoh16(
p_ip_hdr->length );<o:p></o:p></p>
<p class=MsoNormal>+ ip_packet_len = cl_ntoh16(
((ip_hdr_t*)p_ip_hdr)->length ); //TODO add IPv6 support for CM flow<o:p></o:p></p>
<p class=MsoNormal> if( ip_packet_len >
s_buf->p_port->p_adapter->params.payload_mtu )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> //TODO:
NDIS60<o:p></o:p></p>
<p class=MsoNormal>@@ -4565,10 +4651,11 @@<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>
<p class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></p>
<p class=MsoNormal>- IN const ip_hdr_t*
const p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>- IN MDL* p_mdl,<o:p></o:p></p>
<p class=MsoNormal>- IN size_t buf_len,<o:p></o:p></p>
<p class=MsoNormal>- IN OUT ipoib_send_NB_SG* s_buf
)<o:p></o:p></p>
<p class=MsoNormal>+ IN const void*
const p_ip_hdr,<o:p></o:p></p>
<p class=MsoNormal>+ IN MDL* p_mdl,<o:p></o:p></p>
<p class=MsoNormal>+ IN size_t buf_len,<o:p></o:p></p>
<p class=MsoNormal>+ IN uint8_t prot,<o:p></o:p></p>
<p class=MsoNormal>+ IN OUT ipoib_send_NB_SG* s_buf
)<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal> NDIS_STATUS status;<o:p></o:p></p>
<p class=MsoNormal> udp_hdr_t *p_udp_hdr;<o:p></o:p></p>
<p class=MsoNormal>@@ -4598,17 +4685,25 @@<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> else<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>- p_udp_hdr =
(udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>
<p class=MsoNormal>+ if ( prot ==
ETH_PROT_TYPE_IPV6 ) <o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_udp_hdr =
(udp_hdr_t*)GetIpv6PayloadPtr((ipv6_hdr_t*)p_ip_hdr);<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else //IPv4<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ p_udp_hdr =
(udp_hdr_t*)GetIpPayloadPtr((ip_hdr_t*)p_ip_hdr);<o:p></o:p></p>
<p class=MsoNormal>+ if
(((ip_hdr_t*)p_ip_hdr)->offset > 0) {<o:p></o:p></p>
<p class=MsoNormal>+ /*
This is a fragmented part of UDP packet<o:p></o:p></p>
<p class=MsoNormal>+
* Only first packet will contain UDP header in such case<o:p></o:p></p>
<p class=MsoNormal>+
* So, return if offset > 0<o:p></o:p></p>
<p class=MsoNormal>+
*/<o:p></o:p></p>
<p class=MsoNormal>+
return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> /* Get the UDP header and check the
destination port numbers. */<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>- if (p_ip_hdr->offset > 0) {<o:p></o:p></p>
<p class=MsoNormal>- /* This is a fragmented part
of UDP packet<o:p></o:p></p>
<p class=MsoNormal>- * Only first packet will
contain UDP header in such case<o:p></o:p></p>
<p class=MsoNormal>- * So, return if offset >
0<o:p></o:p></p>
<p class=MsoNormal>- */<o:p></o:p></p>
<p class=MsoNormal>- return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>- }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> if( buf_len < sizeof(udp_hdr_t) )<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>@@ -4617,13 +4712,26 @@<o:p></o:p></p>
<p class=MsoNormal> return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal>- if( (p_udp_hdr->src_port !=
DHCP_PORT_CLIENT ||<o:p></o:p></p>
<p class=MsoNormal>- p_udp_hdr->dst_port !=
DHCP_PORT_SERVER) &&<o:p></o:p></p>
<p class=MsoNormal>- (p_udp_hdr->src_port !=
DHCP_PORT_SERVER ||<o:p></o:p></p>
<p class=MsoNormal>- p_udp_hdr->dst_port !=
DHCP_PORT_CLIENT) )<o:p></o:p></p>
<p class=MsoNormal>+ if ( prot == ETH_PROT_TYPE_IPV6 ) {<o:p></o:p></p>
<p class=MsoNormal>+ if( (p_udp_hdr->src_port !=
DHCP_PORT_CLIENT ||<o:p></o:p></p>
<p class=MsoNormal>+ p_udp_hdr->dst_port
!= DHCP_PORT_SERVER) &&<o:p></o:p></p>
<p class=MsoNormal>+ (p_udp_hdr->src_port
!= DHCP_PORT_SERVER ||<o:p></o:p></p>
<p class=MsoNormal>+ p_udp_hdr->dst_port
!= DHCP_PORT_CLIENT) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Not a DHCP
packet. */<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else //IPv4<o:p></o:p></p>
<p class=MsoNormal> {<o:p></o:p></p>
<p class=MsoNormal>- /* Not a DHCP packet. */<o:p></o:p></p>
<p class=MsoNormal>- return NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ if( (p_udp_hdr->src_port !=
DHCP_IPV6_PORT_CLIENT||<o:p></o:p></p>
<p class=MsoNormal>+ p_udp_hdr->dst_port
!= DHCP_IPV6_PORT_SERVER_OR_AGENT) &&<o:p></o:p></p>
<p class=MsoNormal>+ (p_udp_hdr->src_port
!= DHCP_IPV6_PORT_SERVER_OR_AGENT ||<o:p></o:p></p>
<p class=MsoNormal>+ p_udp_hdr->dst_port
!= DHCP_IPV6_PORT_CLIENT) )<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ /* Not a DHCP
packet. */<o:p></o:p></p>
<p class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> <o:p></o:p></p>
<p class=MsoNormal> buf_len -= sizeof(udp_hdr_t);<o:p></o:p></p>
<p class=MsoNormal>@@ -4638,7 +4746,16 @@<o:p></o:p></p>
<p class=MsoNormal> return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>
<p class=MsoNormal> }<o:p></o:p></p>
<p class=MsoNormal> /* Copy the IP and UDP headers. */<o:p></o:p></p>
<p class=MsoNormal>- cl_memcpy(
&s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ //TODO: in this case we limited IP size to 20,
but it can be bigger, according to GetIpPayloadPtr<o:p></o:p></p>
<p class=MsoNormal>+ if ( prot == ETH_PROT_TYPE_IPV6 ) <o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
&s_buf->p_send_buf->ip.hdr_ipv6, p_ip_hdr , sizeof(ipv6_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ else<o:p></o:p></p>
<p class=MsoNormal>+ {<o:p></o:p></p>
<p class=MsoNormal>+ cl_memcpy(
&s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal>+ }<o:p></o:p></p>
<p class=MsoNormal>+ <o:p></o:p></p>
<p class=MsoNormal> cl_memcpy(<o:p></o:p></p>
<p class=MsoNormal> &s_buf->p_send_buf->ip.prot.udp.hdr,
p_udp_hdr, sizeof(udp_hdr_t) );<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><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>