2009-04-27 16:57:02 +00:00
/* packet-pw-satop.c
* Routines for SAToP PW dissection as per RFC4553 .
* Copyright 2009 , Dmitry Trebich , Artem Tamazov < artem . tamazov @ tellabs . com >
*
* $ Id $
*
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
* 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 23:18:38 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2009-04-27 16:57:02 +00:00
*
* History :
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* 19.03 .2009 initial implementation
2009-09-10 15:30:10 +00:00
* 14.08 .2009 added : support for IP / UDP demultiplexing
* Not supported yet :
2009-04-27 16:57:02 +00:00
* - Decoding of PW payload
* - Optional RTP Headers ( RFC3550 )
*/
2012-09-20 02:03:38 +00:00
# include "config.h"
2009-04-27 16:57:02 +00:00
# include <glib.h>
2012-05-15 19:23:35 +00:00
2009-04-27 16:57:02 +00:00
# include <epan/packet.h>
# include <epan/expert.h>
# include "packet-mpls.h"
# include "packet-pw-common.h"
2013-12-12 19:52:14 +00:00
void proto_register_pw_satop ( void ) ;
void proto_reg_handoff_pw_satop ( void ) ;
2009-04-27 16:57:02 +00:00
static gint proto = - 1 ;
static gint ett = - 1 ;
static int hf_cw = - 1 ;
static int hf_cw_bits03 = - 1 ;
static int hf_cw_l = - 1 ;
static int hf_cw_r = - 1 ;
static int hf_cw_rsv = - 1 ;
static int hf_cw_frg = - 1 ;
static int hf_cw_len = - 1 ;
static int hf_cw_seq = - 1 ;
static int hf_payload = - 1 ;
2009-06-29 19:24:14 +00:00
static int hf_payload_l = - 1 ;
2009-04-27 16:57:02 +00:00
2013-09-08 00:47:15 +00:00
static expert_field ei_cw_rsv = EI_INIT ;
static expert_field ei_payload_size_invalid_undecoded = EI_INIT ;
static expert_field ei_payload_size_invalid = EI_INIT ;
static expert_field ei_cw_frg = EI_INIT ;
static expert_field ei_cw_bits03 = EI_INIT ;
static expert_field ei_cw_packet_size_too_small = EI_INIT ;
2009-04-27 16:57:02 +00:00
static dissector_handle_t data_handle ;
2009-06-29 19:24:14 +00:00
static dissector_handle_t pw_padding_handle ;
2009-04-27 16:57:02 +00:00
2009-06-29 19:24:14 +00:00
const char pwc_longname_pw_satop [ ] = " SAToP (no RTP support) " ;
2009-04-27 16:57:02 +00:00
static const char shortname [ ] = " SAToP (no RTP) " ;
2009-09-10 15:30:10 +00:00
static
void dissect_pw_satop ( tvbuff_t * tvb_original
, packet_info * pinfo
, proto_tree * tree
, pwc_demux_type_t demux )
2009-04-27 16:57:02 +00:00
{
const int encaps_size = 4 ; /*RTP header in encapsulation is not supported yet*/
2012-09-28 19:50:49 +00:00
gint packet_size ;
gint payload_size ;
gint padding_size ;
2013-03-18 21:16:23 +00:00
int properties ;
2012-09-28 19:50:49 +00:00
2009-04-27 16:57:02 +00:00
enum {
PAY_NO_IDEA = 0
, PAY_LIKE_E1
, PAY_LIKE_T1
, PAY_LIKE_E3_T3
, PAY_LIKE_OCTET_ALIGNED_T1
} payload_properties ;
packet_size = tvb_reported_length_remaining ( tvb_original , 0 ) ;
/*
* FIXME
* " 4 " below should be replaced by something like " min_packet_size_this_dissector "
* Also call to dissect_try_cw_first_nibble ( ) should be moved before this block
*/
if ( packet_size < 4 ) /* 4 is smallest size which may be sensible (for PWACH dissector) */
{
2012-09-28 19:50:49 +00:00
proto_item * item ;
item = proto_tree_add_item ( tree , proto , tvb_original , 0 , - 1 , ENC_NA ) ;
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , item , & ei_cw_packet_size_too_small ,
2012-09-28 19:50:49 +00:00
" PW packet size (%d) is too small to carry sensible information "
, ( int ) packet_size ) ;
2010-01-13 20:32:01 +00:00
col_set_str ( pinfo - > cinfo , COL_PROTOCOL , shortname ) ;
2009-08-09 07:59:51 +00:00
col_set_str ( pinfo - > cinfo , COL_INFO , " Malformed: PW packet is too small " ) ;
2009-04-27 16:57:02 +00:00
return ;
}
2009-09-10 15:30:10 +00:00
switch ( demux )
2009-04-27 16:57:02 +00:00
{
2009-09-10 15:30:10 +00:00
case PWC_DEMUX_MPLS :
if ( dissect_try_cw_first_nibble ( tvb_original , pinfo , tree ) )
{
return ;
}
break ;
case PWC_DEMUX_UDP :
break ;
default :
DISSECTOR_ASSERT_NOT_REACHED ( ) ;
2009-04-27 16:57:02 +00:00
return ;
}
/* check how "good" is this packet */
/* also decide payload length from packet size and CW */
properties = 0 ;
if ( 0 ! = ( tvb_get_guint8 ( tvb_original , 0 ) & 0xf0 /*bits03*/ ) )
{
properties | = PWC_CW_BAD_BITS03 ;
}
if ( 0 ! = ( tvb_get_guint8 ( tvb_original , 0 ) & 0x03 /*rsv*/ ) )
{
properties | = PWC_CW_BAD_RSV ;
}
if ( 0 ! = ( tvb_get_guint8 ( tvb_original , 1 ) & 0xc0 /*frag*/ ) )
{
properties | = PWC_CW_BAD_FRAG ;
}
{
/* RFC4553:
* [ . . . MAY be used to carry the length of the SAToP
* packet ( defined as the size of the SAToP header + the payload
* size ) if it is less than 64 bytes , and MUST be set to zero
* otherwise . . . ]
*
* Note that this differs from RFC4385 ' s definition of length :
* [ If the MPLS payload is less than 64 bytes , the length field
* MUST be set to the length of the PW payload . . . ]
*
* We will use RFC4553 ' s definition here .
*/
2012-09-28 19:50:49 +00:00
int cw_len ;
2009-04-27 16:57:02 +00:00
gint payload_size_from_packet ;
cw_len = tvb_get_guint8 ( tvb_original , 1 ) & 0x3f ;
payload_size_from_packet = packet_size - encaps_size ;
if ( cw_len ! = 0 )
{
gint payload_size_from_cw ;
payload_size_from_cw = cw_len - encaps_size ;
/*
* Assumptions for error case ,
* will be overwritten if no errors found :
*/
payload_size = payload_size_from_packet ;
padding_size = 0 ;
if ( payload_size_from_cw < 0 )
{
properties | = PWC_CW_BAD_PAYLEN_LT_0 ;
}
else if ( payload_size_from_cw > payload_size_from_packet )
{
properties | = PWC_CW_BAD_PAYLEN_GT_PACKET ;
}
else if ( payload_size_from_packet > = 64 )
{
properties | = PWC_CW_BAD_LEN_MUST_BE_0 ;
}
else /* ok */
{
payload_size = payload_size_from_cw ;
padding_size = payload_size_from_packet - payload_size_from_cw ; /* >=0 */
}
}
else
{
payload_size = payload_size_from_packet ;
padding_size = 0 ;
}
}
if ( payload_size = = 0 )
{
2009-09-10 15:30:10 +00:00
/*
2009-04-27 16:57:02 +00:00
* As CW . L it indicates that PW payload is invalid , dissector should
* not blame packets with bad payload ( including " bad " or " strange " SIZE of
* payload ) when L bit is set .
*/
if ( 0 = = ( tvb_get_guint8 ( tvb_original , 0 ) & 0x08 /*L bit*/ ) )
{
properties | = PWC_PAY_SIZE_BAD ;
}
}
2009-09-10 15:30:10 +00:00
2009-04-27 16:57:02 +00:00
/* guess about payload type */
if ( payload_size = = 256 )
{
payload_properties = PAY_LIKE_E1 ;
}
else if ( payload_size = = 192 )
{
payload_properties = PAY_LIKE_T1 ;
}
else if ( payload_size = = 1024 )
{
payload_properties = PAY_LIKE_E3_T3 ;
}
else if ( ( payload_size ! = 0 ) & & ( payload_size % 25 = = 0 ) )
{
payload_properties = PAY_LIKE_OCTET_ALIGNED_T1 ;
}
else
{
payload_properties = PAY_NO_IDEA ; /*we do not have any ideas about payload type*/
}
/* fill up columns*/
2012-09-28 19:50:49 +00:00
col_set_str ( pinfo - > cinfo , COL_PROTOCOL , shortname ) ;
2013-06-14 01:56:28 +00:00
col_clear ( pinfo - > cinfo , COL_INFO ) ;
if ( properties & PWC_ANYOF_CW_BAD )
2009-04-27 16:57:02 +00:00
{
2013-10-29 14:09:20 +00:00
col_set_str ( pinfo - > cinfo , COL_INFO , " CW:Bad, " ) ;
2013-06-14 01:56:28 +00:00
}
2009-04-27 16:57:02 +00:00
2013-06-14 01:56:28 +00:00
if ( properties & PWC_PAY_SIZE_BAD )
{
col_append_str ( pinfo - > cinfo , COL_INFO , " Payload size:0 (Bad) " ) ;
}
else
{
col_append_fstr ( pinfo - > cinfo , COL_INFO , " TDM octets:%d " , ( int ) payload_size ) ;
}
2009-09-10 15:30:10 +00:00
2013-06-14 01:56:28 +00:00
if ( padding_size ! = 0 )
{
col_append_fstr ( pinfo - > cinfo , COL_INFO , " , Padding:%d " , ( int ) padding_size ) ;
2009-04-27 16:57:02 +00:00
}
{
proto_item * item ;
2011-10-21 02:10:19 +00:00
item = proto_tree_add_item ( tree , proto , tvb_original , 0 , - 1 , ENC_NA ) ;
2009-04-27 16:57:02 +00:00
pwc_item_append_cw ( item , tvb_get_ntohl ( tvb_original , 0 ) , TRUE ) ;
pwc_item_append_text_n_items ( item , ( int ) payload_size , " octet " ) ;
{
2010-01-22 13:56:19 +00:00
proto_tree * tree2 ;
tree2 = proto_item_add_subtree ( item , ett ) ;
2009-04-27 16:57:02 +00:00
{
tvbuff_t * tvb ;
2010-01-22 13:56:19 +00:00
proto_item * item2 ;
2009-04-27 16:57:02 +00:00
tvb = tvb_new_subset ( tvb_original , 0 , PWC_SIZEOF_CW , PWC_SIZEOF_CW ) ;
2011-10-04 22:44:31 +00:00
item2 = proto_tree_add_item ( tree2 , hf_cw , tvb , 0 , - 1 , ENC_NA ) ;
2010-01-22 13:56:19 +00:00
pwc_item_append_cw ( item2 , tvb_get_ntohl ( tvb , 0 ) , FALSE ) ;
2009-04-27 16:57:02 +00:00
{
2010-01-22 13:56:19 +00:00
proto_tree * tree3 ;
tree3 = proto_item_add_subtree ( item2 , ett ) ;
2009-04-27 16:57:02 +00:00
{
2010-01-22 13:56:19 +00:00
proto_item * item3 ;
2009-04-27 16:57:02 +00:00
if ( properties & PWC_CW_BAD_BITS03 ) /*display only if value is wrong*/
{
2011-10-06 03:35:44 +00:00
item3 = proto_tree_add_item ( tree3 , hf_cw_bits03 , tvb , 0 , 1 , ENC_BIG_ENDIAN ) ;
2013-09-08 00:47:15 +00:00
expert_add_info ( pinfo , item3 , & ei_cw_bits03 ) ;
2009-04-27 16:57:02 +00:00
}
2011-10-06 03:35:44 +00:00
proto_tree_add_item ( tree3 , hf_cw_l , tvb , 0 , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree3 , hf_cw_r , tvb , 0 , 1 , ENC_BIG_ENDIAN ) ;
2009-04-27 16:57:02 +00:00
2011-10-06 03:35:44 +00:00
item3 = proto_tree_add_item ( tree3 , hf_cw_rsv , tvb , 0 , 1 , ENC_BIG_ENDIAN ) ;
2009-04-27 16:57:02 +00:00
if ( properties & PWC_CW_BAD_RSV )
{
2013-09-08 00:47:15 +00:00
expert_add_info ( pinfo , item3 , & ei_cw_rsv ) ;
2009-04-27 16:57:02 +00:00
}
2011-10-06 03:35:44 +00:00
item3 = proto_tree_add_item ( tree3 , hf_cw_frg , tvb , 1 , 1 , ENC_BIG_ENDIAN ) ;
2009-04-27 16:57:02 +00:00
if ( properties & PWC_CW_BAD_FRAG )
{
2013-09-08 00:47:15 +00:00
expert_add_info ( pinfo , item3 , & ei_cw_frg ) ;
2009-04-27 16:57:02 +00:00
}
2011-10-06 03:35:44 +00:00
item3 = proto_tree_add_item ( tree3 , hf_cw_len , tvb , 1 , 1 , ENC_BIG_ENDIAN ) ;
2009-04-27 16:57:02 +00:00
if ( properties & PWC_CW_BAD_PAYLEN_LT_0 )
{
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , item3 , & ei_payload_size_invalid ,
2013-09-08 00:47:15 +00:00
" Bad Length: too small, must be > %d " ,
( int ) encaps_size ) ;
2009-04-27 16:57:02 +00:00
}
if ( properties & PWC_CW_BAD_PAYLEN_GT_PACKET )
{
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , item3 , & ei_payload_size_invalid ,
2013-09-08 00:47:15 +00:00
" Bad Length: must be <= than PSN packet size (%d) " ,
( int ) packet_size ) ;
2009-04-27 16:57:02 +00:00
}
if ( properties & PWC_CW_BAD_LEN_MUST_BE_0 )
{
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , item3 , & ei_payload_size_invalid ,
2013-09-08 00:47:15 +00:00
" Bad Length: must be 0 if SAToP packet size (%d) is > 64 " ,
( int ) packet_size ) ;
2009-04-27 16:57:02 +00:00
}
2009-09-10 15:30:10 +00:00
2011-10-06 03:35:44 +00:00
proto_tree_add_item ( tree3 , hf_cw_seq , tvb , 2 , 2 , ENC_BIG_ENDIAN ) ;
2009-04-27 16:57:02 +00:00
}
}
}
}
/* payload */
if ( properties & PWC_PAY_SIZE_BAD )
{
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , item , & ei_payload_size_invalid ,
2009-04-27 16:57:02 +00:00
" SAToP payload: none found. Size of payload must be <> 0 " ) ;
}
else if ( payload_size = = 0 )
{
2013-09-08 00:47:15 +00:00
expert_add_info ( pinfo , item , & ei_payload_size_invalid_undecoded ) ;
2009-04-27 16:57:02 +00:00
}
else
{
2010-01-22 13:56:19 +00:00
proto_tree * tree2 ;
tree2 = proto_item_add_subtree ( item , ett ) ;
2009-04-27 16:57:02 +00:00
{
2010-01-22 13:56:19 +00:00
proto_item * item2 ;
2009-04-27 16:57:02 +00:00
tvbuff_t * tvb ;
tvb = tvb_new_subset ( tvb_original , PWC_SIZEOF_CW , payload_size , payload_size ) ;
2011-10-04 22:44:31 +00:00
item2 = proto_tree_add_item ( tree2 , hf_payload , tvb , 0 , - 1 , ENC_NA ) ;
2010-01-22 13:56:19 +00:00
pwc_item_append_text_n_items ( item2 , ( int ) payload_size , " octet " ) ;
2009-04-27 16:57:02 +00:00
{
2010-01-22 13:56:19 +00:00
proto_tree * tree3 ;
2009-04-27 16:57:02 +00:00
const char * s ;
switch ( payload_properties )
{
case PAY_LIKE_E1 :
s = " (looks like E1) " ;
break ;
case PAY_LIKE_T1 :
s = " (looks like T1) " ;
break ;
case PAY_LIKE_E3_T3 :
s = " (looks like E3/T3) " ;
break ;
case PAY_LIKE_OCTET_ALIGNED_T1 :
s = " (looks like octet-aligned T1) " ;
break ;
case PAY_NO_IDEA :
default :
s = " " ;
break ;
}
2010-01-22 13:56:19 +00:00
proto_item_append_text ( item2 , " %s " , s ) ;
tree3 = proto_item_add_subtree ( item2 , ett ) ;
call_dissector ( data_handle , tvb , pinfo , tree3 ) ;
item2 = proto_tree_add_int ( tree3 , hf_payload_l , tvb , 0 , 0
2009-06-29 19:24:14 +00:00
, ( int ) payload_size ) ; /* allow filtering */
2010-01-22 13:56:19 +00:00
PROTO_ITEM_SET_HIDDEN ( item2 ) ;
2009-04-27 16:57:02 +00:00
}
}
}
2009-09-10 15:30:10 +00:00
2009-04-27 16:57:02 +00:00
/* padding */
if ( padding_size > 0 )
{
2010-01-22 13:56:19 +00:00
proto_tree * tree2 ;
tree2 = proto_item_add_subtree ( item , ett ) ;
2009-04-27 16:57:02 +00:00
{
tvbuff_t * tvb ;
tvb = tvb_new_subset ( tvb_original , PWC_SIZEOF_CW + payload_size , padding_size , - 1 ) ;
2010-01-22 13:56:19 +00:00
call_dissector ( pw_padding_handle , tvb , pinfo , tree2 ) ;
2009-04-27 16:57:02 +00:00
}
2009-09-10 15:30:10 +00:00
}
2009-04-27 16:57:02 +00:00
}
return ;
}
2009-09-10 15:30:10 +00:00
static
void dissect_pw_satop_mpls ( tvbuff_t * tvb_original , packet_info * pinfo , proto_tree * tree )
{
dissect_pw_satop ( tvb_original , pinfo , tree , PWC_DEMUX_MPLS ) ;
return ;
}
static
void dissect_pw_satop_udp ( tvbuff_t * tvb_original , packet_info * pinfo , proto_tree * tree )
{
dissect_pw_satop ( tvb_original , pinfo , tree , PWC_DEMUX_UDP ) ;
return ;
}
2009-04-27 16:57:02 +00:00
void proto_register_pw_satop ( void )
{
static hf_register_info hf [ ] = {
2010-04-25 17:38:46 +00:00
{ & hf_cw , { " Control Word " , " pwsatop.cw "
2009-04-27 16:57:02 +00:00
, FT_NONE , BASE_NONE , NULL
2013-01-26 16:31:24 +00:00
, 0 , NULL , HFILL } } ,
{ & hf_cw_bits03 , { " Bits 0 to 3 " , " pwsatop.cw.bits03 "
2009-09-10 15:30:10 +00:00
, FT_UINT8 , BASE_DEC , NULL
2013-01-26 16:31:24 +00:00
, 0xf0 , NULL , HFILL } } ,
{ & hf_cw_l , { " L bit: TDM payload state " , " pwsatop.cw.lbit "
2009-04-27 16:57:02 +00:00
, FT_UINT8 , BASE_DEC , VALS ( pwc_vals_cw_l_bit )
2013-01-26 16:31:24 +00:00
, 0x08 , NULL , HFILL } } ,
{ & hf_cw_r , { " R bit: Local CE-bound IWF " , " pwsatop.cw.rbit "
2009-04-27 16:57:02 +00:00
, FT_UINT8 , BASE_DEC , VALS ( pwc_vals_cw_r_bit )
2013-01-26 16:31:24 +00:00
, 0x04 , NULL , HFILL } } ,
{ & hf_cw_rsv , { " Reserved " , " pwsatop.cw.rsv "
2009-04-27 16:57:02 +00:00
, FT_UINT8 , BASE_DEC , NULL
2013-01-26 16:31:24 +00:00
, 0x03 , NULL , HFILL } } ,
{ & hf_cw_frg , { " Fragmentation " , " pwsatop.cw.frag "
2009-04-27 16:57:02 +00:00
, FT_UINT8 , BASE_DEC , VALS ( pwc_vals_cw_frag )
2013-01-26 16:31:24 +00:00
, 0xc0 , NULL , HFILL } } ,
{ & hf_cw_len , { " Length " , " pwsatop.cw.length "
2009-04-27 16:57:02 +00:00
, FT_UINT8 , BASE_DEC , NULL
2013-01-26 16:31:24 +00:00
, 0x3f , NULL , HFILL } } ,
{ & hf_cw_seq , { " Sequence number " , " pwsatop.cw.seqno "
2009-04-27 16:57:02 +00:00
, FT_UINT16 , BASE_DEC , NULL
2013-01-26 16:31:24 +00:00
, 0 , NULL , HFILL } } ,
{ & hf_payload , { " TDM payload " , " pwsatop.payload "
2009-09-10 15:30:10 +00:00
, FT_BYTES , BASE_NONE , NULL
2013-01-26 16:31:24 +00:00
, 0 , NULL , HFILL } } ,
{ & hf_payload_l , { " TDM payload length " , " pwsatop.payload.len "
2009-06-29 19:24:14 +00:00
, FT_INT32 , BASE_DEC , NULL
2009-04-27 16:57:02 +00:00
, 0 , NULL , HFILL } }
} ;
2009-09-10 15:30:10 +00:00
2009-04-27 16:57:02 +00:00
static gint * ett_array [ ] = {
& ett
} ;
2013-09-08 00:47:15 +00:00
static ei_register_info ei [ ] = {
{ & ei_cw_packet_size_too_small , { " pwsatop.packet_size_too_small " , PI_MALFORMED , PI_ERROR , " PW packet size (%d) is too small to carry sensible information " , EXPFILL } } ,
{ & ei_cw_bits03 , { " pwsatop.cw.bits03.not_zero " , PI_MALFORMED , PI_ERROR , " Bits 0..3 of Control Word must be 0 " , EXPFILL } } ,
{ & ei_cw_rsv , { " pwsatop.cw.rsv.not_zero " , PI_MALFORMED , PI_ERROR , " RSV bits of Control Word must be 0 " , EXPFILL } } ,
{ & ei_cw_frg , { " pwsatop.cw.frag.not_allowed " , PI_MALFORMED , PI_ERROR , " Fragmentation of payload is not allowed for SAToP " , EXPFILL } } ,
{ & ei_payload_size_invalid , { " pwsatop.payload.size_invalid " , PI_MALFORMED , PI_ERROR , " Bad Length: too small " , EXPFILL } } ,
{ & ei_payload_size_invalid_undecoded , { " pwsatop.payload.undecoded " , PI_UNDECODED , PI_NOTE , " SAToP payload: omitted to conserve bandwidth " , EXPFILL } } ,
} ;
expert_module_t * expert_pwsatop ;
2009-04-27 16:57:02 +00:00
proto = proto_register_protocol ( pwc_longname_pw_satop , shortname , " pwsatopcw " ) ;
proto_register_field_array ( proto , hf , array_length ( hf ) ) ;
proto_register_subtree_array ( ett_array , array_length ( ett_array ) ) ;
2013-09-08 00:47:15 +00:00
expert_pwsatop = expert_register_protocol ( proto ) ;
expert_register_field_array ( expert_pwsatop , ei , array_length ( ei ) ) ;
2009-09-10 15:30:10 +00:00
register_dissector ( " pw_satop_mpls " , dissect_pw_satop_mpls , proto ) ;
register_dissector ( " pw_satop_udp " , dissect_pw_satop_udp , proto ) ;
2009-04-27 16:57:02 +00:00
return ;
}
void proto_reg_handoff_pw_satop ( void )
{
2009-04-28 02:06:35 +00:00
data_handle = find_dissector ( " data " ) ;
2009-06-29 19:24:14 +00:00
pw_padding_handle = find_dissector ( " pw_padding " ) ;
2012-09-28 19:50:49 +00:00
dissector_add_uint ( " mpls.label " , MPLS_LABEL_INVALID , find_dissector ( " pw_satop_mpls " ) ) ;
2009-09-10 15:30:10 +00:00
dissector_add_handle ( " udp.port " , find_dissector ( " pw_satop_udp " ) ) ; /* for Decode-As */
2009-04-27 16:57:02 +00:00
}