[openfirmware] r933 - ofw/inet

svn at openfirmware.info svn at openfirmware.info
Sat Sep 13 00:23:46 CEST 2008


Author: wmb
Date: 2008-09-13 00:23:45 +0200 (Sat, 13 Sep 2008)
New Revision: 933

Modified:
   ofw/inet/dhcp.fth
Log:
OLPC trac 8450 - ask explicitly for several DHCP parameters.



Modified: ofw/inet/dhcp.fth
===================================================================
--- ofw/inet/dhcp.fth	2008-09-12 20:54:20 UTC (rev 932)
+++ ofw/inet/dhcp.fth	2008-09-12 22:23:45 UTC (rev 933)
@@ -155,9 +155,22 @@
 \ Options common to discover, inform, and request messages
 : other-parameters  ( -- )
    set-vendor-class
+
+
+   \ Parameter request list
+   \ h# 01 -  1 Subnet mask
+   \ h# 03 -  3 Router IP address
+   \ h# 06 -  6 Name Server IP address
+   \ h# 0c - 12 Client name
+   \ h# 0f - 15 Domain name
+   \ h# 11 - 17 Root path
+   \ h# 1c - 28 Broadcast IP address
+   \ h# 2b - 43 Vendor options
+   \ h# 36 - 54 Server IP address
+   " "(01 03 06 0c 0f 11 1c 2b 36)" d# 55 +option
+
    \ Later: Add requested IP address if we know it
    \ Later: Add requested IP lease time if we have a preference
-   \ Later: Add parameter request list if we care
    \ Later: Add maximum message size if we should need to
 ;
 : use-ip-broadcast  ( -- )  broadcast-ip-addr set-dest-ip  ;
@@ -288,11 +301,37 @@
 ;
 
 partial-headers
-\ For now we'll take the first offer we get.
+\ wanted? is the DHCP offer filter.  Many environments have multiple DHCP
+\ servers, some giving incomplete information.  You can set wanted? to
+\ require specific characteristics in the offer data.
 
+\ A better approach would be to collect several offers within a time period
+\ and choose the best among them, stopping early if a "perfect" offer arrives.
+
 \ The default value of wanted? accepts the first DHCPOFFER that is received
 defer wanted?  ( -- flag )  ' true to wanted?
 
+\ This filter accepts offers that specify a router
+: router?  ( -- flag )
+   3 find-option  dup  if  nip nip  then
+;
+
+\ This filter accepts offers that specify a name server
+: ns?  ( -- flag )
+   6 find-option  dup  if  nip nip  then
+;
+
+: router+ns?  ( -- flag )  router? ns? and  ;
+
+: adaptive-wanted?  ( -- flag )
+   backoff  case
+      d#  8000 of  router+ns? exit  endof
+      d# 16000 of  router?    exit  endof
+   endcase
+   true
+;
+' adaptive-wanted? to wanted?		\ By default, we accept all DHCP offers
+
 \ This filter rejects offers whose siaddr field is empty, (Microsoft's
 \ DHCP server doesn't fill in siaddr), since we are hosed if we don't know
 \ which server to use.
@@ -304,9 +343,9 @@
       " The DHCP 'siaddr' field is empty" .dhcp-msg
    then
 ;
-' true to wanted?		\ By default, we accept all DHCP offers
 \ ' (wanted?) to wanted?
 
+
 \ Another plausible criterion for choosing a particular offer might be:
 \    If a vendor class identifier is supplied, reject offers that do
 \    not return that identifier, instead waiting for an offer from a




More information about the openfirmware mailing list