void slow_print(register const u_char *pptr, register u_int len) { int print_version; slow_com_header = (const struct slow_common_header_t *)pptr; TCHECK(*slow_com_header); /* * Sanity checking of the header. */ switch (slow_com_header->proto_subtype) { case SLOW_PROTO_LACP: if (slow_com_header->version != LACP_VERSION) { printf("LACP version %u packet not supported",slow_com_header->version); return; } print_version = 1; break; case SLOW_PROTO_MARKER: if (slow_com_header->version != MARKER_VERSION) { printf("MARKER version %u packet not supported",slow_com_header->version); return; } print_version = 1; break; case SLOW_PROTO_OAM: /* fall through */ print_version = 0; break; default: /* print basic information and exit */ print_version = -1; break; } if (print_version) { printf("%sv%u, length %u", tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype), slow_com_header->version, len); } else { /* some slow protos don't have a version number in the header */ printf("%s, length %u", tok2str(slow_proto_values, "unknown (%u)",slow_com_header->proto_subtype), len); } /* unrecognized subtype */ if (print_version == -1) { print_unknown_data(pptr, "\n\t", len); return; } if (!vflag) return; switch (slow_com_header->proto_subtype) { default: /* should not happen */ break; case SLOW_PROTO_OAM: /* skip proto_subtype */ slow_oam_print(pptr+1, len-1); break; case SLOW_PROTO_LACP: /* LACP and MARKER share the same semantics */ case SLOW_PROTO_MARKER: /* skip slow_common_header */ len -= sizeof(const struct slow_common_header_t); pptr += sizeof(const struct slow_common_header_t); slow_marker_lacp_print(pptr, len); break; } return; trunc: printf("\n\t\t packet exceeded snapshot"); }
void slow_print(netdissect_options *ndo, const u_char *pptr, u_int len) { int print_version; u_int subtype; ndo->ndo_protocol = "slow"; if (len < 1) goto tooshort; ND_TCHECK_1(pptr); subtype = EXTRACT_U_1(pptr); /* * Sanity checking of the header. */ switch (subtype) { case SLOW_PROTO_LACP: if (len < 2) goto tooshort; ND_TCHECK_1(pptr + 1); if (EXTRACT_U_1(pptr + 1) != LACP_VERSION) { ND_PRINT("LACP version %u packet not supported", EXTRACT_U_1(pptr + 1)); return; } print_version = 1; break; case SLOW_PROTO_MARKER: if (len < 2) goto tooshort; ND_TCHECK_1(pptr + 1); if (EXTRACT_U_1(pptr + 1) != MARKER_VERSION) { ND_PRINT("MARKER version %u packet not supported", EXTRACT_U_1(pptr + 1)); return; } print_version = 1; break; case SLOW_PROTO_OAM: /* fall through */ print_version = 0; break; default: /* print basic information and exit */ print_version = -1; break; } if (print_version == 1) { ND_PRINT("%sv%u, length %u", tok2str(slow_proto_values, "unknown (%u)", subtype), EXTRACT_U_1((pptr + 1)), len); } else { /* some slow protos don't have a version number in the header */ ND_PRINT("%s, length %u", tok2str(slow_proto_values, "unknown (%u)", subtype), len); } /* unrecognized subtype */ if (print_version == -1) { print_unknown_data(ndo, pptr, "\n\t", len); return; } if (!ndo->ndo_vflag) return; switch (subtype) { default: /* should not happen */ break; case SLOW_PROTO_OAM: /* skip subtype */ len -= 1; pptr += 1; slow_oam_print(ndo, pptr, len); break; case SLOW_PROTO_LACP: /* LACP and MARKER share the same semantics */ case SLOW_PROTO_MARKER: /* skip subtype and version */ len -= 2; pptr += 2; slow_marker_lacp_print(ndo, pptr, len, subtype); break; } return; tooshort: if (!ndo->ndo_vflag) ND_PRINT(" (packet is too short)"); else ND_PRINT("\n\t\t packet is too short"); return; trunc: ND_PRINT("%s", tstr); }