send just requested dhcp options to clients except for server identifier
authorDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 6 Aug 2009 18:09:17 +0000 (18:09 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 6 Aug 2009 18:09:17 +0000 (18:09 +0000)
which busybox udhcpc implementation requires but don't request

lib/PXElator/dhcpd.pm
lib/PXElator/server.pm

index 83f1cd3..23e85ab 100644 (file)
@@ -79,6 +79,7 @@ sub client_ip {
 use log;
 use config;
 use pxelinux;
+use client;
 
 our $file;
 our $transaction = 0; # FIXME predictible transaction numbers
@@ -129,8 +130,26 @@ sub process_packet {
                Giaddr  => $dhcp->giaddr(),
                Chaddr  => $dhcp->chaddr(),
                File    => $file,
+               DHO_DHCP_SERVER_IDENTIFIER()    => $server::ip, # busybox/udhcpc needs it but doesn't request
        };
 
+       my $options = {
+               DHO_SUBNET_MASK()       => $server::netmask,
+               DHO_ROUTERS()           => $server::ip,
+               DHO_DOMAIN_NAME()       => $server::domain_name,
+               DHO_NAME_SERVERS()      => $server::ip,
+               DHO_DOMAIN_NAME_SERVERS() => $server::ip,
+               DHO_HOST_NAME()         => client::conf( $ip, 'hostname' ),
+               DHO_BROADCAST_ADDRESS() => $server::bcast,
+#              DHO_NTP_SERVERS() => '',
+       };
+
+       my @requested = split(/\s/, $dhcp->getOptionValue(DHO_DHCP_PARAMETER_REQUEST_LIST));
+       warn "options ",dump( $options ), ' requested: ',dump( @requested );
+       foreach ( @requested ) {
+               $packet->{$_} = $options->{$_} if defined $options->{$_};
+       }
+
        foreach my $opt ( 'magic', 'config_file', 'path_prefix', 'reboot_time' ) {
                my $DH0 = eval 'DHO_PXELINUX_' . uc $opt;
                warn "DH0: $@" if $@;
@@ -153,11 +172,6 @@ sub process_packet {
                if ( $ip eq $requested_ip ) {
                        $packet->{DHO_DHCP_MESSAGE_TYPE()}      = DHCPACK();
                        $packet->{DHO_DHCP_LEASE_TIME()}        = 5 * 60; # 5 min
-#                      $packet->{DHO_DHCP_SERVER_IDENTIFIER()} = $server::ip;          # FIXME
-                       $packet->{DHO_SUBNET_MASK()}            = '255.255.255.0';
-                       $packet->{DHO_ROUTERS()}                = $server::ip;
-                       $packet->{DHO_DOMAIN_NAME()}            = 'pxelator.lan';
-                       $packet->{DHO_NAME_SERVERS()}           = $server::ip;
 #                      $packet->{DHO_ROOT_PATH()}              = '/exports/foobar';
                } else {
                        $packet->{DHO_DHCP_MESSAGE_TYPE()} = DHCPNAK();
@@ -169,9 +183,9 @@ sub process_packet {
                log::mac $mac, "$messagetype igored (bootp?)";
        }
 
-       warn ">> $mac == $ip server: $server::ip", $file ? " file: $file\n" : "\n" if $debug;
+       warn "packet ",dump( $packet );
 
-warn "## created packet ", dump( $packet );
+       warn ">> $mac == $ip server: $server::ip", $file ? " file: $file\n" : "\n" if $debug;
 
        $packet = new Net::DHCP::Packet( %$packet );
        warn "send ",$packet->toString() if $debug;
index dda409c..503510c 100644 (file)
@@ -6,6 +6,7 @@ use strict;
 
 our $ip      = '172.16.10.1';
 our $netmask = '255.255.255.0';
+our $bcast   = '172.16.10.255';
 
 our ( $ip_from, $ip_to ) = ( 10, 100 );