Fix creation of the htype field; the ll_proto field from which it is
authorMichael Brown <mcb30@etherboot.org>
Mon, 17 Jul 2006 13:07:14 +0000 (13:07 +0000)
committerMichael Brown <mcb30@etherboot.org>
Mon, 17 Jul 2006 13:07:14 +0000 (13:07 +0000)
derived is a 16-bit big-endian field, but htype is only 8 bits wide.

src/include/gpxe/dhcp.h
src/net/udp/dhcp.c

index e35b7ea..71c6c14 100644 (file)
@@ -23,7 +23,9 @@ struct dhcp_packet {
        uint8_t op;
        /** Hardware address type
         *
-        * This is an ARPHRD_XXX constant.
+        * This is an ARPHRD_XXX constant.  Note that ARPHRD_XXX
+        * constants are nominally 16 bits wide; this could be
+        * considered to be a bug in the BOOTP/DHCP specification.
         */
        uint8_t htype;
        /** Hardware address length */
@@ -274,6 +276,14 @@ struct dhcp_option_block {
        signed int priority;
 };
 
+/** A DHCP session */
+struct dhcp_session {
+       /** Network device being configured */
+       struct net_device *netdev;
+       /** Transaction ID, in network-endian order */
+       uint32_t xid;
+};
+
 extern unsigned long dhcp_num_option ( struct dhcp_option *option );
 extern struct dhcp_option *
 find_dhcp_option ( struct dhcp_option_block *options, unsigned int tag );
index 1523e40..7e9af09 100644 (file)
  *
  */
 
-struct dhcp_session {
-       struct net_device *netdev;
-       uint32_t xid;
-};
-
 /** DHCP operation types
  *
  * This table maps from DHCP message types (i.e. values of the @c
@@ -186,7 +181,7 @@ size_t dhcp_assemble ( struct dhcp_session *dhcp, void *data,
        dhcppkt->op = dhcp_op[dhcp_message_type];
 
        /* Fill in NIC details */
-       dhcppkt->htype = dhcp->netdev->ll_protocol->ll_proto;
+       dhcppkt->htype = ntohs ( dhcp->netdev->ll_protocol->ll_proto );
        dhcppkt->hlen = dhcp->netdev->ll_protocol->ll_addr_len;
        memcpy ( dhcppkt->chaddr, dhcp->netdev->ll_addr, dhcppkt->hlen );