[IPoIB_NDIS6_CM] Look for option 160 in a dhcp received packet. If the option 
exists, look for the guid in the packet. If the guid exists, replace it with 
the mac of the client.
This is needed in order to have more complicated altiris scenarios working.



Index: B:/users/tzachid/projinf6/trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
===================================================================
--- B:/users/tzachid/projinf6/trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp    
          (revision 7083)
+++ B:/users/tzachid/projinf6/trunk/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp    
       (revision 7084)
@@ -2862,6 +2862,25 @@
 }


+uint8_t *FindString(uint8_t *src, uint16_t src_len,uint8_t* dst, uint16_t 
dest_len )
+{
+             int i;
+
+             if (src_len < dest_len) {
+                             ASSERT(FALSE);
+                             IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, 
IPOIB_DBG_ERROR,("string to look for is too big ...\n"));
+                             return NULL;
+             }
+             for(i=0; i <= src_len - dest_len; i++) {
+                             if (RtlCompareMemory(src+i, dst, dest_len) == 
dest_len) {
+                                             // string was found
+                                             return src+i;
+                             }
+             }
+             return NULL;
+}
+
+
 static ib_api_status_t
 __recv_dhcp(
                IN                                                           
ipoib_port_t* const                                        p_port,
@@ -2874,6 +2893,9 @@
                dhcp_pkt_t                                        *p_dhcp;
                uint8_t                                                 
*p_option;
                uint8_t                                                 *p_cid 
= NULL;
+             uint8_t                                                 *p_opt160 
= NULL;
+             uint16_t                                               
p_opt160_len = 0;
+             uint8_t                                                 
*p_opt160_guid = NULL;
                uint8_t                                                 msg = 0;

                IPOIB_ENTER( IPOIB_DBG_RECV );
@@ -2927,6 +2949,12 @@

                                case DHCP_OPT_CLIENT_ID:
                                                p_cid = p_option;
+                                             p_option += (p_option[1] + 2);
+                                             break;
+
+                             case 160:
+                                             p_opt160 = p_option;
+                                             p_opt160_len = p_option[1];
                                                /* Fall through. */

                                default:
@@ -2970,6 +2998,30 @@
                                                ("Invalide message type.\n") );
                                return IB_INVALID_PARAMETER;
                }
+
+             if (p_opt160) {
+                             // On the altiris system, the system sends a 
packet with option 160 that has a guid in it. we need to replace it with the mac
+
+                             // I know want to find the guid and replace it
+
+                             // make sure we don't get out of the buffer:
+                             p_opt160_len = (uint16_t)min(p_opt160_len, 
DHCP_OPTIONS_SIZE - (p_opt160 - &p_dhcp->options[0]));
+
+
+                             p_opt160_guid = FindString(p_opt160, 
p_opt160_len, p_src->dgid.raw+8, 6);
+                             if (p_opt160_guid != NULL) {
+                                             IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("option 160 found, guid is replaced with 
mac\n"));
+                                             RtlCopyMemory( p_opt160_guid, 
&p_src->mac, sizeof(p_src->mac) );
+
+                             }
+                             else
+                             {
+                                             IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("option 160 found but guid inside it 
not\n"));
+                             }
+             }
+
+
+
                p_eth->type.ip.prot.udp.hdr.chksum = 0;
                p_dhcp->htype = DHCP_HW_TYPE_ETH;
                p_dhcp->hlen = HW_ADDR_LEN;
_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to