+ ND_TCHECK2(*tptr, MPCP_REPORT_QUEUESETS_LEN);
+ queue_sets = *tptr;
+ tptr+=MPCP_REPORT_QUEUESETS_LEN;
+ ND_PRINT((ndo, "\n\tTotal Queue-Sets %u", queue_sets));
+
+ for (queue_set = 1; queue_set < queue_sets; queue_set++) {
+ ND_TCHECK2(*tptr, MPCP_REPORT_REPORTBITMAP_LEN);
+ report_bitmap = *(tptr);
+ ND_PRINT((ndo, "\n\t Queue-Set #%u, Report-Bitmap [ %s ]",
+ queue_sets,
+ bittok2str(mpcp_report_bitmap_values, "Unknown", report_bitmap)));
+ tptr++;
+
+ report=1;
+ while (report_bitmap != 0) {
+ if (report_bitmap & 1) {
+ ND_TCHECK2(*tptr, MPCP_TIMESTAMP_DURATION_LEN);
+ ND_PRINT((ndo, "\n\t Q%u Report, Duration %u ticks",
+ report,
+ EXTRACT_16BITS(tptr)));
+ tptr+=MPCP_TIMESTAMP_DURATION_LEN;
+ }
+ report++;
+ report_bitmap = report_bitmap >> 1;
+ }
+ }
+ break;
+
+ case MPCP_OPCODE_REG_REQ:
+ ND_TCHECK2(*tptr, sizeof(const struct mpcp_reg_req_t));
+ mpcp.reg_req = (const struct mpcp_reg_req_t *)tptr;
+ ND_PRINT((ndo, "\n\tFlags [ %s ], Pending-Grants %u",
+ bittok2str(mpcp_reg_req_flag_values, "Reserved", mpcp.reg_req->flags),
+ mpcp.reg_req->pending_grants));
+ break;
+
+ case MPCP_OPCODE_REG:
+ ND_TCHECK2(*tptr, sizeof(const struct mpcp_reg_t));
+ mpcp.reg = (const struct mpcp_reg_t *)tptr;
+ ND_PRINT((ndo, "\n\tAssigned-Port %u, Flags [ %s ]" \
+ "\n\tSync-Time %u ticks, Echoed-Pending-Grants %u",
+ EXTRACT_16BITS(mpcp.reg->assigned_port),
+ bittok2str(mpcp_reg_flag_values, "Reserved", mpcp.reg->flags),
+ EXTRACT_16BITS(mpcp.reg->sync_time),
+ mpcp.reg->echoed_pending_grants));
+ break;
+
+ case MPCP_OPCODE_REG_ACK:
+ ND_TCHECK2(*tptr, sizeof(const struct mpcp_reg_ack_t));
+ mpcp.reg_ack = (const struct mpcp_reg_ack_t *)tptr;
+ ND_PRINT((ndo, "\n\tEchoed-Assigned-Port %u, Flags [ %s ]" \
+ "\n\tEchoed-Sync-Time %u ticks",
+ EXTRACT_16BITS(mpcp.reg_ack->echoed_assigned_port),
+ bittok2str(mpcp_reg_ack_flag_values, "Reserved", mpcp.reg_ack->flags),
+ EXTRACT_16BITS(mpcp.reg_ack->echoed_sync_time)));
+ break;
+