]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Adding support for ISO CALM FAST and ETSI GeoNetworking
authorOla Martin Lykkja <[email protected]>
Tue, 25 Jun 2013 21:43:19 +0000 (23:43 +0200)
committerOla Martin Lykkja <[email protected]>
Tue, 25 Jun 2013 21:43:19 +0000 (23:43 +0200)
Makefile.in
ethertype.h
netdissect.h
print-calm-fast.c [new file with mode: 0644]
print-ether.c
print-geonet.c [new file with mode: 0644]
tests/geonet_and_calm_fast.pcap [new file with mode: 0644]

index 3fb1da8d74bddda3e79f796a7ed03f04368856f8..f805bf684604978c0945eeecdc92d49ec31926a7 100644 (file)
@@ -76,12 +76,12 @@ CSRC =      addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c
        print-802_11.c print-802_15_4.c print-ap1394.c print-ah.c \
        print-arcnet.c print-aodv.c print-arp.c print-ascii.c print-atalk.c \
        print-atm.c print-beep.c print-bfd.c print-bgp.c \
-       print-bootp.c print-bt.c print-carp.c print-cdp.c print-cfm.c \
+       print-bootp.c print-bt.c print-calm-fast.c print-carp.c print-cdp.c print-cfm.c \
        print-chdlc.c print-cip.c print-cnfp.c print-dccp.c print-decnet.c \
        print-domain.c print-dtp.c print-dvmrp.c print-enc.c print-egp.c \
        print-eap.c print-eigrp.c\
        print-esp.c print-ether.c print-fddi.c print-forces.c print-fr.c \
-       print-gre.c print-hsrp.c print-icmp.c print-igmp.c \
+       print-geonet.c print-gre.c print-hsrp.c print-icmp.c print-igmp.c \
        print-igrp.c print-ip.c print-ipcomp.c print-ipfc.c print-ipnet.c \
        print-ipx.c print-isoclns.c print-juniper.c print-krb.c \
        print-l2tp.c print-lane.c print-ldp.c print-lldp.c print-llc.c \
index 385da5d7169d39132dab98fbb02ed4d515777ed0..484e01e114a62929a9d2d4577a0d745e18157829 100644 (file)
 #ifndef        ETHERTYPE_ISO
 #define        ETHERTYPE_ISO           0xfefe  /* nonstandard - used in Cisco HDLC encapsulation */
 #endif
+#ifndef        ETHERTYPE_CALM_FAST
+#define        ETHERTYPE_CALM_FAST     0x1111  /* ISO CALM FAST */
+#endif
+#ifndef        ETHERTYPE_GEONET_OLD
+#define        ETHERTYPE_GEONET_OLD    0x0707  /* ETSI GeoNetworking (before an 2013) */
+#endif
+#ifndef        ETHERTYPE_GEONET
+#define        ETHERTYPE_GEONET        0x8947  /* ETSI GeoNetworking (Official IEEE registration from Jan 2013) */
+#endif
 
 extern const struct tok ethertype_values[];
index fec5a6b6b4c61f547de9131d40250f75d7ba0c0a..ce08a54e638bd2a961ba5987b675655b012eefb7 100644 (file)
@@ -525,4 +525,7 @@ extern int esp_print_decrypt_buffer_by_ikev2(netdissect_options *ndo,
                                             u_char *buf, u_char *end);
 
 
+extern void geonet_print(netdissect_options *ndo,const u_char *eth_hdr,const u_char *geo_pck, u_int len);
+extern void calm_fast_print(netdissect_options *ndo,const u_char *eth_hdr,const u_char *calm_pck, u_int len);
+
 #endif  /* netdissect_h */
diff --git a/print-calm-fast.c b/print-calm-fast.c
new file mode 100644 (file)
index 0000000..bd88bd8
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2013
+ *     [email protected]  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code distributions
+ * retain the above copyright notice and this paragraph in its entirety, (2)
+ * distributions including binary code include the above copyright notice and
+ * this paragraph in its entirety in the documentation or other materials
+ * provided with the distribution, and (3) all advertising materials mentioning
+ * features or use of this software display the following acknowledgement:
+ * ``This product includes software developed by Paolo Abeni.'' 
+ * The name of author may not be used to endorse or promote products derived 
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <pcap.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+
+static const char *
+hex48_to_string(const u_char *bp)
+{
+        int i;
+        static char sz[6*3+2];
+        memset(sz, 0, sizeof(sz));
+        for (i=0; i<6; i++) {
+                if (i) strcat(sz,":");
+                sprintf(sz+strlen(sz), "%02x", bp[i]);
+        }
+        return sz;
+}
+
+/*
+ * This is the top level routine of the printer.  'p' points
+ * to the calm header of the packet.
+ */
+void
+calm_fast_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int length)
+{
+       printf("CALM FAST src:%s; ", hex48_to_string(eth+6));
+
+       length -= 0;
+       bp += 0;
+
+       if (ndo->ndo_vflag)
+               default_print(bp, length);
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
index 5a1d58cbea0059449d0b015d80831e245732fb32..4bc8ad3a3d2e4738209c9065b143978bd1976693 100644 (file)
@@ -85,6 +85,9 @@ const struct tok ethertype_values[] = {
     { ETHERTYPE_CFM,            "CFM" },
     { ETHERTYPE_LLDP,           "LLDP" },
     { ETHERTYPE_TIPC,           "TIPC"},       
+    { ETHERTYPE_GEONET_OLD,     "GeoNet (old)"},
+    { ETHERTYPE_GEONET,         "GeoNet"},
+    { ETHERTYPE_CALM_FAST,      "CALM FAST"},
     { 0, NULL}
 };
 
@@ -417,6 +420,15 @@ ethertype_print(netdissect_options *ndo,
                msnlb_print(ndo, p);
                return (1);
 
+        case ETHERTYPE_GEONET_OLD:
+        case ETHERTYPE_GEONET:
+                geonet_print(ndo, p-14, p, length);
+                return (1);
+
+        case ETHERTYPE_CALM_FAST:
+                calm_fast_print(ndo, p-14, p, length);
+                return (1);
+
        case ETHERTYPE_LAT:
        case ETHERTYPE_SCA:
        case ETHERTYPE_MOPRC:
diff --git a/print-geonet.c b/print-geonet.c
new file mode 100644 (file)
index 0000000..b9c60dd
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) 2013
+ *     [email protected]  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code distributions
+ * retain the above copyright notice and this paragraph in its entirety, (2)
+ * distributions including binary code include the above copyright notice and
+ * this paragraph in its entirety in the documentation or other materials
+ * provided with the distribution, and (3) all advertising materials mentioning
+ * features or use of this software display the following acknowledgement:
+ * ``This product includes software developed by Paolo Abeni.'' 
+ * The name of author may not be used to endorse or promote products derived 
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <pcap.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "extract.h"
+#include "addrtoname.h"
+
+
+/*
+   ETSI TS 102 636-5-1 V1.1.1 (2011-02)
+   Intelligent Transport Systems (ITS); Vehicular Communications; GeoNetworking;
+   Part 5: Transport Protocols; Sub-part 1: Basic Transport Protocol
+
+   ETSI TS 102 636-4-1 V1.1.1 (2011-06)
+   Intelligent Transport Systems (ITS); Vehicular communications; GeoNetworking;
+   Part 4: Geographical addressing and forwarding for point-to-point and point-to-multipoint communications;
+   Sub-part 1: Media-Independent Functionality
+*/
+
+static const char *
+hex48_to_string(const u_char *bp)
+{
+       int i;
+       static char sz[6*3+2];
+       memset(sz, 0, sizeof(sz));
+       for (i=0; i<6; i++) {
+               if (i) strcat(sz,":");
+               sprintf(sz+strlen(sz), "%02x", bp[i]);
+       }
+       return sz;
+}
+
+static void
+print_btp_body(const u_char *bp, u_int length)
+{
+       // Assuming ItsDpuHeader
+       int version = bp[0];
+       int msg_type = bp[1];
+       const char *msg_type_str = "Unknown";
+
+       switch (msg_type) {
+               case   0: msg_type_str = "CAM"; break;
+               case   1: msg_type_str = "DENM"; break;
+               case 101: msg_type_str = "TPEGM"; break;
+               case 102: msg_type_str = "TSPDM"; break;
+               case 103: msg_type_str = "VPM"; break;
+               case 104: msg_type_str = "SRM"; break;
+               case 105: msg_type_str = "SLAM"; break;
+               case 106: msg_type_str = "ecoCAM"; break;
+               case 107: msg_type_str = "ITM"; break;
+               case 150: msg_type_str = "SA"; break;
+       }
+       printf("; ItsPduHeader v:%d t:%d-%s", version, msg_type, msg_type_str);
+}
+
+static void
+print_btp(const u_char *bp, u_int length)
+{
+       u_int16_t dest = EXTRACT_16BITS(bp+0);
+       u_int16_t src = EXTRACT_16BITS(bp+2);
+       printf("; BTP Dst:%u Src:%u", dest, src);
+}
+
+static void
+print_long_pos_vector(const char *type, const u_char *bp, u_int length)
+{
+       int i;
+       u_int32_t lat, lon;
+
+       printf("GN_ADDR:");
+       for (i=0; i<8; i++) {
+               if (i) printf(":");
+               printf("%02x", bp[i]);
+       }
+       printf(" ");
+
+       lat = EXTRACT_32BITS(bp+12);
+       printf("lat:%d ", lat);
+       lon = EXTRACT_32BITS(bp+16);
+       printf("lon:%d", lon);
+}
+
+
+/*
+ * This is the top level routine of the printer.  'p' points
+ * to the geonet header of the packet.
+ */
+void
+geonet_print(netdissect_options *ndo, const u_char *eth, const u_char *bp, u_int length)
+{
+       printf("GeoNet src:%s; ", hex48_to_string(eth+6));
+
+       if (length >= 36) {
+               // Process Common Header
+               int version = bp[0] >> 4;
+               int next_hdr = bp[0] & 0x0f;
+               int hdr_type = bp[1] >> 4;
+               int hdr_subtype = bp[1] & 0x0f;
+               u_int16_t payload_length = EXTRACT_16BITS(bp+4);
+               int hop_limit = bp[7];
+               const char *next_hdr_txt = "Unknown";
+               const char *hdr_type_txt = "Unknown";
+               int hdr_size = -1;
+
+               switch (next_hdr) {
+                       case 0: next_hdr_txt = "Any"; break;
+                       case 1: next_hdr_txt = "BTP-A"; break;
+                       case 2: next_hdr_txt = "BTP-B"; break;
+                       case 3: next_hdr_txt = "IPv6"; break;
+               }
+
+               switch (hdr_type) {
+                       case 0: hdr_type_txt = "Any"; break;
+                       case 1: hdr_type_txt = "Beacon"; break;
+                       case 2: hdr_type_txt = "GeoUnicast"; break;
+                       case 3: switch (hdr_subtype) {
+                                       case 0: hdr_type_txt = "GeoAnycastCircle"; break;
+                                       case 1: hdr_type_txt = "GeoAnycastRect"; break;
+                                       case 2: hdr_type_txt = "GeoAnycastElipse"; break;
+                               }
+                               break;
+                       case 4: switch (hdr_subtype) {
+                                       case 0: hdr_type_txt = "GeoBroadcastCircle"; break;
+                                       case 1: hdr_type_txt = "GeoBroadcastRect"; break;
+                                       case 2: hdr_type_txt = "GeoBroadcastElipse"; break;
+                               }
+                               break;
+                       case 5: switch (hdr_subtype) {
+                                       case 0: hdr_type_txt = "TopoScopeBcast-SH"; break;
+                                       case 1: hdr_type_txt = "TopoScopeBcast-MH"; break;
+                               }
+                               break;
+                       case 6: switch (hdr_subtype) {
+                                       case 0: hdr_type_txt = "LocService-Request"; break;
+                                       case 1: hdr_type_txt = "LocService-Reply"; break;
+                               }
+                               break;
+               }
+
+               printf("v:%d ", version);
+               printf("NH:%d-%s ", next_hdr, next_hdr_txt);
+               printf("HT:%d-%d-%s ", hdr_type, hdr_subtype, hdr_type_txt);
+               printf("HopLim:%d ", hop_limit);
+               printf("Payload:%d ", payload_length);
+               print_long_pos_vector("Sender", bp + 8, 36-8);
+
+               // Skip Common Header
+               length -= 36;
+               bp += 36;
+
+               // Process Extended Headers
+               switch (hdr_type) {
+                       case 0: /* Any */
+                               hdr_size = 0;
+                               break;
+                       case 1: /* Beacon */
+                               hdr_size = 0;
+                               break;
+                       case 2: /* GeoUnicast */
+                               break;
+                       case 3: switch (hdr_subtype) {
+                                       case 0: /* GeoAnycastCircle */
+                                               break;
+                                       case 1: /* GeoAnycastRect */
+                                               break;
+                                       case 2: /* GeoAnycastElipse */
+                                               break;
+                               }
+                               break;
+                       case 4: switch (hdr_subtype) {
+                                       case 0: /* GeoBroadcastCircle */
+                                               break;
+                                       case 1: /* GeoBroadcastRect */
+                                               break;
+                                       case 2: /* GeoBroadcastElipse */
+                                               break;
+                               }
+                               break;
+                       case 5: switch (hdr_subtype) {
+                                       case 0: /* TopoScopeBcast-SH */
+                                               hdr_size = 0;
+                                               break;
+                                       case 1: /* TopoScopeBcast-MH */
+                                               hdr_size = 68 - 36;
+                                               break;
+                               }
+                               break;
+                       case 6: switch (hdr_subtype) {
+                                       case 0: /* LocService-Request */
+                                               break;
+                                       case 1: /* LocService-Reply */
+                                               break;
+                               }
+                               break;
+               }
+
+               // Skip Extended headers
+               if (hdr_size >= 0) {
+                       length -= hdr_size;
+                       bp += hdr_size;
+                       switch (next_hdr) {
+                               case 0: /* Any */
+                                       break;
+                               case 1:
+                               case 2: /* BTP A/B */
+                                       print_btp(bp, length);
+                                       length -= 4;
+                                       bp += 4;
+                                       print_btp_body(bp, length);
+                                       break;
+                               case 3: /* IPv6 */
+                                       break;
+                       }
+               }
+       } else {
+               printf("Malformed (small) ");
+       }
+
+       // Print user data part
+       if (ndo->ndo_vflag)
+               default_print(bp, length);
+}
+
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */
diff --git a/tests/geonet_and_calm_fast.pcap b/tests/geonet_and_calm_fast.pcap
new file mode 100644 (file)
index 0000000..62ab425
Binary files /dev/null and b/tests/geonet_and_calm_fast.pcap differ