[Gd-chatter] r11728 - in trunk/libraries: gui-sniffer layer network/ip-stack/layers/media-access/ethernet network/ip-stack/layers/media-access/ppp-over-ethernet network/ip-stack/state-machines/ppp protocols registry/generic
andreas at gwydiondylan.org
andreas at gwydiondylan.org
Wed Mar 5 02:44:15 CET 2008
Author: andreas
Date: Wed Mar 5 02:44:13 2008
New Revision: 11728
Added:
trunk/libraries/network/ip-stack/layers/media-access/ethernet/
trunk/libraries/network/ip-stack/layers/media-access/ethernet/ethernet.dylan (contents, props changed)
trunk/libraries/network/ip-stack/layers/media-access/ethernet/ethernet.lid (contents, props changed)
trunk/libraries/network/ip-stack/layers/media-access/ethernet/library.dylan (contents, props changed)
trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/
trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/library.dylan (contents, props changed)
trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/ppp-over-ethernet.dylan (contents, props changed)
trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/ppp-over-ethernet.lid (contents, props changed)
trunk/libraries/registry/generic/ethernet (contents, props changed)
trunk/libraries/registry/generic/ppp-over-ethernet (contents, props changed)
Modified:
trunk/libraries/gui-sniffer/gui-sniffer.dylan
trunk/libraries/gui-sniffer/layer-commands.dylan
trunk/libraries/gui-sniffer/library.dylan
trunk/libraries/layer/module.dylan
trunk/libraries/layer/new-layer.dylan
trunk/libraries/layer/ppp.dylan
trunk/libraries/layer/socket.dylan
trunk/libraries/network/ip-stack/state-machines/ppp/library.dylan
trunk/libraries/network/ip-stack/state-machines/ppp/ppp.dylan
trunk/libraries/protocols/ethernet.dylan
Log:
job: 7299
Layer implementations for Ethernet and PPPoE.
Modified: trunk/libraries/gui-sniffer/gui-sniffer.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.dylan (original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.dylan Wed Mar 5 02:44:13 2008
@@ -905,7 +905,7 @@
end;
define class <frame-with-metadata> (<object>)
- constant slot real-frame :: <container-frame>, required-init-keyword: frame:;
+ constant slot real-frame :: <frame>, required-init-keyword: frame:;
constant slot number :: <integer> = counter();
constant slot receive-time :: <date> = current-date(), init-keyword: receive-time:;
end;
Modified: trunk/libraries/gui-sniffer/layer-commands.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/layer-commands.dylan (original)
+++ trunk/libraries/gui-sniffer/layer-commands.dylan Wed Mar 5 02:44:13 2008
@@ -61,13 +61,7 @@
end;
define method do-execute-command (context :: <nnv-context>, command :: <show-layer-command>)
- let out = context.context-server.server-output-stream;
- do(curry(print-property, out), get-properties(command.%layer));
- format(out, "services: ");
- do(curry(format, out, "%s "), map(layer-name, command.%layer.upper-layers));
- format(out, "\nsources: ");
- do(curry(format, out, "%s "), map(layer-name, command.%layer.lower-layers));
- format(out, "\n");
+ print-layer(context.context-server.server-output-stream, command.%layer);
end;
define class <set-l-property-command> (<basic-command>)
@@ -160,6 +154,37 @@
let out = context.context-server.server-output-stream;
format(out, "Layer %s of type %s created\n", layer.layer-name, layer.default-name);
end;
+
+define class <up-command> (<basic-command>)
+ constant slot %layer :: <layer>, required-init-keyword: layer:;
+end;
+
+define command-line up => <up-command>
+ (summary: "Set administrative state of layer to 'up'.",
+ documentation: "Set administrative state of layer to 'up'.")
+ argument layer :: <layer> = "Layer to bring up.";
+end;
+
+define method do-execute-command (context :: <nnv-context>, command :: <up-command>)
+ let layer = command.%layer;
+ set-property-value(layer, #"administrative-state", #"up");
+end;
+
+define class <down-command> (<basic-command>)
+ constant slot %layer :: <layer>, required-init-keyword: layer:;
+end;
+
+define command-line down => <down-command>
+ (summary: "Set administrative state of layer to 'down'.",
+ documentation: "Set administrative state of layer to 'down'.")
+ argument layer :: <layer> = "Layer to bring down.";
+end;
+
+define method do-execute-command (context :: <nnv-context>, command :: <down-command>)
+ let layer = command.%layer;
+ set-property-value(layer, #"administrative-state", #"down");
+end;
+
define command-group layer
(summary: "Layer commands",
documentation: "The set of commands for managing the layers.")
@@ -170,5 +195,7 @@
command connect;
command disconnect;
command create;
+ command up;
+ command down;
end command-group;
Modified: trunk/libraries/gui-sniffer/library.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/library.dylan (original)
+++ trunk/libraries/gui-sniffer/library.dylan Wed Mar 5 02:44:13 2008
@@ -23,4 +23,6 @@
use pcap-live-interface;
use bridge-group;
use ieee802-1q;
+ use ethernet;
+ use ppp-over-ethernet;
end library gui-sniffer;
Modified: trunk/libraries/layer/module.dylan
==============================================================================
--- trunk/libraries/layer/module.dylan (original)
+++ trunk/libraries/layer/module.dylan Wed Mar 5 02:44:13 2008
@@ -125,6 +125,6 @@
export <input-output-socket>, socket-input, socket-output;
- export send, close-socket;
+ export send, close-socket, sendto;
end;
Modified: trunk/libraries/layer/new-layer.dylan
==============================================================================
--- trunk/libraries/layer/new-layer.dylan (original)
+++ trunk/libraries/layer/new-layer.dylan Wed Mar 5 02:44:13 2008
@@ -107,8 +107,14 @@
$layer-registry;
end;
-define function print-layer (stream :: <stream>, layer :: <layer>) => ()
- format(stream, "%s %s\n", layer.default-name, layer.layer-name);
+define function print-layer (out :: <stream>, layer :: <layer>) => ()
+ format(out, "%s %s\n", layer.default-name, layer.layer-name);
+ do(curry(print-property, out), get-properties(layer));
+ format(out, " services: ");
+ do(curry(format, out, "%s "), map(layer-name, layer.upper-layers));
+ format(out, "\n sources: ");
+ do(curry(format, out, "%s "), map(layer-name, layer.lower-layers));
+ format(out, "\n\n");
end;
define function print-config (stream :: <stream>, layer :: <layer>) => ()
@@ -118,7 +124,6 @@
if (slot-initialized?(prop, %property-value))
unless (slot-initialized?(prop, property-default-value)
& (prop.property-default-value = prop.property-value))
- format(stream, " ");
print-property(stream, prop);
end;
end;
@@ -187,8 +192,8 @@
end;
define macro layer-class-definer
- { layer-class-definer(?attr:*; ?:name (?superclass:expression); ?properties:*) }
- => { define ?attr class "<" ## ?name ## "-layer>" (?superclass)
+ { layer-class-definer(?attr:*; ?:name (?superclasses:*); ?properties:*) }
+ => { define ?attr class "<" ## ?name ## "-layer>" (?superclasses)
inherited slot default-name = ?#"name";
?properties
end }
@@ -204,12 +209,12 @@
define method initialize-layer (layer :: <layer>, #key, #all-keys) => () end;
define macro layer-definer
- { define ?attr:* layer ?:name (?superclass:expression)
+ { define ?attr:* layer ?:name (?superclasses:*)
?properties:*
end }
=>
{ layer-getter-and-setter-definer("<" ## ?name ## "-layer>"; ?properties);
- layer-class-definer(?attr; ?name (?superclass); ?properties);
+ layer-class-definer(?attr; ?name (?superclasses); ?properties);
$layer-type-registry[?#"name"] := "<" ## ?name ## "-layer>";
@@ -266,6 +271,12 @@
(source :: <layer>, name :: <symbol>, callback :: <function>) => ()
let prop = get-property(source, name);
prop.listeners := add!(prop.listeners, callback);
+ if (slot-initialized?(prop, %property-value))
+ let event = make(<property-changed-event>,
+ property: prop,
+ old-value: prop.property-value);
+ callback(event);
+ end;
end;
define inline function deregister-property-changed-event
@@ -293,7 +304,7 @@
end;
define inline function print-property (stream :: <stream>, prop :: <property>) => ()
- format(stream, "%s: %=\n", prop.property-name, prop.property-value);
+ format(stream, " %s: %=\n", prop.property-name, prop.property-value);
end;
define inline function get-properties
(object :: <layer>) => (res :: <collection>)
Modified: trunk/libraries/layer/ppp.dylan
==============================================================================
--- trunk/libraries/layer/ppp.dylan (original)
+++ trunk/libraries/layer/ppp.dylan Wed Mar 5 02:44:13 2008
@@ -45,7 +45,7 @@
send(node.send-socket, $broadcast-ethernet-address, pppoe-discovery);
end;
define method state-transition (node :: <pppoe-client>,
- old-state :: <pado-received>,
+ old-state :: <padi-sent>,
event,
new-state :: <padr-sent>) => ()
let pppoe = pppoe-discovery(pppoe-code: #"PADR (PPPoE Active Discovery Request)",
Modified: trunk/libraries/layer/socket.dylan
==============================================================================
--- trunk/libraries/layer/socket.dylan (original)
+++ trunk/libraries/layer/socket.dylan Wed Mar 5 02:44:13 2008
@@ -17,32 +17,41 @@
define open generic create-socket (layer :: <layer>, #key, #all-keys) => (socket :: <socket>);
define open generic send (socket :: <socket>, data);
+
+define method send (node :: <socket>, data)
+ if (node.socket-input.connected-output)
+ push-data(node.socket-input.connected-output, data)
+ end;
+end;
+
+define open generic sendto (socket :: <socket>, destination, data);
+
define open generic close-socket (socket :: <socket>);
define method close-socket (socket :: <socket>)
socket.socket-owner.sockets := remove!(socket.socket-owner.sockets, socket);
+ disconnect(socket.socket-output, socket.socket-output.connected-input);
+ disconnect(socket.socket-input.connected-output, socket.socket-input);
end;
+
+define open generic socket-input (socket :: <socket>) => (res /* :: <input> */);
+
+define open generic socket-output (socket :: <socket>) => (res /* :: <output> */);
+
define class <flow-node-socket> (<socket>)
constant slot flow-node /* :: <node> */, required-init-keyword: flow-node:;
end;
-define method send (node :: <flow-node-socket>, data)
- push-data(node.flow-node.the-input, data)
+define method socket-input (flow-node-socket :: <flow-node-socket>) => (res :: <input>)
+ flow-node-socket.flow-node.the-input;
+end;
+define method socket-output (flow-node-socket :: <flow-node-socket>) => (res :: <output>)
+ flow-node-socket.flow-node.the-output;
end;
define class <input-output-socket> (<socket>)
- constant slot socket-input, required-init-keyword: input:;
- constant slot socket-output, required-init-keyword: output:;
+ constant slot socket-input /* :: <input> */, required-init-keyword: input:;
+ constant slot socket-output /* :: <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;
Added: trunk/libraries/network/ip-stack/layers/media-access/ethernet/ethernet.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/ethernet/ethernet.dylan Wed Mar 5 02:44:13 2008
@@ -0,0 +1,72 @@
+module: ethernet
+
+define layer ethernet (<layer>)
+ property administrative-state :: <symbol> = #"up";
+ system property running-state :: <symbol> = #"down";
+ property mac-address :: <mac-address> = mac-address("08:00:05:00:00:03");
+end;
+
+define method read-as (type :: subclass(<leaf-frame>), value :: <string>) => (res)
+ read-frame(type, value)
+end;
+
+define class <ethernet-socket> (<socket>)
+ constant slot lower-socket :: <socket>, required-init-keyword: lower-socket:;
+ constant slot decapsulator :: <decapsulator> = make(<decapsulator>);
+ constant slot completer :: <completer>, required-init-keyword: completer:;
+end;
+
+define method create-socket (layer :: <ethernet-layer>, #rest rest, #key filter-string, #all-keys)
+ => (res :: <socket>)
+ unless(layer. at running-state == #"up")
+ error("Layer down");
+ end;
+ let filter = format-to-string("ethernet.destination-address = %s", as(<string>, layer. at mac-address));
+ if (filter-string)
+ filter := format-to-string("(%s) & (%s)", filter, filter-string);
+ end;
+ let socket = create-socket(layer.lower-layers[0], filter-string: filter);
+ let completer = make(<completer>, template-frame: ethernet-frame(source-address: layer. at mac-address));
+ let res = make(<ethernet-socket>,
+ owner: layer,
+ lower-socket: socket,
+ completer: completer);
+ connect(socket.socket-output, res.decapsulator);
+ connect(completer, socket.socket-input);
+ res
+end;
+
+define method socket-input (socket :: <ethernet-socket>) => (res :: <input>)
+ socket.completer.the-input
+end;
+define method socket-output (socket :: <ethernet-socket>) => (res :: <output>)
+ socket.decapsulator.the-output;
+end;
+
+define method close-socket (socket :: <ethernet-socket>)
+ next-method();
+ close-socket(socket.lower-socket);
+end;
+
+define method sendto (socket :: <ethernet-socket>, destination :: <mac-address>, data);
+ let frame = ethernet-frame(destination-address: destination, payload: data);
+ send(socket, frame);
+end;
+define method check-upper-layer? (lower :: <ethernet-layer>, upper :: <layer>) => (allowed? :: <boolean>);
+ #t;
+end;
+
+define method check-lower-layer? (upper :: <ethernet-layer>, lower :: <layer>) => (allowed? :: <boolean>);
+ upper. at running-state == #"down" &
+ check-socket-arguments?(lower, type: <ethernet-frame>);
+end;
+
+define method register-lower-layer (upper :: <ethernet-layer>, lower :: <layer>)
+ upper. at running-state := #"up";
+end;
+
+define method deregister-lower-layer (upper :: <ethernet-layer>, lower :: <layer>)
+ do(close-socket, upper.sockets);
+ upper. at running-state := #"down";
+end;
+
Added: trunk/libraries/network/ip-stack/layers/media-access/ethernet/ethernet.lid
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/ethernet/ethernet.lid Wed Mar 5 02:44:13 2008
@@ -0,0 +1,3 @@
+library: ethernet
+files: library
+ ethernet
Added: trunk/libraries/network/ip-stack/layers/media-access/ethernet/library.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/ethernet/library.dylan Wed Mar 5 02:44:13 2008
@@ -0,0 +1,20 @@
+module: dylan-user
+
+define library ethernet
+ use common-dylan;
+ use layer;
+ use packetizer;
+ use protocols, rename: { ethernet => ethernet-frame };
+ use flow;
+ use network-flow;
+end;
+
+define module ethernet
+ use common-dylan;
+ use new-layer;
+ use ethernet-frame;
+ use packetizer;
+ use flow;
+ use network-flow;
+ use socket;
+end;
Added: trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/library.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/library.dylan Wed Mar 5 02:44:13 2008
@@ -0,0 +1,26 @@
+module: dylan-user
+
+define library ppp-over-ethernet
+ use common-dylan;
+ use layer;
+ use packetizer;
+ use protocols;
+ use flow;
+ use network-flow;
+ use ppp-state-machine;
+ use state-machine;
+end;
+
+define module ppp-over-ethernet
+ use common-dylan;
+ use new-layer;
+ use pppoe, rename: { session-id => pppoe-session-id };
+ use packetizer;
+ use ethernet, import: { mac-address };
+ use flow;
+ use network-flow;
+ use socket;
+ use ppp-state-machine;
+ use simple-random;
+ use state-machine;
+end;
Added: trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/ppp-over-ethernet.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/ppp-over-ethernet.dylan Wed Mar 5 02:44:13 2008
@@ -0,0 +1,120 @@
+module: ppp-over-ethernet
+
+define open generic @administrative-state (layer :: <pppoe-client-layer>) => (res :: <symbol>);
+define open generic @administrative-state-setter (new-value :: <symbol>, layer :: <pppoe-client-layer>) => (res :: <symbol>);
+define open generic @running-state (layer :: <pppoe-client-layer>) => (res :: <symbol>);
+define open generic @running-state-setter (new-value :: <symbol>, layer :: <pppoe-client-layer>) => (res :: <symbol>);
+define open generic @session-id (layer :: <pppoe-client-layer>) => (res :: <integer>);
+define open generic @session-id-setter (new-value :: <integer>, layer :: <pppoe-client-layer>) => (res :: <integer>);
+
+define layer pppoe-client (<layer>, <pppoe-client-abstract-state-machine>)
+ property administrative-state :: <symbol> = #"down";
+ system property running-state :: <symbol> = #"down";
+ system property session-id :: <integer> = 0;
+ slot lower-discovery-socket :: false-or(<socket>) = #f;
+ slot lower-session-socket :: false-or(<socket>) = #f;
+ slot property-changed-callback :: <function>;
+ slot offer;
+end;
+
+define method initialize-layer (layer :: <pppoe-client-layer>, #key, #all-keys) => ();
+ local method call (event :: <property-changed-event>)
+ let new-val = event.property-changed-event-property.property-value;
+ process-event(layer, if (new-val == #"up")
+ #"administrative-up"
+ elseif (new-val == #"down")
+ #"administrative-down"
+ end);
+ end;
+ register-property-changed-event(layer, #"administrative-state", call);
+end;
+define method check-upper-layer? (lower :: <pppoe-client-layer>, upper :: <layer>) => (allowed? :: <boolean>);
+ #t;
+end;
+
+define method check-lower-layer? (upper :: <pppoe-client-layer>, lower :: <layer>) => (allowed? :: <boolean>);
+ upper. at running-state == #"down" /* &
+ check-socket-arguments?(lower, type: <pppoe-discovery>) &
+ check-socket-arguments?(lower, type: <pppoe-session>) */
+end;
+
+define function process-incoming-pppoe-discovery (node :: <pppoe-client-layer>, frame :: <pppoe-discovery>)
+ if (instance?(node.state, <padi-sent>))
+ if (frame.pppoe-code == #"PADO (PPPoE Active Discovery Offer)")
+ node.offer := frame;
+ process-event(node, #"pado-received");
+ end;
+ end;
+ if (instance?(node.state, <padr-sent>))
+ if (frame.pppoe-code == #"PADS (PPPoE Active Discovery Session-confirmation)")
+ node. at session-id := frame.pppoe-session-id;
+ process-event(node, #"valid-pads-received");
+ end;
+ end;
+ if (instance?(node.state, <established>))
+ if (frame.pppoe-code == #"PADT (PPPoE Active Discovery Termination)")
+ process-event(node, #"padt-received");
+ end;
+ end;
+end;
+
+define method register-lower-layer (upper :: <pppoe-client-layer>, lower :: <layer>)
+ upper.property-changed-callback := method(event :: <property-changed-event>)
+ if(event.property-changed-event-property.property-value == #"up")
+ process-event(upper, #"lower-layer-up")
+ else
+ process-event(upper, #"lower-layer-down")
+ end;
+ end;
+ register-property-changed-event(lower, #"running-state", upper.property-changed-callback);
+end;
+
+define method deregister-lower-layer (upper :: <pppoe-client-layer>, lower :: <layer>)
+ deregister-property-changed-event(lower, #"running-state", upper.property-changed-callback);
+ close-socket(upper.lower-discovery-socket);
+ upper. at running-state := #"down";
+end;
+
+define constant $broadcast-ethernet-address = mac-address("ff:ff:ff:ff:ff:ff");
+
+define method state-transition (node :: <pppoe-client-layer>,
+ old-state :: type-union(<waiting-for-carrier>, <waiting-for-administrative-up>, <established>),
+ event,
+ new-state :: <padi-sent>) => ()
+ node.lower-discovery-socket := create-socket(node.lower-layers[0], filter-string: "pppoe-discovery");
+ let closure-node = make(<closure-node>, closure: curry(process-incoming-pppoe-discovery, node));
+ connect(node.lower-discovery-socket.socket-output, closure-node);
+ connect(closure-node, node.lower-discovery-socket.socket-input);
+
+ let id = as(<raw-frame>, list(random(2 ^ 8 - 1), random(2 ^ 8 - 1), 23, 42));
+ let pppoe-discovery = pppoe-discovery(pppoe-code: #"PADI (PPPoE Active Discovery Initiation)",
+ pppoe-tags: list(pppoe-service-name(),
+ pppoe-host-uniq(custom-data: id)));
+ sendto(node.lower-discovery-socket, $broadcast-ethernet-address, pppoe-discovery);
+end;
+define method state-transition (node :: <pppoe-client-layer>,
+ old-state :: <padi-sent>,
+ event,
+ new-state :: <padr-sent>) => ()
+ let pppoe = pppoe-discovery(pppoe-code: #"PADR (PPPoE Active Discovery Request)",
+ pppoe-tags: node.offer.pppoe-tags);
+ sendto(node.lower-discovery-socket, node.offer.parent.source-address, pppoe);
+end;
+
+define method state-transition (node :: <pppoe-client-layer>,
+ old-state :: <pppoe-state>,
+ event,
+ new-state :: <established>) => ()
+ let filter = format-to-string("pppoe-session.session-id = %d", node. at session-id);
+ node.lower-session-socket := create-socket(node.lower-layers[0], filter-string: filter);
+ node. at running-state := #"up";
+end;
+
+define method state-transition (node :: <pppoe-client-layer>,
+ old-state :: <established>,
+ event,
+ new-state :: <waiting-for-administrative-up>) => ()
+ let pppoe = pppoe-discovery(pppoe-code: #"PADT (PPPoE Active Discovery Termination)",
+ session-id: node. at session-id);
+ sendto(node.lower-discovery-socket, node.offer.parent.source-address, pppoe);
+end;
Added: trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/ppp-over-ethernet.lid
==============================================================================
--- (empty file)
+++ trunk/libraries/network/ip-stack/layers/media-access/ppp-over-ethernet/ppp-over-ethernet.lid Wed Mar 5 02:44:13 2008
@@ -0,0 +1,3 @@
+library: ppp-over-ethernet
+files: library
+ ppp-over-ethernet
Modified: trunk/libraries/network/ip-stack/state-machines/ppp/library.dylan
==============================================================================
--- trunk/libraries/network/ip-stack/state-machines/ppp/library.dylan (original)
+++ trunk/libraries/network/ip-stack/state-machines/ppp/library.dylan Wed Mar 5 02:44:13 2008
@@ -16,8 +16,9 @@
export <pppoe-client-abstract-state-machine>;
export <down>, <padi-sent>,
- <pado-received>, <padr-sent>,
- <established>, <pppoe-state>;
+ <padr-sent>,
+ <established>, <pppoe-state>,
+ <waiting-for-carrier>, <waiting-for-administrative-up>;
export <ppp-abstract-state-machine>;
Modified: trunk/libraries/network/ip-stack/state-machines/ppp/ppp.dylan
==============================================================================
--- trunk/libraries/network/ip-stack/state-machines/ppp/ppp.dylan (original)
+++ trunk/libraries/network/ip-stack/state-machines/ppp/ppp.dylan Wed Mar 5 02:44:13 2008
@@ -7,25 +7,30 @@
define abstract class <pppoe-state> (<protocol-state>) end;
-states(<down>, <padi-sent>, <pado-received>, <padr-sent>, <established>; <pppoe-state>);
+states(<down>, <waiting-for-administrative-up>, <waiting-for-carrier>,
+ <padi-sent>, <padr-sent>, <established>; <pppoe-state>);
define constant <pppoe-events>
- = one-of(#"padi-sent", #"pado-received", #"padr-sent", #"valid-pads-received",
- #"invalid-pads-received", #"padt-received", #"abort");
+ = one-of(#"lower-layer-up", #"pado-received", #"valid-pads-received",
+ #"invalid-pads-received", #"padt-received", #"lower-layer-down",
+ #"administrative-up", #"administrative-down");
+
+define state-transition-rule <down> #"lower-layer-up" <waiting-for-administrative-up> end;
+define state-transition-rule <waiting-for-carrier> #"lower-layer-up" <padi-sent> end;
+define state-transition-rule <waiting-for-administrative-up> #"administrative-up" <padi-sent> end;
+define state-transition-rule <down> #"administrative-up" <waiting-for-carrier> end;
-define state-transition-rule <down> #"padi-sent" <padi-sent> end;
-
-define state-transition-rule <padi-sent> #"pado-received" <pado-received> end;
-
-define state-transition-rule <pado-received> #"padr-sent" <padr-sent> end;
+define state-transition-rule <padi-sent> #"pado-received" <padr-sent> end;
define state-transition-rule <padr-sent> #"valid-pads-received" <established> end;
define state-transition-rule <padr-sent> #"invalid-pads-received" <down> end;
-define state-transition-rule <established> #"padt-received" <down> end;
+define state-transition-rule <established> #"padt-received" <padi-sent> end;
-define state-transition-rule <pppoe-state> #"abort" <down> end;
+define state-transition-rule <pppoe-state> #"lower-layer-down" <down> end;
+define state-transition-rule <pppoe-state> #"administrative-down" <waiting-for-administrative-up> end;
+define state-transition-rule <down> #"administrative-down" <down> end;
define open class <ppp-abstract-state-machine> (<protocol-state-encapsulation>)
Modified: trunk/libraries/protocols/ethernet.dylan
==============================================================================
--- trunk/libraries/protocols/ethernet.dylan (original)
+++ trunk/libraries/protocols/ethernet.dylan Wed Mar 5 02:44:13 2008
@@ -91,11 +91,16 @@
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>;
+ field type-code :: <2byte-big-endian-unsigned-integer>,
+ fixup: reverse-lookup-layer(<ethernet-frame>, frame.payload);
variably-typed-field payload,
type-function: lookup-layer(<ethernet-frame>, frame.type-code) | <raw-frame>;
end;
+define method source-address (frame :: <vlan-tag>) => (res :: <mac-address>)
+ frame.parent.source-address;
+end;
+
define protocol stp-identifier (container-frame)
summary "%=/%=", bridge-priority, bridge-address;
field bridge-priority :: <2byte-big-endian-unsigned-integer>;
Added: trunk/libraries/registry/generic/ethernet
==============================================================================
--- (empty file)
+++ trunk/libraries/registry/generic/ethernet Wed Mar 5 02:44:13 2008
@@ -0,0 +1 @@
+abstract://dylan/network/ip-stack/layers/media-access/ethernet/ethernet.lid
\ No newline at end of file
Added: trunk/libraries/registry/generic/ppp-over-ethernet
==============================================================================
--- (empty file)
+++ trunk/libraries/registry/generic/ppp-over-ethernet Wed Mar 5 02:44:13 2008
@@ -0,0 +1 @@
+abstract://dylan/network/ip-stack/layers/media-access/ppp-over-ethernet/ppp-over-ethernet.lid
\ No newline at end of file
More information about the chatter
mailing list