summaryrefslogtreecommitdiff
path: root/print-arista.c
diff options
context:
space:
mode:
authorniks3089 <niks3089@gmail.com>2019-06-20 22:54:58 -0700
committerfxlb <devel.fx.lebail@orange.fr>2019-07-15 08:59:44 +0200
commita38033a59baaaf8eb10436267605af3468d4cb83 (patch)
tree0b0e5519523f6ae726ddd1521488abb94aa362af /print-arista.c
parenta602436cc2e62fd49c9d1af84367d4fc25b920c6 (diff)
downloadtcpdump-a38033a59baaaf8eb10436267605af3468d4cb83.tar.gz
Support 2 new versions for arista ethertype and print time in utc
Diffstat (limited to 'print-arista.c')
-rw-r--r--print-arista.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/print-arista.c b/print-arista.c
index ce0adc10..5a660a60 100644
--- a/print-arista.c
+++ b/print-arista.c
@@ -17,8 +17,35 @@
#define ARISTA_SUBTYPE_TIMESTAMP 0x01
-#define ARISTA_TIMESTAMP_V1 0x10
-#define ARISTA_TIMESTAMP_V2 0x20
+#define ARISTA_TIMESTAMP_64_TAI 0x0010
+#define ARISTA_TIMESTAMP_64_UTC 0x0110
+#define ARISTA_TIMESTAMP_48_TAI 0x0020
+#define ARISTA_TIMESTAMP_48_UTC 0x0120
+
+static const struct tok ts_version_name[] = {
+ { ARISTA_TIMESTAMP_64_TAI, "TAI(64-bit)" },
+ { ARISTA_TIMESTAMP_64_UTC, "UTC(64-bit)" },
+ { ARISTA_TIMESTAMP_48_TAI, "TAI(48-bit)" },
+ { ARISTA_TIMESTAMP_48_UTC, "UTC(48-bit)" },
+ { 0, NULL }
+};
+
+static inline void
+arista_print_date_hms_time(netdissect_options *ndo, uint32_t seconds,
+ uint32_t nanoseconds)
+{
+ time_t ts;
+ struct tm *tm;
+ char buf[BUFSIZE];
+
+ ts = seconds + (nanoseconds / 1000000000);
+ if (NULL == (tm = gmtime(&ts)))
+ ND_PRINT(": gmtime() error");
+ else if (0 == strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm))
+ ND_PRINT(": strftime() error");
+ else
+ ND_PRINT(": %s, %09u ns, ", buf, nanoseconds);
+}
int
arista_ethertype_print(netdissect_options *ndo, const u_char *bp, u_int len _U_)
@@ -27,6 +54,7 @@ arista_ethertype_print(netdissect_options *ndo, const u_char *bp, u_int len _U_)
uint16_t version;
u_short bytesConsumed = 0;
u_short size = 0;
+ uint32_t seconds, nanoseconds;
ndo->ndo_protocol = "arista";
@@ -36,27 +64,28 @@ arista_ethertype_print(netdissect_options *ndo, const u_char *bp, u_int len _U_)
bp += 2;
bytesConsumed += 4;
- ND_PRINT("SubType: 0x%1X, Version: 0x%02x, ", subTypeId, version);
+ ND_PRINT("SubType: 0x%1x, Version: 0x%04x, ", subTypeId, version);
// TapAgg Header Timestamping
if (subTypeId == ARISTA_SUBTYPE_TIMESTAMP) {
// Timestamp has 32-bit lsb in nanosec and remaining msb in sec
-
+ ND_PRINT("Timestamp %s", tok2str(ts_version_name,
+ "Unknown timestamp Version 0x%04x ", version));
switch (version) {
- case ARISTA_TIMESTAMP_V1:
- ND_PRINT("Timestamp TAI(64-bit)");
- ND_PRINT(": Seconds: %u,", GET_BE_U_4(bp));
- ND_PRINT(" Nanoseconds: %u, ", GET_BE_U_4(bp + 4));
+ case ARISTA_TIMESTAMP_64_TAI:
+ case ARISTA_TIMESTAMP_64_UTC:
+ seconds = GET_BE_U_4(bp);
+ nanoseconds = GET_BE_U_4(bp + 4);
+ arista_print_date_hms_time(ndo, seconds, nanoseconds);
bytesConsumed += size + 8;
break;
- case ARISTA_TIMESTAMP_V2:
- ND_PRINT("Timestamp (48-bit)");
+ case ARISTA_TIMESTAMP_48_TAI:
+ case ARISTA_TIMESTAMP_48_UTC:
ND_PRINT(": Seconds %u,", GET_BE_U_2(bp));
ND_PRINT(" Nanoseconds %u, ", GET_BE_U_4(bp + 2));
bytesConsumed += size + 6;
break;
default:
- ND_PRINT("Unknown timestamp Version 0x%02X ", version);
return -1;
}
} else {