X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/0636ecf91357b749370170716e0c4cd494bcea84..6d3b0e4599c5aa922bba42e53b038b51d9024a62:/print-arista.c diff --git a/print-arista.c b/print-arista.c index ce0adc10..0d1d5d91 100644 --- a/print-arista.c +++ b/print-arista.c @@ -3,22 +3,46 @@ /* \summary: EtherType protocol for Arista Networks printer */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif -#include - -#include +#include "netdissect-stdinc.h" #include "netdissect.h" -#include "interface.h" #include "extract.h" #include "addrtoname.h" #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 +51,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 +61,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 {