]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-geonet.c
NTP: Use tstr for truncation indicator.
[tcpdump] / print-geonet.c
index edfb7f2d6c0e359d929b8fb3926e169cd9bb76f4..9da89bfe81dc8b4e443cfe8ff3422e2cee7c1dce 100644 (file)
  * Original code by Ola Martin Lykkja ([email protected])
  */
 
-#define NETDISSECT_REWORKED
+/* \summary: ISO CALM FAST and ETSI GeoNetworking printer */
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
 
-#include "interface.h"
+#include "netdissect.h"
 #include "extract.h"
 #include "addrtoname.h"
 
@@ -85,6 +86,8 @@ print_long_pos_vector(netdissect_options *ndo,
 {
        uint32_t lat, lon;
 
+       if (!ND_TTEST2(*bp, GEONET_ADDR_LEN))
+               return (-1);
        ND_PRINT((ndo, "GN_ADDR:%s ", linkaddr_string (ndo, bp, 0, GEONET_ADDR_LEN)));
 
        if (!ND_TTEST2(*(bp+12), 8))
@@ -102,7 +105,8 @@ print_long_pos_vector(netdissect_options *ndo,
  * to the geonet header of the packet.
  */
 void
-geonet_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int length)
+geonet_print(netdissect_options *ndo, const u_char *bp, u_int length,
+            const struct lladdr_info *src)
 {
        int version;
        int next_hdr;
@@ -114,13 +118,16 @@ geonet_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int
        const char *hdr_type_txt = "Unknown";
        int hdr_size = -1;
 
-       ND_PRINT((ndo, "GeoNet src:%s; ", etheraddr_string(ndo, eth+6)));
+       ND_PRINT((ndo, "GeoNet "));
+       if (src != NULL)
+               ND_PRINT((ndo, "src:%s", (src->addr_string)(ndo, src->addr)));
+       ND_PRINT((ndo, "; "));
 
        /* Process Common Header */
        if (length < 36)
-               goto malformed;
-               
-       ND_TCHECK2(*bp, 7);
+               goto invalid;
+
+       ND_TCHECK2(*bp, 8);
        version = bp[0] >> 4;
        next_hdr = bp[0] & 0x0f;
        hdr_type = bp[1] >> 4;
@@ -224,7 +231,7 @@ geonet_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int
        /* Skip Extended headers */
        if (hdr_size >= 0) {
                if (length < (u_int)hdr_size)
-                       goto malformed;
+                       goto invalid;
                ND_TCHECK2(*bp, hdr_size);
                length -= hdr_size;
                bp += hdr_size;
@@ -234,7 +241,7 @@ geonet_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int
                        case 1:
                        case 2: /* BTP A/B */
                                if (length < 4)
-                                       goto malformed;
+                                       goto invalid;
                                ND_TCHECK2(*bp, 4);
                                print_btp(ndo, bp);
                                length -= 4;
@@ -261,7 +268,7 @@ geonet_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int
                ND_DEFAULTPRINT(bp, length);
        return;
 
-malformed:
+invalid:
        ND_PRINT((ndo, " Malformed (small) "));
        /* XXX - print the remaining data as hex? */
        return;