2003-11-23 22:00:48 +00:00
/* packet-bfd.c
2007-09-07 19:05:55 +00:00
* Routines for Bidirectional Forwarding Detection ( BFD ) message dissection
2012-05-01 01:04:24 +00:00
* RFCs 5880 , 5881 , 5882 , 5883 , 5884 , 5885
* ( and http : //tools.ietf.org/html/draft-ietf-bfd-base-01 for version 0)
2003-11-23 22:00:48 +00:00
*
* Copyright 2003 , Hannes Gredler < hannes @ juniper . net >
2006-02-20 17:21:47 +00:00
* Copyright 2006 , Balint Reczey < Balint . Reczey @ ericsson . com >
2007-09-07 19:05:55 +00:00
* Copyright 2007 , Todd J Martin < todd . martin @ acm . org >
2003-11-23 22:00:48 +00:00
*
2011-12-06 07:07:19 +00:00
* Copyright 2011 , Jaihari Kalijanakiraman < jaiharik @ ipinfusion . com >
* Krishnamurthy Mayya < krishnamurthy . mayya @ ipinfusion . com >
2011-12-02 05:46:11 +00:00
* Nikitha Malgi < malgi . nikitha @ ipinfusion . com >
2011-11-30 20:00:42 +00:00
* - support for MPLS - TP BFD Proactive CV Message Format as per RFC 6428
2012-04-30 21:50:21 +00:00
* - includes decoding support for Section MEP - ID , LSP MEP - ID , PW MEP - ID
2011-11-30 20:00:42 +00:00
*
2006-05-21 04:49:01 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
2003-11-23 22:00:48 +00:00
* Copyright 1998 Gerald Combs
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
2012-06-28 22:56:06 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2003-11-23 22:00:48 +00:00
*/
2012-09-20 02:03:38 +00:00
# include "config.h"
2003-11-23 22:00:48 +00:00
# include <epan/packet.h>
2007-09-07 19:05:55 +00:00
# include <epan/expert.h>
2003-11-23 22:00:48 +00:00
2011-11-28 17:59:54 +00:00
# include "packet-bfd.h"
2014-11-09 19:00:01 +00:00
# include "packet-mpls.h"
2011-11-28 17:59:54 +00:00
2013-03-14 07:37:13 +00:00
void proto_register_bfd ( void ) ;
void proto_reg_handoff_bfd ( void ) ;
2007-09-07 19:05:55 +00:00
# define UDP_PORT_BFD_1HOP_CONTROL 3784 /* draft-katz-ward-bfd-v4v6-1hop-00.txt */
# define UDP_PORT_BFD_MULTIHOP_CONTROL 4784 /* draft-ietf-bfd-multihop-05.txt */
2003-11-23 22:00:48 +00:00
2011-11-28 17:13:45 +00:00
/* As per RFC 6428 : http://tools.ietf.org/html/rfc6428
Section : 3.5 */
2012-04-30 21:50:21 +00:00
# define TLV_TYPE_MPLSTP_SECTION_MEP 0
2011-11-28 17:13:45 +00:00
# define TLV_TYPE_MPLSTP_LSP_MEP 1
# define TLV_TYPE_MPLSTP_PW_MEP 2
static const value_string mplstp_mep_tlv_type_values [ ] = {
{ TLV_TYPE_MPLSTP_SECTION_MEP , " Section MEP-ID " } ,
{ TLV_TYPE_MPLSTP_LSP_MEP , " LSP MEP-ID " } ,
{ TLV_TYPE_MPLSTP_PW_MEP , " PW MEP-ID " } ,
{ 0 , NULL }
} ;
2006-02-20 17:21:47 +00:00
static const value_string bfd_control_v0_diag_values [ ] = {
2003-11-23 22:00:48 +00:00
{ 0 , " No Diagnostic " } ,
{ 1 , " Control Detection Time Expired " } ,
{ 2 , " Echo Function Failed " } ,
{ 3 , " Neighbor Signaled Session Down " } ,
{ 4 , " Forwarding Plane Reset " } ,
{ 5 , " Path Down " } ,
{ 6 , " Concatenated Path Down " } ,
{ 7 , " Administratively Down " } ,
{ 0 , NULL }
} ;
2006-02-20 17:21:47 +00:00
static const value_string bfd_control_v1_diag_values [ ] = {
{ 0 , " No Diagnostic " } ,
{ 1 , " Control Detection Time Expired " } ,
{ 2 , " Echo Function Failed " } ,
{ 3 , " Neighbor Signaled Session Down " } ,
{ 4 , " Forwarding Plane Reset " } ,
{ 5 , " Path Down " } ,
{ 6 , " Concatenated Path Down " } ,
{ 7 , " Administratively Down " } ,
{ 8 , " Reverse Concatenated Path Down " } ,
2011-11-28 17:13:45 +00:00
{ 9 , " Mis-Connectivity Defect " } ,
2003-11-23 22:00:48 +00:00
{ 0 , NULL }
} ;
2006-02-20 17:21:47 +00:00
static const value_string bfd_control_sta_values [ ] = {
{ 0 , " AdminDown " } ,
{ 1 , " Down " } ,
{ 2 , " Init " } ,
2006-02-27 15:39:08 +00:00
{ 3 , " Up " } ,
{ 0 , NULL }
2006-02-20 17:21:47 +00:00
} ;
2007-09-07 19:05:55 +00:00
# define BFD_AUTH_SIMPLE 1
# define BFD_AUTH_MD5 2
# define BFD_AUTH_MET_MD5 3
# define BFD_AUTH_SHA1 4
# define BFD_AUTH_MET_SHA1 5
static const value_string bfd_control_auth_type_values [ ] = {
{ BFD_AUTH_SIMPLE , " Simple Password " } ,
{ BFD_AUTH_MD5 , " Keyed MD5 " } ,
{ BFD_AUTH_MET_MD5 , " Meticulous Keyed MD5 " } ,
{ BFD_AUTH_SHA1 , " Keyed SHA1 " } ,
{ BFD_AUTH_MET_SHA1 , " Meticulous Keyed SHA1 " } ,
{ 0 , NULL }
} ;
/* Per the standard, the simple password must by 1-16 bytes in length */
# define MAX_PASSWORD_LEN 16
/* Per the standard, the length of the MD5 authentication packets must be 24
* bytes and the checksum is 16 bytes */
# define MD5_AUTH_LEN 24
# define MD5_CHECKSUM_LEN 16
/* Per the standard, the length of the SHA1 authentication packets must be 28
* bytes and the checksum is 20 bytes */
# define SHA1_AUTH_LEN 28
# define SHA1_CHECKSUM_LEN 20
2003-11-23 22:00:48 +00:00
static gint proto_bfd = - 1 ;
static gint hf_bfd_version = - 1 ;
static gint hf_bfd_diag = - 1 ;
2006-02-20 17:21:47 +00:00
static gint hf_bfd_sta = - 1 ;
2014-08-01 14:08:57 +00:00
static gint hf_bfd_flags = - 1 ;
2006-02-20 17:21:47 +00:00
static gint hf_bfd_flags_h = - 1 ;
static gint hf_bfd_flags_p = - 1 ;
static gint hf_bfd_flags_f = - 1 ;
static gint hf_bfd_flags_c = - 1 ;
static gint hf_bfd_flags_a = - 1 ;
static gint hf_bfd_flags_d = - 1 ;
2007-09-07 19:05:55 +00:00
static gint hf_bfd_flags_m = - 1 ;
2006-02-20 17:21:47 +00:00
static gint hf_bfd_flags_d_v0 = - 1 ;
2006-08-08 19:54:37 +00:00
static gint hf_bfd_flags_p_v0 = - 1 ;
static gint hf_bfd_flags_f_v0 = - 1 ;
2003-11-23 22:00:48 +00:00
static gint hf_bfd_detect_time_multiplier = - 1 ;
2007-09-07 19:05:55 +00:00
static gint hf_bfd_message_length = - 1 ;
2003-11-23 22:00:48 +00:00
static gint hf_bfd_my_discriminator = - 1 ;
static gint hf_bfd_your_discriminator = - 1 ;
static gint hf_bfd_desired_min_tx_interval = - 1 ;
static gint hf_bfd_required_min_rx_interval = - 1 ;
static gint hf_bfd_required_min_echo_interval = - 1 ;
2014-08-01 14:08:57 +00:00
static gint hf_bfd_checksum = - 1 ;
2003-11-23 22:00:48 +00:00
2007-09-07 19:05:55 +00:00
static gint hf_bfd_auth_type = - 1 ;
static gint hf_bfd_auth_len = - 1 ;
static gint hf_bfd_auth_key = - 1 ;
static gint hf_bfd_auth_password = - 1 ;
static gint hf_bfd_auth_seq_num = - 1 ;
2003-11-23 22:00:48 +00:00
static gint ett_bfd = - 1 ;
2006-02-20 17:21:47 +00:00
static gint ett_bfd_flags = - 1 ;
2007-09-07 19:05:55 +00:00
static gint ett_bfd_auth = - 1 ;
2003-11-23 22:00:48 +00:00
2013-05-25 17:06:40 +00:00
static expert_field ei_bfd_auth_len_invalid = EI_INIT ;
static expert_field ei_bfd_auth_no_data = EI_INIT ;
2011-11-28 17:13:45 +00:00
static gint hf_mep_type = - 1 ;
static gint hf_mep_len = - 1 ;
static gint hf_mep_global_id = - 1 ;
static gint hf_mep_node_id = - 1 ;
2013-01-31 17:55:31 +00:00
/* static gint hf_mep_interface_no = -1; */
2011-11-28 17:13:45 +00:00
static gint hf_mep_tunnel_no = - 1 ;
static gint hf_mep_lsp_no = - 1 ;
static gint hf_mep_ac_id = - 1 ;
static gint hf_mep_agi_type = - 1 ;
static gint hf_mep_agi_len = - 1 ;
static gint hf_mep_agi_val = - 1 ;
static gint hf_section_interface_no = - 1 ;
2003-11-23 22:00:48 +00:00
/*
2006-02-20 17:21:47 +00:00
* Control packet version 0 , draft - katz - ward - bfd - 01. txt
2003-11-23 22:00:48 +00:00
*
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Vers | Diag | H | D | P | F | Rsvd | Detect Mult | Length |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | My Discriminator |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Your Discriminator |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Desired Min TX Interval |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Required Min RX Interval |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Required Min Echo RX Interval |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
*/
2006-02-20 17:21:47 +00:00
/*
2016-08-19 07:15:31 +00:00
* Control packet version 1 , RFC 5880
2006-02-20 17:21:47 +00:00
*
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
2016-08-19 07:15:31 +00:00
* | Vers | Diag | Sta | P | F | C | A | D | M | Detect Mult | Length |
2006-02-20 17:21:47 +00:00
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | My Discriminator |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Your Discriminator |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Desired Min TX Interval |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Required Min RX Interval |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Required Min Echo RX Interval |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
*
* An optional Authentication Section may be present :
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Auth Type | Auth Len | Authentication Data . . . |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
*
2007-09-07 19:05:55 +00:00
* There are 5 types of authentication defined :
* 1 - Simple Password
* 2 - Keyed MD5
* 3 - Meticulous Keyed MD5
* 4 - Keyed SHA1
* 5 - Meticulous Keyed SHA1
*
* The format for Simple Password authentication is :
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Auth Type | Auth Len | Auth Key ID | Password . . . |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | . . . |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
2010-05-10 15:54:57 +00:00
*
2007-09-07 19:05:55 +00:00
* The format for Keyed MD5 and Meticulous Keyed MD5 authentication is :
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Auth Type | Auth Len | Auth Key ID | Reserved |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Sequence Number |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Auth Key / Checksum . . . |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | . . . |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
*
* The format for Keyed SHA1 and Meticulous Keyed SHA1 authentication is :
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Auth Type | Auth Len | Auth Key ID | Reserved |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Sequence Number |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | Auth Key / Checksum . . . |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
* | . . . |
* + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
2006-02-20 17:21:47 +00:00
*
2010-05-10 15:54:57 +00:00
*
2006-02-20 17:21:47 +00:00
*/
2007-09-07 19:05:55 +00:00
/* Given the type of authentication being used, return the required length of
* the authentication header
*/
2012-04-30 21:50:21 +00:00
static guint8
get_bfd_required_auth_len ( guint8 auth_type )
2007-09-07 19:05:55 +00:00
{
guint8 auth_len = 0 ;
2010-05-10 15:54:57 +00:00
2007-09-07 19:05:55 +00:00
switch ( auth_type ) {
2010-05-10 15:54:57 +00:00
case BFD_AUTH_MD5 :
case BFD_AUTH_MET_MD5 :
auth_len = MD5_AUTH_LEN ;
break ;
case BFD_AUTH_SHA1 :
case BFD_AUTH_MET_SHA1 :
auth_len = SHA1_AUTH_LEN ;
break ;
default :
break ;
2007-09-07 19:05:55 +00:00
}
return auth_len ;
}
/* Given the type of authentication being used, return the length of
* checksum field
*/
2012-04-30 21:50:21 +00:00
static guint8
get_bfd_checksum_len ( guint8 auth_type )
2007-09-07 19:05:55 +00:00
{
guint8 checksum_len = 0 ;
switch ( auth_type ) {
2010-05-10 15:54:57 +00:00
case BFD_AUTH_MD5 :
case BFD_AUTH_MET_MD5 :
checksum_len = MD5_CHECKSUM_LEN ;
break ;
case BFD_AUTH_SHA1 :
case BFD_AUTH_MET_SHA1 :
checksum_len = SHA1_CHECKSUM_LEN ;
break ;
default :
break ;
2007-09-07 19:05:55 +00:00
}
return checksum_len ;
}
2012-04-30 21:50:21 +00:00
static void
dissect_bfd_authentication ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree )
2007-09-07 19:05:55 +00:00
{
2016-06-26 14:52:37 +00:00
int offset = 24 ;
guint8 auth_type ;
guint8 auth_len ;
proto_item * ti = NULL ;
proto_item * auth_item = NULL ;
proto_tree * auth_tree = NULL ;
const guint8 * password ;
2007-09-07 19:05:55 +00:00
auth_type = tvb_get_guint8 ( tvb , offset ) ;
2012-04-30 21:50:21 +00:00
auth_len = tvb_get_guint8 ( tvb , offset + 1 ) ;
2007-09-07 19:05:55 +00:00
2012-09-23 18:15:09 +00:00
if ( tree ) {
2014-06-22 20:01:36 +00:00
auth_tree = proto_tree_add_subtree_format ( tree , tvb , offset , auth_len ,
ett_bfd_auth , NULL , " Authentication: %s " ,
2012-09-23 18:15:09 +00:00
val_to_str ( auth_type ,
bfd_control_auth_type_values ,
" Unknown Authentication Type (%d) " ) ) ;
2007-09-07 19:05:55 +00:00
2012-09-23 18:15:09 +00:00
proto_tree_add_item ( auth_tree , hf_bfd_auth_type , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2007-09-07 19:05:55 +00:00
2012-09-23 18:15:09 +00:00
ti = proto_tree_add_item ( auth_tree , hf_bfd_auth_len , tvb , offset + 1 , 1 , ENC_BIG_ENDIAN ) ;
proto_item_append_text ( ti , " bytes " ) ;
2007-09-07 19:05:55 +00:00
2012-09-23 18:15:09 +00:00
proto_tree_add_item ( auth_tree , hf_bfd_auth_key , tvb , offset + 2 , 1 , ENC_BIG_ENDIAN ) ;
}
2007-09-07 19:05:55 +00:00
switch ( auth_type ) {
2012-04-30 21:50:21 +00:00
case BFD_AUTH_SIMPLE :
2016-06-26 14:52:37 +00:00
proto_tree_add_item_ret_string ( auth_tree , hf_bfd_auth_password , tvb , offset + 3 ,
auth_len - 3 , ENC_ASCII | ENC_NA , wmem_packet_scope ( ) , & password ) ;
proto_item_append_text ( auth_item , " : %s " , password ) ;
2012-04-30 21:50:21 +00:00
break ;
case BFD_AUTH_MD5 :
case BFD_AUTH_MET_MD5 :
case BFD_AUTH_SHA1 :
case BFD_AUTH_MET_SHA1 :
if ( auth_len ! = get_bfd_required_auth_len ( auth_type ) ) {
2014-08-01 14:08:57 +00:00
proto_tree_add_expert_format ( auth_tree , pinfo , & ei_bfd_auth_len_invalid , tvb , offset , auth_len ,
" Length of authentication section (%d) is invalid for Authentication Type: %s " ,
auth_len , val_to_str ( auth_type , bfd_control_auth_type_values , " Unknown Authentication Type (%d) " ) ) ;
proto_item_append_text ( auth_item , " : Invalid Authentication Section " ) ;
2012-04-30 21:50:21 +00:00
}
2012-09-23 18:15:09 +00:00
if ( tree ) {
proto_tree_add_item ( auth_tree , hf_bfd_auth_seq_num , tvb , offset + 4 , 4 , ENC_BIG_ENDIAN ) ;
2012-04-30 21:50:21 +00:00
2014-08-01 14:08:57 +00:00
proto_tree_add_item ( auth_tree , hf_bfd_checksum , tvb , offset + 8 , get_bfd_checksum_len ( auth_type ) , ENC_NA ) ;
2012-09-23 18:15:09 +00:00
}
2012-04-30 21:50:21 +00:00
break ;
default :
break ;
2007-09-07 19:05:55 +00:00
}
}
2015-11-10 04:01:28 +00:00
static int
dissect_bfd_control ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2003-11-23 22:00:48 +00:00
{
2012-04-30 21:50:21 +00:00
guint flags ;
guint bfd_version ;
guint bfd_diag ;
2012-12-10 23:23:01 +00:00
guint bfd_sta = 0 ;
2012-04-30 21:50:21 +00:00
guint bfd_flags ;
2012-12-10 23:23:01 +00:00
guint bfd_flags_a = 0 ;
2012-04-30 21:50:21 +00:00
guint bfd_detect_time_multiplier ;
guint bfd_length ;
guint bfd_my_discriminator ;
guint bfd_your_discriminator ;
guint bfd_desired_min_tx_interval ;
guint bfd_required_min_rx_interval ;
guint bfd_required_min_echo_interval ;
2012-09-23 18:15:09 +00:00
proto_tree * bfd_tree = NULL ;
2010-05-10 15:54:57 +00:00
2009-08-09 06:26:46 +00:00
col_set_str ( pinfo - > cinfo , COL_PROTOCOL , " BFD Control " ) ;
2009-08-09 07:36:13 +00:00
col_clear ( pinfo - > cinfo , COL_INFO ) ;
2003-11-23 22:00:48 +00:00
2012-04-30 21:50:21 +00:00
bfd_version = ( tvb_get_guint8 ( tvb , 0 ) & 0xe0 ) > > 5 ;
bfd_diag = ( tvb_get_guint8 ( tvb , 0 ) & 0x1f ) ;
flags = tvb_get_guint8 ( tvb , 1 ) ;
2006-02-20 17:21:47 +00:00
switch ( bfd_version ) {
2010-05-10 15:54:57 +00:00
case 0 :
2012-04-30 21:50:21 +00:00
bfd_flags = flags ;
2010-05-10 15:54:57 +00:00
break ;
case 1 :
default :
2012-04-30 21:50:21 +00:00
bfd_sta = flags & 0xc0 ;
bfd_flags = flags & 0x3e ;
bfd_flags_a = flags & 0x04 ;
2010-05-10 15:54:57 +00:00
break ;
2006-02-20 17:21:47 +00:00
}
2012-04-30 21:50:21 +00:00
bfd_detect_time_multiplier = tvb_get_guint8 ( tvb , 2 ) ;
bfd_length = tvb_get_guint8 ( tvb , 3 ) ;
bfd_my_discriminator = tvb_get_ntohl ( tvb , 4 ) ;
bfd_your_discriminator = tvb_get_ntohl ( tvb , 8 ) ;
bfd_desired_min_tx_interval = tvb_get_ntohl ( tvb , 12 ) ;
bfd_required_min_rx_interval = tvb_get_ntohl ( tvb , 16 ) ;
2003-11-23 22:00:48 +00:00
bfd_required_min_echo_interval = tvb_get_ntohl ( tvb , 20 ) ;
2012-04-30 21:50:21 +00:00
switch ( bfd_version ) {
case 0 :
col_add_fstr ( pinfo - > cinfo , COL_INFO , " Diag: %s, Flags: 0x%02x " ,
val_to_str_const ( bfd_diag , bfd_control_v0_diag_values , " Unknown " ) ,
bfd_flags ) ;
break ;
case 1 :
default :
col_add_fstr ( pinfo - > cinfo , COL_INFO , " Diag: %s, State: %s, Flags: 0x%02x " ,
val_to_str_const ( bfd_diag , bfd_control_v1_diag_values , " Unknown " ) ,
val_to_str_const ( bfd_sta > > 6 , bfd_control_sta_values , " Unknown " ) ,
bfd_flags ) ;
break ;
2003-11-23 22:00:48 +00:00
}
if ( tree ) {
2012-04-30 21:50:21 +00:00
proto_item * ti ;
2011-11-28 17:13:45 +00:00
ti = proto_tree_add_protocol_format ( tree , proto_bfd , tvb , 0 , bfd_length ,
2003-11-23 22:00:48 +00:00
" BFD Control message " ) ;
bfd_tree = proto_item_add_subtree ( ti , ett_bfd ) ;
2007-09-07 19:05:55 +00:00
proto_tree_add_uint ( bfd_tree , hf_bfd_version , tvb , 0 ,
2006-02-20 17:21:47 +00:00
1 , bfd_version < < 5 ) ;
2003-11-23 22:00:48 +00:00
2007-09-07 19:05:55 +00:00
proto_tree_add_uint ( bfd_tree , hf_bfd_diag , tvb , 0 ,
2003-11-23 22:00:48 +00:00
1 , bfd_diag ) ;
2012-04-30 21:50:21 +00:00
switch ( bfd_version ) {
2010-05-10 15:54:57 +00:00
case 0 :
break ;
case 1 :
default :
proto_tree_add_uint ( bfd_tree , hf_bfd_sta , tvb , 1 ,
1 , bfd_sta ) ;
break ;
2012-04-30 21:50:21 +00:00
}
switch ( bfd_version ) {
2010-05-10 15:54:57 +00:00
case 0 :
2014-08-01 14:08:57 +00:00
{
static const int * bfd_message_flags [ ] = {
& hf_bfd_flags_h ,
& hf_bfd_flags_d_v0 ,
& hf_bfd_flags_p_v0 ,
& hf_bfd_flags_f_v0 ,
NULL
} ;
2015-11-25 16:25:11 +00:00
proto_tree_add_bitmask_with_flags ( bfd_tree , tvb , 1 , hf_bfd_flags , ett_bfd_flags , bfd_message_flags , ENC_NA , BMT_NO_FALSE ) ;
2014-08-01 14:08:57 +00:00
}
2010-05-10 15:54:57 +00:00
break ;
case 1 :
default :
2014-08-01 14:08:57 +00:00
{
static const int * bfd_message_flags [ ] = {
& hf_bfd_flags_p ,
& hf_bfd_flags_f ,
& hf_bfd_flags_c ,
& hf_bfd_flags_a ,
& hf_bfd_flags_d ,
& hf_bfd_flags_m ,
NULL
} ;
2015-11-25 16:25:11 +00:00
proto_tree_add_bitmask_with_flags ( bfd_tree , tvb , 1 , hf_bfd_flags , ett_bfd_flags , bfd_message_flags , ENC_NA , BMT_NO_FALSE ) ;
2014-08-01 14:08:57 +00:00
}
2010-05-10 15:54:57 +00:00
break ;
2012-04-30 21:50:21 +00:00
}
2003-11-23 22:00:48 +00:00
2007-09-07 19:05:55 +00:00
proto_tree_add_uint_format_value ( bfd_tree , hf_bfd_detect_time_multiplier , tvb , 2 ,
2012-04-30 21:50:21 +00:00
1 , bfd_detect_time_multiplier ,
" %u (= %u ms Detection time) " ,
bfd_detect_time_multiplier ,
bfd_detect_time_multiplier * ( bfd_desired_min_tx_interval / 1000 ) ) ;
2003-11-23 22:00:48 +00:00
2012-04-30 21:50:21 +00:00
proto_tree_add_uint_format_value ( bfd_tree , hf_bfd_message_length , tvb , 3 , 1 , bfd_length ,
" %u bytes " , bfd_length ) ;
2010-05-10 15:54:57 +00:00
2007-09-07 19:05:55 +00:00
proto_tree_add_uint ( bfd_tree , hf_bfd_my_discriminator , tvb , 4 ,
2003-11-23 22:00:48 +00:00
4 , bfd_my_discriminator ) ;
2007-09-07 19:05:55 +00:00
proto_tree_add_uint ( bfd_tree , hf_bfd_your_discriminator , tvb , 8 ,
2003-11-23 22:00:48 +00:00
4 , bfd_your_discriminator ) ;
2007-09-07 19:05:55 +00:00
proto_tree_add_uint_format_value ( bfd_tree , hf_bfd_desired_min_tx_interval , tvb , 12 ,
2006-02-16 11:43:38 +00:00
4 , bfd_desired_min_tx_interval ,
2007-09-07 19:05:55 +00:00
" %4u ms (%u us) " ,
bfd_desired_min_tx_interval / 1000 ,
2012-04-30 21:50:21 +00:00
bfd_desired_min_tx_interval ) ;
2006-02-16 11:43:38 +00:00
2007-09-07 19:05:55 +00:00
proto_tree_add_uint_format_value ( bfd_tree , hf_bfd_required_min_rx_interval , tvb , 16 ,
2006-02-16 11:43:38 +00:00
4 , bfd_required_min_rx_interval ,
2007-09-07 19:05:55 +00:00
" %4u ms (%u us) " ,
bfd_required_min_rx_interval / 1000 ,
2012-04-30 21:50:21 +00:00
bfd_required_min_rx_interval ) ;
2006-02-16 11:43:38 +00:00
2007-09-07 19:05:55 +00:00
proto_tree_add_uint_format_value ( bfd_tree , hf_bfd_required_min_echo_interval , tvb , 20 ,
2006-02-16 11:43:38 +00:00
4 , bfd_required_min_echo_interval ,
2007-09-07 19:05:55 +00:00
" %4u ms (%u us) " ,
bfd_required_min_echo_interval / 1000 ,
2012-04-30 21:50:21 +00:00
bfd_required_min_echo_interval ) ;
2012-09-23 18:15:09 +00:00
} /* if (tree) */
/* Dissect the authentication fields if the Authentication flag has
* been set
*/
if ( bfd_version & & bfd_flags_a ) {
if ( bfd_length > = 28 ) {
dissect_bfd_authentication ( tvb , pinfo , bfd_tree ) ;
} else {
2014-08-01 14:08:57 +00:00
proto_tree_add_expert_format ( bfd_tree , pinfo , & ei_bfd_auth_no_data , tvb , 24 , bfd_length - 24 ,
2012-09-23 18:15:09 +00:00
" Authentication: Length of the BFD frame is invalid (%d) " , bfd_length ) ;
2012-04-30 21:50:21 +00:00
}
2003-11-23 22:00:48 +00:00
}
2012-09-23 18:15:09 +00:00
2015-11-10 04:01:28 +00:00
return tvb_captured_length ( tvb ) ;
2003-11-23 22:00:48 +00:00
}
2012-12-10 23:23:01 +00:00
2012-04-30 21:50:21 +00:00
/* BFD CV Source MEP-ID TLV Decoder,
2011-11-28 17:13:45 +00:00
As per RFC 6428 : http : //tools.ietf.org/html/rfc6428
sections - 3.5 .1 , 3.5 .2 , 3.5 .3 */
2012-04-30 21:50:21 +00:00
void
2012-11-19 20:13:57 +00:00
dissect_bfd_mep ( tvbuff_t * tvb , proto_tree * tree , const int hfindex )
2011-11-28 17:13:45 +00:00
{
2012-12-10 23:23:01 +00:00
proto_item * ti ;
proto_tree * bfd_tree ;
2012-11-19 20:13:57 +00:00
gint offset = 0 ;
2012-12-10 23:23:01 +00:00
gint mep_type ;
gint mep_len ;
gint mep_agi_len ;
2012-04-30 21:50:21 +00:00
if ( ! tree )
return ;
/* Fetch the BFD control message length and move the offset
2011-11-28 17:13:45 +00:00
to point to the data portion after the control message */
2012-11-19 20:13:57 +00:00
2012-12-10 23:23:01 +00:00
/* The parameter hfindex is used for determining the tree under which MEP-ID TLV
has to be determined . Since according to RFC 6428 , MEP - ID TLV can be used by any
OAM function , if hfindex is 0 , as per this function the MEP - TLV is a part of
BFD - CV payload . If a non - zero hfindex comes , then tht TLV info will be displayed
2012-11-19 20:13:57 +00:00
under a particular protocol - tree . */
if ( ! hfindex )
{
2012-12-10 23:23:01 +00:00
offset = tvb_get_guint8 ( tvb , 3 ) ;
2012-11-19 20:13:57 +00:00
mep_type = tvb_get_ntohs ( tvb , offset ) ;
mep_len = tvb_get_ntohs ( tvb , ( offset + 2 ) ) ;
ti = proto_tree_add_protocol_format ( tree , proto_bfd , tvb , offset , ( mep_len + 4 ) ,
" MPLS-TP SOURCE MEP-ID TLV " ) ;
}
else
{
mep_type = tvb_get_ntohs ( tvb , offset ) ;
mep_len = tvb_get_ntohs ( tvb , ( offset + 2 ) ) ;
ti = proto_tree_add_protocol_format ( tree , hfindex , tvb , offset , ( mep_len + 4 ) ,
" MPLS-TP SOURCE MEP-ID TLV " ) ;
}
2011-11-28 17:13:45 +00:00
switch ( mep_type ) {
2012-04-30 21:50:21 +00:00
case TLV_TYPE_MPLSTP_SECTION_MEP :
bfd_tree = proto_item_add_subtree ( ti , ett_bfd ) ;
proto_tree_add_uint ( bfd_tree , hf_mep_type , tvb , offset ,
2 , mep_type ) ;
proto_tree_add_uint ( bfd_tree , hf_mep_len , tvb , ( offset + 2 ) ,
2 , mep_len ) ;
proto_tree_add_item ( bfd_tree , hf_mep_global_id , tvb , ( offset + 4 ) ,
4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( bfd_tree , hf_mep_node_id , tvb , ( offset + 8 ) ,
4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( bfd_tree , hf_section_interface_no , tvb , ( offset + 12 ) ,
4 , ENC_BIG_ENDIAN ) ;
break ;
2011-11-28 17:13:45 +00:00
case TLV_TYPE_MPLSTP_LSP_MEP :
2012-04-30 21:50:21 +00:00
bfd_tree = proto_item_add_subtree ( ti , ett_bfd ) ;
proto_tree_add_uint ( bfd_tree , hf_mep_type , tvb , offset ,
2 , mep_type ) ;
proto_tree_add_uint ( bfd_tree , hf_mep_len , tvb , ( offset + 2 ) ,
2 , mep_len ) ;
proto_tree_add_item ( bfd_tree , hf_mep_global_id , tvb , ( offset + 4 ) ,
4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( bfd_tree , hf_mep_node_id , tvb , ( offset + 8 ) ,
4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( bfd_tree , hf_mep_tunnel_no , tvb , ( offset + 12 ) ,
2 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( bfd_tree , hf_mep_lsp_no , tvb , ( offset + 14 ) ,
2 , ENC_BIG_ENDIAN ) ;
break ;
2011-11-28 17:13:45 +00:00
case TLV_TYPE_MPLSTP_PW_MEP :
2012-04-30 21:50:21 +00:00
mep_agi_len = tvb_get_guint8 ( tvb , ( offset + 17 ) ) ;
bfd_tree = proto_item_add_subtree ( ti , ett_bfd ) ;
proto_tree_add_uint ( bfd_tree , hf_mep_type , tvb , offset ,
2 , ( mep_type ) ) ;
proto_tree_add_uint ( bfd_tree , hf_mep_len , tvb , ( offset + 2 ) ,
2 , mep_len ) ;
proto_tree_add_item ( bfd_tree , hf_mep_global_id , tvb , ( offset + 4 ) ,
4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( bfd_tree , hf_mep_node_id , tvb , ( offset + 8 ) ,
4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( bfd_tree , hf_mep_ac_id , tvb , ( offset + 12 ) ,
4 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( bfd_tree , hf_mep_agi_type , tvb , ( offset + 16 ) ,
1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_uint ( bfd_tree , hf_mep_agi_len , tvb , ( offset + 17 ) ,
1 , mep_agi_len ) ;
proto_tree_add_item ( bfd_tree , hf_mep_agi_val , tvb , ( offset + 18 ) ,
2012-05-05 00:03:59 +00:00
mep_agi_len , ENC_ASCII | ENC_NA ) ;
2011-11-28 17:13:45 +00:00
2012-04-30 21:50:21 +00:00
break ;
2011-11-28 17:13:45 +00:00
default :
2012-04-30 21:50:21 +00:00
break ;
2011-11-28 17:13:45 +00:00
}
return ;
}
2003-11-23 22:00:48 +00:00
2006-05-21 04:49:01 +00:00
/* Register the protocol with Wireshark */
2012-04-30 21:50:21 +00:00
void
proto_register_bfd ( void )
2003-11-23 22:00:48 +00:00
{
/* Setup list of header fields */
static hf_register_info hf [ ] = {
{ & hf_bfd_version ,
{ " Protocol Version " , " bfd.version " ,
FT_UINT8 , BASE_DEC , NULL , 0xe0 ,
2007-09-07 19:05:55 +00:00
" The version number of the BFD protocol " , HFILL }
2003-11-23 22:00:48 +00:00
} ,
{ & hf_bfd_diag ,
{ " Diagnostic Code " , " bfd.diag " ,
2006-02-20 17:21:47 +00:00
FT_UINT8 , BASE_HEX , VALS ( bfd_control_v1_diag_values ) , 0x1f ,
2007-09-07 19:05:55 +00:00
" This field give the reason for a BFD session failure " , HFILL }
2006-02-20 17:21:47 +00:00
} ,
{ & hf_bfd_sta ,
{ " Session State " , " bfd.sta " ,
FT_UINT8 , BASE_HEX , VALS ( bfd_control_sta_values ) , 0xc0 ,
2007-09-07 19:05:55 +00:00
" The BFD state as seen by the transmitting system " , HFILL }
2003-11-23 22:00:48 +00:00
} ,
{ & hf_bfd_flags ,
{ " Message Flags " , " bfd.flags " ,
2014-08-01 14:08:57 +00:00
FT_UINT8 , BASE_HEX , NULL , 0x00 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL }
2003-11-23 22:00:48 +00:00
} ,
2006-02-20 17:21:47 +00:00
{ & hf_bfd_flags_h ,
{ " I hear you " , " bfd.flags.h " ,
2009-07-07 14:54:15 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_set_notset ) , 0x80 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL }
2006-02-20 17:21:47 +00:00
} ,
{ & hf_bfd_flags_d_v0 ,
{ " Demand " , " bfd.flags.d " ,
2009-07-07 14:54:15 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_set_notset ) , 0x40 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL }
2006-02-20 17:21:47 +00:00
} ,
2006-08-08 19:54:37 +00:00
{ & hf_bfd_flags_p_v0 ,
{ " Poll " , " bfd.flags.p " ,
2009-07-07 14:54:15 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_set_notset ) , 0x20 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL }
2006-08-08 19:54:37 +00:00
} ,
{ & hf_bfd_flags_f_v0 ,
{ " Final " , " bfd.flags.f " ,
2009-07-07 14:54:15 +00:00
FT_BOOLEAN , 8 , TFS ( & tfs_set_notset ) , 0x10 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL }
2006-08-08 19:54:37 +00:00
} ,
2006-02-20 17:21:47 +00:00
{ & hf_bfd_flags_p ,
{ " Poll " , " bfd.flags.p " ,
2012-05-01 01:04:24 +00:00
FT_BOOLEAN , 6 , TFS ( & tfs_set_notset ) , 0x20 , /* 6 flag bits; Sta is shown separately */
2010-05-10 15:54:57 +00:00
" If set, the transmitting system is expecting a packet with the Final (F) bit in reply " ,
2012-04-30 21:50:21 +00:00
HFILL }
2006-02-20 17:21:47 +00:00
} ,
{ & hf_bfd_flags_f ,
{ " Final " , " bfd.flags.f " ,
2012-05-01 01:04:24 +00:00
FT_BOOLEAN , 6 , TFS ( & tfs_set_notset ) , 0x10 , /* 6 flag bits; Sta is shown separately */
2010-05-10 15:54:57 +00:00
" If set, the transmitting system is replying to a packet with the Poll (P) bit set " ,
2012-04-30 21:50:21 +00:00
HFILL }
2006-02-20 17:21:47 +00:00
} ,
{ & hf_bfd_flags_c ,
{ " Control Plane Independent " , " bfd.flags.c " ,
2012-05-01 01:04:24 +00:00
FT_BOOLEAN , 6 , TFS ( & tfs_set_notset ) , 0x08 , /* 6 flag bits; Sta is shown separately */
2007-09-07 19:05:55 +00:00
" If set, the BFD implementation is implemented in the forwarding plane " , HFILL }
2006-02-20 17:21:47 +00:00
} ,
{ & hf_bfd_flags_a ,
{ " Authentication Present " , " bfd.flags.a " ,
2012-05-01 01:04:24 +00:00
FT_BOOLEAN , 6 , TFS ( & tfs_set_notset ) , 0x04 , /* 6 flag bits; Sta is shown separately */
2007-09-07 19:05:55 +00:00
" The Authentication Section is present " , HFILL }
2006-02-20 17:21:47 +00:00
} ,
{ & hf_bfd_flags_d ,
{ " Demand " , " bfd.flags.d " ,
2012-05-01 01:04:24 +00:00
FT_BOOLEAN , 6 , TFS ( & tfs_set_notset ) , 0x02 , /* 6 flag bits; Sta is shown separately */
2007-09-07 19:05:55 +00:00
" If set, Demand mode is active in the transmitting system " , HFILL }
} ,
{ & hf_bfd_flags_m ,
{ " Multipoint " , " bfd.flags.m " ,
2012-05-01 01:04:24 +00:00
FT_BOOLEAN , 6 , TFS ( & tfs_set_notset ) , 0x01 , /* 6 flag bits; Sta is shown separately */
2007-09-07 19:05:55 +00:00
" Reserved for future point-to-multipoint extensions " , HFILL }
2006-02-20 17:21:47 +00:00
} ,
2003-11-23 22:00:48 +00:00
{ & hf_bfd_detect_time_multiplier ,
{ " Detect Time Multiplier " , " bfd.detect_time_multiplier " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
2007-09-07 19:05:55 +00:00
" The transmit interval multiplied by this value is the failure detection time " , HFILL }
} ,
{ & hf_bfd_message_length ,
{ " Message Length " , " bfd.message_length " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
" Length of the BFD Control packet, in bytes " , HFILL }
2003-11-23 22:00:48 +00:00
} ,
{ & hf_bfd_my_discriminator ,
{ " My Discriminator " , " bfd.my_discriminator " ,
FT_UINT32 , BASE_HEX , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL }
2003-11-23 22:00:48 +00:00
} ,
{ & hf_bfd_your_discriminator ,
{ " Your Discriminator " , " bfd.your_discriminator " ,
FT_UINT32 , BASE_HEX , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL }
2003-11-23 22:00:48 +00:00
} ,
{ & hf_bfd_desired_min_tx_interval ,
{ " Desired Min TX Interval " , " bfd.desired_min_tx_interval " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
2007-09-07 19:05:55 +00:00
" The minimum interval to use when transmitting BFD Control packets " , HFILL }
2003-11-23 22:00:48 +00:00
} ,
{ & hf_bfd_required_min_rx_interval ,
{ " Required Min RX Interval " , " bfd.required_min_rx_interval " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
2007-09-07 19:05:55 +00:00
" The minimum interval between received BFD Control packets that this system can support " , HFILL }
2003-11-23 22:00:48 +00:00
} ,
{ & hf_bfd_required_min_echo_interval ,
{ " Required Min Echo Interval " , " bfd.required_min_echo_interval " ,
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
2007-09-07 19:05:55 +00:00
" The minimum interval between received BFD Echo packets that this system can support " , HFILL }
} ,
2014-08-01 14:08:57 +00:00
{ & hf_bfd_checksum ,
{ " Checksum " , " bfd.checksum " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2007-09-07 19:05:55 +00:00
{ & hf_bfd_auth_type ,
{ " Authentication Type " , " bfd.auth.type " ,
FT_UINT8 , BASE_DEC , VALS ( bfd_control_auth_type_values ) , 0x0 ,
" The type of authentication in use on this session " , HFILL }
2003-11-23 22:00:48 +00:00
} ,
2007-09-07 19:05:55 +00:00
{ & hf_bfd_auth_len ,
{ " Authentication Length " , " bfd.auth.len " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
" The length, in bytes, of the authentication section " , HFILL }
} ,
{ & hf_bfd_auth_key ,
{ " Authentication Key ID " , " bfd.auth.key " ,
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
" The Authentication Key ID, identifies which password is in use for this packet " , HFILL }
} ,
{ & hf_bfd_auth_password ,
{ " Password " , " bfd.auth.password " ,
FT_STRING , BASE_NONE , NULL , 0x0 ,
" The simple password in use on this session " , HFILL }
} ,
{ & hf_bfd_auth_seq_num ,
{ " Sequence Number " , " bfd.auth.seq_num " ,
FT_UINT32 , BASE_HEX , NULL , 0x0 ,
" The Sequence Number is periodically incremented to prevent replay attacks " , HFILL }
2011-11-28 17:13:45 +00:00
} ,
2012-04-30 21:50:21 +00:00
{ & hf_mep_type ,
2012-07-22 03:06:37 +00:00
{ " Type " , " bfd.mep.type " ,
2011-11-28 17:13:45 +00:00
FT_UINT16 , BASE_DEC , VALS ( mplstp_mep_tlv_type_values ) , 0x0 ,
" The type of the MEP Id " , HFILL }
} ,
{ & hf_mep_len ,
2012-07-22 03:06:37 +00:00
{ " Length " , " bfd.mep.len " ,
2011-11-28 17:13:45 +00:00
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
" The length of the MEP Id " , HFILL }
} ,
{ & hf_mep_global_id ,
2012-07-22 03:06:37 +00:00
{ " Global Id " , " bfd.mep.global.id " ,
2011-11-28 17:13:45 +00:00
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
" MPLS-TP Global MEP Id " , HFILL }
} ,
{ & hf_mep_node_id ,
2012-07-22 03:06:37 +00:00
{ " Node Id " , " bfd.mep.node.id " ,
2011-11-28 17:13:45 +00:00
FT_IPv4 , BASE_NONE , NULL , 0x0 ,
" MPLS-TP Node Identifier " , HFILL }
} ,
2013-01-31 17:55:31 +00:00
#if 0
2011-11-28 17:13:45 +00:00
{ & hf_mep_interface_no ,
2012-07-22 03:06:37 +00:00
{ " Interface Number " , " bfd.mep.interface.no " ,
2011-11-28 17:13:45 +00:00
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
" MPLS-TP Interface Number " , HFILL }
} ,
2013-01-31 17:55:31 +00:00
# endif
2011-11-28 17:13:45 +00:00
{ & hf_mep_tunnel_no ,
2012-07-22 03:06:37 +00:00
{ " Tunnel Number " , " bfd.mep.tunnel.no " ,
2011-11-28 17:13:45 +00:00
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
2011-11-28 18:10:57 +00:00
NULL , HFILL }
2011-11-28 17:13:45 +00:00
} ,
{ & hf_mep_lsp_no ,
2012-07-22 03:06:37 +00:00
{ " LSP Number " , " bfd.mep.lsp.no " ,
2011-11-28 17:13:45 +00:00
FT_UINT16 , BASE_DEC , NULL , 0x0 ,
2011-11-28 18:10:57 +00:00
NULL , HFILL }
2011-11-28 17:13:45 +00:00
} ,
{ & hf_mep_ac_id ,
2012-07-22 03:06:37 +00:00
{ " AC Id " , " bfd.mep.ac.id " ,
2011-11-28 17:13:45 +00:00
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
2011-11-28 18:10:57 +00:00
NULL , HFILL }
2011-11-28 17:13:45 +00:00
} ,
{ & hf_mep_agi_type ,
2012-07-22 03:06:37 +00:00
{ " AGI TYPE " , " bfd.mep.agi.type " ,
2011-11-28 17:13:45 +00:00
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
2011-11-28 18:10:57 +00:00
NULL , HFILL }
2011-11-28 17:13:45 +00:00
} ,
{ & hf_mep_agi_len ,
2012-07-22 03:06:37 +00:00
{ " AGI Length " , " bfd.mep.agi.len " ,
2011-11-28 17:13:45 +00:00
FT_UINT8 , BASE_DEC , NULL , 0x0 ,
2011-11-28 18:10:57 +00:00
NULL , HFILL }
2011-11-28 17:13:45 +00:00
} ,
{ & hf_mep_agi_val ,
2012-07-22 03:06:37 +00:00
{ " AGI value " , " bfd.mep.agi.val " ,
2012-04-30 21:50:21 +00:00
FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
2011-11-28 17:13:45 +00:00
} ,
{ & hf_section_interface_no ,
2012-07-22 03:06:37 +00:00
{ " Interface Number " , " bfd.mep.interface.no " ,
2011-11-28 17:13:45 +00:00
FT_UINT32 , BASE_DEC , NULL , 0x0 ,
" MPLS-TP Interface Number " , HFILL }
2007-09-07 19:05:55 +00:00
}
2003-11-23 22:00:48 +00:00
} ;
/* Setup protocol subtree array */
static gint * ett [ ] = {
& ett_bfd ,
2007-09-07 19:05:55 +00:00
& ett_bfd_flags ,
2012-04-30 21:50:21 +00:00
& ett_bfd_auth
2003-11-23 22:00:48 +00:00
} ;
2013-05-25 17:06:40 +00:00
static ei_register_info ei [ ] = {
{ & ei_bfd_auth_len_invalid , { " bfd.auth.len.invalid " , PI_MALFORMED , PI_WARN , " Length of authentication section is invalid " , EXPFILL } } ,
{ & ei_bfd_auth_no_data , { " bfd.auth.no_data " , PI_MALFORMED , PI_WARN , " Authentication flag is set in a BFD packet, but no authentication data is present " , EXPFILL } } ,
} ;
expert_module_t * expert_bfd ;
2003-11-23 22:00:48 +00:00
/* Register the protocol name and description */
2007-09-07 19:05:55 +00:00
proto_bfd = proto_register_protocol ( " Bidirectional Forwarding Detection Control Message " ,
2003-11-23 22:00:48 +00:00
" BFD Control " ,
2007-09-07 19:05:55 +00:00
" bfd " ) ;
2015-12-09 04:04:01 +00:00
register_dissector ( " bfd " , dissect_bfd_control , proto_bfd ) ;
2003-11-23 22:00:48 +00:00
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array ( proto_bfd , hf , array_length ( hf ) ) ;
proto_register_subtree_array ( ett , array_length ( ett ) ) ;
2013-05-25 17:06:40 +00:00
expert_bfd = expert_register_protocol ( proto_bfd ) ;
expert_register_field_array ( expert_bfd , ei , array_length ( ei ) ) ;
2003-11-23 22:00:48 +00:00
}
void
proto_reg_handoff_bfd ( void )
{
dissector_handle_t bfd_control_handle ;
2012-04-30 21:50:21 +00:00
bfd_control_handle = find_dissector ( " bfd " ) ;
dissector_add_uint ( " udp.port " , UDP_PORT_BFD_1HOP_CONTROL , bfd_control_handle ) ;
2010-12-20 05:35:29 +00:00
dissector_add_uint ( " udp.port " , UDP_PORT_BFD_MULTIHOP_CONTROL , bfd_control_handle ) ;
2014-11-09 19:00:01 +00:00
dissector_add_uint ( " pwach.channel_type " , ACH_TYPE_BFD_CC , bfd_control_handle ) ;
dissector_add_uint ( " pwach.channel_type " , ACH_TYPE_BFD_CV , bfd_control_handle ) ;
dissector_add_uint ( " pwach.channel_type " , 0x7 , bfd_control_handle ) ; /* PWACH-encapsulated BFD, RFC 5885 */
2003-11-23 22:00:48 +00:00
}
2014-09-28 23:25:09 +00:00
/*
* Editor modelines - http : //www.wireshark.org/tools/modelines.html
*
* Local variables :
* c - basic - offset : 4
* tab - width : 8
* indent - tabs - mode : nil
* End :
*
* vi : set shiftwidth = 4 tabstop = 8 expandtab :
* : indentSize = 4 : tabSize = 8 : noTabs = true :
*/