[Openib-windows] ipoib dhcp patch

Fab Tillier ftillier at windows.microsoft.com
Mon Jan 22 09:27:17 PST 2007


Hi Anatoly,

 

When you have the DHCP server on the eth side, I assume it is
communicating with the IB hosts through your IB to Ethernet gateway.
Your gateway should perform conversion of DHCP packets to/from the IPoIB
DHCP format, and can't just forward the Ethernet DHCP packets unchanged.
See the IPoIB spec for what things need to work on DHCP.

 

Also, instead of disabling DHCP support, how about fixing it so that it
send properly formed packets (as per IPoIB spec) and then convert them
to the OS so that the OS is happy with them.  You can use netmon on the
host to snoop the network traffic and look at the DHCP packet as it's
given from the OS to the IPoIB driver and from the IPoIB driver to the
OS.

 

Disabling the DHCP packet conversion makes the DHCP packets on the wire
not compliant to the IPoIB spec.

 

-Fab

 

From: openib-windows-bounces at openib.org
[mailto:openib-windows-bounces at openib.org] On Behalf Of Anatoly Lisenko
Sent: Monday, January 22, 2007 3:53 AM
To: Tzachi Dar; Yossi Leybovich; openib-windows at openib.org
Cc: Tzahi Oved
Subject: [Openib-windows] ipoib dhcp patch

 

Hi,

 

I saw that ipoib interface fail to get automatic ip address when DHCP
server run on eth side.

This caused by changing DHCP packet fields at __send_mgr_filter_dhcp().

I run ethereal on eth side and it show that the DHCP packet from ipoib
arrive damaged.

I think this cause DHCP server to ignore this packet.

But if DHCP server run on IB side than ipoib then interface success to
get automatic ip.

This work because in __recv_dhcp() ipoib change all DHCP packet fields
like in the DHCP packet arrived from ETH side.

I attach patch that disable all changes to DHCP packets:

1. All changed related to DHCP placed into #ifdef IPOIB_DHCP_HACK ...
#endif

2. IPOIB_DHCP_HACK isn't defined.

 

 

 

Index: ulp/ipoib/kernel/ipoib_port.c

===================================================================

--- ulp/ipoib/kernel/ipoib_port.c   (revision 570)

+++ ulp/ipoib/kernel/ipoib_port.c   (working copy)

@@ -2089,7 +2089,9 @@

      dhcp_pkt_t              *p_dhcp;

      uint8_t                       *p_option;

      uint8_t                       *p_cid = NULL;

+#ifdef IPOIB_DHCP_HACK

      ib_gid_t                gid;

+#endif

      uint8_t                       msg = 0;

 

      IPOIB_ENTER( IPOIB_DBG_RECV );

@@ -2168,12 +2170,15 @@

                        ("Failed to find required Client-identifier
option.\n") );

                  return IB_INVALID_SETTING;

            }

+#ifdef IPOIB_DHCP_HACK       

            if( p_dhcp->htype != DHCP_HW_TYPE_IB )

            {

                  IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,

                        ("Invalid hardware address type.\n") );

                  return IB_INVALID_SETTING;

            }

+#endif //#ifdef IPOIB_DHCP_HACK

+

            break;

      /* message from DHCP server */

      case DHCPOFFER:

@@ -2186,6 +2191,8 @@

                  ("Invalide message type.\n") );

            return IB_INVALID_PARAMETER;

      }

+

+#ifdef IPOIB_DHCP_HACK

      p_eth->type.ip.prot.udp.hdr.chksum = 0;

      p_dhcp->htype = DHCP_HW_TYPE_ETH;

      p_dhcp->hlen = HW_ADDR_LEN;

@@ -2216,6 +2223,8 @@

            status = ipoib_mac_from_guid( gid.unicast.interface_id,
(mac_addr_t*)&p_cid[3] );

            p_cid[HW_ADDR_LEN + 3] = DHCP_OPT_END; //terminate tag

      }

+#endif //#ifdef IPOIB_DHCP_HACK

+

      IPOIB_EXIT( IPOIB_DBG_RECV );

      return status;

 }

@@ -3160,8 +3169,10 @@

      dhcp_pkt_t              *p_ib_dhcp;

      uint8_t                       *p_option, *p_cid = NULL;

      uint8_t                       msg = 0;

+#ifdef IPOIB_DHCP_HACK

      size_t                        len;

      ib_gid_t                gid;

+#endif //#ifdef IPOIB_DHCP_HACK

 

      IPOIB_ENTER( IPOIB_DBG_SEND );

 

@@ -3236,6 +3247,7 @@

      case DHCPRELEASE:

      case DHCPINFORM:

            /* Fix up the client identifier option */

+#ifdef IPOIB_DHCP_HACK

            if( p_cid )

            {

                  /* do we need to replace it ?  len eq ETH MAC sz 'and'
MAC is mine */

@@ -3295,6 +3307,8 @@

            p_ib_dhcp->htype = DHCP_HW_TYPE_IB;

            p_ib_dhcp->hlen = 0;

            cl_memclr( p_ib_dhcp->chaddr, sizeof(p_ib_dhcp->chaddr) );

+#endif //#ifdef IPOIB_DHCP_HACK

+

            break;

 

      /* Server messages. */

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20070122/607e67a0/attachment.html>


More information about the ofw mailing list