[Gd-chatter] r11017 - in trunk/libraries: layer network-flow

hannes at gwydiondylan.org hannes at gwydiondylan.org
Sat Dec 2 18:48:00 CET 2006


Author: hannes
Date: Sat Dec  2 18:47:56 2006
New Revision: 11017

Modified:
   trunk/libraries/layer/cidr.dylan
   trunk/libraries/layer/layer.dylan
   trunk/libraries/layer/module.dylan
   trunk/libraries/network-flow/module.dylan
   trunk/libraries/network-flow/network-flow.dylan
Log:
Bug: 7299
layer:
 *implement broadcast-address (<cidr>)
 *implement send-gratitious-arp (<arp-handler>, <ipv4-address>)
 *implement init-arp-handler (mac-address: <mac-address>, ip-address: <ipv4-address>, netmask: <integer>, interface-name: <string>)
 *some more exports

network-flow:
 * implement <encapsulator>

Modified: trunk/libraries/layer/cidr.dylan
==============================================================================
--- trunk/libraries/layer/cidr.dylan	(original)
+++ trunk/libraries/layer/cidr.dylan	Sat Dec  2 18:47:56 2006
@@ -47,3 +47,15 @@
        network-address: ipv4-address(ip),
        netmask: string-to-integer(mask));
 end;
+
+define method broadcast-address (cidr :: <cidr>) => (res :: <ipv4-address>);
+  let res = ipv4-address(as(<string>, cidr.cidr-network-address));
+  let (bytes, bits) = truncate/(32 - cidr.cidr-netmask, 8);
+  for (i from 0 below bytes)
+    res.data[3 - i] := #xff;
+  end;
+  if (bits > 0)
+    res.data[3 - bytes] := logior(res.data[3 - bytes], logand(#xff, 2 ^ bits - 1));
+  end;
+  res;
+end;

Modified: trunk/libraries/layer/layer.dylan
==============================================================================
--- trunk/libraries/layer/layer.dylan	(original)
+++ trunk/libraries/layer/layer.dylan	Sat Dec  2 18:47:56 2006
@@ -599,6 +599,44 @@
   add-response-to-table(node, frame)
 end;
 
+define function send-gratitious-arp (arp-handler :: <arp-handler>, ip :: <ipv4-address>)
+  let arp-entry = element(arp-handler.arp-table, ip, default: #f);
+  if (arp-entry)
+    let arp-frame = make(<arp-frame>,
+                         operation: 1,
+                         source-mac-address: arp-entry.arp-mac-address,
+                         source-ip-address: arp-entry.ip-address,
+                         target-mac-address: mac-address("00:00:00:00:00:00"),
+                         target-ip-address: arp-entry.ip-address);
+    send(arp-handler.send-socket, $broadcast-ethernet-address, arp-frame);
+  end;
+end;
+
+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");
+  let interface = make(<ethernet-interface>, name: interface-name);
+  let ethernet-layer = make(<ethernet-layer>,
+                            ethernet-interface: interface,
+                            default-mac-address: mac-address);
+  let arp-handler = make(<arp-handler>);
+  let cidr = make(<cidr>, network-address: ip-address, netmask: netmask);
+  unless (broadcast-address(cidr) = ip-address)
+    arp-handler.arp-table[ip-address] := make(<advertised-arp-entry>,
+                                              mac-address: mac-address,
+                                              ip-address: ip-address);
+  end;
+  let arp-socket = create-socket(ethernet-layer, #x806);
+  let arp-broadcast-socket = create-socket(ethernet-layer, #x806, mac-address: $broadcast-ethernet-address);
+  let arp-fan-in = make(<fan-in>);
+  arp-handler.send-socket := arp-socket;
+  connect(arp-socket.decapsulator, arp-fan-in);
+  connect(arp-broadcast-socket.decapsulator, arp-fan-in);
+  connect(arp-fan-in, arp-handler);
+  send-gratitious-arp(arp-handler, ip-address);
+  ethernet-layer;
+end;
 
 
 define function init-ethernet ()

Modified: trunk/libraries/layer/module.dylan
==============================================================================
--- trunk/libraries/layer/module.dylan	(original)
+++ trunk/libraries/layer/module.dylan	Sat Dec  2 18:47:56 2006
@@ -25,6 +25,7 @@
   // Add binding exports here.
 
   export <ethernet-layer>,
+    ethernet-interface,
     <ip-over-ethernet-adapter>,
     <ip-layer>,
     <icmp-handler>,
@@ -32,5 +33,9 @@
     <arp-handler>,
     register-route,
     <cidr>,
+    broadcast-address,
+    init-arp-handler,
+    decapsulator,
+    create-socket,
     send;
 end module layer;

Modified: trunk/libraries/network-flow/module.dylan
==============================================================================
--- trunk/libraries/network-flow/module.dylan	(original)
+++ trunk/libraries/network-flow/module.dylan	Sat Dec  2 18:47:56 2006
@@ -16,8 +16,8 @@
   use pcap, import: { packets, <pcap-file-header>, <pcap-packet>, <pcap-file> };
 
   export <summary-printer>, <verbose-printer>,
-    <decapsulator>, <demultiplexer>,
-    create-output-for-filter,
+    <decapsulator>, <encapsulator>,
+    <demultiplexer>, create-output-for-filter,
     <completer>,
     <frame-filter>,
     <pcap-file-reader>,

Modified: trunk/libraries/network-flow/network-flow.dylan
==============================================================================
--- trunk/libraries/network-flow/network-flow.dylan	(original)
+++ trunk/libraries/network-flow/network-flow.dylan	Sat Dec  2 18:47:56 2006
@@ -36,6 +36,19 @@
 end;
 
 
+define class <encapsulator> (<filter>)
+end;
+
+define method push-data-aux (input :: <push-input>,
+                             node :: <encapsulator>,
+                             frame :: <frame>)
+  if (frame.parent)
+    push-data(node.the-output, frame.parent)
+  else
+    error("No parent found")
+  end;
+end;
+
 define class <decapsulator> (<filter>)
 end;
 



More information about the chatter mailing list