[Gd-chatter] r11668 - trunk/libraries/protocols

hannes at gwydiondylan.org hannes at gwydiondylan.org
Wed Feb 6 03:13:55 CET 2008


Author: hannes
Date: Wed Feb  6 03:13:54 2008
New Revision: 11668

Modified:
   trunk/libraries/protocols/hsrp.dylan
Log:
Bug: 7299
some more hsrp hacking... advertising operation is stolen from wireshark


Modified: trunk/libraries/protocols/hsrp.dylan
==============================================================================
--- trunk/libraries/protocols/hsrp.dylan	(original)
+++ trunk/libraries/protocols/hsrp.dylan	Wed Feb  6 03:13:54 2008
@@ -1,58 +1,60 @@
 module: hsrp
 
 //Cisco Hot Standby Router Protocol (HSRP) RFC 2281 
-define protocol hsrp (container-frame)
+define abstract protocol hsrp (variably-typed-container-frame)
   over <udp-frame> 1985;
   field version :: <unsigned-byte> = 0;
-  /*
-    0 Hello
-    1 Coup
-    2 Resign
-  */
-  field opcode :: <unsigned-byte> = 0;
-  /*
-    0 Initial
-    1 Learn
-    2 Listen
-    4 Speak
-    8 Standby
-    16 Active
-  */
-  field state :: <unsigned-byte> = 16;
+  layering field opcode :: <unsigned-byte> = 0;
+end;
+
+define abstract protocol hsrp-rfc2881 (hsrp)
+  summary "HSRP v%= (%=)", version, state;
+  enum field state :: <unsigned-byte> = 16,
+    mappings: { 0 <=> #"Initial",
+                1 <=> #"Learn",
+                2 <=> #"Listen",
+                4 <=> #"Speak",
+                8 <=> #"Standby",
+                16 <=> #"Active" };
   field hello-time :: <unsigned-byte> = 3;
   field hold-time :: <unsigned-byte> = 10;
   field priority :: <unsigned-byte> = 120;
   field group :: <unsigned-byte> = 1;
   field reserved :: <unsigned-byte> = 0;
-  //recommended default value 0x63 0x69 0x73 0x63 0x6F 0x00 0x00 0x00 
-  field authentication-data :: <raw-frame>, static-length: 8 * 8;
+  field authentication-data :: <raw-frame> =
+    as(<raw-frame>, #(#x63, #x69, #x73, #x63, #x6F, #x00, #x00, #x00)),
+    static-length: 8 * 8;
   field virtual-ip :: <ipv4-address>;
 end;
 
+define protocol hsrp-hello (hsrp-rfc2881)
+  over <hsrp> 0;
+end;
+
+define protocol hsrp-coup (hsrp-rfc2881)
+  over <hsrp> 1;
+end;
 
-define method summary (frame :: <hsrp>) => (res :: <string>)
-  if(frame.opcode = 0)
-    if(frame.state = 0)
-      format-to-string("HSRP v%= Hello (Initial)", frame.version)
-    elseif(frame.state = 1)
-      format-to-string("HSRP v%= Hello (Learn)", frame.version)
-    elseif(frame.state = 2)
-      format-to-string("HSRP v%= Hello (Listen)", frame.version)
-    elseif(frame.state = 4)
-      format-to-string("HSRP v%= Hello (Speak)", frame.version)
-    elseif(frame.state = 8)
-      format-to-string("HSRP v%= Hello (Standby)", frame.version)
-    elseif(frame.state = 16)
-      format-to-string("HSRP v%= Hello (Active)", frame.version)
-    else
-      format-to-string("HSRP v%= Hello state: %=",
-	                frame.version,
-			frame.state)
-    end
-  else
-    format-to-string("HSRP v%= opcode: %= state: %=",
-	             frame.version,
-		     frame.opcode,
-		     frame.state)
-  end
+define protocol hsrp-resign (hsrp-rfc2881)
+  over <hsrp> 2;
 end;
+
+define protocol hsrp-advertisement (hsrp)
+  summary "HSRP v%= (%=)", version, state;
+  length frame.advertisement-length * 8;
+  over <hsrp> 3;
+  field hsrp-interface-state :: <2byte-big-endian-unsigned-integer> = 1;
+  field advertisement-length :: <2byte-big-endian-unsigned-integer>,
+    fixup: byte-offset(frame-size(frame));
+  enum field state :: <unsigned-byte> = 16,
+    mappings: { 0 <=> #"Initial",
+                1 <=> #"Learn",
+                2 <=> #"Listen",
+                4 <=> #"Speak",
+                8 <=> #"Standby",
+                16 <=> #"Active" };
+  field reserverd1 :: <unsigned-byte>;
+  field active-groups :: <2byte-big-endian-unsigned-integer>;
+  field passive-groups :: <2byte-big-endian-unsigned-integer>;
+  field reserved2 :: <big-endian-unsigned-integer-4byte>;
+end;
\ No newline at end of file



More information about the chatter mailing list