#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ethernet.h>
#include <snoop.h>
struct conf_bpdu {
uchar_t cb_protid[2];
uchar_t cb_protvers;
uchar_t cb_type;
uchar_t cb_flags;
uchar_t cb_rootid[8];
uchar_t cb_rootcost[4];
uchar_t cb_bridgeid[8];
uchar_t cb_portid[2];
uchar_t cb_messageage[2];
uchar_t cb_maxage[2];
uchar_t cb_hello[2];
uchar_t cb_fwddelay[2];
};
#define BPDU_TYPE_CONF 0
#define BPDU_TYPE_RCONF 2
#define BPDU_TYPE_TCNOTIF 0x80
int
interpret_bpdu(int flags, char *data, int dlen)
{
struct conf_bpdu *cb;
const char *pdutype;
if (dlen < 4) {
(void) snprintf(get_sum_line(), MAXLINE,
"BPDU (short packet)");
return (0);
}
cb = (struct conf_bpdu *)data;
if (flags & F_SUM) {
(void) snprintf(get_sum_line(), MAXLINE,
"Bridge PDU T:%d L:%d", cb->cb_type, dlen);
}
if (flags & F_DTAIL) {
show_header("Bridge-PDU: ",
"Bridge PDU Frame", dlen);
show_space();
switch (cb->cb_type) {
case BPDU_TYPE_CONF:
pdutype = "Configuration";
break;
case BPDU_TYPE_RCONF:
pdutype = "Rapid Configuration";
break;
case BPDU_TYPE_TCNOTIF:
pdutype = "TC Notification";
break;
default:
pdutype = "?";
break;
}
(void) snprintf(get_line(0, 0), get_line_remain(),
"PDU type = %d (%s)", cb->cb_type, pdutype);
show_trailer();
}
return (0);
}