[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