+ ND_TCHECK_4(cp);
+ ND_PRINT(", vport_no %u", GET_BE_U_4(cp));
+ cp += 4;
+ break;
+ case BSN_SHELL_COMMAND:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | service |
+ * +---------------+---------------+---------------+---------------+
+ * | data ...
+ * +---------------+---------------+--------
+ *
+ */
+ if (len < 8)
+ goto invalid;
+ /* service */
+ ND_TCHECK_4(cp);
+ ND_PRINT(", service %u", GET_BE_U_4(cp));
+ cp += 4;
+ /* data */
+ ND_PRINT(", data '");
+ if (nd_printn(ndo, cp, len - 8, ep)) {
+ ND_PRINT("'");
+ goto trunc;
+ }
+ ND_PRINT("'");
+ cp += len - 8;
+ break;
+ case BSN_SHELL_OUTPUT:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | data ...
+ * +---------------+---------------+--------
+ *
+ */
+ /* already checked that len >= 4 */
+ /* data */
+ ND_PRINT(", data '");
+ if (nd_printn(ndo, cp, len - 4, ep)) {
+ ND_PRINT("'");
+ goto trunc;
+ }
+ ND_PRINT("'");
+ cp += len - 4;
+ break;
+ case BSN_SHELL_STATUS:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | status |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 8)
+ goto invalid;
+ /* status */
+ ND_TCHECK_4(cp);
+ ND_PRINT(", status 0x%08x", GET_BE_U_4(cp));
+ cp += 4;
+ break;
+ default:
+ ND_TCHECK_LEN(cp, len - 4);
+ cp += len - 4;
+ }
+ return cp;
+
+invalid: /* skip the undersized data */
+ nd_print_invalid(ndo);
+ ND_TCHECK_LEN(cp0, len);
+ return cp0 + len;
+trunc:
+ nd_print_trunc(ndo);
+ return ep;
+}
+
+static const u_char *
+of10_bsn_actions_print(netdissect_options *ndo,
+ const u_char *cp, const u_char *ep, const u_int len)
+{
+ const u_char *cp0 = cp;
+ uint32_t subtype, vlan_tag;
+
+ if (len < 4)
+ goto invalid;
+ /* subtype */
+ ND_TCHECK_4(cp);
+ subtype = GET_BE_U_4(cp);
+ cp += 4;
+ ND_PRINT("\n\t subtype %s", tok2str(bsn_action_subtype_str, "unknown (0x%08x)", subtype));
+ switch (subtype) {
+ case BSN_ACTION_MIRROR:
+ /*
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +---------------+---------------+---------------+---------------+
+ * | subtype |
+ * +---------------+---------------+---------------+---------------+
+ * | dest_port |
+ * +---------------+---------------+---------------+---------------+
+ * | vlan_tag |
+ * +---------------+---------------+---------------+---------------+
+ * | copy_stage | pad |
+ * +---------------+---------------+---------------+---------------+
+ *
+ */
+ if (len != 16)
+ goto invalid;
+ /* dest_port */
+ ND_TCHECK_4(cp);
+ ND_PRINT(", dest_port %u", GET_BE_U_4(cp));
+ cp += 4;
+ /* vlan_tag */
+ ND_TCHECK_4(cp);
+ vlan_tag = GET_BE_U_4(cp);