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