logo       
Google Custom Search
    AddThis Social Bookmark Button
-->

r10823 - in trunk/libraries: interfaces network-flow packetizer: msg#00010

Subject: r10823 - in trunk/libraries: interfaces network-flow packetizer
Author: mb
Date: Wed Jul 12 14:30:49 2006
New Revision: 10823

Added:
   trunk/libraries/packetizer/ieee80211.dylan   (contents, props changed)
   trunk/libraries/packetizer/logical-link.dylan   (contents, props changed)
   trunk/libraries/packetizer/prism2.dylan   (contents, props changed)
Modified:
   trunk/libraries/interfaces/interfaces.dylan
   trunk/libraries/network-flow/network-flow.dylan
   trunk/libraries/packetizer/ethernet.dylan
   trunk/libraries/packetizer/module.dylan
   trunk/libraries/packetizer/packetizer.hdp
   trunk/libraries/packetizer/pcap.dylan
Log:
Bug: 7299

packetizer goes wireless



Modified: trunk/libraries/interfaces/interfaces.dylan
==============================================================================
--- trunk/libraries/interfaces/interfaces.dylan (original)
+++ trunk/libraries/interfaces/interfaces.dylan Wed Jul 12 14:30:49 2006
@@ -2,7 +2,6 @@
 Author:    Andreas Bogk, Hannes Mehnert
 Copyright: (C) 2005, 2006,  All rights reserved. Free for non-commercial use.
 
-
 define constant $ethernet-buffer-size :: <integer> = 1548;
 define constant <buffer> = <byte-vector>;
 

Modified: trunk/libraries/network-flow/network-flow.dylan
==============================================================================
--- trunk/libraries/network-flow/network-flow.dylan     (original)
+++ trunk/libraries/network-flow/network-flow.dylan     Wed Jul 12 14:30:49 2006
@@ -144,12 +144,24 @@
 define method toplevel (reader :: <pcap-file-reader>)
   let file = as(<byte-vector>, stream-contents(reader.file-stream));
   let pcap-file = make(unparsed-class(<pcap-file>), packet: file);
-//  push-data(reader.the-output, pcap-file.header);
+  //  push-data(reader.the-output, pcap-file.header);
+  let push-out = select (get-frame-field(#"linktype", pcap-file.header).value)
+                   $DLT-EN10MB =>
+                     method (r, f)
+                       push-data(r.the-output,
+                                 make(unparsed-class(<ethernet-frame>),
+                                      packet: assemble-frame(f.payload)));
+                     end method;
+                   $DLT-PRISM-HEADER =>
+                     method (r, f)
+                       push-data(r.the-output,
+                                 make(unparsed-class(<prism2-frame>),
+                                      packet: assemble-frame(f.payload)));
+                     end method;
+                 end select;
   for(frame in pcap-file.packets)
-    push-data(reader.the-output,
-              make(unparsed-class(<ethernet-frame>),
-                   packet: assemble-frame(frame.payload)))
-  end
+    push-out(reader, frame);
+  end;
 end;
 
 define class <pcap-file-writer> (<single-push-input-node>)

Modified: trunk/libraries/packetizer/ethernet.dylan
==============================================================================
--- trunk/libraries/packetizer/ethernet.dylan   (original)
+++ trunk/libraries/packetizer/ethernet.dylan   Wed Jul 12 14:30:49 2006
@@ -41,11 +41,5 @@
     source-address, destination-address, compose(summary, payload);
   field destination-address :: <mac-address>;
   field source-address :: <mac-address>;
-  field type-code :: <2byte-big-endian-unsigned-integer>;
-  variably-typed-field payload,
-    type-function: select (frame.type-code)
-                     #x800 => <ipv4-frame>;
-                     #x806 => <arp-frame>;
-                     otherwise <raw-frame>;
-                   end;
+  field payload :: <logical-link-control>;
 end;

Added: trunk/libraries/packetizer/ieee80211.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/packetizer/ieee80211.dylan  Wed Jul 12 14:30:49 2006
@@ -0,0 +1,326 @@
+module:         packetizer
+Author:         Andreas Bogk, Hannes Mehnert, mb
+Copyright:      (C) 2005, 2006,  All rights reserved. Free for non-commercial 
use.
+
+// main frame types
+define constant $management-frame = #x0;
+define constant $control-frame = #x1;
+define constant $data-frame = #x2;
+
+// management frame subtypes
+define constant $association-request = #b0000;
+define constant $association-response = #b0001;
+define constant $reassociation-request = #b0010;
+define constant $reassociation-response = #b0011;
+define constant $probe-request = #b0100;
+define constant $probe-response = #b0101;
+define constant $beacon = #b1000;
+define constant $atim = #b1001;
+define constant $disassociation = #b1010;
+define constant $authentication = #b1011;
+define constant $deauthentication = #b1100;
+
+// data frame subtypes
+define constant $data = #b0000;
+define constant $data-cf-ack = #b0001;
+define constant $data-cf-poll = #b0010;
+define constant $data-cf-ack-cf-poll = #b0011;
+define constant $data-null-function = #b0100;
+define constant $cf-ack-no-data = #b0101;
+define constant $cf-poll-no-data = #b0110;
+define constant $cf-ack-cf-poll-no-data = #b0111;
+
+// control frame subtypes
+define constant $power-save-poll = #b1010;
+define constant $request-to-send = #b1011;
+define constant $clear-to-send = #b1100;
+define constant $acknowledgement = #b1101;
+define constant $contention-free-end = #b1110;
+define constant $cf-end-cf-ack = #b1111;
+
+// information field id's
+define constant $information-element-ssid = 0;
+define constant $information-element-supported-rates = 1;
+define constant $information-element-fh-set = 2;
+define constant $information-element-ds-set = 3;
+define constant $information-element-cf-set = 4;
+define constant $information-element-tim = 5;
+define constant $information-element-ibss = 6;
+define constant $information-element-challenge-text = 16;
+
+define n-byte-vector(wlan-device-name, 16) end;
+define n-byte-vector(timestamp, 8) end;
+define n-bit-unsigned-integer(<11bit-unsigned-integer>; 11) end;
+define n-bit-unsigned-integer(<12bit-unsigned-integer>; 12) end;
+
+define protocol ieee80211-sequence-control (container-frame)
+  field sequence-number :: <12bit-unsigned-integer>;
+  field fragment-number :: <4bit-unsigned-integer>;
+end;
+
+define protocol ieee80211-capability-information (container-frame)
+  field reserved :: <11bit-unsigned-integer>;
+  field privacy :: <1bit-unsigned-integer>;
+  field cf-poll-request :: <1bit-unsigned-integer>;
+  field cf-pollabel :: <1bit-unsigned-integer>;
+  field ibss :: <1bit-unsigned-integer>;
+  field ess :: <1bit-unsigned-integer>;
+end;
+
+// ieee80211 information fields
+define protocol ieee80211-information-field (container-frame)
+  field length :: <unsigned-byte>,
+    fixup: byte-offset(frame-size(frame.information));
+  // the fields also contain binary data
+  field data :: <externally-delimited-string>,
+    length: frame.length * 8;
+end;
+
+define protocol ieee80211-ssid (ieee80211-information-field)
+  summary "SSID: %=", data;
+end;
+
+define protocol ieee80211-fh-set (ieee80211-information-field)
+end;
+
+define protocol ieee80211-ds-set (ieee80211-information-field)
+end;
+
+define protocol ieee80211-cf-set (ieee80211-information-field)
+end;
+
+define protocol ieee80211-tim (ieee80211-information-field)
+end;
+
+define protocol ieee80211-ibss (ieee80211-information-field)
+end;
+
+define protocol ieee80211-challenge-text (ieee80211-information-field)
+end;
+
+define protocol ieee80211-supported-rates (ieee80211-information-field)
+end;
+
+define protocol ieee80211-reserved-field (ieee80211-information-field)
+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;
+end;
+
+// management frames
+define protocol ieee80211-management-frame (container-frame)
+  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>;
+end;
+
+define protocol ieee80211-disassociation (ieee80211-management-frame)
+  field reason-code :: <2byte-little-endian-unsigned-integer>;
+end;
+
+define protocol ieee80211-association-request (ieee80211-management-frame)
+  summary "%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)
+  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 "%s", compose(summary, ssid);
+  field capabilty-information :: <ieee80211-capability-information>;
+  field listen-intervall :: <2byte-little-endian-unsigned-integer>;
+  field current-ap-address :: <mac-address>;
+  field ssid :: <ieee80211-information-element>;
+  field supported-rates :: <ieee80211-information-element>;
+end;
+
+define protocol ieee80211-reassociation-response (ieee80211-management-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 "%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 "%s", compose(summary, ssid);
+  field timestamp :: <timestamp>;
+  field beacon-intervall :: <2byte-little-endian-unsigned-integer>;
+  field capability-information :: <ieee80211-capability-information>;
+  field ssid :: <ieee80211-information-element>;
+  field supported-rates :: <ieee80211-information-element>;
+  field raw-data :: <raw-frame>;
+  // the following fields may or may not be present
+  //  field fh-parameter-set :: <ieee80211-information-element>;
+  //  field ds-parameter-set :: <ieee80211-information-element>;
+  //  field cf-parameter-set :: <ieee80211-information-element>;
+  //  field ibbs :: <ieee80211-information-element>;
+end;
+
+define protocol ieee80211-authentication (ieee80211-management-frame)
+  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>;
+  field raw-data :: <raw-frame>;
+  //  field challenge-text :: <ieee80211-information-element>;
+end;
+
+define protocol ieee80211-deauthentication (ieee80211-management-frame)
+  field reason-code :: <2byte-little-endian-unsigned-integer>;
+end;
+
+define protocol ieee80211-atim (ieee80211-management-frame)
+end;
+
+define protocol ieee80211-beacon (ieee80211-management-frame)
+  summary "%s", compose(summary, ssid);
+  field timestamp :: <timestamp>;
+  field beacon-interval :: <2byte-little-endian-unsigned-integer>;
+  field capability-information :: <2byte-little-endian-unsigned-integer>;
+  field ssid :: <ieee80211-information-element>;
+  field supported-rates :: <ieee80211-information-element>;
+  field raw-data :: <raw-frame>;
+  // the following fields may or may not be present
+  //  field fh-parameter-set :: <ieee80211-information-element>;
+  //  field ds-parameter-set :: <ieee80211-information-element>;
+  //  field cf-parameter-set :: <ieee80211-information-element>;
+  //  field ibbs :: <ieee80211-information-element>;
+  //  field tim :: <ieee80211-information-element>;
+end;
+
+// ieee80211 data frames
+define protocol ieee80211-data-frame (header-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>;
+end;
+
+define protocol ieee80211-null-function (ieee80211-data-frame)
+  field payload :: <raw-frame>; // there should be no data
+end;
+
+define protocol ieee80211-data (ieee80211-data-frame)
+  summary "%s", compose(summary, payload);
+  field payload :: <link-control>;
+end;
+
+// ieee80211 control frames
+define protocol ieee80211-control-frame(container-frame)
+end;
+
+define protocol ieee80211-request-to-send (ieee80211-control-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)
+  field duration :: <2byte-little-endian-unsigned-integer>;
+  field receiver-address :: <mac-address>;
+end;
+
+define protocol ieee80211-ps-poll (ieee80211-control-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)
+  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 type :: <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/%s", compose(summary, frame-control), compose(summary, 
payload);
+  field frame-control :: <ieee80211-frame-control>;
+  variably-typed-field payload,
+    type-function: 
+      select (frame.frame-control.type)
+        $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;
+

Added: trunk/libraries/packetizer/logical-link.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/packetizer/logical-link.dylan       Wed Jul 12 14:30:49 2006
@@ -0,0 +1,24 @@
+module: packetizer
+Author:    Andreas Bogk, Hannes Mehnert
+Copyright: (C) 2005, 2006,  All rights reserved. Free for non-commercial use.
+
+define protocol logical-link-control (header-frame)
+  summary "%s", compose(summary, payload);
+  field type-code :: <2byte-big-endian-unsigned-integer>;
+  variably-typed-field payload,
+    type-function:
+      select (frame.type-code)
+        #x800 => <ipv4-frame>;
+        #x806 => <arp-frame>;
+          otherwise <raw-frame>;
+      end;  
+end;
+
+define protocol link-control (header-frame)
+  summary "%s", compose(summary, payload);
+  field dsap :: <unsigned-byte>;
+  field ssap :: <unsigned-byte>;
+  field control :: <unsigned-byte>;
+  field organisation-code :: <3byte-big-endian-unsigned-integer>;
+  field payload :: <logical-link-control>;
+end;

Modified: trunk/libraries/packetizer/module.dylan
==============================================================================
--- trunk/libraries/packetizer/module.dylan     (original)
+++ trunk/libraries/packetizer/module.dylan     Wed Jul 12 14:30:49 2006
@@ -18,7 +18,12 @@
 
   // Add binding exports here.
   export <ethernet-frame>, <ipv4-frame>,
-    <ipv4-address>, <mac-address>,
+    <ipv4-address>, <mac-address>, <ieee80211-frame>, <prism2-frame>,
+    <logical-link-control>, <link-control>,
+    <ieee80211-information-field>,
+    <ieee80211-data-frame>,
+    <ieee80211-management-frame>,
+    <ieee80211-control-frame>,
     operation, source-address, destination-address,
     type-code, <arp-frame>, target-mac-address,
     target-ip-address, source-ip-address, source-mac-address,
@@ -28,7 +33,8 @@
     total-length, concrete-frame-fields,
     <repeated-field>;
 
-  export <pcap-file>, <pcap-file-header>, <pcap-packet>, header, packets;
+  export <pcap-file>, <pcap-file-header>, <pcap-packet>, header, packets,
+    $DLT-EN10MB, $DLT-PRISM-HEADER;
 
   export <icmp-frame>, code, type, checksum;
 

Modified: trunk/libraries/packetizer/packetizer.hdp
==============================================================================
--- trunk/libraries/packetizer/packetizer.hdp   (original)
+++ trunk/libraries/packetizer/packetizer.hdp   Wed Jul 12 14:30:49 2006
@@ -8,10 +8,13 @@
        protocol-definer-macro
        filter
        filter-parser
+       logical-link
        ethernet
        ipv4
        pcap
        dns
+       ieee80211
+       prism2
 base-address:  0x63FE0000
 debug-arguments:       c:\foo.pcap
 linker-options:        $(guilflags)

Modified: trunk/libraries/packetizer/pcap.dylan
==============================================================================
--- trunk/libraries/packetizer/pcap.dylan       (original)
+++ trunk/libraries/packetizer/pcap.dylan       Wed Jul 12 14:30:49 2006
@@ -2,6 +2,10 @@
 Author:    Andreas Bogk, Hannes Mehnert
 Copyright: (C) 2005, 2006,  All rights reserved. Free for non-commercial use.
 
+// from pcap-bpf.h
+define constant $DLT-EN10MB = 1;
+define constant $DLT-PRISM-HEADER = 119;
+
 //FIXME
 define n-byte-vector(little-endian-unsigned-integer-4byte, 4) end;
 
@@ -48,7 +52,8 @@
   field last-packet-length :: <unsigned-byte> = 0;
   variably-typed-field payload,
     type-function: select (frame.parent.header.linktype)
-                     1 => <ethernet-frame>;
+                     $DLT-EN10MB => <ethernet-frame>;
+                     $DLT-PRISM-HEADER => <prism2-frame>;
                      otherwise => <raw-frame>;
                    end,
     length: frame.capture-length * 8;

Added: trunk/libraries/packetizer/prism2.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/packetizer/prism2.dylan     Wed Jul 12 14:30:49 2006
@@ -0,0 +1,28 @@
+module:         packetizer
+Author:         Andreas Bogk, Hannes Mehnert, mb
+Copyright:      (C) 2005, 2006,  All rights reserved. Free for non-commercial 
use.
+
+define protocol prism2-header-item (container-frame)
+  field item-did :: <little-endian-unsigned-integer-4byte>;
+  field item-status :: <2byte-little-endian-unsigned-integer>;
+  field item-length :: <2byte-little-endian-unsigned-integer>;
+  field item-data :: <little-endian-unsigned-integer-4byte>;
+end;
+
+define protocol prism2-frame (header-frame)
+  summary "PRISM2/%s", compose(summary, payload);
+  field message-code :: <little-endian-unsigned-integer-4byte>;
+  field messsage-len :: <little-endian-unsigned-integer-4byte>;
+  field device-name :: <wlan-device-name>;
+  field host-time :: <prism2-header-item>;
+  field mac-time :: <prism2-header-item>;
+  field channel :: <prism2-header-item>;
+  field rssi :: <prism2-header-item>;
+  field sq ::  <prism2-header-item>;
+  field signal-level ::  <prism2-header-item>;
+  field noise-level ::  <prism2-header-item>;
+  field rate ::  <prism2-header-item>;
+  field istx ::  <prism2-header-item>;
+  field frame-length ::  <prism2-header-item>;
+  field payload :: <ieee80211-frame>;
+end;
-- 
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://www.opendylan.org/mailman/listinfo/gd-chatter



<Prev in Thread] Current Thread [Next in Thread>