[dhcp] Accept filename via DHCP option 67 as well as BOOTP filename field
authorMichael Brown <mcb30@etherboot.org>
Wed, 15 Apr 2009 20:08:02 +0000 (21:08 +0100)
committerMichael Brown <mcb30@etherboot.org>
Wed, 15 Apr 2009 20:08:02 +0000 (21:08 +0100)
Allow options with dedicated BOOTP fields to fall back to using the
equivalent DHCP option if the relevant field is empty.

src/net/dhcppkt.c

index 1f2d373..2f3e680 100644 (file)
@@ -155,6 +155,8 @@ int dhcppkt_store ( struct dhcp_packet *dhcppkt, unsigned int tag,
                memset ( field_data, 0, field->len );
                memcpy ( dhcp_packet_field ( dhcppkt->dhcphdr, field ),
                         data, len );
+               /* Erase any equivalent option from the options block */
+               dhcpopt_store ( &dhcppkt->options, tag, NULL, 0 );
                return 0;
        }
 
@@ -181,14 +183,16 @@ int dhcppkt_fetch ( struct dhcp_packet *dhcppkt, unsigned int tag,
                    void *data, size_t len ) {
        struct dhcp_packet_field *field;
        void *field_data;
-       size_t field_len;
+       size_t field_len = 0;
        
-       /* If this is a special field, return it */
+       /* Identify special field, if any */
        if ( ( field = find_dhcp_packet_field ( tag ) ) != NULL ) {
                field_data = dhcp_packet_field ( dhcppkt->dhcphdr, field );
                field_len = field->used_len ( field_data, field->len );
-               if ( ! field_len )
-                       return -ENOENT;
+       }
+
+       /* Return special field, if it exists and is populated */
+       if ( field_len ) {
                if ( len > field_len )
                        len = field_len;
                memcpy ( data, field_data, len );