- u_int16_t *ptr = (u_int16_t *)dat;
-
- printf("%04x, ", EXTRACT_16BITS(ptr)); ptr++; /* Disconnect Code */
- printf("%04x ", EXTRACT_16BITS(ptr)); ptr++; /* Control Protocol Number */
- printf("%s", tok2str(l2tp_cc_direction2str,
- "Direction-#%u", *((u_char *)ptr++)));
-
- if (length > 5) {
- printf(" ");
- print_string((const u_char *)ptr, length-5);
+ if (length < 5) {
+ ND_PRINT("AVP too short");
+ return;
+ }
+ /* Disconnect Code */
+ ND_PRINT("%04x, ", GET_BE_U_2(dat));
+ dat += 2;
+ length -= 2;
+ /* Control Protocol Number */
+ ND_PRINT("%04x ", GET_BE_U_2(dat));
+ dat += 2;
+ length -= 2;
+ /* Direction */
+ ND_PRINT("%s", tok2str(l2tp_cc_direction2str,
+ "Direction-#%u", GET_U_1(dat)));
+ dat++;
+ length--;
+
+ if (length != 0) {
+ ND_PRINT(" ");
+ nd_printjn(ndo, (const u_char *)dat, length);