- ND_PRINT(" id %u", EXTRACT_U_1(add_addr->addr_id));
- switch (ipver) {
- case 4:
- ND_PRINT(" %s", ipaddr_string(ndo, add_addr->u.v4.addr));
- if (opt_len == 10)
- ND_PRINT(":%u", EXTRACT_BE_U_2(add_addr->u.v4.port));
- break;
- case 6:
- ND_PRINT(" %s", ip6addr_string(ndo, add_addr->u.v6.addr));
- if (opt_len == 22)
- ND_PRINT(":%u", EXTRACT_BE_U_2(add_addr->u.v6.port));
- break;
- default:
- return 0;
+ ND_PRINT(" %s",
+ tok2str(mptcp_addr_subecho_bits, "[bad version/echo]",
+ GET_U_1(add_addr->sub_echo) & 0xF));
+ ND_PRINT(" id %u", GET_U_1(add_addr->addr_id));
+ if (opt_len == 8 || opt_len == 10 || opt_len == 16 || opt_len == 18) {
+ ND_PRINT(" %s", GET_IPADDR_STRING(add_addr->u.v4.addr));
+ if (opt_len == 10 || opt_len == 18)
+ ND_PRINT(":%u", GET_BE_U_2(add_addr->u.v4.port));
+ if (opt_len == 16)
+ ND_PRINT(" hmac 0x%" PRIx64, GET_BE_U_8(add_addr->u.v4np.mac));
+ if (opt_len == 18)
+ ND_PRINT(" hmac 0x%" PRIx64, GET_BE_U_8(add_addr->u.v4.mac));
+ }
+
+ if (opt_len == 20 || opt_len == 22 || opt_len == 28 || opt_len == 30) {
+ ND_PRINT(" %s", GET_IP6ADDR_STRING(add_addr->u.v6.addr));
+ if (opt_len == 22 || opt_len == 30)
+ ND_PRINT(":%u", GET_BE_U_2(add_addr->u.v6.port));
+ if (opt_len == 28)
+ ND_PRINT(" hmac 0x%" PRIx64, GET_BE_U_8(add_addr->u.v6np.mac));
+ if (opt_len == 30)
+ ND_PRINT(" hmac 0x%" PRIx64, GET_BE_U_8(add_addr->u.v6.mac));