/* \summary: MPLS LSP PING printer */
+/* specification: RFC 4349 */
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "l2vpn.h"
#include "oui.h"
-/* RFC 4349 */
-
/*
* LSPPING common header
*
*/
struct lspping_common_header {
- uint8_t version[2];
- uint8_t global_flags[2];
- uint8_t msg_type;
- uint8_t reply_mode;
- uint8_t return_code;
- uint8_t return_subcode;
- uint8_t sender_handle[4];
- uint8_t seq_number[4];
- uint8_t ts_sent_sec[4];
- uint8_t ts_sent_usec[4];
- uint8_t ts_rcvd_sec[4];
- uint8_t ts_rcvd_usec[4];
+ nd_uint16_t version;
+ nd_uint16_t global_flags;
+ nd_uint8_t msg_type;
+ nd_uint8_t reply_mode;
+ nd_uint8_t return_code;
+ 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;
};
#define LSPPING_VERSION 1
*/
struct lspping_tlv_header {
- uint8_t type[2];
- uint8_t length[2];
+ nd_uint16_t type;
+ nd_uint16_t length;
};
#define LSPPING_TLV_TARGET_FEC_STACK 1
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_ldp_ipv4_t {
- uint8_t prefix [4];
- uint8_t prefix_len;
+ nd_ipv4 prefix;
+ nd_uint8_t prefix_len;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_ldp_ipv6_t {
- uint8_t prefix [16];
- uint8_t prefix_len;
+ nd_ipv6 prefix;
+ nd_uint8_t prefix_len;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_rsvp_ipv4_t {
- uint8_t tunnel_endpoint [4];
- uint8_t res[2];
- uint8_t tunnel_id[2];
- uint8_t extended_tunnel_id[4];
- uint8_t tunnel_sender [4];
- uint8_t res2[2];
- uint8_t lsp_id [2];
+ nd_ipv4 tunnel_endpoint;
+ nd_byte res[2];
+ nd_uint16_t tunnel_id;
+ nd_ipv4 extended_tunnel_id;
+ nd_ipv4 tunnel_sender;
+ nd_byte res2[2];
+ nd_uint16_t lsp_id;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_rsvp_ipv6_t {
- uint8_t tunnel_endpoint [16];
- uint8_t res[2];
- uint8_t tunnel_id[2];
- uint8_t extended_tunnel_id[16];
- uint8_t tunnel_sender [16];
- uint8_t res2[2];
- uint8_t lsp_id [2];
+ nd_ipv6 tunnel_endpoint;
+ nd_byte res[2];
+ nd_uint16_t tunnel_id;
+ nd_ipv6 extended_tunnel_id;
+ nd_ipv6 tunnel_sender;
+ nd_byte res2[2];
+ nd_uint16_t lsp_id;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_l3vpn_ipv4_t {
- uint8_t rd [8];
- uint8_t prefix [4];
- uint8_t prefix_len;
+ nd_byte rd[8];
+ nd_ipv4 prefix;
+ nd_uint8_t prefix_len;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_l3vpn_ipv6_t {
- uint8_t rd [8];
- uint8_t prefix [16];
- uint8_t prefix_len;
+ nd_byte rd[8];
+ nd_ipv6 prefix;
+ nd_uint8_t prefix_len;
};
/*
* 0 1 2 3
*/
struct lspping_tlv_targetfec_subtlv_l2vpn_endpt_t {
- uint8_t rd [8];
- uint8_t sender_ve_id [2];
- uint8_t receiver_ve_id [2];
- uint8_t encapsulation[2];
+ nd_byte rd[8];
+ nd_uint16_t sender_ve_id;
+ nd_uint16_t receiver_ve_id;
+ nd_uint16_t encapsulation;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_fec_128_pw_old {
- uint8_t remote_pe_address [4];
- uint8_t pw_id [4];
- uint8_t pw_type[2];
+ nd_ipv4 remote_pe_address;
+ nd_uint32_t pw_id;
+ nd_uint16_t pw_type;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_fec_128_pw {
- uint8_t sender_pe_address [4];
- uint8_t remote_pe_address [4];
- uint8_t pw_id [4];
- uint8_t pw_type[2];
+ nd_ipv4 sender_pe_address;
+ nd_ipv4 remote_pe_address;
+ nd_uint32_t pw_id;
+ nd_uint16_t pw_type;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_bgp_ipv4_t {
- uint8_t prefix [4];
- uint8_t prefix_len;
+ nd_ipv4 prefix;
+ nd_uint8_t prefix_len;
};
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct lspping_tlv_targetfec_subtlv_bgp_ipv6_t {
- uint8_t prefix [16];
- uint8_t prefix_len;
+ nd_ipv6 prefix;
+ nd_uint8_t prefix_len;
};
/*
*/
/* Enough to get the address type */
struct lspping_tlv_downstream_map_t {
- uint8_t mtu [2];
- uint8_t address_type;
- uint8_t ds_flags;
+ nd_uint16_t mtu;
+ nd_uint8_t address_type;
+ nd_uint8_t ds_flags;
};
struct lspping_tlv_downstream_map_ipv4_t {
- uint8_t mtu [2];
- uint8_t address_type;
- uint8_t ds_flags;
- uint8_t downstream_ip[4];
- uint8_t downstream_interface[4];
+ nd_uint16_t mtu;
+ nd_uint8_t address_type;
+ nd_uint8_t ds_flags;
+ nd_ipv4 downstream_ip;
+ nd_ipv4 downstream_interface;
};
struct lspping_tlv_downstream_map_ipv4_unmb_t {
- uint8_t mtu [2];
- uint8_t address_type;
- uint8_t ds_flags;
- uint8_t downstream_ip[4];
- uint8_t downstream_interface[4];
+ nd_uint16_t mtu;
+ nd_uint8_t address_type;
+ nd_uint8_t ds_flags;
+ nd_ipv4 downstream_ip;
+ nd_uint32_t downstream_interface;
};
struct lspping_tlv_downstream_map_ipv6_t {
- uint8_t mtu [2];
- uint8_t address_type;
- uint8_t ds_flags;
- uint8_t downstream_ip[16];
- uint8_t downstream_interface[16];
+ nd_uint16_t mtu;
+ nd_uint8_t address_type;
+ nd_uint8_t ds_flags;
+ nd_ipv6 downstream_ip;
+ nd_ipv6 downstream_interface;
};
struct lspping_tlv_downstream_map_ipv6_unmb_t {
- uint8_t mtu [2];
- uint8_t address_type;
- uint8_t ds_flags;
- uint8_t downstream_ip[16];
- uint8_t downstream_interface[4];
+ nd_uint16_t mtu;
+ nd_uint8_t address_type;
+ nd_uint8_t ds_flags;
+ nd_ipv6 downstream_ip;
+ nd_uint32_t downstream_interface;
};
struct lspping_tlv_downstream_map_info_t {
- uint8_t multipath_type;
- uint8_t depth_limit;
- uint8_t multipath_length [2];
+ nd_uint8_t multipath_type;
+ nd_uint8_t depth_limit;
+ nd_uint16_t multipath_length;
};
#define LSPPING_AFI_IPV4 1
const struct lspping_tlv_header *lspping_tlv_header;
const struct lspping_tlv_header *lspping_subtlv_header;
const u_char *tptr,*tlv_tptr,*subtlv_tptr;
+ u_int return_code, return_subcode;
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;
+ u_int address_type;
union {
const struct lspping_tlv_downstream_map_t *lspping_tlv_downstream_map;
/*
* Sanity checking of the header.
*/
- if (EXTRACT_BE_U_2(&lspping_com_header->version[0]) != LSPPING_VERSION) {
+ if (EXTRACT_BE_U_2(lspping_com_header->version) != LSPPING_VERSION) {
ND_PRINT((ndo, "LSP-PING version %u packet not supported",
- EXTRACT_BE_U_2(&lspping_com_header->version[0])));
+ EXTRACT_BE_U_2(lspping_com_header->version)));
return;
}
/* in non-verbose mode just lets print the basic Message Type*/
if (ndo->ndo_vflag < 1) {
ND_PRINT((ndo, "LSP-PINGv%u, %s, seq %u, length: %u",
- EXTRACT_BE_U_2(&lspping_com_header->version[0]),
- tok2str(lspping_msg_type_values, "unknown (%u)",lspping_com_header->msg_type),
+ EXTRACT_BE_U_2(lspping_com_header->version),
+ tok2str(lspping_msg_type_values, "unknown (%u)",EXTRACT_U_1(lspping_com_header->msg_type)),
EXTRACT_BE_U_4(lspping_com_header->seq_number),
len));
return;
tlen=len;
ND_PRINT((ndo, "\n\tLSP-PINGv%u, msg-type: %s (%u), length: %u\n\t reply-mode: %s (%u)",
- EXTRACT_BE_U_2(&lspping_com_header->version[0]),
- tok2str(lspping_msg_type_values, "unknown",lspping_com_header->msg_type),
- lspping_com_header->msg_type,
+ EXTRACT_BE_U_2(lspping_com_header->version),
+ tok2str(lspping_msg_type_values, "unknown",EXTRACT_U_1(lspping_com_header->msg_type)),
+ EXTRACT_U_1(lspping_com_header->msg_type),
len,
- tok2str(lspping_reply_mode_values, "unknown",lspping_com_header->reply_mode),
- lspping_com_header->reply_mode));
+ tok2str(lspping_reply_mode_values, "unknown",EXTRACT_U_1(lspping_com_header->reply_mode)),
+ EXTRACT_U_1(lspping_com_header->reply_mode)));
/*
* the following return codes require that the subcode is attached
* at the end of the translated token output
*/
- if (lspping_com_header->return_code == 3 ||
- lspping_com_header->return_code == 4 ||
- lspping_com_header->return_code == 8 ||
- lspping_com_header->return_code == 10 ||
- lspping_com_header->return_code == 11 ||
- lspping_com_header->return_code == 12 )
+ return_code = EXTRACT_U_1(lspping_com_header->return_code);
+ return_subcode = EXTRACT_U_1(lspping_com_header->return_subcode);
+ if (return_code == 3 ||
+ return_code == 4 ||
+ return_code == 8 ||
+ return_code == 10 ||
+ return_code == 11 ||
+ return_code == 12 )
ND_PRINT((ndo, "\n\t Return Code: %s %u (%u)\n\t Return Subcode: (%u)",
- tok2str(lspping_return_code_values, "unknown",lspping_com_header->return_code),
- lspping_com_header->return_subcode,
- lspping_com_header->return_code,
- lspping_com_header->return_subcode));
+ tok2str(lspping_return_code_values, "unknown",return_code),
+ return_subcode,
+ return_code,
+ return_subcode));
else
ND_PRINT((ndo, "\n\t Return Code: %s (%u)\n\t Return Subcode: (%u)",
- tok2str(lspping_return_code_values, "unknown",lspping_com_header->return_code),
- lspping_com_header->return_code,
- lspping_com_header->return_subcode));
+ tok2str(lspping_return_code_values, "unknown",return_code),
+ return_code,
+ return_subcode));
ND_PRINT((ndo, "\n\t Sender Handle: 0x%08x, Sequence: %u",
EXTRACT_BE_U_4(lspping_com_header->sender_handle),
(const struct lspping_tlv_targetfec_subtlv_ldp_ipv4_t *)subtlv_tptr;
ND_PRINT((ndo, "\n\t %s/%u",
ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix),
- subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix_len));
+ EXTRACT_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv4->prefix_len)));
}
break;
(const struct lspping_tlv_targetfec_subtlv_ldp_ipv6_t *)subtlv_tptr;
ND_PRINT((ndo, "\n\t %s/%u",
ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix),
- subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix_len));
+ EXTRACT_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_ldp_ipv6->prefix_len)));
}
break;
(const struct lspping_tlv_targetfec_subtlv_bgp_ipv4_t *)subtlv_tptr;
ND_PRINT((ndo, "\n\t %s/%u",
ipaddr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix),
- subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix_len));
+ EXTRACT_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv4->prefix_len)));
}
break;
(const struct lspping_tlv_targetfec_subtlv_bgp_ipv6_t *)subtlv_tptr;
ND_PRINT((ndo, "\n\t %s/%u",
ip6addr_string(ndo, subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix),
- subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix_len));
+ EXTRACT_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_bgp_ipv6->prefix_len)));
}
break;
ND_PRINT((ndo, "\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),
- subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix_len));
+ EXTRACT_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv4->prefix_len)));
}
break;
ND_PRINT((ndo, "\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),
- subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix_len));
+ EXTRACT_U_1(subtlv_ptr.lspping_tlv_targetfec_subtlv_l3vpn_ipv6->prefix_len)));
}
break;
* we do not know if its IPv4 or IPv6 or is unnumbered; after
* we find the address-type, we recast the tlv_tptr and move on. */
+ address_type = EXTRACT_U_1(tlv_ptr.lspping_tlv_downstream_map->address_type);
ND_PRINT((ndo, "\n\t MTU: %u, Address-Type: %s (%u)",
EXTRACT_BE_U_2(tlv_ptr.lspping_tlv_downstream_map->mtu),
tok2str(lspping_tlv_downstream_addr_values,
"unknown",
- tlv_ptr.lspping_tlv_downstream_map->address_type),
- tlv_ptr.lspping_tlv_downstream_map->address_type));
+ address_type),
+ address_type));
- switch(tlv_ptr.lspping_tlv_downstream_map->address_type) {
+ switch(address_type) {
case LSPPING_AFI_IPV4:
/* Does the data go past the end of the TLV? */