[Gd-chatter] r11637 - in trunk/libraries: layer packetizer protocols

hannes at gwydiondylan.org hannes at gwydiondylan.org
Fri Jan 18 14:55:11 CET 2008


Author: hannes
Date: Fri Jan 18 14:55:10 2008
New Revision: 11637

Modified:
   trunk/libraries/layer/dhcp.dylan
   trunk/libraries/packetizer/protocol-definer-macro.dylan
   trunk/libraries/protocols/protocols-library.dylan
Log:
Job: 7299
dhcp does work again...


Modified: trunk/libraries/layer/dhcp.dylan
==============================================================================
--- trunk/libraries/layer/dhcp.dylan	(original)
+++ trunk/libraries/layer/dhcp.dylan	Fri Jan 18 14:55:10 2008
@@ -9,6 +9,10 @@
                              node :: <dhcp-client>,
                              frame :: <dhcp-message>)
   let message-type-frame = find-option(frame, <dhcp-message-type-option>);
+  //format-out("Received dhcp message %= %= %=\n",
+  //           node.state,
+  //           frame.operation,
+  //           message-type-frame.message-type); 
   if (instance?(node.state, <selecting>))
     if (frame.operation == #"bootreply")
       if (message-type-frame.message-type == #"dhcpoffer")
@@ -49,7 +53,8 @@
                     transaction-id: state.xid,
                     client-hardware-address: $hardware-address,
                     dhcp-options: list(make(<dhcp-message-type-option>,
-                                            message-type: #"dhcpdiscover")));
+                                            message-type: #"dhcpdiscover"),
+                                       make(<dhcp-end-option>)));
   send(state.send-socket, $broadcast-address, packet);
 end;
 
@@ -70,12 +75,14 @@
                                 new-state :: <requesting>) => ()
 //  if (matches-requirements?(state.offer))
   let server-option = find-option(state.offer, <dhcp-server-identifier-option>);
+  //XXX: somehow the #"dhcprequest" doesn't work here :/
   let options = list(make(<dhcp-message-type-option>,
-                          message-type: #"dhcprequest"),
+                          message-type: 3), //#"dhcprequest"),
                      make(<dhcp-requested-ip-address-option>,
                           requested-ip: state.offer.your-ip-address),
                      make(<dhcp-server-identifier-option>,
-                          selected-server: server-option.selected-server));
+                          selected-server: server-option.selected-server),
+                     make(<dhcp-end-option>));
   let packet = make(<dhcp-message>,
                     transaction-id: state.xid,
                     client-hardware-address: $hardware-address,
@@ -86,7 +93,7 @@
 
 
 define method main()
-  let eth = build-ethernet-layer("Intel", promiscuous?: #t);
+  let eth = build-ethernet-layer("eth0", promiscuous?: #t);
   let ip-layer = build-ip-layer(eth);
   let udp = make(<udp-layer>, ip-layer: ip-layer);
   let socket = create-socket(udp, 67, client-port: 68);

Modified: trunk/libraries/packetizer/protocol-definer-macro.dylan
==============================================================================
--- trunk/libraries/packetizer/protocol-definer-macro.dylan	(original)
+++ trunk/libraries/packetizer/protocol-definer-macro.dylan	Fri Jan 18 14:55:10 2008
@@ -32,8 +32,10 @@
 
 end;
 
-define inline function filter-enums!(key/value-pairs :: <collection>,
-                                     fields :: <collection>)
+define inline function filter-enums
+    (key/value-pairs :: <collection>, fields :: <collection>)
+ => (args :: <collection>)
+  let args = copy-sequence(key/value-pairs);
   for (ele in fields)
     if (instance?(ele, <enum-field>))
       let (key, pos)
@@ -45,10 +47,13 @@
             end;
           end;
       if (key & instance?(key, <symbol>))
-        key/value-pairs[pos] := enum-field-symbol-to-int(ele, key);
+        //format-out("changed %= from %= to %=\n", ele.field-name, key, enum-field-symbol-to-int(ele, key));
+        args[pos] := enum-field-symbol-to-int(ele, key);
       end;
     end;
   end;
+  //format-out("returning from filter-enum1\n");
+  args;
 end;
 
 
@@ -114,9 +119,10 @@
           static-end(last("$" ## ?name ## "-fields"));
         end;
       end;
-      define method make (class == ?name, #rest rest, #key, #all-keys) => (res :: ?name)
-        filter-enums!(rest, "$" ## ?name ## "-fields");
-        let frame = apply(make, decoded-class(?name), rest);
+      define method make (class == ?name,
+                          #rest rest, #key, #all-keys) => (res :: ?name)
+        let args = filter-enums(rest, "$" ## ?name ## "-fields");
+        let frame = apply(make, decoded-class(?name), args);
         for (field in fields(frame))
           if (field.getter(frame) = #f)
             field.setter(field.init-value, frame);

Modified: trunk/libraries/protocols/protocols-library.dylan
==============================================================================
--- trunk/libraries/protocols/protocols-library.dylan	(original)
+++ trunk/libraries/protocols/protocols-library.dylan	Fri Jan 18 14:55:10 2008
@@ -319,6 +319,7 @@
     <dhcp-server-identifier-option>,
     <dhcp-subnet-mask>,
     <dhcp-router-option>,
+    <dhcp-end-option>,
     subnet-mask,
     addresses,
     message-type,



More information about the chatter mailing list