blob: 38dd724a56b8e4f1ea5e5cc550db884b842e9e19 [file] [log] [blame]
// Copyright (c) 2018 Arista Networks, Inc. All rights reserved.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <netdissect-stdinc.h>
#include <string.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
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;
}