[Gd-chatter] r11004 - in trunk/libraries: packetizer protocols
hannes at gwydiondylan.org
hannes at gwydiondylan.org
Wed Nov 29 18:09:58 CET 2006
Author: hannes
Date: Wed Nov 29 18:09:53 2006
New Revision: 11004
Modified:
trunk/libraries/packetizer/leaf-frames.dylan
trunk/libraries/packetizer/module.dylan
trunk/libraries/packetizer/packetizer.dylan
trunk/libraries/packetizer/protocol-definer-macro.dylan
trunk/libraries/protocols/ethernet.dylan
trunk/libraries/protocols/ipv4.dylan
Log:
Bug: 7299
packetizer & protocol-definer-macro:
*implement <variably-typed-container-frame> for internally-typed container frames
*those use the layering-stuff (layering field and "over type magic" syntax in protocol-definer-macro),
first, superclass is parsed to dispatch on the type,
afterwards the real frame is parsed (parse-frame in protocol-definer-macro.dylan)
*assembly (esp: fixup of the layering field) does not work yet for <variably-typed-container-frame>s
*open generic frame-size
ethernet:
*use <variably-typed-container-frame> as superclass for <cdp-record>
(PoC that variably-typed-container-frames are useful and work)
ipv4:
*rename router-alert-data to router-alert-value (which is exported)
leaf-frames:
*implement <15bit-unsigned-integer> (it's exported and not defined)
*seal <unsigned-integer-bit-frame> (it's not exported)
Modified: trunk/libraries/packetizer/leaf-frames.dylan
==============================================================================
--- trunk/libraries/packetizer/leaf-frames.dylan (original)
+++ trunk/libraries/packetizer/leaf-frames.dylan Wed Nov 29 18:09:53 2006
@@ -78,7 +78,7 @@
end;
-define open abstract class <unsigned-integer-bit-frame> (<fixed-size-translated-leaf-frame>)
+define abstract class <unsigned-integer-bit-frame> (<fixed-size-translated-leaf-frame>)
end;
define macro n-bit-unsigned-integer-definer
@@ -112,6 +112,7 @@
define n-bit-unsigned-integer(<12bit-unsigned-integer>; 12) end;
define n-bit-unsigned-integer(<13bit-unsigned-integer>; 13) end;
define n-bit-unsigned-integer(<14bit-unsigned-integer>; 14) end;
+define n-bit-unsigned-integer(<15bit-unsigned-integer>; 15) end;
define method parse-frame (frame-type :: subclass(<unsigned-integer-bit-frame>),
packet :: <byte-sequence>,
Modified: trunk/libraries/packetizer/module.dylan
==============================================================================
--- trunk/libraries/packetizer/module.dylan (original)
+++ trunk/libraries/packetizer/module.dylan Wed Nov 29 18:09:53 2006
@@ -120,6 +120,10 @@
<decoded-header-frame>,
payload, payload-setter;
+ export <variably-typed-container-frame>,
+ <unparsed-variably-typed-container-frame>,
+ <decoded-variably-typed-container-frame>;
+
export frame-size,
byte-offset,
bit-offset;
Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan (original)
+++ trunk/libraries/packetizer/packetizer.dylan Wed Nov 29 18:09:53 2006
@@ -148,7 +148,7 @@
fixup!(frame.payload);
end;
-define generic frame-size (frame :: type-union(<frame>, subclass(<fixed-size-frame>)))
+define open generic frame-size (frame :: type-union(<frame>, subclass(<fixed-size-frame>)))
=> (length :: <integer>);
define open generic summary (frame :: <frame>) => (summary :: <string>);
@@ -264,6 +264,9 @@
get-protocol-magic(frame, frame.payload);
end;
+//define inline method fixup-protocol-magic (frame :: <variably-typed-container-frame>) => (magic)
+// get-protocol-magic
+//end;
define inline method get-protocol-magic (frame :: <header-frame>, payload :: <frame>) => (magic)
let reverse-layering = reverse-layer(frame.object-class);
let res = element(reverse-layering, decoded-class(payload.object-class), default: #f);
@@ -326,6 +329,17 @@
fields(frame))
end;
+define open abstract class <variably-typed-container-frame> (<container-frame>)
+end;
+
+define open abstract class <decoded-variably-typed-container-frame>
+ (<variably-typed-container-frame>, <decoded-container-frame>)
+end;
+
+define open abstract class <unparsed-variably-typed-container-frame>
+ (<variably-typed-container-frame>, <unparsed-container-frame>)
+end;
+
define open abstract class <header-frame> (<container-frame>)
end;
Modified: trunk/libraries/packetizer/protocol-definer-macro.dylan
==============================================================================
--- trunk/libraries/packetizer/protocol-definer-macro.dylan (original)
+++ trunk/libraries/packetizer/protocol-definer-macro.dylan Wed Nov 29 18:09:53 2006
@@ -64,6 +64,8 @@
define constant "$" ## ?name ## "-layering"
= if (subtype?(?name, <header-frame>))
make(<table>);
+ elseif (subtype?(?name, <variably-typed-container-frame>))
+ make(<table>);
end;
define inline method layer (frame :: subclass(?name)) => (res :: false-or(<table>))
"$" ## ?name ## "-layering";
@@ -71,6 +73,8 @@
define constant "$" ## ?name ## "-reverse-layering"
= if (subtype?(?name, <header-frame>))
make(<table>);
+ elseif (subtype?(?name, <variably-typed-container-frame>))
+ make(<table>);
end;
define inline method reverse-layer (frame :: subclass(?name)) => (res :: false-or(<table>))
"$" ## ?name ## "-reverse-layering";
@@ -404,6 +408,20 @@
values(frames, start);
end;
+define method parse-frame (frame-type :: subclass(<variably-typed-container-frame>),
+ packet :: <byte-sequence>,
+ #key parent :: false-or(<container-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>);
+ parse-frame(real-type, packet, parent: parent);
+ else
+ next-method()
+ end;
+end;
+
define method parse-frame (frame-type :: subclass(<container-frame>),
packet :: <byte-sequence>,
#key parent :: false-or(<container-frame>))
Modified: trunk/libraries/protocols/ethernet.dylan
==============================================================================
--- trunk/libraries/protocols/ethernet.dylan (original)
+++ trunk/libraries/protocols/ethernet.dylan Wed Nov 29 18:09:53 2006
@@ -121,40 +121,13 @@
summary "STP topology change notification";
end;
-define protocol cdp-record (container-frame)
- field cdp-type :: <2byte-big-endian-unsigned-integer>;
+define protocol cdp-record (variably-typed-container-frame)
+ layering field cdp-type :: <2byte-big-endian-unsigned-integer>;
field cdp-length :: <2byte-big-endian-unsigned-integer>;
end;
-define method parse-frame (frame-type == <cdp-record>,
- packet :: <byte-sequence>,
- #key parent)
- => (value :: <cdp-record>, next-unparsed :: false-or(<integer>));
- let bpdu-type = next-method().cdp-type;
- let bpdu-class = select (bpdu-type)
- #x0001 => <cdp-device-id>;
- #x0002 => <cdp-addresses>;
- #x0003 => <cdp-port-id>;
- #x0004 => <cdp-capabilities>;
- #x0005 => <cdp-version>;
- #x0006 => <cdp-platform>;
- #x0007 => <cdp-ip-prefixes>;
- #x0008 => <cdp-hello>;
- #x0009 => <cdp-vtp-management-domain>;
- #x000a => <cdp-vtp-native-vlan-id>;
- #x000b => <cdp-duplex>;
- #x000e => <cdp-ata-186-voip-vlan-request>;
- #x000f => <cdp-ata-186-voip-vlan-assignment>;
- #x0010 => <cdp-power>;
- #x0011 => <cdp-mtu>;
- #x0012 => <cdp-avvid-trust-bitmap>;
- #x0013 => <cdp-avvid-untrusted-port-CoS>;
- #x0014 => <cdp-system-name>;
- #x0016 => <cdp-system-object-id>;
- #x0017 => <cdp-physical-location>;
- otherwise => <cdp-unknown-record>;
- end;
- parse-frame(bpdu-class, packet, parent: parent);
+define method frame-size (frame :: <cdp-record>) => (res :: <integer>)
+ frame.cdp-length * 8;
end;
define protocol cdp-unknown-record (cdp-record)
@@ -166,6 +139,7 @@
end;
define protocol cdp-device-id (cdp-string-record)
+ over <cdp-record> #x1;
summary "ID: %=", cdp-value;
end;
@@ -178,6 +152,7 @@
end;
define protocol cdp-addresses (cdp-record)
+ over <cdp-record> #x2;
field address-count :: <unsigned-byte>;
repeated field cdp-addresses :: <cdp-address>,
count: frame.address-count;
@@ -185,10 +160,12 @@
end;
define protocol cdp-port-id (cdp-string-record)
+ over <cdp-record> #x3;
summary "Port: %=", cdp-value;
end;
define protocol cdp-capabilities (cdp-record)
+ over <cdp-record> #x4;
field padding1 :: <3byte-big-endian-unsigned-integer>;
field padding2 :: <1bit-unsigned-integer>;
field cdp-layer1 :: <1bit-unsigned-integer>;
@@ -201,10 +178,12 @@
end;
define protocol cdp-version (cdp-string-record)
+ over <cdp-record> #x5;
summary "Version: %=", cdp-value;
end;
define protocol cdp-platform (cdp-string-record)
+ over <cdp-record> #x6;
summary "Platform: %=", cdp-value;
end;
@@ -214,63 +193,77 @@
end;
define protocol cdp-ip-prefixes (cdp-record)
+ over <cdp-record> #x7;
field ip-prefix-count :: <unsigned-byte>;
repeated field ip-prefixes :: <cdp-ip-prefix>,
count: frame.ip-prefix-count;
end;
define protocol cdp-vtp-management-domain (cdp-string-record)
+ over <cdp-record> #x9;
summary "VTP Management domain: %=", cdp-value;
end;
define protocol cdp-vtp-native-vlan-id (cdp-record)
+ over <cdp-record> #xa;
summary "VTP native VLAN: %=", cdp-native-vlan-id;
field cdp-native-vlan-id :: <2byte-big-endian-unsigned-integer>;
end;
define protocol cdp-duplex (cdp-record)
+ over <cdp-record> #xb;
summary "Duplex: %s", method(x) if (x.cdp-duplex = 0) "half" else "full" end end;
field cdp-duplex :: <unsigned-byte>;
end;
define protocol cdp-hello (cdp-unknown-record)
+ over <cdp-record> #x8;
summary "Hello (undocumented)";
end;
define protocol cdp-ata-186-voip-vlan-request (cdp-unknown-record)
+ over <cdp-record> #xe;
summary "ATA 186 VoIP VLAN Request";
end;
define protocol cdp-ata-186-voip-vlan-assignment (cdp-unknown-record)
+ over <cdp-record> #xf;
summary "ATA 186 VoIP VLAN Assignment";
end;
define protocol cdp-power (cdp-unknown-record)
+ over <cdp-record> #x10;
summary "Power: %=", cdp-value;
end;
define protocol cdp-mtu (cdp-record)
+ over <cdp-record> #x11;
summary "MTU: %=", cdp-mtu;
field cdp-mtu :: <big-endian-unsigned-integer-4byte>;
end;
define protocol cdp-avvid-trust-bitmap (cdp-unknown-record)
+ over <cdp-record> #x12;
summary "AVVID Trust Bitmap";
end;
define protocol cdp-avvid-untrusted-port-CoS (cdp-unknown-record)
+ over <cdp-record> #x13;
summary "AVVID Untrusted Port CoS";
end;
define protocol cdp-system-name (cdp-string-record)
+ over <cdp-record> #x14;
summary "System name: %=", cdp-value;
end;
define protocol cdp-system-object-id (cdp-unknown-record)
+ over <cdp-record> #x16;
summary "System OID: %=", cdp-value;
end;
define protocol cdp-physical-location (cdp-string-record)
+ over <cdp-record> #x17;
summary "Physical location: %=", cdp-value;
end;
Modified: trunk/libraries/protocols/ipv4.dylan
==============================================================================
--- trunk/libraries/protocols/ipv4.dylan (original)
+++ trunk/libraries/protocols/ipv4.dylan Wed Nov 29 18:09:53 2006
@@ -46,7 +46,7 @@
define protocol router-alert-ip-option (ip-option-frame)
field router-alert-length :: <unsigned-byte> = 4;
- field router-alert-data :: <2byte-big-endian-unsigned-integer>;
+ field router-alert-value :: <2byte-big-endian-unsigned-integer>;
end;
define protocol end-of-option-ip-option (ip-option-frame)
@@ -233,6 +233,8 @@
field protocol-address-size :: <unsigned-byte>
= byte-offset(field-size(<ipv4-address>));
field operation :: <2byte-big-endian-unsigned-integer>;
+// enum: { #x1 => #"arp-request", "ARP WHO HAS %= TELL %=";
+// #x2 => #"arp-response", "ARP %= IS AT %="; };
field source-mac-address :: <mac-address>;
field source-ip-address :: <ipv4-address>;
field target-mac-address :: <mac-address>;
More information about the chatter
mailing list