123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include <netdissect-stdinc.h>
- #include "netdissect.h"
- #include "ether.h"
- #include "ethertype.h"
- #include "addrtoname.h"
- #include "extract.h"
- static const char tstr[] = "[|MEDSA]";
- struct medsa_pkthdr {
- u_char bytes[6];
- u_short ether_type;
- };
- #define TAG(medsa) (medsa->bytes[2] >> 6)
- #define TAG_TO_CPU 0
- #define TAG_FROM_CPU 1
- #define TAG_FORWARD 3
- #define SRC_TAG(medsa) ((medsa->bytes[2] >> 5) & 0x01)
- #define SRC_DEV(medsa) (medsa->bytes[2] & 0x1f)
- #define SRC_PORT(medsa) ((medsa->bytes[3] >> 3) & 0x01f)
- #define TRUNK(medsa) ((medsa->bytes[3] >> 2) & 0x01)
- #define CODE(medsa) ((medsa->bytes[3] & 0x06) | \
- ((medsa->bytes[4] >> 4) & 0x01))
- #define CODE_BDPU 0
- #define CODE_IGMP_MLD 2
- #define CODE_ARP_MIRROR 4
- #define CFI(medsa) (medsa->bytes[3] & 0x01)
- #define PRI(medsa) (medsa->bytes[4] >> 5)
- #define VID(medsa) (((u_short)(medsa->bytes[4] & 0xf) << 8 | \
- medsa->bytes[5]))
- static const struct tok tag_values[] = {
- { TAG_TO_CPU, "To_CPU" },
- { TAG_FROM_CPU, "From_CPU" },
- { TAG_FORWARD, "Forward" },
- { 0, NULL },
- };
- static const struct tok code_values[] = {
- { CODE_BDPU, "BDPU" },
- { CODE_IGMP_MLD, "IGMP/MLD" },
- { CODE_ARP_MIRROR, "APR_Mirror" },
- { 0, NULL },
- };
- static void
- medsa_print_full(netdissect_options *ndo,
- const struct medsa_pkthdr *medsa,
- u_int caplen)
- {
- u_char tag = TAG(medsa);
- ND_PRINT((ndo, "%s",
- tok2str(tag_values, "Unknown (%u)", tag)));
- switch (tag) {
- case TAG_TO_CPU:
- ND_PRINT((ndo, ", %stagged", SRC_TAG(medsa) ? "" : "un"));
- ND_PRINT((ndo, ", dev.port:vlan %d.%d:%d",
- SRC_DEV(medsa), SRC_PORT(medsa), VID(medsa)));
- ND_PRINT((ndo, ", %s",
- tok2str(code_values, "Unknown (%u)", CODE(medsa))));
- if (CFI(medsa))
- ND_PRINT((ndo, ", CFI"));
- ND_PRINT((ndo, ", pri %d: ", PRI(medsa)));
- break;
- case TAG_FROM_CPU:
- ND_PRINT((ndo, ", %stagged", SRC_TAG(medsa) ? "" : "un"));
- ND_PRINT((ndo, ", dev.port:vlan %d.%d:%d",
- SRC_DEV(medsa), SRC_PORT(medsa), VID(medsa)));
- if (CFI(medsa))
- ND_PRINT((ndo, ", CFI"));
- ND_PRINT((ndo, ", pri %d: ", PRI(medsa)));
- break;
- case TAG_FORWARD:
- ND_PRINT((ndo, ", %stagged", SRC_TAG(medsa) ? "" : "un"));
- if (TRUNK(medsa))
- ND_PRINT((ndo, ", dev.trunk:vlan %d.%d:%d",
- SRC_DEV(medsa), SRC_PORT(medsa), VID(medsa)));
- else
- ND_PRINT((ndo, ", dev.port:vlan %d.%d:%d",
- SRC_DEV(medsa), SRC_PORT(medsa), VID(medsa)));
- if (CFI(medsa))
- ND_PRINT((ndo, ", CFI"));
- ND_PRINT((ndo, ", pri %d: ", PRI(medsa)));
- break;
- default:
- ND_DEFAULTPRINT((const u_char *)medsa, caplen);
- return;
- }
- }
- void
- medsa_print(netdissect_options *ndo,
- const u_char *bp, u_int length, u_int caplen,
- const struct lladdr_info *src, const struct lladdr_info *dst)
- {
- const struct medsa_pkthdr *medsa;
- u_short ether_type;
- medsa = (const struct medsa_pkthdr *)bp;
- ND_TCHECK(*medsa);
- if (!ndo->ndo_eflag)
- ND_PRINT((ndo, "MEDSA %d.%d:%d: ",
- SRC_DEV(medsa), SRC_PORT(medsa), VID(medsa)));
- else
- medsa_print_full(ndo, medsa, caplen);
- bp += 8;
- length -= 8;
- caplen -= 8;
- ether_type = EXTRACT_16BITS(&medsa->ether_type);
- if (ether_type <= ETHERMTU) {
-
- if (llc_print(ndo, bp, length, caplen, src, dst) < 0) {
-
- if (!ndo->ndo_suppress_default_print)
- ND_DEFAULTPRINT(bp, caplen);
- }
- } else {
- if (ndo->ndo_eflag)
- ND_PRINT((ndo, "ethertype %s (0x%04x) ",
- tok2str(ethertype_values, "Unknown",
- ether_type),
- ether_type));
- if (ethertype_print(ndo, ether_type, bp, length, caplen, src, dst) == 0) {
-
- if (!ndo->ndo_eflag)
- ND_PRINT((ndo, "ethertype %s (0x%04x) ",
- tok2str(ethertype_values, "Unknown",
- ether_type),
- ether_type));
- if (!ndo->ndo_suppress_default_print)
- ND_DEFAULTPRINT(bp, caplen);
- }
- }
- return;
- trunc:
- ND_PRINT((ndo, "%s", tstr));
- }
|