4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * CDDL HEADER START
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * The contents of this file are subject to the terms of the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Common Development and Distribution License (the "License").
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * You may not use this file except in compliance with the License.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * or http://www.opensolaris.org/os/licensing.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * See the License for the specific language governing permissions
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * and limitations under the License.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * When distributing Covered Code, include this CDDL HEADER in each
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * If applicable, add the following below this CDDL HEADER, with the
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * fields enclosed by brackets "[]" replaced with your own identifying
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * information: Portions Copyright [yyyy] [name of copyright owner]
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai *
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * CDDL HEADER END
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai/*
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai * Use is subject to license terms.
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <stdio.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <sys/types.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <sys/socket.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <sys/ethernet.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#include <snoop.h>
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaistruct conf_bpdu {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_protid[2]; /* Protocol Identifier */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_protvers; /* Protocol Version Identifier */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_type; /* BPDU Type */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_flags; /* BPDU Flags */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_rootid[8]; /* Root Identifier */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_rootcost[4]; /* Root Path Cost */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_bridgeid[8]; /* Bridge Identifier */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_portid[2]; /* Port Identifier */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_messageage[2]; /* Message Age */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_maxage[2]; /* Max Age */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_hello[2]; /* Hello Time */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai uchar_t cb_fwddelay[2]; /* Forward Delay */
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai};
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define BPDU_TYPE_CONF 0
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define BPDU_TYPE_RCONF 2
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai#define BPDU_TYPE_TCNOTIF 0x80
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiint
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavaiinterpret_bpdu(int flags, char *data, int dlen)
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai{
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai struct conf_bpdu *cb;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai const char *pdutype;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (dlen < 4) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) snprintf(get_sum_line(), MAXLINE,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "BPDU (short packet)");
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (0);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai cb = (struct conf_bpdu *)data;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (flags & F_SUM) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) snprintf(get_sum_line(), MAXLINE,
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge PDU T:%d L:%d", cb->cb_type, dlen);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai if (flags & F_DTAIL) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai show_header("Bridge-PDU: ",
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "Bridge PDU Frame", dlen);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai show_space();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai switch (cb->cb_type) {
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai case BPDU_TYPE_CONF:
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai pdutype = "Configuration";
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai break;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai case BPDU_TYPE_RCONF:
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai pdutype = "Rapid Configuration";
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai break;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai case BPDU_TYPE_TCNOTIF:
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai pdutype = "TC Notification";
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai break;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai default:
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai pdutype = "?";
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai break;
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai (void) snprintf(get_line(0, 0), get_line_remain(),
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai "PDU type = %d (%s)", cb->cb_type, pdutype);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai show_trailer();
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai }
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai return (0);
4eaa471005973e11a6110b69fe990530b3b95a38Rishi Srivatsavai}