[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