]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-hsrp.c
add support for AS-PIC cookies
[tcpdump] / print-hsrp.c
index 3f107509f9d0f20fb195c476474b805ccfd044e7..21ec05404e112fc3bcb82a02fe7d24bc3f4dce48 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2001 Julian Cowley
  * All rights reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -13,7 +13,7 @@
  * 3. Neither the name of the project nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 /* Cisco Hot Standby Router Protocol (HSRP). */
 
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-hsrp.c,v 1.1 2001-09-17 06:22:33 guy Exp $";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-hsrp.c,v 1.9.2.1 2005-05-06 07:57:17 guy Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <sys/types.h>
+#include <tcpdump-stdinc.h>
 
 #include <stdio.h>
-#include <netinet/in.h>
 
 #include "interface.h"
 #include "addrtoname.h"
 
 /* HSRP op code types. */
-static char *op_code_str[] = {
+static const char *op_code_str[] = {
        "hello",
        "coup",
        "resign"
 };
 
 /* HSRP states and associated names. */
-static struct {
-       u_int value;
-       char *str;
-} states[] = {
+static struct tok states[] = {
        {  0, "initial" },
        {  1, "learn" },
        {  2, "listen" },
        {  4, "speak" },
        {  8, "standby" },
-       { 16, "active" }
+       { 16, "active" },
+       {  0, NULL }
 };
 
 /*
@@ -88,24 +85,22 @@ static struct {
 
 /* HSRP protocol header. */
 struct hsrp {
-       u_char          hsrp_version;
-       u_char          hsrp_op_code;
-       u_char          hsrp_state;
-       u_char          hsrp_hellotime;
-       u_char          hsrp_holdtime;
-       u_char          hsrp_priority;
-       u_char          hsrp_group;
-       u_char          hsrp_reserved;
-       u_char          hsrp_authdata[HSRP_AUTH_SIZE];
+       u_int8_t        hsrp_version;
+       u_int8_t        hsrp_op_code;
+       u_int8_t        hsrp_state;
+       u_int8_t        hsrp_hellotime;
+       u_int8_t        hsrp_holdtime;
+       u_int8_t        hsrp_priority;
+       u_int8_t        hsrp_group;
+       u_int8_t        hsrp_reserved;
+       u_int8_t        hsrp_authdata[HSRP_AUTH_SIZE];
        struct in_addr  hsrp_virtaddr;
 };
 
 void
-hsrp_print(register const u_char *bp, register u_int len)
+hsrp_print(register const u_int8_t *bp, register u_int len)
 {
-       int op_code, state;
        struct hsrp *hp = (struct hsrp *) bp;
-       int i;
 
        TCHECK(hp->hsrp_version);
        printf("HSRPv%d", hp->hsrp_version);
@@ -113,31 +108,17 @@ hsrp_print(register const u_char *bp, register u_int len)
                return;
        TCHECK(hp->hsrp_op_code);
        printf("-");
-       op_code = hp->hsrp_op_code;
-       if (op_code < (sizeof(op_code_str) / sizeof(op_code_str[0]))) {
-               printf("%s ", op_code_str[op_code]);
-       } else {
-               printf("unknown (%d) ", op_code);
-       }
+       printf("%s ", tok2strary(op_code_str, "unknown (%d)", hp->hsrp_op_code));
        printf("%d: ", len);
        TCHECK(hp->hsrp_state);
-       state = hp->hsrp_state;
-       for (i = 0; i < (sizeof(states) / sizeof(states[0])); i++) {
-               if (state == states[i].value)
-                       break;
-       }
-       if (i < (sizeof(states) / sizeof(states[0]))) {
-               printf("state=%s ", states[i].str);
-       } else {
-               printf("state=Unknown (%d) ", state);
-       }
+       printf("state=%s ", tok2str(states, "Unknown (%d)", hp->hsrp_state));
        TCHECK(hp->hsrp_group);
        printf("group=%d ", hp->hsrp_group);
        TCHECK(hp->hsrp_reserved);
        if (hp->hsrp_reserved != 0) {
                printf("[reserved=%d!] ", hp->hsrp_reserved);
        }
-       TCHECK2(hp->hsrp_virtaddr, sizeof(hp->hsrp_virtaddr));
+       TCHECK(hp->hsrp_virtaddr);
        printf("addr=%s", ipaddr_string(&hp->hsrp_virtaddr));
        if (vflag) {
                printf(" hellotime=");
@@ -146,7 +127,11 @@ hsrp_print(register const u_char *bp, register u_int len)
                relts_print(hp->hsrp_holdtime);
                printf(" priority=%d", hp->hsrp_priority);
                printf(" auth=\"");
-               fn_printn(hp->hsrp_authdata, sizeof(hp->hsrp_authdata), NULL);
+               if (fn_printn(hp->hsrp_authdata, sizeof(hp->hsrp_authdata),
+                   snapend)) {
+                       printf("\"");
+                       goto trunc;
+               }
                printf("\"");
        }
        return;