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
|