logo       
Google Custom Search
    AddThis Social Bookmark Button

r11004 - in trunk/libraries: packetizer protocols: msg#00073

Subject: r11004 - in trunk/libraries: packetizer protocols
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>;
-- 
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://www.opendylan.org/mailman/listinfo/gd-chatter




Try Searching:
servers, voip, java, networking, microsoft ...
<Prev in Thread] Current Thread [Next in Thread>