// Copyright (c) 2018 Arista Networks, Inc. All rights reserved. #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #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 int arista_print_ethertype(netdissect_options *ndo, const u_char *bp, u_int len _U_) { uint16_t subTypeId; uint16_t version; u_short bytesConsumed = 0; u_short size = 0; ndo->ndo_protocol = "arista"; subTypeId = GET_BE_U_2(bp); bp += 2; version = GET_BE_U_2(bp); bp += 2; bytesConsumed += 4; ND_PRINT("SubType: 0x%1X, Version: 0x%02x, ", subTypeId, version); // TapAgg Header Timestamping if (subTypeId == ARISTA_SUBTYPE_TIMESTAMP) { // Timestamp has 32-bit lsb in nanosec and remaining msb in sec 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)); bytesConsumed += size + 8; break; case ARISTA_TIMESTAMP_V2: ND_PRINT("Timestamp (48-bit)"); 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 { return -1; } return bytesConsumed; }