+ ND_PRINT("%s",
+ GET_IPADDR_STRING(tlv_ptr.eigrp_tlv_ip_int->nexthop));
+
+ ND_PRINT("\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u",
+ (GET_BE_U_4(tlv_ptr.eigrp_tlv_ip_int->delay)/100),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_ip_int->bandwidth),
+ GET_BE_U_3(tlv_ptr.eigrp_tlv_ip_int->mtu),
+ GET_U_1(tlv_ptr.eigrp_tlv_ip_int->hopcount),
+ GET_U_1(tlv_ptr.eigrp_tlv_ip_int->reliability),
+ GET_U_1(tlv_ptr.eigrp_tlv_ip_int->load));
+ break;
+
+ case EIGRP_TLV_IP_EXT:
+ tlv_ptr.eigrp_tlv_ip_ext = (const struct eigrp_tlv_ip_ext_t *)tlv_tptr;
+ if (tlv_tlen < sizeof(*tlv_ptr.eigrp_tlv_ip_ext)) {
+ ND_PRINT(" (too short, < %zu)",
+ sizeof(struct eigrp_tlv_header) + sizeof(*tlv_ptr.eigrp_tlv_ip_ext));
+ break;
+ }
+
+ bit_length = GET_U_1(tlv_ptr.eigrp_tlv_ip_ext->plen);
+ if (bit_length > 32) {
+ ND_PRINT("\n\t illegal prefix length %u",bit_length);
+ break;
+ }
+ byte_length = (bit_length + 7) / 8; /* variable length encoding */
+ memset(prefix, 0, 4);
+ GET_CPY_BYTES(prefix, tlv_ptr.eigrp_tlv_ip_ext->destination, byte_length);
+
+ ND_PRINT("\n\t IPv4 prefix: %15s/%u, nexthop: ",
+ ipaddr_string(ndo, prefix), /* local buffer, not packet data; don't use GET_IPADDR_STRING() */
+ bit_length);
+ if (GET_BE_U_4(tlv_ptr.eigrp_tlv_ip_ext->nexthop) == 0)
+ ND_PRINT("self");
+ else
+ ND_PRINT("%s",
+ GET_IPADDR_STRING(tlv_ptr.eigrp_tlv_ip_ext->nexthop));
+
+ ND_PRINT("\n\t origin-router %s, origin-as %u, origin-proto %s, flags [0x%02x], tag 0x%08x, metric %u",
+ GET_IPADDR_STRING(tlv_ptr.eigrp_tlv_ip_ext->origin_router),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_ip_ext->origin_as),
+ tok2str(eigrp_ext_proto_id_values,"unknown",GET_U_1(tlv_ptr.eigrp_tlv_ip_ext->proto_id)),
+ GET_U_1(tlv_ptr.eigrp_tlv_ip_ext->flags),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_ip_ext->tag),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_ip_ext->metric));
+
+ ND_PRINT("\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u",
+ (GET_BE_U_4(tlv_ptr.eigrp_tlv_ip_ext->delay)/100),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_ip_ext->bandwidth),
+ GET_BE_U_3(tlv_ptr.eigrp_tlv_ip_ext->mtu),
+ GET_U_1(tlv_ptr.eigrp_tlv_ip_ext->hopcount),
+ GET_U_1(tlv_ptr.eigrp_tlv_ip_ext->reliability),
+ GET_U_1(tlv_ptr.eigrp_tlv_ip_ext->load));
+ break;
+
+ case EIGRP_TLV_AT_CABLE_SETUP:
+ tlv_ptr.eigrp_tlv_at_cable_setup = (const struct eigrp_tlv_at_cable_setup_t *)tlv_tptr;
+ if (tlv_tlen < sizeof(*tlv_ptr.eigrp_tlv_at_cable_setup)) {
+ ND_PRINT(" (too short, < %zu)",
+ sizeof(struct eigrp_tlv_header) + sizeof(*tlv_ptr.eigrp_tlv_at_cable_setup));
+ break;
+ }
+
+ ND_PRINT("\n\t Cable-range: %u-%u, Router-ID %u",
+ GET_BE_U_2(tlv_ptr.eigrp_tlv_at_cable_setup->cable_start),
+ GET_BE_U_2(tlv_ptr.eigrp_tlv_at_cable_setup->cable_end),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_at_cable_setup->router_id));
+ break;
+
+ case EIGRP_TLV_AT_INT:
+ tlv_ptr.eigrp_tlv_at_int = (const struct eigrp_tlv_at_int_t *)tlv_tptr;
+ if (tlv_tlen < sizeof(*tlv_ptr.eigrp_tlv_at_int)) {
+ ND_PRINT(" (too short, < %zu)",
+ sizeof(struct eigrp_tlv_header) + sizeof(*tlv_ptr.eigrp_tlv_at_int));
+ break;
+ }
+
+ ND_PRINT("\n\t Cable-Range: %u-%u, nexthop: ",
+ GET_BE_U_2(tlv_ptr.eigrp_tlv_at_int->cable_start),
+ GET_BE_U_2(tlv_ptr.eigrp_tlv_at_int->cable_end));
+
+ if (GET_BE_U_4(tlv_ptr.eigrp_tlv_at_int->nexthop) == 0)
+ ND_PRINT("self");
+ else
+ ND_PRINT("%u.%u",
+ GET_BE_U_2(&tlv_ptr.eigrp_tlv_at_int->nexthop[0]),
+ GET_BE_U_2(&tlv_ptr.eigrp_tlv_at_int->nexthop[2]));
+
+ ND_PRINT("\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u",
+ (GET_BE_U_4(tlv_ptr.eigrp_tlv_at_int->delay)/100),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_at_int->bandwidth),
+ GET_BE_U_3(tlv_ptr.eigrp_tlv_at_int->mtu),
+ GET_U_1(tlv_ptr.eigrp_tlv_at_int->hopcount),
+ GET_U_1(tlv_ptr.eigrp_tlv_at_int->reliability),
+ GET_U_1(tlv_ptr.eigrp_tlv_at_int->load));
+ break;
+
+ case EIGRP_TLV_AT_EXT:
+ tlv_ptr.eigrp_tlv_at_ext = (const struct eigrp_tlv_at_ext_t *)tlv_tptr;
+ if (tlv_tlen < sizeof(*tlv_ptr.eigrp_tlv_at_ext)) {
+ ND_PRINT(" (too short, < %zu)",
+ sizeof(struct eigrp_tlv_header) + sizeof(*tlv_ptr.eigrp_tlv_at_ext));
+ break;
+ }
+
+ ND_PRINT("\n\t Cable-Range: %u-%u, nexthop: ",
+ GET_BE_U_2(tlv_ptr.eigrp_tlv_at_ext->cable_start),
+ GET_BE_U_2(tlv_ptr.eigrp_tlv_at_ext->cable_end));
+
+ if (GET_BE_U_4(tlv_ptr.eigrp_tlv_at_ext->nexthop) == 0)
+ ND_PRINT("self");
+ else
+ ND_PRINT("%u.%u",
+ GET_BE_U_2(&tlv_ptr.eigrp_tlv_at_ext->nexthop[0]),
+ GET_BE_U_2(&tlv_ptr.eigrp_tlv_at_ext->nexthop[2]));
+
+ ND_PRINT("\n\t origin-router %u, origin-as %u, origin-proto %s, flags [0x%02x], tag 0x%08x, metric %u",
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_at_ext->origin_router),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_at_ext->origin_as),
+ tok2str(eigrp_ext_proto_id_values,"unknown",GET_U_1(tlv_ptr.eigrp_tlv_at_ext->proto_id)),
+ GET_U_1(tlv_ptr.eigrp_tlv_at_ext->flags),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_at_ext->tag),
+ GET_BE_U_2(tlv_ptr.eigrp_tlv_at_ext->metric));
+
+ ND_PRINT("\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u",
+ (GET_BE_U_4(tlv_ptr.eigrp_tlv_at_ext->delay)/100),
+ GET_BE_U_4(tlv_ptr.eigrp_tlv_at_ext->bandwidth),
+ GET_BE_U_3(tlv_ptr.eigrp_tlv_at_ext->mtu),
+ GET_U_1(tlv_ptr.eigrp_tlv_at_ext->hopcount),
+ GET_U_1(tlv_ptr.eigrp_tlv_at_ext->reliability),
+ GET_U_1(tlv_ptr.eigrp_tlv_at_ext->load));