+static int
+lmp_print_data_link_subobjs(netdissect_options *ndo, const u_char *obj_tptr,
+ int total_subobj_len, int offset)
+{
+ int hexdump = FALSE;
+ int subobj_type, subobj_len;
+
+ while (total_subobj_len > 0 && hexdump == FALSE ) {
+ subobj_type = GET_U_1(obj_tptr + offset);
+ subobj_len = GET_U_1(obj_tptr + offset + 1);
+ ND_PRINT("\n\t Subobject, Type: %s (%u), Length: %u",
+ tok2str(lmp_data_link_subobj,
+ "Unknown",
+ subobj_type),
+ subobj_type,
+ subobj_len);
+ if (subobj_len < 4) {
+ ND_PRINT(" (too short)");
+ break;
+ }
+ if ((subobj_len % 4) != 0) {
+ ND_PRINT(" (not a multiple of 4)");
+ break;
+ }
+ if (total_subobj_len < subobj_len) {
+ ND_PRINT(" (goes past the end of the object)");
+ break;
+ }
+ switch(subobj_type) {
+ case INT_SWITCHING_TYPE_SUBOBJ:
+ ND_PRINT("\n\t Switching Type: %s (%u)",
+ tok2str(gmpls_switch_cap_values,
+ "Unknown",
+ GET_U_1(obj_tptr + offset + 2)),
+ GET_U_1(obj_tptr + offset + 2));
+ ND_PRINT("\n\t Encoding Type: %s (%u)",
+ tok2str(gmpls_encoding_values,
+ "Unknown",
+ GET_U_1(obj_tptr + offset + 3)),
+ GET_U_1(obj_tptr + offset + 3));
+ ND_PRINT("\n\t Min Reservable Bandwidth: %.3f Mbps",
+ GET_BE_F_4(obj_tptr + offset + 4)*8/1000000);
+ ND_PRINT("\n\t Max Reservable Bandwidth: %.3f Mbps",
+ GET_BE_F_4(obj_tptr + offset + 8)*8/1000000);
+ break;
+ case WAVELENGTH_SUBOBJ:
+ ND_PRINT("\n\t Wavelength: %u",
+ GET_BE_U_4(obj_tptr + offset + 4));
+ break;
+ default:
+ /* Any Unknown Subobject ==> Exit loop */
+ hexdump=TRUE;
+ break;
+ }
+ total_subobj_len-=subobj_len;
+ offset+=subobj_len;
+ }
+ return (hexdump);
+}