[Gd-chatter] r11737 - in trunk/libraries: gui-sniffer network/ip-stack/layers/physical/linux-live-interface
andreas at gwydiondylan.org
andreas at gwydiondylan.org
Thu Mar 20 01:17:56 CET 2008
Author: andreas
Date: Thu Mar 20 01:17:55 2008
New Revision: 11737
Modified:
trunk/libraries/gui-sniffer/commands.dylan
trunk/libraries/gui-sniffer/layer-commands.dylan
trunk/libraries/gui-sniffer/main.dylan
trunk/libraries/network/ip-stack/layers/physical/linux-live-interface/library.dylan
trunk/libraries/network/ip-stack/layers/physical/linux-live-interface/linux-live-interface.dylan
Log:
job: 7299
* Make physical layer based on packet API work on Linux
* Introduce tapping sockets that see both directions of traffic
* Move layer initialization to a different time due to weird crashes
Modified: trunk/libraries/gui-sniffer/commands.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/commands.dylan (original)
+++ trunk/libraries/gui-sniffer/commands.dylan Thu Mar 20 01:17:55 2008
@@ -276,7 +276,7 @@
if (context.nnv-context.tapping-socket)
new-close-socket(context.nnv-context.tapping-socket);
end;
- let tap = new-create-socket(layer);
+ let tap = new-create-socket(layer, tap?: #t);
context.nnv-context.tapping-socket := tap;
connect(tap.new-socket-output, context.nnv-context);
end;
Modified: trunk/libraries/gui-sniffer/layer-commands.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/layer-commands.dylan (original)
+++ trunk/libraries/gui-sniffer/layer-commands.dylan Thu Mar 20 01:17:55 2008
@@ -1,9 +1,5 @@
module: layer-commands
-begin
- start-layer();
-end;
-
define class <show-config-command> (<basic-command>)
end;
Modified: trunk/libraries/gui-sniffer/main.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/main.dylan (original)
+++ trunk/libraries/gui-sniffer/main.dylan Thu Mar 20 01:17:55 2008
@@ -11,10 +11,11 @@
command-enabled?(close-interface, gui-sniffer) := #f;
gadget-enabled?(gui-sniffer.stop-button) := #f;
frame-mapped?(gui-sniffer) := #t;
- *standard-output* := gui-sniffer.nnv-shell-pane.command-line-server.server-output-stream;
+ //*standard-output* := gui-sniffer.nnv-shell-pane.command-line-server.server-output-stream;
write(*standard-output*, $about-text);
format(*standard-output*, "\n\nType 'help' down here to get started.\n");
recenter-window(gui-sniffer.nnv-shell-pane, gui-sniffer.nnv-shell-pane.window-point.bp-line, #"bottom");
+ new-start-layer();
start-frame(gui-sniffer);
end function main;
Modified: trunk/libraries/network/ip-stack/layers/physical/linux-live-interface/library.dylan
==============================================================================
--- trunk/libraries/network/ip-stack/layers/physical/linux-live-interface/library.dylan (original)
+++ trunk/libraries/network/ip-stack/layers/physical/linux-live-interface/library.dylan Thu Mar 20 01:17:55 2008
@@ -11,6 +11,7 @@
use collection-extensions;
use functional-dylan;
use flow;
+ use network-flow;
use network;
use packetizer;
use protocols, import: { ethernet, prism2, ieee80211 };
@@ -19,6 +20,7 @@
define module pcap-live-interface
use common-dylan, exclude: { format-to-string, close };
use new-layer;
+ use socket;
use physical-layer;
use dylan-extensions;
use threads;
@@ -34,6 +36,7 @@
use C-FFI;
use dylan-direct-c-ffi;
use flow;
+ use network-flow;
use packetizer, import: { parse-frame, assemble-frame, packet };
use ethernet, import: { <ethernet-frame> };
use ieee80211, import: { <ieee80211-frame> };
Modified: trunk/libraries/network/ip-stack/layers/physical/linux-live-interface/linux-live-interface.dylan
==============================================================================
--- trunk/libraries/network/ip-stack/layers/physical/linux-live-interface/linux-live-interface.dylan (original)
+++ trunk/libraries/network/ip-stack/layers/physical/linux-live-interface/linux-live-interface.dylan Thu Mar 20 01:17:55 2008
@@ -14,17 +14,18 @@
property promiscuous? :: <boolean> = #t;
system property running-state :: <symbol> = #"down";
system property device-name :: <string>;
- slot packet-flow-node :: <packet-flow-node>;
-end;
-
-define method create-raw-socket (phy :: <phy-layer>) => (res :: <node>)
- phy.packet-flow-node
+ slot packet-flow-node :: <packet-flow-node> = make(<packet-flow-node>);
+ slot demultiplexer :: <demultiplexer> = make(<demultiplexer>);
+ slot fan-in :: <fan-in> = make(<fan-in>);
+ slot fan-out :: <fan-out> = make(<fan-out>);
end;
define method initialize-layer (layer :: <phy-layer>,
#key, #all-keys)
=> ()
- layer.packet-flow-node := make(<packet-flow-node>);
+ connect(layer.packet-flow-node, layer.demultiplexer);
+ connect(layer.fan-in, layer.fan-out);
+ connect(layer.fan-out, layer.packet-flow-node);
register-c-dylan-object(layer.packet-flow-node);
register-property-changed-event(layer, #"administrative-state",
toggle-administrative-state);
@@ -41,11 +42,65 @@
end;
end;
+define method check-upper-layer? (lower :: <phy-layer>, upper :: <layer>)
+ => (allowed? :: <boolean>);
+ #t
+end;
+
+define method check-socket-arguments? (lower :: <phy-layer>, #rest rest, #key type, #all-keys)
+ => (valid-arguments? :: <boolean>)
+ //XXX: if (valid-type?)
+ type == <ethernet-frame>
+end;
+
+define class <tapping-socket> (<socket>)
+ slot fan-in = make(<fan-in>);
+ slot frame-filter :: <frame-filter>;
+ slot demux-output :: <output>;
+end;
+
+define method close-socket (socket :: <tapping-socket>)
+ socket.socket-owner.sockets := remove!(socket.socket-owner.sockets, socket);
+ disconnect(socket.socket-output, socket.socket-output.connected-input);
+ disconnect(socket.socket-owner.fan-out, socket.frame-filter);
+ disconnect(socket.demux-output, socket.fan-in);
+end;
+
+define method socket-input (socket :: <tapping-socket>) => (res /* :: <input> */);
+ error("Tapping sockets are read-only");
+end;
+
+define method socket-output (socket :: <tapping-socket>) => (res /* :: <output> */);
+ socket.fan-in.the-output;
+end;
+
+define method create-socket (lower :: <phy-layer>, #rest rest, #key type, filter-string, tap?, #all-keys)
+ => (socket :: <socket>)
+ let filter-string = filter-string | "ethernet";
+ if (tap?)
+ let socket = make(<tapping-socket>, owner: lower);
+ socket.frame-filter := make(<frame-filter>, frame-filter: filter-string);
+ connect(lower.fan-out, socket.frame-filter);
+ connect(socket.frame-filter, socket.fan-in);
+ socket.demux-output := create-output-for-filter(lower.demultiplexer, filter-string);
+ connect(socket.demux-output, socket.fan-in);
+ socket;
+ else
+ let input = create-input(lower.fan-in);
+ let output = create-output-for-filter(lower.demultiplexer, filter-string);
+ make(<input-output-socket>, owner: lower, input: input, output: output);
+ end;
+end;
+
+
define method push-data-aux (input :: <push-input>,
node :: <packet-flow-node>,
frame :: <ethernet-frame>)
- send(node.unix-file-descriptor,
- as(<byte-vector>, assemble-frame(frame).packet));
+ let buffer = as(<byte-vector>, assemble-frame(frame).packet);
+ unix-send-buffer(node.unix-file-descriptor,
+ buffer-offset(buffer, 0),
+ buffer.size,
+ 0);
end;
define function run-interface (layer :: <phy-layer>)
@@ -162,13 +217,6 @@
unix-receive();
end method receive;
-define method send (interface :: <integer>, buffer :: <buffer>)
- unix-send-buffer(interface,
- buffer-offset(buffer, 0),
- buffer.size,
- 0);
-end method send;
-
define function buffer-offset
(the-buffer :: <buffer>, data-offset :: <integer>)
=> (result-offset :: <machine-word>)
More information about the chatter
mailing list