[Gd-chatter] r11018 - trunk/libraries/layer

hannes at gwydiondylan.org hannes at gwydiondylan.org
Sat Dec 2 21:35:13 CET 2006


Author: hannes
Date: Sat Dec  2 21:35:11 2006
New Revision: 11018

Modified:
   trunk/libraries/layer/layer.dylan
   trunk/libraries/layer/module.dylan
   trunk/libraries/layer/udp.dylan
Log:
Bug: 7299
*support for ip-broadcasts (in <ip-over-ethernet-adapter>)

Modified: trunk/libraries/layer/layer.dylan
==============================================================================
--- trunk/libraries/layer/layer.dylan	(original)
+++ trunk/libraries/layer/layer.dylan	Sat Dec  2 21:35:11 2006
@@ -145,37 +145,41 @@
 end;
 
 define method send (socket :: <ip-over-ethernet-adapter>, destination :: <ipv4-address>, payload :: <container-frame>);
-  let arp-entry = element(socket.arp-handler.arp-table, destination, default: #f);
-  if (instance?(arp-entry, <known-arp-entry>))
-    send(socket.ip-send-socket, arp-entry.arp-mac-address, payload);
+  if (broadcast-address(make(<cidr>, network-address: socket.v4-address, netmask: socket.netmask)) = destination)
+    send(socket.ip-send-socket, $broadcast-ethernet-address, payload);
   else
-    let arp-handler = socket.arp-handler;
-    with-lock(arp-handler.table-lock)
-      if (arp-entry)
-        arp-entry.outstanding-packets := add!(arp-entry.outstanding-packets, payload);
-      else
-        let from-addr = arp-handler.send-socket.listen-address;
-        let from-ip = find-key(arp-handler.arp-table,
-                               method(x)
-                                 x.arp-mac-address = from-addr
-                               end);
-        let arp-request = make(<arp-frame>,
-                               operation: 1,
-                               source-mac-address: from-addr,
-                               source-ip-address: from-ip,
-                               target-ip-address: destination,
-                               target-mac-address: mac-address("00:00:00:00:00:00"));
-        send(arp-handler.send-socket, $broadcast-ethernet-address, arp-request);
-        let outstanding-request = make(<outstanding-arp-request>,
-                                       handler: arp-handler,
-                                       request: arp-request,
-                                       destination: $broadcast-ethernet-address,
-                                       ip-address: destination,
-                                       outstanding-packets: list(payload));
-        let timer* = make(<timer>, in: 5, event: curry(try-again, outstanding-request, arp-handler));
-        outstanding-request.timer := timer*;
-        arp-handler.arp-table[destination] := outstanding-request;
-        arp-entry := outstanding-request;
+    let arp-entry = element(socket.arp-handler.arp-table, destination, default: #f);
+    if (instance?(arp-entry, <known-arp-entry>))
+      send(socket.ip-send-socket, arp-entry.arp-mac-address, payload);
+    else
+      let arp-handler = socket.arp-handler;
+      with-lock(arp-handler.table-lock)
+        if (arp-entry)
+          arp-entry.outstanding-packets := add!(arp-entry.outstanding-packets, payload);
+        else
+          let from-addr = arp-handler.send-socket.listen-address;
+          let from-ip = find-key(arp-handler.arp-table,
+                                 method(x)
+                                   x.arp-mac-address = from-addr
+                                 end);
+          let arp-request = make(<arp-frame>,
+                                 operation: 1,
+                                 source-mac-address: from-addr,
+                                 source-ip-address: from-ip,
+                                 target-ip-address: destination,
+                                 target-mac-address: mac-address("00:00:00:00:00:00"));
+          send(arp-handler.send-socket, $broadcast-ethernet-address, arp-request);
+          let outstanding-request = make(<outstanding-arp-request>,
+                                         handler: arp-handler,
+                                         request: arp-request,
+                                         destination: $broadcast-ethernet-address,
+                                         ip-address: destination,
+                                         outstanding-packets: list(payload));
+          let timer* = make(<timer>, in: 5, event: curry(try-again, outstanding-request, arp-handler));
+          outstanding-request.timer := timer*;
+          arp-handler.arp-table[destination] := outstanding-request;
+          arp-entry := outstanding-request;
+        end;
       end;
     end;
   end;
@@ -615,7 +619,7 @@
 define function init-arp-handler (#key mac-address :: <mac-address> = mac-address("00:de:ad:be:ef:00"),
                                   ip-address :: <ipv4-address> = ipv4-address("23.23.23.23"),
                                   netmask :: <integer> = 24,
-                                  interface-name :: <string> = "Intel");
+                                  interface-name :: <string> = "eth0");
   let interface = make(<ethernet-interface>, name: interface-name);
   let ethernet-layer = make(<ethernet-layer>,
                             ethernet-interface: interface,
@@ -638,52 +642,26 @@
   ethernet-layer;
 end;
 
-
-define function init-ethernet ()
-  let int = make(<ethernet-interface>, name: "Intel");
-  let ethernet-layer = make(<ethernet-layer>, ethernet-interface: int);
+define function init-ip-layer (#key mac-address :: <mac-address> = mac-address("00:de:ad:be:ef:00"),
+                               ip-address :: <ipv4-address> = ipv4-address("23.23.23.23"),
+                               netmask :: <integer> = 24,
+                               interface-name :: <string> = "eth0")
+  let int = make(<ethernet-interface>, name: interface-name);
+  let ethernet-layer = make(<ethernet-layer>, ethernet-interface: int, default-mac-address: mac-address);
   let arp-handler = make(<arp-handler>);
-/*
-  arp-handler.arp-table[ipv4-address("192.168.0.23")]
-    := make(<advertised-arp-entry>,
-            mac-address: mac-address("00:de:ad:be:ef:00"),
-            ip-address: ipv4-address("192.168.0.23"));
-*/
   let ip-layer = make(<ip-layer>);
-  register-route(ip-layer, make(<next-hop-route>, cidr: as(<cidr>, "0.0.0.0/0"),
-                                next-hop: ipv4-address("192.168.0.1")));
   let ip-over-ethernet = make(<ip-over-ethernet-adapter>,
                               ethernet: ethernet-layer,
                               arp: arp-handler,
                               ip-layer: ip-layer,
-                              ipv4-address: ipv4-address("192.168.0.23"),
-                              netmask: 24);
+                              ipv4-address: ip-address,
+                              netmask: netmask);
+  send-gratitious-arp(arp-handler, ip-address);
   let icmp-handler = make(<icmp-handler>);
   let icmp-over-ip = make(<icmp-over-ip-adapter>,
                           ip-layer: ip-layer,
                           icmp-handler: icmp-handler);
-  let thr = make(<thread>, function: curry(toplevel, int));
-  send(icmp-handler.ip-socket,
-       ipv4-address("213.73.91.29"),
-       make(<icmp-frame>,
-            icmp-type: 8,
-            code: 0,
-            payload: parse-frame(<raw-frame>, as(<byte-vector>, #(#x23, #x42, #x0, #x0)))));
-  send(icmp-handler.ip-socket,
-       ipv4-address("212.202.174.224"),
-       make(<icmp-frame>,
-            icmp-type: 8,
-            code: 0,
-            payload: parse-frame(<raw-frame>, as(<byte-vector>, #(#x23, #x42, #x0, #x0)))));
-  send(icmp-handler.ip-socket,
-       ipv4-address("192.168.0.1"),
-       make(<icmp-frame>,
-            icmp-type: 8,
-            code: 0,
-            payload: parse-frame(<raw-frame>, as(<byte-vector>, #(#x23, #x42, #x0, #x0)))));
-
-//  format-out("Mac 192.168.2.1: %=\n", element(arp-handler.arp-table, ipv4-address("192.168.2.1"), default: #f));
-
-  ip-layer;
+  make(<thread>, function: curry(toplevel, int));
+  values(ip-layer, ip-over-ethernet);
 end;
 

Modified: trunk/libraries/layer/module.dylan
==============================================================================
--- trunk/libraries/layer/module.dylan	(original)
+++ trunk/libraries/layer/module.dylan	Sat Dec  2 21:35:11 2006
@@ -35,7 +35,9 @@
     <cidr>,
     broadcast-address,
     init-arp-handler,
+    init-ip-layer,
     decapsulator,
     create-socket,
+    send-socket,
     send;
 end module layer;

Modified: trunk/libraries/layer/udp.dylan
==============================================================================
--- trunk/libraries/layer/udp.dylan	(original)
+++ trunk/libraries/layer/udp.dylan	Sat Dec  2 21:35:11 2006
@@ -35,7 +35,7 @@
 end;                                  
 
 define function udp-begin()
-  let ip-layer = init-ethernet();
+  let ip-layer = init-ip-layer();
   let udp = make(<udp-layer>, ip-layer: ip-layer);
   let socket = create-socket(udp, 53);
   connect(socket.decapsulator, make(<verbose-printer>, stream: *standard-output*));



More information about the chatter mailing list