[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