[Gd-chatter] r11719 - in trunk/libraries: flow gui-sniffer layer network-flow network/ip-stack/layers/media-access/802-1q network/ip-stack/layers/media-access/bridge-group network/ip-stack/layers/physical/pcap-live-interface protocols registry/generic
andreas at gwydiondylan.org
andreas at gwydiondylan.org
Fri Feb 29 02:45:03 CET 2008
Author: andreas
Date: Fri Feb 29 02:45:00 2008
New Revision: 11719
Added:
trunk/libraries/network/ip-stack/layers/media-access/802-1q/802-1q.dylan (contents, props changed)
trunk/libraries/network/ip-stack/layers/media-access/802-1q/802-1q.lid (contents, props changed)
trunk/libraries/network/ip-stack/layers/media-access/802-1q/library.dylan (contents, props changed)
trunk/libraries/registry/generic/ieee802-1q (contents, props changed)
Modified:
trunk/libraries/flow/flow.dylan
trunk/libraries/gui-sniffer/commands.dylan
trunk/libraries/gui-sniffer/gui-sniffer.dylan
trunk/libraries/gui-sniffer/library.dylan
trunk/libraries/layer/module.dylan
trunk/libraries/layer/new-layer.dylan
trunk/libraries/layer/socket.dylan
trunk/libraries/network-flow/module.dylan
trunk/libraries/network-flow/network-flow.dylan
trunk/libraries/network/ip-stack/layers/media-access/bridge-group/bridge-group.dylan
trunk/libraries/network/ip-stack/layers/physical/pcap-live-interface/library-win32.dylan
trunk/libraries/network/ip-stack/layers/physical/pcap-live-interface/pcap-live-interface.dylan
trunk/libraries/protocols/ethernet.dylan
trunk/libraries/protocols/protocols-library.dylan
Log:
Job: 7299
*implement IEEE 802.1q layer
*include a fan-in and a demultiplexer into <pcap-live-interface>
*fix minor stuff in protocols, layer, flow and network-flow.
A sample session in the GUI (commands entered are prefixed with #):
Network Night Vision 0.0.2
(c) 2005 - 2007 Andreas Bogk, Hannes Mehnert
All Rights Reserved. Free for non-commercial use.
http://www.networknightvision.com/
Type 'help' down here to get started.
# create vlan v5
Layer v5 of type vlan created
# create vlan v8
Layer v8 of type vlan created
# !set v5 vlan-id 5
# !set pcap2 administrative-state up
# tap v5
# connect pcap2 v5
# !set v5 vlan-id 223
# !set v5 vlan-id 5
# connect pcap2 v8
# !set v8 vlan-id 8
# create repeater-group r
Layer R of type repeater-group created
# connect v5 r
# connect v8 r
# tap pcap2
# !set r administrative-state down
# show-config
pcap pcap2 {
administrative-state: #"up"
service v8
service v5
}
vlan v8 {
vlan-id: 8
service R
}
vlan v5 {
vlan-id: 5
service R
}
repeater-group R {
administrative-state: #"down"
}
# show-layer pcap2
device-description: "NVIDIA nForce MCP Networking Adapter Driver (Microsoft's Packet Scheduler) "
device-id: "\\Device\\NPF_{2E173194-FA6E-4C90-82F5-06D97CA08131}"
administrative-state: #"up"
promiscuous?: #t
running-state: #"up"
services: v8 v5
sources:
# show-layer r
administrative-state: #"down"
services:
sources: v8 v5
# show-layer v5
vlan-id: 5
administrative-state: #"up"
services: R
sources: pcap2
Modified: trunk/libraries/flow/flow.dylan
==============================================================================
--- trunk/libraries/flow/flow.dylan (original)
+++ trunk/libraries/flow/flow.dylan Fri Feb 29 02:45:00 2008
@@ -97,14 +97,6 @@
node.the-input := make(<push-input>, node: node)
end;
-define class <closure-node> (<single-push-input-node>)
- constant slot closure :: <function>, required-init-keyword: closure:;
-end;
-
-define method push-data-aux (input :: <push-input>, node :: <closure-node>, data) => ()
- node.closure(data);
-end;
-
define method get-inputs (node :: <single-input-node>) => (inputs)
list(node.the-input)
end;
@@ -168,6 +160,14 @@
define open abstract class <filter> (<single-push-input-node>, <single-push-output-node>)
end;
+define class <closure-node> (<filter>)
+ constant slot closure :: <function>, required-init-keyword: closure:;
+end;
+
+define method push-data-aux (input :: <push-input>, node :: <closure-node>, data) => ()
+ node.closure(data);
+end;
+
define class <queue> (<single-push-input-node>, <single-pull-output-node>)
slot queue :: <deque> = make(<deque>);
slot lock :: <lock> = make(<lock>);
Modified: trunk/libraries/gui-sniffer/commands.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/commands.dylan (original)
+++ trunk/libraries/gui-sniffer/commands.dylan Fri Feb 29 02:45:00 2008
@@ -275,13 +275,10 @@
let layer = command.%layer;
if (context.nnv-context.tapping-socket)
new-close-socket(context.nnv-context.tapping-socket);
- if (context.nnv-context.tapping-socket.new-flow-node.the-output.connected-input.node = context.nnv-context)
- disconnect(context.nnv-context.tapping-socket.new-flow-node, context.nnv-context);
- end;
end;
let tap = new-create-socket(layer);
context.nnv-context.tapping-socket := tap;
- connect(tap.new-flow-node, context.nnv-context);
+ connect(tap.new-socket-output, context.nnv-context);
end;
define command-group layer-gui
(summary: "Layer command for the GUI",
Modified: trunk/libraries/gui-sniffer/gui-sniffer.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.dylan (original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.dylan Fri Feb 29 02:45:00 2008
@@ -269,7 +269,7 @@
define function show-packet (frame :: <gui-sniffer-frame>)
let current-packet = current-packet(frame);
show-packet-tree(frame, current-packet);
- current-packet & show-hexdump(frame, current-packet.packet);
+ current-packet & show-hexdump(frame, current-packet.assemble-frame!.packet);
redisplay-window(frame.packet-hex-dump);
end;
Modified: trunk/libraries/gui-sniffer/library.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/library.dylan (original)
+++ trunk/libraries/gui-sniffer/library.dylan Fri Feb 29 02:45:00 2008
@@ -22,4 +22,5 @@
use timer;
use pcap-live-interface;
use bridge-group;
+ use ieee802-1q;
end library gui-sniffer;
Modified: trunk/libraries/layer/module.dylan
==============================================================================
--- trunk/libraries/layer/module.dylan (original)
+++ trunk/libraries/layer/module.dylan Fri Feb 29 02:45:00 2008
@@ -75,6 +75,7 @@
export <layer>, layer-name, default-name,
lower-layers, upper-layers,
+ sockets, sockets-setter,
initialize-layer,
connect-layer, disconnect-layer,
register-lower-layer, register-upper-layer,
@@ -121,7 +122,9 @@
export <socket>, <flow-node-socket>,
create-socket, flow-node, socket-owner,
check-socket-arguments?;
-
+
+ export <input-output-socket>, socket-input, socket-output;
+
export send, close-socket;
end;
Modified: trunk/libraries/layer/new-layer.dylan
==============================================================================
--- trunk/libraries/layer/new-layer.dylan (original)
+++ trunk/libraries/layer/new-layer.dylan Fri Feb 29 02:45:00 2008
@@ -6,6 +6,7 @@
constant each-subclass slot default-name :: <symbol>;
slot upper-layers :: <sequence> = #();
slot lower-layers :: <sequence> = #();
+ slot sockets :: <list> = #();
end;
define open generic register-lower-layer (upper :: <layer>, lower :: <layer>);
@@ -330,6 +331,10 @@
end;
end;
+define method read-as (type == <integer>, value :: <string>) => (res :: <integer>)
+ string-to-integer(value);
+end;
+
define inline function set-property-value
(object :: <layer>, property-name :: <symbol>, new-value)
=> (value)
Modified: trunk/libraries/layer/socket.dylan
==============================================================================
--- trunk/libraries/layer/socket.dylan (original)
+++ trunk/libraries/layer/socket.dylan Fri Feb 29 02:45:00 2008
@@ -4,6 +4,9 @@
constant slot socket-owner, required-init-keyword: owner:;
end;
+define method initialize (socket :: <socket>, #key, #all-keys)
+ socket.socket-owner.sockets := add!(socket.socket-owner.sockets, socket);
+end;
define open generic check-socket-arguments? (layer :: <layer>, #key, #all-keys)
=> (valid-socket-arguments? :: <boolean>);
@@ -15,8 +18,9 @@
define open generic send (socket :: <socket>, data);
define open generic close-socket (socket :: <socket>);
-define method close-socket (socket :: <socket>) end;
-
+define method close-socket (socket :: <socket>)
+ socket.socket-owner.sockets := remove!(socket.socket-owner.sockets, socket);
+end;
define class <flow-node-socket> (<socket>)
constant slot flow-node /* :: <node> */, required-init-keyword: flow-node:;
end;
@@ -24,3 +28,21 @@
define method send (node :: <flow-node-socket>, data)
push-data(node.flow-node.the-input, data)
end;
+
+define class <input-output-socket> (<socket>)
+ constant slot socket-input, required-init-keyword: input:;
+ constant slot socket-output, required-init-keyword: output:;
+end;
+
+define method send (node :: <input-output-socket>, data)
+ if (node.socket-input.connected-output)
+ push-data(node.socket-input.connected-output, data)
+ end;
+end;
+
+define method close-socket (socket :: <input-output-socket>)
+ next-method();
+ disconnect(socket.socket-output, socket.socket-output.connected-input);
+ disconnect(socket.socket-input.connected-output, socket.socket-input);
+end;
+
Modified: trunk/libraries/network-flow/module.dylan
==============================================================================
--- trunk/libraries/network-flow/module.dylan (original)
+++ trunk/libraries/network-flow/module.dylan Fri Feb 29 02:45:00 2008
@@ -24,5 +24,5 @@
<pcap-file-writer>,
<malformed-packet-writer>,
<fan-out>, <fan-in>,
- create-input, create-output, remove-output;
+ create-input, create-output;
end module network-flow;
Modified: trunk/libraries/network-flow/network-flow.dylan
==============================================================================
--- trunk/libraries/network-flow/network-flow.dylan (original)
+++ trunk/libraries/network-flow/network-flow.dylan Fri Feb 29 02:45:00 2008
@@ -145,21 +145,27 @@
define method create-output-for-filter
(demux :: <demultiplexer>, filter :: <filter-expression>)
=> (output :: <filtered-push-output>)
- let output = make(<filtered-push-output>,
- frame-filter: filter,
- node: demux);
+ make(<filtered-push-output>,
+ frame-filter: filter,
+ node: demux);
+end;
+
+define method connect (output :: <filtered-push-output>, input :: <push-input>)
+ next-method();
+ let demux = output.node;
with-lock(demux.%lock)
add!(demux.outputs, output);
end;
- output
end;
-define method remove-output
- (demux :: <demultiplexer>, filter-output :: <filtered-push-output>)
+define method disconnect
+ (output :: <filtered-push-output>, input :: <push-input>)
=> ();
+ let demux = output.node;
with-lock(demux.%lock)
- remove!(demux.outputs, filter-output);
+ remove!(demux.outputs, output);
end;
+ next-method();
end;
define method push-data-aux (input :: <push-input>,
Added: trunk/libraries/network/ip-stack/layers/media-access/802-1q/802-1q.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/802-1q/802-1q.dylan Fri Feb 29 02:45:00 2008
@@ -0,0 +1,90 @@
+module: ieee802-1q
+
+define class <dot1q-encapsulator> (<filter>)
+ slot encapsulator-vlan-id :: <integer> = 0;
+end;
+
+define class <dot1q-decapsulator> (<filter>)
+end;
+
+define layer vlan (<layer>)
+ property administrative-state :: <symbol> = #"up";
+ property vlan-id :: <integer> = 0;
+ slot dot1q-decapsulator :: <dot1q-decapsulator> = make(<dot1q-decapsulator>);
+ slot dot1q-encapsulator :: <dot1q-encapsulator> = make(<dot1q-encapsulator>);
+ slot fan-in :: <fan-in> = make(<fan-in>);
+ slot demultiplexer :: <demultiplexer> = make(<demultiplexer>);
+ slot lower-socket :: false-or(<socket>) = #f;
+end;
+
+define method initialize-layer (layer :: <vlan-layer>, #key, #all-keys) => ()
+ connect(layer.dot1q-decapsulator, layer.demultiplexer);
+ connect(layer.fan-in, layer.dot1q-encapsulator);
+ local method change-vlan-id (event :: <property-changed-event>)
+ let new-value = event.property-changed-event-property.property-value;
+ layer.dot1q-encapsulator.encapsulator-vlan-id := new-value;
+ if (layer.lower-socket)
+ let lower = layer.lower-socket.socket-owner;
+ deregister-lower-layer(layer, lower);
+ register-lower-layer(layer, lower);
+ end;
+ end;
+ register-property-changed-event(layer, #"vlan-id", change-vlan-id);
+end;
+
+
+define method push-data-aux (input :: <push-input>, node :: <dot1q-encapsulator>, data :: <ethernet-frame>);
+ let new-frame = ethernet-frame(source-address: data.source-address,
+ destination-address: data.destination-address,
+ payload: vlan-tag(vlan-id: node.encapsulator-vlan-id,
+ type-code: data.type-code,
+ payload: data.payload));
+ push-data(node.the-output, new-frame);
+end;
+
+define method push-data-aux (input :: <push-input>, node :: <dot1q-decapsulator>, data :: <ethernet-frame>);
+ let new-frame = ethernet-frame(source-address: data.source-address,
+ destination-address: data.destination-address,
+ type-code: data.payload.type-code,
+ payload: data.payload.payload);
+ push-data(node.the-output, new-frame);
+end;
+
+define method create-socket (lower :: <vlan-layer>, #rest rest, #key filter-string, #all-keys)
+ => (res :: <socket>)
+ let input = create-input(lower.fan-in);
+ let output = create-output-for-filter(lower.demultiplexer, filter-string | "ethernet");
+ make(<input-output-socket>, owner: lower, input: input, output: output);
+end;
+
+define method check-socket-arguments? (lower :: <vlan-layer>, #rest rest, #key type, #all-keys)
+ => (valid-arguments? :: <boolean>)
+ //XXX: if (valid-type?)
+ type == <ethernet-frame>
+end;
+define method check-upper-layer? (lower :: <vlan-layer>, upper :: <layer>) => (allowed? :: <boolean>);
+ #t;
+end;
+
+define method check-lower-layer? (upper :: <vlan-layer>, lower :: <layer>) => (allowed? :: <boolean>);
+ (~ upper.lower-socket) & check-socket-arguments?(lower, type: <ethernet-frame>)
+end;
+
+define method register-upper-layer (lower :: <vlan-layer>, upper :: <layer>)
+
+end;
+
+define method register-lower-layer (upper :: <vlan-layer>, lower :: <layer>)
+ let ethernet-socket
+ = create-socket(lower, type: <ethernet-frame>,
+ filter-string: format-to-string("(vlan-tag) & (vlan-tag.vlan-id = %d)", upper. at vlan-id));
+ connect(ethernet-socket.socket-output, upper.dot1q-decapsulator);
+ connect(upper.dot1q-encapsulator, ethernet-socket.socket-input);
+ upper.lower-socket := ethernet-socket;
+end;
+
+define method deregister-lower-layer (upper :: <vlan-layer>, lower :: <layer>)
+ close-socket(upper.lower-socket);
+ upper.lower-socket := #f;
+end;
+
Added: trunk/libraries/network/ip-stack/layers/media-access/802-1q/802-1q.lid
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/802-1q/802-1q.lid Fri Feb 29 02:45:00 2008
@@ -0,0 +1,3 @@
+library: ieee802-1q
+files: library
+ 802-1q
Added: trunk/libraries/network/ip-stack/layers/media-access/802-1q/library.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/802-1q/library.dylan Fri Feb 29 02:45:00 2008
@@ -0,0 +1,20 @@
+module: dylan-user
+
+define library ieee802-1q
+ use common-dylan;
+ use layer;
+ use packetizer;
+ use protocols;
+ use flow;
+ use network-flow;
+end;
+
+define module ieee802-1q
+ use common-dylan;
+ use new-layer;
+ use ethernet;
+ use packetizer;
+ use flow;
+ use network-flow;
+ use socket;
+end;
Modified: trunk/libraries/network/ip-stack/layers/media-access/bridge-group/bridge-group.dylan
==============================================================================
--- trunk/libraries/network/ip-stack/layers/media-access/bridge-group/bridge-group.dylan (original)
+++ trunk/libraries/network/ip-stack/layers/media-access/bridge-group/bridge-group.dylan Fri Feb 29 02:45:00 2008
@@ -1,19 +1,16 @@
module: bridge-group
define layer repeater-group (<layer>)
- property administrative-state :: <symbol> = #"down";
- slot sockets :: <stretchy-vector> = make(<stretchy-vector>);
+ property administrative-state :: <symbol> = #"up";
end;
define class <output-node> (<single-push-output-node>)
end;
define method create-socket (repeater :: <repeater-group-layer>, #rest rest, #key, #all-keys)
=> (res :: <socket>)
- let socket = make(<flow-node-socket>,
- owner: repeater,
- flow-node: make(<output-node>));
- add!(repeater.sockets, socket);
- socket;
+ make(<flow-node-socket>,
+ owner: repeater,
+ flow-node: make(<output-node>));
end;
define method check-upper-layer? (lower :: <repeater-group-layer>, upper :: <layer>) => (allowed? :: <boolean>);
@@ -40,8 +37,9 @@
end
end
end);
- connect(ethernet-socket.flow-node, node);
- add!(upper.sockets, ethernet-socket);
+ connect(ethernet-socket.socket-output, node);
+ connect(node.the-output, ethernet-socket.socket-input);
+ upper.sockets := add!(upper.sockets, ethernet-socket);
end;
define method deregister-lower-layer (upper :: <repeater-group-layer>, lower :: <layer>)
@@ -49,8 +47,8 @@
map(socket-owner, upper.sockets),
upper.sockets);
for (s in layer-sockets)
- disconnect(s.flow-node, s.flow-node.the-output.connected-input);
- remove!(upper.sockets, s);
+ close-socket(s);
+ upper.sockets := remove!(upper.sockets, s);
end;
end;
Modified: trunk/libraries/network/ip-stack/layers/physical/pcap-live-interface/library-win32.dylan
==============================================================================
--- trunk/libraries/network/ip-stack/layers/physical/pcap-live-interface/library-win32.dylan (original)
+++ trunk/libraries/network/ip-stack/layers/physical/pcap-live-interface/library-win32.dylan Fri Feb 29 02:45:00 2008
@@ -10,6 +10,7 @@
use collection-extensions;
use functional-dylan;
use flow;
+ use network-flow;
use network;
use packetizer;
use protocols, import: { ethernet, ipv4, cidr };
@@ -29,6 +30,7 @@
use machine-words;
use byte-vector;
use flow;
+ use network-flow;
use print;
use format;
use threads;
@@ -38,7 +40,7 @@
use packetizer,
import: { parse-frame,
<frame>,
- assemble-frame,
+ assemble-frame!,
packet,
<stretchy-vector-subsequence> };
end;
Modified: trunk/libraries/network/ip-stack/layers/physical/pcap-live-interface/pcap-live-interface.dylan
==============================================================================
--- trunk/libraries/network/ip-stack/layers/physical/pcap-live-interface/pcap-live-interface.dylan (original)
+++ trunk/libraries/network/ip-stack/layers/physical/pcap-live-interface/pcap-live-interface.dylan Fri Feb 29 02:45:00 2008
@@ -13,20 +13,23 @@
system property running-state :: <symbol> = #"down";
system property device-id :: <string>;
system property device-description :: <string>;
- slot pcap-flow-node :: <pcap-flow-node>;
+ slot pcap-flow-node :: <pcap-flow-node> = make(<pcap-flow-node>);
+ slot demultiplexer :: <demultiplexer> = make(<demultiplexer>);
+ slot fan-in :: <fan-in> = make(<fan-in>);
end;
define method initialize-layer
(layer :: <pcap-layer>, #key, #all-keys)
=> ()
- layer.pcap-flow-node := make(<pcap-flow-node>);
+ connect(layer.pcap-flow-node, layer.demultiplexer);
+ connect(layer.fan-in, layer.pcap-flow-node);
register-c-dylan-object(layer.pcap-flow-node);
register-property-changed-event(layer, #"administrative-state", toggle-administrative-state);
end;
define method check-upper-layer? (lower :: <pcap-layer>, upper :: <layer>)
=> (allowed? :: <boolean>);
- lower.upper-layers.size == 0;
+ #t
end;
define method check-socket-arguments? (lower :: <pcap-layer>, #rest rest, #key type, #all-keys)
@@ -35,9 +38,11 @@
type == <ethernet-frame>
end;
-define method create-socket (lower :: <pcap-layer>, #rest rest, #key, #all-keys)
+define method create-socket (lower :: <pcap-layer>, #rest rest, #key type, filter-string, #all-keys)
=> (socket :: <socket>)
- make(<flow-node-socket>, owner: lower, flow-node: lower.pcap-flow-node);
+ let input = create-input(lower.fan-in);
+ let output = create-output-for-filter(lower.demultiplexer, filter-string | "ethernet");
+ make(<input-output-socket>, owner: lower, input: input, output: output);
end;
define function toggle-administrative-state (event :: <property-changed-event>) => ();
@@ -71,7 +76,7 @@
define method push-data-aux (input :: <push-input>,
node :: <pcap-flow-node>,
frame :: <frame>)
- let buffer = as(<byte-vector>, assemble-frame(frame).packet);
+ let buffer = as(<byte-vector>, assemble-frame!(frame).packet);
pcap-inject(node.pcap-t, buffer-offset(buffer, 0), buffer.size);
end;
Modified: trunk/libraries/protocols/ethernet.dylan
==============================================================================
--- trunk/libraries/protocols/ethernet.dylan (original)
+++ trunk/libraries/protocols/ethernet.dylan Fri Feb 29 02:45:00 2008
@@ -88,8 +88,8 @@
define protocol vlan-tag (header-frame)
over <ethernet-frame> #x8100;
summary "VLAN: %=", vlan-id;
- field priority :: <3bit-unsigned-integer>;
- field canonical-format-indicatior :: <1bit-unsigned-integer>;
+ field priority :: <3bit-unsigned-integer> = 0;
+ field canonical-format-indicator :: <1bit-unsigned-integer> = 0;
field vlan-id :: <12bit-unsigned-integer>;
layering field type-code :: <2byte-big-endian-unsigned-integer>;
variably-typed-field payload,
Modified: trunk/libraries/protocols/protocols-library.dylan
==============================================================================
--- trunk/libraries/protocols/protocols-library.dylan (original)
+++ trunk/libraries/protocols/protocols-library.dylan Fri Feb 29 02:45:00 2008
@@ -55,9 +55,11 @@
use common-extensions;
- export <ethernet-frame>,
+ export <ethernet-frame>, ethernet-frame,
type-code, type-code-setter;
+ export vlan-tag;
+
export <mac-address>, mac-address;
export <ipv4-address>, ipv4-address;
Added: trunk/libraries/registry/generic/ieee802-1q
==============================================================================
--- (empty file)
+++ trunk/libraries/registry/generic/ieee802-1q Fri Feb 29 02:45:00 2008
@@ -0,0 +1 @@
+abstract://dylan/network/ip-stack/layers/media-access/802-1q/802-1q.lid
\ No newline at end of file
More information about the chatter
mailing list