[Gd-chatter] r11604 - in trunk/libraries: packetizer protocols

hannes at gwydiondylan.org hannes at gwydiondylan.org
Fri Jan 4 05:59:14 CET 2008


Author: hannes
Date: Fri Jan  4 05:59:13 2008
New Revision: 11604

Modified:
   trunk/libraries/packetizer/protocol-definer-macro.dylan
   trunk/libraries/protocols/ieee80211.dylan
   trunk/libraries/protocols/prism2.dylan
   trunk/libraries/protocols/protocols-library.dylan
Log:
Job: 7299
refactored the 802.11 protocol description 
added support for custom defaults in parse-frame of <variably-typed-container-frame>

Modified: trunk/libraries/packetizer/protocol-definer-macro.dylan
==============================================================================
--- trunk/libraries/packetizer/protocol-definer-macro.dylan	(original)
+++ trunk/libraries/packetizer/protocol-definer-macro.dylan	Fri Jan  4 05:59:13 2008
@@ -397,12 +397,13 @@
 
 define method parse-frame (frame-type :: subclass(<variably-typed-container-frame>),
                            packet :: <byte-sequence>,
-                           #key parent :: false-or(<container-frame>))
+                           #key parent :: false-or(<container-frame>),
+                           default = <raw-frame>)
   if (layer(frame-type) & layer(frame-type).size > 0)
     let superprotocol-frame = next-method();
     let real-type = element(layer(frame-type),
                             layer-magic(superprotocol-frame),
-                            default: <raw-frame>);
+                            default: default);
     parse-frame(real-type, packet, parent: parent);
   else
     next-method()

Modified: trunk/libraries/protocols/ieee80211.dylan
==============================================================================
--- trunk/libraries/protocols/ieee80211.dylan	(original)
+++ trunk/libraries/protocols/ieee80211.dylan	Fri Jan  4 05:59:13 2008
@@ -3,8 +3,6 @@
 Copyright:      (C) 2005, 2006,  All rights reserved. Free for non-commercial use.
 
 
-define n-byte-vector(wlan-device-name, 16) end;
-
 // main frame types
 define constant $management-frame = #x0;
 define constant $control-frame = #x1;
@@ -68,44 +66,66 @@
 end;
 
 // ieee80211 information fields
-define protocol ieee80211-information-field (container-frame)
+// TODO: need more info about various (commercially-used) fields
+define protocol ieee80211-information-element (variably-typed-container-frame)
+  length (2 + frame.data-length) * 8;
+  layering field element-id :: <unsigned-byte>;
   field data-length :: <unsigned-byte>,
-    fixup: byte-offset(frame-size(frame.raw-data));
+    fixup: byte-offset(frame-size(frame)) - 2;
+end;
+
+define method parse-frame (frame == <ieee80211-information-element>,
+                           packet :: <byte-sequence>,
+                           #next next-method,
+                           #key parent)
+  block()
+    next-method(frame, packet, parent: parent, default: #f);
+  exception (e :: <error>)
+    parse-frame(<ieee80211-reserved-field>, packet, parent: parent);
+  end;
+end;
+
+define protocol ieee80211-raw-information-element (ieee80211-information-element)
+  field raw-data :: <raw-frame>;
 end;
 
-define protocol ieee80211-raw-information-field (ieee80211-information-field)
-  field raw-data :: <raw-frame>,
-    length: frame.data-length * 8;
+define protocol ieee80211-reserved-field (ieee80211-raw-information-element)
 end;
 
-define protocol ieee80211-ssid (ieee80211-information-field)
+define protocol ieee80211-ssid (ieee80211-information-element)
+  over <ieee80211-information-element> $information-element-ssid;
   summary "SSID: %=", raw-data;
-  field raw-data :: <externally-delimited-string>,
-    length: frame.data-length * 8;
+  field raw-data :: <externally-delimited-string>;
 end;
 
-define protocol ieee80211-fh-set (ieee80211-raw-information-field)
+define protocol ieee80211-fh-set (ieee80211-raw-information-element)
+  over <ieee80211-information-element> $information-element-fh-set;
 end;
 
-define protocol ieee80211-ds-set (ieee80211-raw-information-field)
+define protocol ieee80211-ds-set (ieee80211-raw-information-element)
+  over <ieee80211-information-element> $information-element-ds-set;
 end;
 
-define protocol ieee80211-cf-set (ieee80211-raw-information-field)
+define protocol ieee80211-cf-set (ieee80211-raw-information-element)
+  over <ieee80211-information-element> $information-element-cf-set;
 end;
 
-define protocol ieee80211-tim (ieee80211-raw-information-field)
+define protocol ieee80211-tim (ieee80211-raw-information-element)
+  over <ieee80211-information-element> $information-element-tim;
 end;
 
-define protocol ieee80211-ibss (ieee80211-raw-information-field)
+define protocol ieee80211-ibss (ieee80211-raw-information-element)
+  over <ieee80211-information-element> $information-element-ibss;
 end;
 
-define protocol ieee80211-challenge-text (ieee80211-raw-information-field)
+define protocol ieee80211-challenge-text (ieee80211-raw-information-element)
+  over <ieee80211-information-element> $information-element-challenge-text;
 end;
 
-define protocol ieee80211-supported-rates (ieee80211-information-field)
+define protocol ieee80211-supported-rates (ieee80211-information-element)
+  over <ieee80211-information-element> $information-element-supported-rates;
   repeated field supported-rate :: <rate>,
-    reached-end?: #f,
-    length: frame.data-length * 8;
+    reached-end?: #f;
 end;
 
 define method summary (frame :: <rate>) => (res :: <string>)
@@ -142,6 +162,7 @@
                 #x12 => "9";
                 #x18 => "12";
                 #x24 => "18";
+                #x2c => "22"; //stolen from wireshark
                 #x30 => "24";
                 #x48 => "36";
                 #x60 => "48";
@@ -163,62 +184,88 @@
   parse-frame(type, packet, parent: parent);
 end;
 
-define protocol ieee80211-reserved-field (ieee80211-raw-information-field)
+//frame control
+define protocol ieee80211-frame-control (variably-typed-container-frame)
+  field subtype :: <4bit-unsigned-integer>;
+  layering field ftype :: <2bit-unsigned-integer>;
+  field protocol-version :: <2bit-unsigned-integer>;
+  field order :: <1bit-unsigned-integer>;
+  field wep :: <1bit-unsigned-integer>;
+  field more-data :: <1bit-unsigned-integer>;
+  field power-management :: <1bit-unsigned-integer>;
+  field retry :: <1bit-unsigned-integer>;
+  field more-fragments :: <1bit-unsigned-integer>;
+  field to-ds :: <1bit-unsigned-integer>;
+  field from-ds :: <1bit-unsigned-integer>;
 end;
 
-// ieee80211 information elements (information field header)
-define protocol ieee80211-information-element (container-frame)
-  summary "%s", compose(summary, information-field);
-  field element-id :: <unsigned-byte>;
-  variably-typed-field information-field, 
-    type-function:
-      select (frame.element-id)
-        $information-element-ssid => <ieee80211-ssid>;
-        $information-element-supported-rates => <ieee80211-supported-rates>;
-        $information-element-fh-set => <ieee80211-fh-set>;
-        $information-element-cf-set => <ieee80211-cf-set>;
-        $information-element-ds-set => <ieee80211-ds-set>;
-        $information-element-tim => <ieee80211-tim>;
-        $information-element-ibss => <ieee80211-ibss>;
-        $information-element-challenge-text => <ieee80211-challenge-text>;
-          // TODO: need more info about various (commercially-used) fields
-          otherwise <ieee80211-reserved-field>;
-      end select;
+// ieee80211 frame
+define abstract protocol ieee80211-frame (header-frame)
+  field frame-control :: <ieee80211-frame-control>;
+end;
+
+define method parse-frame (frame == <ieee80211-frame>,
+                           packet :: <byte-sequence>,
+                           #next next-method,
+                           #key parent)
+  let f = next-method();
+  let type = select (f.frame-control.ftype)
+               $management-frame => <ieee80211-management-frame>;
+               $data-frame => <ieee80211-data-frame>;
+               $control-frame => <ieee80211-control-frame>;
+               otherwise => signal(make(<malformed-packet-error>));
+             end;
+  parse-frame(type, packet, parent: parent);
 end;
 
-// management frames
-define protocol ieee80211-management-frame (container-frame)
-  summary "DST %=, SRC %=, BSSID %=", destination-address,
-    source-address, bssid;
+// ieee80211 management frames
+define protocol ieee80211-management-frame (ieee80211-frame)
+  summary "DST %=, SRC %=, BSSID %=", destination-address, source-address, bssid;
   field duration :: <2byte-little-endian-unsigned-integer>;
   field destination-address :: <mac-address>;
   field source-address :: <mac-address>;
   field bssid :: <mac-address>;
   field sequence-control  :: <ieee80211-sequence-control>;
+  variably-typed-field payload,
+    type-function:
+      select (frame.frame-control.subtype)
+        $atim => <ieee80211-atim>;
+        $beacon => <ieee80211-beacon>;
+        $disassociation => <ieee80211-disassociation>;
+        $association-request => <ieee80211-association-request>;
+        $association-response => <ieee80211-association-response>;
+        $reassociation-request => <ieee80211-reassociation-request>;
+        $reassociation-response => <ieee80211-reassociation-response>;
+        $probe-request => <ieee80211-probe-request>;
+        $probe-response => <ieee80211-probe-response>;
+        $authentication => <ieee80211-authentication>;
+        $deauthentication => <ieee80211-deauthentication>;
+          otherwise signal(make(<malformed-packet-error>));
+      end select;
 end;
 
-define protocol ieee80211-disassociation (ieee80211-management-frame)
-  summary "DISASSOC %=", method (x) next-method() end;
+define protocol ieee80211-disassociation (container-frame)
+  summary "DISASSOC";
   field reason-code :: <2byte-little-endian-unsigned-integer>;
 end;
 
-define protocol ieee80211-association-request (ieee80211-management-frame)
-  summary "ASSOC-REQ %= %s", method (x) next-method() end, compose(summary, ssid);
+define protocol ieee80211-association-request (container-frame)
+  summary "ASSOC-REQ %s", compose(summary, ssid);
   field capability-information :: <ieee80211-capability-information>;
   field listen-interval :: <2byte-little-endian-unsigned-integer>;
   field ssid :: <ieee80211-information-element>;
   field supported-rates :: <ieee80211-information-element>;
 end;
 
-define protocol ieee80211-association-response (ieee80211-management-frame)
+define protocol ieee80211-association-response (container-frame)
   field capability-information :: <ieee80211-capability-information>;
   field status-code :: <2byte-little-endian-unsigned-integer>;
   field association-id :: <2byte-little-endian-unsigned-integer>;
   field supported-rates :: <ieee80211-information-element>;
 end;
 
-define protocol ieee80211-reassociation-request (ieee80211-management-frame)
-  summary "REASSOC %s", compose(summary, ssid);
+define protocol ieee80211-reassociation-request (container-frame)
+  summary "REASSOC";
   field capabilty-information :: <ieee80211-capability-information>;
   field listen-intervall :: <2byte-little-endian-unsigned-integer>;
   field current-ap-address :: <mac-address>;
@@ -226,21 +273,21 @@
   field supported-rates :: <ieee80211-information-element>;
 end;
 
-define protocol ieee80211-reassociation-response (ieee80211-management-frame)
+define protocol ieee80211-reassociation-response (container-frame)
   field capability-information :: <ieee80211-capability-information>;
   field status-code :: <2byte-little-endian-unsigned-integer>;
   field association-id :: <2byte-little-endian-unsigned-integer>;
   field supported-rates :: <ieee80211-information-element>;
 end;
 
-define protocol ieee80211-probe-request (ieee80211-management-frame)
-  summary "PROBE-REQ %= %s", method(x) next-method() end, compose(summary, ssid);
+define protocol ieee80211-probe-request (container-frame)
+  summary "PROBE-REQ %s", compose(summary, ssid);
   field ssid :: <ieee80211-information-element>;
   field supported-rates :: <ieee80211-information-element>;
 end;
 
-define protocol ieee80211-probe-response (ieee80211-management-frame)
-  summary "PROBE-RESP %= %s", method (x) next-method() end, compose(summary, ssid);
+define protocol ieee80211-probe-response (container-frame)
+  summary "PROBE-RESP %s", compose(summary, ssid);
   field timestamp :: <timestamp>;
   field beacon-intervall :: <2byte-little-endian-unsigned-integer>;
   field capability-information :: <ieee80211-capability-information>;
@@ -250,8 +297,8 @@
     reached-end?: #f;
 end;
 
-define protocol ieee80211-authentication (ieee80211-management-frame)
-  summary "AUTH %=", method (x) next-method() end;
+define protocol ieee80211-authentication (container-frame)
+  summary "AUTH";
   field algorithm-number :: <2byte-little-endian-unsigned-integer>;
   field transaction-sequence-number :: <2byte-little-endian-unsigned-integer>;
   field status-code :: <2byte-little-endian-unsigned-integer>;
@@ -259,15 +306,15 @@
     reached-end?: #f;
 end;
 
-define protocol ieee80211-deauthentication (ieee80211-management-frame)
+define protocol ieee80211-deauthentication (container-frame)
   field reason-code :: <2byte-little-endian-unsigned-integer>;
 end;
 
-define protocol ieee80211-atim (ieee80211-management-frame)
+define protocol ieee80211-atim (container-frame)
 end;
 
-define protocol ieee80211-beacon (ieee80211-management-frame)
-  summary "BEACON %= %s", method (x) next-method() end, compose(summary, ssid);
+define protocol ieee80211-beacon (container-frame)
+  summary "BEACON %s", compose(summary, ssid);
   field timestamp :: <timestamp>;
   field beacon-interval :: <2byte-little-endian-unsigned-integer>;
   field capability-information :: <2byte-little-endian-unsigned-integer>;
@@ -278,107 +325,69 @@
 end;
 
 // ieee80211 data frames
-define protocol ieee80211-data-frame (header-frame)
+define protocol ieee80211-data-frame (ieee80211-frame)
   field duration-id :: <2byte-little-endian-unsigned-integer>;
   field mac-address-one :: <mac-address>;
   field mac-address-two :: <mac-address>;
   field mac-address-three :: <mac-address>;
   field sequence-control ::  <ieee80211-sequence-control>;
+  variably-typed-field payload,
+    type-function:
+      select (frame.frame-control.subtype)
+        // XXX: split up (inheritance)
+        $data, $data-cf-ack, $data-cf-poll, $data-cf-ack-cf-poll
+          => <ieee80211-data>;
+        $data-null-function, $cf-poll-no-data, $cf-ack-no-data, $cf-ack-cf-poll-no-data
+          => <ieee80211-null-function>;
+          otherwise signal(make(<malformed-packet-error>));
+      end select;
 end;
 
-define protocol ieee80211-null-function (ieee80211-data-frame)
-  summary "NULL-FUNCTION %=", method (x) next-method() end;
-  field payload :: <raw-frame>; // there should be no data
+define protocol ieee80211-null-function (container-frame)
+  summary "NULL-FUNCTION";
+  field no-data :: <raw-frame> = $empty-raw-frame; // there should be no data
 end;
 
-define protocol ieee80211-data (ieee80211-data-frame)
+define protocol ieee80211-data (container-frame)
   summary "%s", compose(summary, payload);
-  field payload :: <link-control>;
+  field actual-data :: <link-control>;
 end;
 
 // ieee80211 control frames
-define protocol ieee80211-control-frame (container-frame)
+define protocol ieee80211-control-frame (ieee80211-frame)
+  variably-typed-field payload,
+    type-function:
+      select (frame.frame-control.subtype)
+        $power-save-poll => <ieee80211-ps-poll>;
+        $request-to-send => <ieee80211-request-to-send>;
+        // XXX: split up
+        $clear-to-send, $acknowledgement => <ieee80211-cts-and-ack>;
+        $contention-free-end, $cf-end-cf-ack => <ieee80211-cf-end>;
+          otherwise signal(make(<malformed-packet-error>));
+      end select;
 end;
 
-define protocol ieee80211-request-to-send (ieee80211-control-frame)
+define protocol ieee80211-request-to-send (container-frame)
   field duration :: <2byte-little-endian-unsigned-integer>;
   field receiver-address :: <mac-address>;
   field transmitter-address :: <mac-address>;
 end;
 
-define protocol ieee80211-cts-and-ack (ieee80211-control-frame)
+define protocol ieee80211-cts-and-ack (container-frame)
   field duration :: <2byte-little-endian-unsigned-integer>;
   field receiver-address :: <mac-address>;
 end;
 
-define protocol ieee80211-ps-poll (ieee80211-control-frame)
+define protocol ieee80211-ps-poll (container-frame)
   field association-id :: <2byte-little-endian-unsigned-integer>;
   field bssid :: <mac-address>;
   field transmitter-address :: <mac-address>;
 end;
 
-define protocol ieee80211-cf-end (ieee80211-control-frame)
+define protocol ieee80211-cf-end (container-frame)
   field duration :: <2byte-little-endian-unsigned-integer>;
   field receiver-address :: <mac-address>;
   field bssid :: <mac-address>;
 end;
 
-// frame control field of each <ieee80211-frame>
-define protocol ieee80211-frame-control (container-frame)
-  summary "WEP: %=", wep;
-  field subtype :: <4bit-unsigned-integer>;
-  field ftype :: <2bit-unsigned-integer>;
-  field protcol-version :: <2bit-unsigned-integer>;
-  field order :: <1bit-unsigned-integer>;
-  field wep :: <1bit-unsigned-integer>;
-  field more-data :: <1bit-unsigned-integer>;
-  field power-management :: <1bit-unsigned-integer>;
-  field retry :: <1bit-unsigned-integer>;
-  field more-fragments :: <1bit-unsigned-integer>;
-  field to-ds :: <1bit-unsigned-integer>;
-  field from-ds :: <1bit-unsigned-integer>;
-end;
-
-define protocol ieee80211-frame (header-frame)
-  summary "IEEE80211 %s", compose(summary, frame-control);
-  field frame-control :: <ieee80211-frame-control>;
-  variably-typed-field payload,
-    type-function: 
-      select (frame.frame-control.ftype)
-        $management-frame =>
-          select (frame.frame-control.subtype)
-            $atim => <ieee80211-atim>;
-            $beacon => <ieee80211-beacon>;
-            $disassociation => <ieee80211-disassociation>;
-            $association-request => <ieee80211-association-request>;
-            $association-response => <ieee80211-association-response>;
-            $reassociation-request => <ieee80211-reassociation-request>;
-            $reassociation-response => <ieee80211-reassociation-response>;
-            $probe-request => <ieee80211-probe-request>;
-            $probe-response => <ieee80211-probe-response>;
-            $authentication => <ieee80211-authentication>;
-            $deauthentication => <ieee80211-deauthentication>;
-              otherwise signal(make(<malformed-packet-error>));
-          end select;  
-        $control-frame =>
-          select (frame.frame-control.subtype)
-            $power-save-poll => <ieee80211-ps-poll>;
-            $request-to-send => <ieee80211-request-to-send>;
-            // XXX: split up
-            $clear-to-send, $acknowledgement => <ieee80211-cts-and-ack>;
-            $contention-free-end, $cf-end-cf-ack => <ieee80211-cf-end>;
-              otherwise signal(make(<malformed-packet-error>));
-          end select;
-        $data-frame =>
-          select (frame.frame-control.subtype)
-            // XXX: split up (inheritance)
-            $data, $data-cf-ack, $data-cf-poll, $data-cf-ack-cf-poll
-              => <ieee80211-data>;
-            $data-null-function, $cf-poll-no-data, $cf-ack-no-data, $cf-ack-cf-poll-no-data
-              => <ieee80211-null-function>;
-              otherwise signal(make(<malformed-packet-error>));
-          end select;
-          otherwise signal(make(<malformed-packet-error>));
-      end select;
-end;
 

Modified: trunk/libraries/protocols/prism2.dylan
==============================================================================
--- trunk/libraries/protocols/prism2.dylan	(original)
+++ trunk/libraries/protocols/prism2.dylan	Fri Jan  4 05:59:13 2008
@@ -10,10 +10,11 @@
 end;
 
 define protocol prism2-frame (header-frame)
-  summary "PRISM2/%s", compose(summary, payload);
   field message-code :: <little-endian-unsigned-integer-4byte>;
   field message-len :: <little-endian-unsigned-integer-4byte>;
-  field device-name :: <wlan-device-name>;
+  field device-name :: <externally-delimited-string>
+    = $empty-externally-delimited-string,
+    static-length: 16 * 8;
   field host-time :: <prism2-header-item>;
   field mac-time :: <prism2-header-item>;
   field channel :: <prism2-header-item>;
@@ -24,7 +25,8 @@
   field rate ::  <prism2-header-item>;
   field istx ::  <prism2-header-item>;
   field frame-length ::  <prism2-header-item>;
-  field payload :: <ieee80211-frame>;
+  variably-typed-field payload,
+    type-function: <ieee80211-frame>;
 end;
 
 define protocol bsd-80211-radio-frame (header-frame)
@@ -33,6 +35,8 @@
   field frame-length :: <2byte-little-endian-unsigned-integer>;
   field it-present :: <little-endian-unsigned-integer-4byte>;
   field options :: <raw-frame>;
-  field payload :: <ieee80211-frame>, start: frame.frame-length * 8;
+  variably-typed-field payload,
+    type-function: <ieee80211-frame>,
+    start: frame.frame-length * 8;
 end;
 

Modified: trunk/libraries/protocols/protocols-library.dylan
==============================================================================
--- trunk/libraries/protocols/protocols-library.dylan	(original)
+++ trunk/libraries/protocols/protocols-library.dylan	Fri Jan  4 05:59:13 2008
@@ -52,8 +52,6 @@
   use ethernet, import: { <mac-address> };
   use logical-link, import: { <link-control> };
 
-  export wlan-device-name, <wlan-device-name>;
-
   export <ieee80211-frame>;
 /*
   export <ieee80211-sequence-control>,
@@ -459,3 +457,8 @@
     netmask-from-byte-vector;
 end;
 
+define module eap
+  use dylan;
+  use packetizer;
+  use ethernet, import: { <ethernet-frame> };
+end;
\ No newline at end of file



More information about the chatter mailing list