[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