12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1998-2005 The TCPDUMP project
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution.
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR A PARTICULAR PURPOSE.
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * support for the IEEE "slow protocols" LACP, MARKER as per 802.3ad
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Original code by Hannes Gredler (hannes@juniper.net)
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-slow.c,v 1.1.2.1 2005/07/10 14:47:56 hannes Exp $";
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h>
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ether.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct slow_common_header {
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t proto_subtype;
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t version;
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	SLOW_PROTO_LACP                     1
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	SLOW_PROTO_MARKER                   2
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	LACP_VERSION                        1
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	MARKER_VERSION                      1
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok slow_proto_values[] = {
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SLOW_PROTO_LACP, "LACP" },
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SLOW_PROTO_MARKER, "MARKER" },
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct tlv_header_t {
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t type;
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t length;
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_TLV_TERMINATOR     0x00
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_TLV_ACTOR_INFO     0x01
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_TLV_PARTNER_INFO   0x02
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LACP_TLV_COLLECTOR_INFO 0x03
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MARKER_TLV_TERMINATOR   0x00
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MARKER_TLV_MARKER_INFO  0x01
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok slow_tlv_values[] = {
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { (SLOW_PROTO_LACP << 8) + LACP_TLV_TERMINATOR, "Terminator"},
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { (SLOW_PROTO_LACP << 8) + LACP_TLV_ACTOR_INFO, "Actor Information"},
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { (SLOW_PROTO_LACP << 8) + LACP_TLV_PARTNER_INFO, "Partner Information"},
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { (SLOW_PROTO_LACP << 8) + LACP_TLV_COLLECTOR_INFO, "Collector Information"},
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { (SLOW_PROTO_MARKER << 8) + MARKER_TLV_TERMINATOR, "Terminator"},
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { (SLOW_PROTO_MARKER << 8) + MARKER_TLV_MARKER_INFO, "Marker Information"},
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct lacp_tlv_actor_partner_info_t {
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t sys_pri[2];
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t sys[ETHER_ADDR_LEN];
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t key[2];
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t port_pri[2];
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t port[2];
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t state;
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pad[3];
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok lacp_tlv_actor_partner_info_state_values[] = {
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x01, "Activity"},
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x02, "Timeout"},
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x04, "Aggregation"},
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x08, "Synchronization"},
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x10, "Collecting"},
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x20, "Distributing"},
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x40, "Default"},
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0x80, "Expired"},
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, NULL}
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct lacp_tlv_collector_info_t {
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t max_delay[2];
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pad[12];
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct marker_tlv_marker_info_t {
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t req_port[2];
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t req_sys[ETHER_ADDR_LEN];
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t req_trans_id[4];
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pad[2];
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct lacp_marker_tlv_terminator_t {
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int8_t pad[50];
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectslow_print(register const u_char *pptr, register u_int len) {
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct slow_common_header *slow_com_header;
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const struct tlv_header_t *tlv_header;
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *tptr,*tlv_tptr;
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int tlv_len,tlen,tlv_tlen;
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    union {
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        const struct lacp_marker_tlv_terminator_t *lacp_marker_tlv_terminator;
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        const struct lacp_tlv_actor_partner_info_t *lacp_tlv_actor_partner_info;
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        const struct lacp_tlv_collector_info_t *lacp_tlv_collector_info;
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        const struct marker_tlv_marker_info_t *marker_tlv_marker_info;
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } tlv_ptr;
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tptr=pptr;
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    slow_com_header = (const struct slow_common_header *)pptr;
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(*slow_com_header);
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /*
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     * Sanity checking of the header.
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (slow_com_header->proto_subtype == SLOW_PROTO_LACP &&
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        slow_com_header->version != LACP_VERSION) {
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("LACP version %u packet not supported",slow_com_header->version);
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (slow_com_header->proto_subtype == SLOW_PROTO_MARKER &&
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        slow_com_header->version != MARKER_VERSION) {
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("MARKER version %u packet not supported",slow_com_header->version);
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%sv%u, length: %u",
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype),
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           slow_com_header->version,
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           len);
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (!vflag)
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return;
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* ok they seem to want to know everything - lets fully decode it */
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tlen=len-sizeof(struct slow_common_header);
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tptr+=sizeof(const struct slow_common_header);
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    while(tlen>0) {
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* did we capture enough for fully decoding the tlv header ? */
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        TCHECK2(*tptr, sizeof(struct tlv_header_t));
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tlv_header = (const struct tlv_header_t *)tptr;
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tlv_len = tlv_header->length;
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        printf("\n\t%s TLV (0x%02x), length: %u",
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tok2str(slow_tlv_values,
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       "Unknown",
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       (slow_com_header->proto_subtype << 8) + tlv_header->type),
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tlv_header->type,
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project               tlv_len);
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if ((tlv_len < sizeof(struct tlv_header_t) ||
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlv_len > tlen) &&
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlv_header->type != LACP_TLV_TERMINATOR &&
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlv_header->type != MARKER_TLV_TERMINATOR) {
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t-----trailing data-----");
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            print_unknown_data(tptr+sizeof(sizeof(struct tlv_header_t)),"\n\t  ",tlen);
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return;
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tlv_tptr=tptr+sizeof(struct tlv_header_t);
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tlv_tlen=tlv_len-sizeof(struct tlv_header_t);
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* did we capture enough for fully decoding the tlv ? */
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        TCHECK2(*tptr, tlv_len);
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        switch((slow_com_header->proto_subtype << 8) + tlv_header->type) {
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* those two TLVs have the same structure -> fall through */
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ((SLOW_PROTO_LACP << 8) + LACP_TLV_ACTOR_INFO):
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ((SLOW_PROTO_LACP << 8) + LACP_TLV_PARTNER_INFO):
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlv_ptr.lacp_tlv_actor_partner_info = (const struct lacp_tlv_actor_partner_info_t *)tlv_tptr;
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t  System %s, System Priority %u, Key %u" \
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   ", Port %u, Port Priority %u\n\t  State Flags [%s]",
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   etheraddr_string(tlv_ptr.lacp_tlv_actor_partner_info->sys),
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->sys_pri),
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->key),
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->port),
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   EXTRACT_16BITS(tlv_ptr.lacp_tlv_actor_partner_info->port_pri),
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   bittok2str(lacp_tlv_actor_partner_info_state_values,
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                              "none",
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                              tlv_ptr.lacp_tlv_actor_partner_info->state));
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ((SLOW_PROTO_LACP << 8) + LACP_TLV_COLLECTOR_INFO):
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlv_ptr.lacp_tlv_collector_info = (const struct lacp_tlv_collector_info_t *)tlv_tptr;
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t  Max Delay %u",
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   EXTRACT_16BITS(tlv_ptr.lacp_tlv_collector_info->max_delay));
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ((SLOW_PROTO_MARKER << 8) + MARKER_TLV_MARKER_INFO):
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlv_ptr.marker_tlv_marker_info = (const struct marker_tlv_marker_info_t *)tlv_tptr;
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            printf("\n\t  Request System %s, Request Port %u, Request Transaction ID 0x%08x",
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   etheraddr_string(tlv_ptr.marker_tlv_marker_info->req_sys),
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   EXTRACT_16BITS(tlv_ptr.marker_tlv_marker_info->req_port),
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                   EXTRACT_32BITS(tlv_ptr.marker_tlv_marker_info->req_trans_id));
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            /* those two TLVs have the same structure -> fall through */
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ((SLOW_PROTO_LACP << 8) + LACP_TLV_TERMINATOR):
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        case ((SLOW_PROTO_MARKER << 8) + LACP_TLV_TERMINATOR):
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            tlv_ptr.lacp_marker_tlv_terminator = (const struct lacp_marker_tlv_terminator_t *)tlv_tptr;
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (tlv_len == 0) {
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                tlv_len = sizeof(tlv_ptr.lacp_marker_tlv_terminator->pad) +
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    sizeof(struct tlv_header_t);
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* tell the user that we modified the length field  */
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (vflag>1)
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                    printf(" (=%u)",tlv_len);
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                /* we have messed around with the length field - now we need to check
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                 * again if there are enough bytes on the wire for the hexdump */
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                TCHECK2(tlv_ptr.lacp_marker_tlv_terminator->pad[0],
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        sizeof(tlv_ptr.lacp_marker_tlv_terminator->pad));
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            }
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        default:
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (vflag <= 1)
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                print_unknown_data(tlv_tptr,"\n\t  ",tlv_tlen);
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            break;
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        /* do we want to see an additionally hexdump ? */
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        if (vflag > 1)
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            print_unknown_data(tptr+sizeof(sizeof(struct tlv_header_t)),"\n\t  ",
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                               tlv_len-sizeof(struct tlv_header_t));
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tptr+=tlv_len;
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        tlen-=tlv_len;
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n\t\t packet exceeded snapshot");
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
265