X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/ee68aa36460d7efeca48747f33b7f2adc0900bfb..d9a787e4995b4b5101e410ed1e93367907ab9fe2:/print-lspping.c diff --git a/print-lspping.c b/print-lspping.c index cf2abb2b..4c5fc4e8 100644 --- a/print-lspping.c +++ b/print-lspping.c @@ -15,7 +15,7 @@ /* \summary: MPLS LSP PING printer */ -/* specification: RFC 4349 */ +/* specification: RFC 4379 */ #ifdef HAVE_CONFIG_H #include @@ -23,9 +23,11 @@ #include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "extract.h" #include "addrtoname.h" +#include "ntp.h" #include "l2vpn.h" #include "oui.h" @@ -68,10 +70,8 @@ struct lspping_common_header { nd_uint8_t return_subcode; nd_uint32_t sender_handle; nd_uint32_t seq_number; - nd_uint32_t ts_sent_sec; - nd_uint32_t ts_sent_usec; - nd_uint32_t ts_rcvd_sec; - nd_uint32_t ts_rcvd_usec; + struct l_fixedpt ts_sent; + struct l_fixedpt ts_rcvd; }; #define LSPPING_VERSION 1 @@ -498,7 +498,7 @@ lspping_print(netdissect_options *ndo, u_int tlen,lspping_tlv_len,lspping_tlv_type,tlv_tlen; int tlv_hexdump,subtlv_hexdump; u_int lspping_subtlv_len,lspping_subtlv_type; - struct timeval timestamp; + uint32_t int_part, fraction; u_int address_type; union { @@ -589,16 +589,15 @@ lspping_print(netdissect_options *ndo, GET_BE_U_4(lspping_com_header->sender_handle), GET_BE_U_4(lspping_com_header->seq_number)); - timestamp.tv_sec=GET_BE_U_4(lspping_com_header->ts_sent_sec); - timestamp.tv_usec=GET_BE_U_4(lspping_com_header->ts_sent_usec); ND_PRINT("\n\t Sender Timestamp: "); - ts_print(ndo, ×tamp); + p_ntp_time(ndo, &lspping_com_header->ts_sent); + ND_PRINT(" "); - timestamp.tv_sec=GET_BE_U_4(lspping_com_header->ts_rcvd_sec); - timestamp.tv_usec=GET_BE_U_4(lspping_com_header->ts_rcvd_usec); + int_part=GET_BE_U_4(lspping_com_header->ts_rcvd.int_part); + fraction=GET_BE_U_4(lspping_com_header->ts_rcvd.fraction); ND_PRINT("Receiver Timestamp: "); - if ((timestamp.tv_sec != 0) && (timestamp.tv_usec != 0)) - ts_print(ndo, ×tamp); + if (! (int_part == 0 && fraction == 0)) + p_ntp_time(ndo, &lspping_com_header->ts_rcvd); else ND_PRINT("no timestamp"); @@ -610,9 +609,6 @@ lspping_print(netdissect_options *ndo, if (tlen < sizeof(struct lspping_tlv_header)) goto tooshort; - /* did we capture enough for fully decoding the tlv header ? */ - ND_TCHECK_LEN(tptr, sizeof(struct lspping_tlv_header)); - lspping_tlv_header = (const struct lspping_tlv_header *)tptr; lspping_tlv_type=GET_BE_U_2(lspping_tlv_header->type); lspping_tlv_len=GET_BE_U_2(lspping_tlv_header->length); @@ -650,8 +646,6 @@ lspping_print(netdissect_options *ndo, tlv_hexdump = TRUE; goto tlv_tooshort; } - /* did we capture enough for fully decoding the subtlv header ? */ - ND_TCHECK_LEN(tlv_tptr, sizeof(struct lspping_tlv_header)); subtlv_hexdump=FALSE; lspping_subtlv_header = (const struct lspping_tlv_header *)tlv_tptr; @@ -687,7 +681,7 @@ lspping_print(netdissect_options *ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4 = (const struct lspping_tlv_targetfec_subtlv_ldp_ipv4_t *)subtlv_tptr; ND_PRINT("\n\t %s/%u", - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix), + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix), GET_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix_len)); } break; @@ -701,7 +695,7 @@ lspping_print(netdissect_options *ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6 = (const struct lspping_tlv_targetfec_subtlv_ldp_ipv6_t *)subtlv_tptr; ND_PRINT("\n\t %s/%u", - ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix), + GET_IP6ADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix), GET_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix_len)); } break; @@ -715,7 +709,7 @@ lspping_print(netdissect_options *ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4 = (const struct lspping_tlv_targetfec_subtlv_bgp_ipv4_t *)subtlv_tptr; ND_PRINT("\n\t %s/%u", - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix), + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix), GET_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix_len)); } break; @@ -729,7 +723,7 @@ lspping_print(netdissect_options *ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6 = (const struct lspping_tlv_targetfec_subtlv_bgp_ipv6_t *)subtlv_tptr; ND_PRINT("\n\t %s/%u", - ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix), + GET_IP6ADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix), GET_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix_len)); } break; @@ -744,11 +738,11 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_targetfec_subtlv_rsvp_ipv4_t *)subtlv_tptr; ND_PRINT("\n\t tunnel end-point %s, tunnel sender %s, lsp-id 0x%04x" "\n\t tunnel-id 0x%04x, extended tunnel-id %s", - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_endpoint), - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_sender), + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_endpoint), + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_sender), GET_BE_U_2(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->lsp_id), GET_BE_U_2(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->tunnel_id), - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->extended_tunnel_id)); + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv4->extended_tunnel_id)); } break; @@ -762,11 +756,11 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_targetfec_subtlv_rsvp_ipv6_t *)subtlv_tptr; ND_PRINT("\n\t tunnel end-point %s, tunnel sender %s, lsp-id 0x%04x" "\n\t tunnel-id 0x%04x, extended tunnel-id %s", - ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_endpoint), - ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_sender), + GET_IP6ADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_endpoint), + GET_IP6ADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_sender), GET_BE_U_2(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->lsp_id), GET_BE_U_2(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->tunnel_id), - ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->extended_tunnel_id)); + GET_IP6ADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_rsvp_ipv6->extended_tunnel_id)); } break; @@ -780,7 +774,7 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv4_t *)subtlv_tptr; ND_PRINT("\n\t RD: %s, %s/%u", bgp_vpn_rd_print(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->rd), - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix), + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix), GET_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix_len)); } break; @@ -795,7 +789,7 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_targetfec_subtlv_l3vpn_ipv6_t *)subtlv_tptr; ND_PRINT("\n\t RD: %s, %s/%u", bgp_vpn_rd_print(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->rd), - ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix), + GET_IP6ADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix), GET_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix_len)); } break; @@ -831,7 +825,7 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_targetfec_subtlv_fec_128_pw_old *)subtlv_tptr; ND_PRINT("\n\t Remote PE: %s" "\n\t PW ID: 0x%08x, PW Type: %s (%u)", - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->remote_pe_address), + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->remote_pe_address), GET_BE_U_4(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid_old->pw_id), tok2str(mpls_pw_types_values, "unknown", @@ -850,8 +844,8 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_targetfec_subtlv_fec_128_pw *)subtlv_tptr; ND_PRINT("\n\t Sender PE: %s, Remote PE: %s" "\n\t PW ID: 0x%08x, PW Type: %s (%u)", - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->sender_pe_address), - ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->remote_pe_address), + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->sender_pe_address), + GET_IPADDR_STRING(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->remote_pe_address), GET_BE_U_4(subtlv_ptr.lspping_tlv_targetfec_subtlv_l2vpn_vcid->pw_id), tok2str(mpls_pw_types_values, "unknown", @@ -927,8 +921,8 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_downstream_map_ipv4_t *)tlv_tptr; ND_PRINT("\n\t Downstream IP: %s" "\n\t Downstream Interface IP: %s", - ipaddr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_ip), - ipaddr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_interface)); + GET_IPADDR_STRING(tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_ip), + GET_IPADDR_STRING(tlv_ptr.lspping_tlv_downstream_map_ipv4->downstream_interface)); tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv4_t); tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv4_t); break; @@ -947,7 +941,7 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_downstream_map_ipv4_unmb_t *)tlv_tptr; ND_PRINT("\n\t Downstream IP: %s" "\n\t Downstream Interface Index: 0x%08x", - ipaddr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv4_unmb->downstream_ip), + GET_IPADDR_STRING(tlv_ptr.lspping_tlv_downstream_map_ipv4_unmb->downstream_ip), GET_BE_U_4(tlv_ptr.lspping_tlv_downstream_map_ipv4_unmb->downstream_interface)); tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv4_unmb_t); tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv4_unmb_t); @@ -967,8 +961,8 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_downstream_map_ipv6_t *)tlv_tptr; ND_PRINT("\n\t Downstream IP: %s" "\n\t Downstream Interface IP: %s", - ip6addr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv6->downstream_ip), - ip6addr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv6->downstream_interface)); + GET_IP6ADDR_STRING(tlv_ptr.lspping_tlv_downstream_map_ipv6->downstream_ip), + GET_IP6ADDR_STRING(tlv_ptr.lspping_tlv_downstream_map_ipv6->downstream_interface)); tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv6_t); tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv6_t); break; @@ -987,7 +981,7 @@ lspping_print(netdissect_options *ndo, (const struct lspping_tlv_downstream_map_ipv6_unmb_t *)tlv_tptr; ND_PRINT("\n\t Downstream IP: %s" "\n\t Downstream Interface Index: 0x%08x", - ip6addr_string(ndo, tlv_ptr.lspping_tlv_downstream_map_ipv6_unmb->downstream_ip), + GET_IP6ADDR_STRING(tlv_ptr.lspping_tlv_downstream_map_ipv6_unmb->downstream_ip), GET_BE_U_4(tlv_ptr.lspping_tlv_downstream_map_ipv6_unmb->downstream_interface)); tlv_tptr+=sizeof(struct lspping_tlv_downstream_map_ipv6_unmb_t); tlv_tlen-=sizeof(struct lspping_tlv_downstream_map_ipv6_unmb_t); @@ -1028,8 +1022,7 @@ lspping_print(netdissect_options *ndo, tlv_hexdump = TRUE; goto tlv_tooshort; } else { - ND_TCHECK_LEN(tptr, LSPPING_TLV_BFD_DISCRIMINATOR_LEN); - ND_PRINT("\n\t BFD Discriminator 0x%08x", GET_BE_U_4(tptr)); + ND_PRINT("\n\t BFD Discriminator 0x%08x", GET_BE_U_4(tlv_tptr)); } break; @@ -1042,7 +1035,6 @@ lspping_print(netdissect_options *ndo, tlv_hexdump = TRUE; goto tlv_tooshort; } else { - ND_TCHECK_LEN(tptr, LSPPING_TLV_VENDOR_ENTERPRISE_LEN); vendor_id = GET_BE_U_4(tlv_tptr); ND_PRINT("\n\t Vendor: %s (0x%04x)", tok2str(smi_values, "Unknown", vendor_id), @@ -1085,8 +1077,4 @@ lspping_print(netdissect_options *ndo, return; tooshort: ND_PRINT("\n\t\t packet is too short"); - return; -trunc: - nd_print_trunc(ndo); - return; }