forked from osmocom/wireshark
BACP and BAP support in PPP dissector, from Motonori Shindo.
svn path=/trunk/; revision=4356
This commit is contained in:
parent
9f3b7f5ffd
commit
3af8644dac
1
AUTHORS
1
AUTHORS
|
@ -795,6 +795,7 @@ Motonori Shindo <mshindo[AT]mshindo.net> {
|
|||
formats that have an ASCII dump at the end of the line
|
||||
Get rid of "send output to /dev/null" hack in Ascend/Lucent
|
||||
trace reading code's Flex scanner
|
||||
BACP and BAP support in PPP dissector
|
||||
}
|
||||
|
||||
Terje Krogdahl <tekr[AT]nextra.com> {
|
||||
|
|
566
packet-ppp.c
566
packet-ppp.c
|
@ -1,7 +1,7 @@
|
|||
/* packet-ppp.c
|
||||
* Routines for ppp packet disassembly
|
||||
*
|
||||
* $Id: packet-ppp.c,v 1.78 2001/12/03 03:59:38 guy Exp $
|
||||
* $Id: packet-ppp.c,v 1.79 2001/12/08 01:03:19 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -88,6 +88,22 @@ static gint ett_cbcp_options = -1;
|
|||
static gint ett_cbcp_no_callback_opt = -1;
|
||||
static gint ett_cbcp_callback_opt = -1;
|
||||
|
||||
static int proto_bacp = -1;
|
||||
|
||||
static gint ett_bacp = -1;
|
||||
static gint ett_bacp_options = -1;
|
||||
static gint ett_bacp_favored_peer_opt = -1;
|
||||
|
||||
static int proto_bap = -1;
|
||||
|
||||
static gint ett_bap = -1;
|
||||
static gint ett_bap_options = -1;
|
||||
static gint ett_bap_link_type_opt = -1;
|
||||
static gint ett_bap_phone_delta_opt = -1;
|
||||
static gint ett_bap_reason_opt = -1;
|
||||
static gint ett_bap_link_disc_opt = -1;
|
||||
static gint ett_bap_call_status_opt = -1;
|
||||
|
||||
static int proto_comp_data = -1;
|
||||
|
||||
static gint ett_comp_data = -1;
|
||||
|
@ -153,6 +169,8 @@ static const value_string ppp_vals[] = {
|
|||
{PPP_CHAP, "Cryptographic Handshake Auth. Protocol" },
|
||||
{PPP_EAP, "Extensible Authentication Protocol" },
|
||||
{PPP_CBCP, "Callback Control Protocol" },
|
||||
{PPP_BACP, "Bandwidth Allocation Control Protocol" },
|
||||
{PPP_BAP, "Bandwitdh Allocation Protocol" },
|
||||
{0, NULL }
|
||||
};
|
||||
|
||||
|
@ -202,6 +220,18 @@ static const value_string cp_vals[] = {
|
|||
|
||||
#define CBCP_OPT 6 /* Use callback control protocol */
|
||||
|
||||
/*
|
||||
* BAP-specific packet types.
|
||||
*/
|
||||
#define BAP_CREQ 1 /* Call Request */
|
||||
#define BAP_CRES 2 /* Call Response */
|
||||
#define BAP_CBREQ 3 /* Callback Request */
|
||||
#define BAP_CBRES 4 /* Callback Response */
|
||||
#define BAP_LDQREQ 5 /* Link Drop Query Request */
|
||||
#define BAP_LDQRES 6 /* Link Drop Query Response */
|
||||
#define BAP_CSI 7 /* Call Status Indication */
|
||||
#define BAP_CSRES 8 /* Call Status Response */
|
||||
|
||||
static const value_string lcp_vals[] = {
|
||||
{CONFREQ, "Configuration Request" },
|
||||
{CONFACK, "Configuration Ack" },
|
||||
|
@ -239,6 +269,163 @@ static const value_string cbcp_vals[] = {
|
|||
{0, NULL }
|
||||
};
|
||||
|
||||
static const value_string bap_vals[] = {
|
||||
{BAP_CREQ, "Call Request" },
|
||||
{BAP_CRES, "Call Response" },
|
||||
{BAP_CBREQ, "Callback Request" },
|
||||
{BAP_CBRES, "Callback Response" },
|
||||
{BAP_LDQREQ, "Link Drop Query Request" },
|
||||
{BAP_LDQRES, "Link Drop Query Response" },
|
||||
{BAP_CSI, "Call Status Indication" },
|
||||
{BAP_CSRES, "Call Status Response" },
|
||||
{0, NULL }
|
||||
};
|
||||
|
||||
#define BAP_RESP_CODE_REQACK 0x00
|
||||
#define BAP_RESP_CODE_REQNAK 0x01
|
||||
#define BAP_RESP_CODE_REQREJ 0x02
|
||||
#define BAP_RESP_CODE_REQFULLNAK 0x03
|
||||
static const value_string bap_resp_code_vals[] = {
|
||||
{BAP_RESP_CODE_REQACK, "Request Ack" },
|
||||
{BAP_RESP_CODE_REQNAK, "Request Nak" },
|
||||
{BAP_RESP_CODE_REQREJ, "Request Rej" },
|
||||
{BAP_RESP_CODE_REQFULLNAK, "Request Full Nak" },
|
||||
{0, NULL }
|
||||
};
|
||||
|
||||
#define BAP_LINK_TYPE_ISDN 0 /* ISDN */
|
||||
#define BAP_LINK_TYPE_X25 1 /* X.25 */
|
||||
#define BAP_LINK_TYPE_ANALOG 2 /* Analog */
|
||||
#define BAP_LINK_TYPE_SD 3 /* Switched Digital (non-ISDN) */
|
||||
#define BAP_LINK_TYPE_ISDNOV 4 /* ISDN data over voice */
|
||||
#define BAP_LINK_TYPE_RESV5 5 /* Reserved */
|
||||
#define BAP_LINK_TYPE_RESV6 6 /* Reserved */
|
||||
#define BAP_LINK_TYPE_RESV7 7 /* Reserved */
|
||||
static const value_string bap_link_type_vals[] = {
|
||||
{BAP_LINK_TYPE_ISDN, "ISDN" },
|
||||
{BAP_LINK_TYPE_X25, "X.25" },
|
||||
{BAP_LINK_TYPE_ANALOG, "Analog" },
|
||||
{BAP_LINK_TYPE_SD, "Switched Digital (non-ISDN)" },
|
||||
{BAP_LINK_TYPE_ISDNOV, "ISDN data over voice" },
|
||||
{BAP_LINK_TYPE_RESV5, "Reserved" },
|
||||
{BAP_LINK_TYPE_RESV6, "Reserved" },
|
||||
{BAP_LINK_TYPE_RESV7, "Reserved" },
|
||||
{0, NULL }
|
||||
};
|
||||
|
||||
#define BAP_PHONE_DELTA_SUBOPT_UNIQ_DIGIT 1 /* Unique Digit */
|
||||
#define BAP_PHONE_DELTA_SUBOPT_SUBSC_NUM 2 /* Subscriber Number */
|
||||
#define BAP_PHONE_DELTA_SUBOPT_PHONENUM_SUBADDR 3 /* Phone Number Sub Address */
|
||||
static const value_string bap_phone_delta_subopt_vals[] = {
|
||||
{BAP_PHONE_DELTA_SUBOPT_UNIQ_DIGIT, "Unique Digit" },
|
||||
{BAP_PHONE_DELTA_SUBOPT_SUBSC_NUM, "Subscriber Number" },
|
||||
{BAP_PHONE_DELTA_SUBOPT_PHONENUM_SUBADDR, "Phone Number Sub Address" },
|
||||
{0, NULL }
|
||||
};
|
||||
|
||||
/*
|
||||
* Cause codes for Cause.
|
||||
*
|
||||
* The following code table is taken from packet-q931.c but is slightly
|
||||
* adapted to BAP protocol.
|
||||
*/
|
||||
static const value_string q931_cause_code_vals[] = {
|
||||
{ 0x00, "Call successful" },
|
||||
{ 0x01, "Unallocated (unassigned) number" },
|
||||
{ 0x02, "No route to specified transit network" },
|
||||
{ 0x03, "No route to destination" },
|
||||
{ 0x04, "Send special information tone" },
|
||||
{ 0x05, "Misdialled trunk prefix" },
|
||||
{ 0x06, "Channel unacceptable" },
|
||||
{ 0x07, "Call awarded and being delivered in an established channel" },
|
||||
{ 0x08, "Prefix 0 dialed but not allowed" },
|
||||
{ 0x09, "Prefix 1 dialed but not allowed" },
|
||||
{ 0x0A, "Prefix 1 dialed but not required" },
|
||||
{ 0x0B, "More digits received than allowed, call is proceeding" },
|
||||
{ 0x10, "Normal call clearing" },
|
||||
{ 0x11, "User busy" },
|
||||
{ 0x12, "No user responding" },
|
||||
{ 0x13, "No answer from user (user alerted)" },
|
||||
{ 0x14, "Subscriber absent" },
|
||||
{ 0x15, "Call rejected" },
|
||||
{ 0x16, "Number changed" },
|
||||
{ 0x17, "Reverse charging rejected" },
|
||||
{ 0x18, "Call suspended" },
|
||||
{ 0x19, "Call resumed" },
|
||||
{ 0x1A, "Non-selected user clearing" },
|
||||
{ 0x1B, "Destination out of order" },
|
||||
{ 0x1C, "Invalid number format (incomplete number)" },
|
||||
{ 0x1D, "Facility rejected" },
|
||||
{ 0x1E, "Response to STATUS ENQUIRY" },
|
||||
{ 0x1F, "Normal unspecified" },
|
||||
{ 0x21, "Circuit out of order" },
|
||||
{ 0x22, "No circuit/channel available" },
|
||||
{ 0x23, "Destination unattainable" },
|
||||
{ 0x25, "Degraded service" },
|
||||
{ 0x26, "Network out of order" },
|
||||
{ 0x27, "Transit delay range cannot be achieved" },
|
||||
{ 0x28, "Throughput range cannot be achieved" },
|
||||
{ 0x29, "Temporary failure" },
|
||||
{ 0x2A, "Switching equipment congestion" },
|
||||
{ 0x2B, "Access information discarded" },
|
||||
{ 0x2C, "Requested circuit/channel not available" },
|
||||
{ 0x2D, "Pre-empted" },
|
||||
{ 0x2E, "Precedence call blocked" },
|
||||
{ 0x2F, "Resources unavailable, unspecified" },
|
||||
{ 0x31, "Quality of service unavailable" },
|
||||
{ 0x32, "Requested facility not subscribed" },
|
||||
{ 0x33, "Reverse charging not allowed" },
|
||||
{ 0x34, "Outgoing calls barred" },
|
||||
{ 0x35, "Outgoing calls barred within CUG" },
|
||||
{ 0x36, "Incoming calls barred" },
|
||||
{ 0x37, "Incoming calls barred within CUG" },
|
||||
{ 0x38, "Call waiting not subscribed" },
|
||||
{ 0x39, "Bearer capability not authorized" },
|
||||
{ 0x3A, "Bearer capability not presently available" },
|
||||
{ 0x3E, "Inconsistency in designated outgoing access information and subscriber class" },
|
||||
{ 0x3F, "Service or option not available, unspecified" },
|
||||
{ 0x41, "Bearer capability not implemented" },
|
||||
{ 0x42, "Channel type not implemented" },
|
||||
{ 0x43, "Transit network selection not implemented" },
|
||||
{ 0x44, "Message not implemented" },
|
||||
{ 0x45, "Requested facility not implemented" },
|
||||
{ 0x46, "Only restricted digital information bearer capability is available" },
|
||||
{ 0x4F, "Service or option not implemented, unspecified" },
|
||||
{ 0x51, "Invalid call reference value" },
|
||||
{ 0x52, "Identified channel does not exist" },
|
||||
{ 0x53, "Call identity does not exist for suspended call" },
|
||||
{ 0x54, "Call identity in use" },
|
||||
{ 0x55, "No call suspended" },
|
||||
{ 0x56, "Call having the requested call identity has been cleared" },
|
||||
{ 0x57, "Called user not member of CUG" },
|
||||
{ 0x58, "Incompatible destination" },
|
||||
{ 0x59, "Non-existent abbreviated address entry" },
|
||||
{ 0x5A, "Destination address missing, and direct call not subscribed" },
|
||||
{ 0x5B, "Invalid transit network selection (national use)" },
|
||||
{ 0x5C, "Invalid facility parameter" },
|
||||
{ 0x5D, "Mandatory information element is missing" },
|
||||
{ 0x5F, "Invalid message, unspecified" },
|
||||
{ 0x60, "Mandatory information element is missing" },
|
||||
{ 0x61, "Message type non-existent or not implemented" },
|
||||
{ 0x62, "Message not compatible with call state or message type non-existent or not implemented" },
|
||||
{ 0x63, "Information element nonexistant or not implemented" },
|
||||
{ 0x64, "Invalid information element contents" },
|
||||
{ 0x65, "Message not compatible with call state" },
|
||||
{ 0x66, "Recovery on timer expiry" },
|
||||
{ 0x67, "Parameter non-existent or not implemented - passed on" },
|
||||
{ 0x6E, "Message with unrecognized parameter discarded" },
|
||||
{ 0x6F, "Protocol error, unspecified" },
|
||||
{ 0x7F, "Internetworking, unspecified" },
|
||||
{ 0xFF, "Non-specific failure" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string bap_call_status_opt_action_vals[] = {
|
||||
{0, "No retry" },
|
||||
{1, "Retry" },
|
||||
{0, NULL }
|
||||
};
|
||||
|
||||
#define STAC_CM_NONE 0
|
||||
#define STAC_CM_LCB 1
|
||||
#define STAC_CM_CRC 2
|
||||
|
@ -775,6 +962,111 @@ static const ip_tcp_opt cbcp_opts[] = {
|
|||
|
||||
#define N_CBCP_OPTS (sizeof cbcp_opts / sizeof cbcp_opts[0])
|
||||
|
||||
/*
|
||||
* Options. (BACP)
|
||||
*/
|
||||
#define CI_BACP_FAVORED_PEER 1 /* Favored-Peer */
|
||||
|
||||
static void dissect_bacp_favored_peer_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree);
|
||||
|
||||
static const ip_tcp_opt bacp_opts[] = {
|
||||
{
|
||||
CI_BACP_FAVORED_PEER,
|
||||
"Favored-Peer",
|
||||
&ett_bacp_favored_peer_opt,
|
||||
FIXED_LENGTH,
|
||||
6,
|
||||
dissect_bacp_favored_peer_opt
|
||||
}
|
||||
};
|
||||
|
||||
#define N_BACP_OPTS (sizeof bacp_opts / sizeof bacp_opts[0])
|
||||
|
||||
/*
|
||||
* Options. (BAP)
|
||||
*/
|
||||
#define CI_BAP_LINK_TYPE 1 /* Link Type */
|
||||
#define CI_BAP_PHONE_DELTA 2 /* Phone-Delta */
|
||||
#define CI_BAP_NO_PHONE_NUM_NEEDED 3 /* No Phone Number Needed */
|
||||
#define CI_BAP_REASON 4 /* Reason */
|
||||
#define CI_BAP_LINK_DISC 5 /* Link Discriminator */
|
||||
#define CI_BAP_CALL_STATUS 6 /* Call Status */
|
||||
|
||||
static void dissect_bap_link_type_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree);
|
||||
|
||||
static void dissect_bap_phone_delta_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree);
|
||||
|
||||
static void dissect_bap_link_disc_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree);
|
||||
|
||||
static void dissect_bap_reason_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree);
|
||||
|
||||
static void dissect_bap_call_status_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree);
|
||||
|
||||
static const ip_tcp_opt bap_opts[] = {
|
||||
{
|
||||
CI_BAP_LINK_TYPE,
|
||||
"Link Type",
|
||||
&ett_bap_link_type_opt,
|
||||
FIXED_LENGTH,
|
||||
5,
|
||||
dissect_bap_link_type_opt
|
||||
},
|
||||
{
|
||||
CI_BAP_PHONE_DELTA,
|
||||
"Phone Delta",
|
||||
&ett_bap_phone_delta_opt,
|
||||
VARIABLE_LENGTH,
|
||||
4,
|
||||
dissect_bap_phone_delta_opt
|
||||
},
|
||||
{
|
||||
CI_BAP_NO_PHONE_NUM_NEEDED,
|
||||
"No Phone Number Needed",
|
||||
NULL,
|
||||
FIXED_LENGTH,
|
||||
2,
|
||||
NULL
|
||||
},
|
||||
{
|
||||
CI_BAP_REASON,
|
||||
"Reason",
|
||||
&ett_bap_reason_opt,
|
||||
VARIABLE_LENGTH,
|
||||
2,
|
||||
dissect_bap_reason_opt
|
||||
},
|
||||
{
|
||||
CI_BAP_LINK_DISC,
|
||||
"Link Discriminator",
|
||||
&ett_bap_link_disc_opt,
|
||||
FIXED_LENGTH,
|
||||
4,
|
||||
dissect_bap_link_disc_opt
|
||||
},
|
||||
{
|
||||
CI_BAP_CALL_STATUS,
|
||||
"Call Status",
|
||||
&ett_bap_call_status_opt,
|
||||
FIXED_LENGTH,
|
||||
4,
|
||||
dissect_bap_call_status_opt
|
||||
}
|
||||
};
|
||||
|
||||
#define N_BAP_OPTS (sizeof bap_opts / sizeof bap_opts[0])
|
||||
|
||||
static void dissect_ppp(tvbuff_t *tvb, packet_info *pinfo,
|
||||
proto_tree *tree);
|
||||
|
||||
|
@ -1475,6 +1767,141 @@ dissect_cbcp_callback_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_bacp_favored_peer_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree)
|
||||
{
|
||||
proto_item *tf;
|
||||
|
||||
tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
|
||||
|
||||
proto_tree_add_text(tf, tvb, offset + 2, 4,
|
||||
"Magic number: 0x%08x", tvb_get_ntohl(tvb, offset + 2));
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_bap_link_type_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree)
|
||||
{
|
||||
proto_item *tf;
|
||||
guint8 link_type;
|
||||
|
||||
tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
|
||||
|
||||
proto_tree_add_text(tf, tvb, offset + 2, 2,
|
||||
"Link Speed : %u kbps", tvb_get_ntohs(tvb, offset + 2));
|
||||
link_type = tvb_get_guint8(tvb, offset + 4);
|
||||
proto_tree_add_text(tf, tvb, offset + 4, 1,
|
||||
"Link Type : %s (%u)", val_to_str(link_type, bap_link_type_vals,
|
||||
"Unknown"), link_type);
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_bap_phone_delta_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree)
|
||||
{
|
||||
proto_item *ti;
|
||||
proto_item *tf;
|
||||
guint8 link_type;
|
||||
guint8 subopt_type;
|
||||
guint8 subopt_len;
|
||||
guint8 buf[256]; /* Since Sub-Option length field in BAP Phone-Delta
|
||||
Option is 8 bits, 256-octets buf is large enough */
|
||||
|
||||
ti = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
|
||||
|
||||
offset += 2;
|
||||
length -= 2;
|
||||
|
||||
while (length > 0) {
|
||||
subopt_type = tvb_get_guint8(tvb, offset);
|
||||
subopt_len = tvb_get_guint8(tvb, offset + 1);
|
||||
tf = proto_tree_add_text(ti, tvb, offset, subopt_len,
|
||||
"Sub-Option (%d byte%s)",
|
||||
subopt_len, plurality(subopt_len, "", "s"));
|
||||
|
||||
proto_tree_add_text(tf, tvb, offset, 1,
|
||||
"Sub-Option Type : %s (%u)",
|
||||
val_to_str(subopt_type, bap_phone_delta_subopt_vals, "Unknown"),
|
||||
subopt_type);
|
||||
|
||||
proto_tree_add_text(tf, tvb, offset + 1, 1,
|
||||
"Sub-Option Length : %u", subopt_len);
|
||||
|
||||
switch (subopt_type) {
|
||||
case BAP_PHONE_DELTA_SUBOPT_UNIQ_DIGIT:
|
||||
proto_tree_add_text(tf, tvb, offset + 2, 1, "Uniq Digit: %u",
|
||||
tvb_get_guint8(tvb, offset + 2));
|
||||
break;
|
||||
case BAP_PHONE_DELTA_SUBOPT_SUBSC_NUM:
|
||||
tvb_get_nstringz0(tvb, offset + 2, subopt_len - 2, buf);
|
||||
proto_tree_add_text(tf, tvb, offset + 2, subopt_len - 2,
|
||||
"Subscriber Number: %s", buf);
|
||||
break;
|
||||
case BAP_PHONE_DELTA_SUBOPT_PHONENUM_SUBADDR:
|
||||
tvb_get_nstringz0(tvb, offset + 2, subopt_len - 2, buf);
|
||||
proto_tree_add_text(tf, tvb, offset + 2, subopt_len - 2,
|
||||
"Phone Number Sub Address: %s", buf);
|
||||
break;
|
||||
default:
|
||||
proto_tree_add_text(tf, tvb, offset + 2, subopt_len - 2, "Unknown");
|
||||
break;
|
||||
}
|
||||
offset += subopt_len;
|
||||
length -= subopt_len;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_bap_reason_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree)
|
||||
{
|
||||
guint8 link_type;
|
||||
guint8 buf[256]; /* Since length field in BAP Reason Option is
|
||||
8 bits, 256-octets buf is large enough */
|
||||
|
||||
tvb_get_nstringz0(tvb, offset + 2, length - 2, buf);
|
||||
proto_tree_add_text(tree, tvb, offset, length, "%s : %s",
|
||||
optp->name, buf);
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_bap_link_disc_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree)
|
||||
{
|
||||
guint8 link_type;
|
||||
|
||||
proto_tree_add_text(tree, tvb, offset, length, "%s : 0x%04x",
|
||||
optp->name, tvb_get_ntohs(tvb, offset + 2));
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_bap_call_status_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
|
||||
int offset, guint length, frame_data *fd,
|
||||
proto_tree *tree)
|
||||
{
|
||||
proto_item *tf;
|
||||
guint8 link_type;
|
||||
guint8 status, action;
|
||||
|
||||
tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
|
||||
|
||||
status = tvb_get_guint8(tvb, offset + 2);
|
||||
proto_tree_add_text(tf, tvb, offset + 2, 1,
|
||||
"Status : %s (0x%02x)",
|
||||
val_to_str(status, q931_cause_code_vals, "Unknown"), status);
|
||||
|
||||
action = tvb_get_guint8(tvb, offset + 3);
|
||||
proto_tree_add_text(tf, tvb, offset + 3, 1,
|
||||
"Action : %s (0x%02x)",
|
||||
val_to_str(action, bap_call_status_opt_action_vals, "Unknown"), action);
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_cp( tvbuff_t *tvb, int proto_id, int proto_subtree_index,
|
||||
const value_string *proto_vals, int options_subtree_index,
|
||||
|
@ -1673,6 +2100,73 @@ dissect_cbcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
cbcp_opts, N_CBCP_OPTS, pinfo, tree);
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_bacp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
{
|
||||
dissect_cp(tvb, proto_bacp, ett_bacp, cp_vals, ett_bacp_options,
|
||||
bacp_opts, N_BACP_OPTS, pinfo, tree);
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_bap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
{
|
||||
|
||||
proto_item *ti;
|
||||
proto_tree *fh_tree = NULL;
|
||||
proto_item *tf;
|
||||
proto_tree *field_tree;
|
||||
|
||||
guint8 type;
|
||||
guint8 id;
|
||||
int length, offset;
|
||||
guint8 resp_code;
|
||||
|
||||
type = tvb_get_guint8(tvb, 0);
|
||||
id = tvb_get_guint8(tvb, 1);
|
||||
length = tvb_get_ntohs(tvb, 2);
|
||||
|
||||
if(check_col(pinfo->fd, COL_PROTOCOL))
|
||||
col_set_str(pinfo->fd, COL_PROTOCOL,
|
||||
proto_get_protocol_short_name(proto_bap));
|
||||
|
||||
if(check_col(pinfo->fd, COL_INFO))
|
||||
col_add_fstr(pinfo->fd, COL_INFO, "%s %s",
|
||||
proto_get_protocol_short_name(proto_bap),
|
||||
val_to_str(type, bap_vals, "Unknown"));
|
||||
|
||||
if(tree) {
|
||||
ti = proto_tree_add_item(tree, proto_bap, tvb, 0, length, FALSE);
|
||||
fh_tree = proto_item_add_subtree(ti, ett_bap_options);
|
||||
proto_tree_add_text(fh_tree, tvb, 0, 1, "Type: %s (0x%02x)",
|
||||
val_to_str(type, bap_vals, "Unknown"), type);
|
||||
proto_tree_add_text(fh_tree, tvb, 1, 1, "Identifier: 0x%02x",
|
||||
id);
|
||||
proto_tree_add_text(fh_tree, tvb, 2, 2, "Length: %u",
|
||||
length);
|
||||
}
|
||||
offset = 4;
|
||||
length -= 4;
|
||||
|
||||
if (type == BAP_CRES || type == BAP_CBRES ||
|
||||
type == BAP_LDQRES || type == BAP_CSRES) {
|
||||
resp_code = tvb_get_guint8(tvb, offset);
|
||||
proto_tree_add_text(fh_tree, tvb, offset, 1, "Response Code: %s (0x%02x)",
|
||||
val_to_str(resp_code, bap_resp_code_vals, "Unknown"), resp_code);
|
||||
offset++;
|
||||
length--;
|
||||
}
|
||||
|
||||
if(tree) {
|
||||
if (length > 0) {
|
||||
tf = proto_tree_add_text(fh_tree, tvb, offset, length,
|
||||
"Data (%d byte%s)", length, plurality(length, "", "s"));
|
||||
field_tree = proto_item_add_subtree(tf, ett_bap_options);
|
||||
dissect_ip_tcp_options(tvb, offset, length, bap_opts, N_BAP_OPTS, -1,
|
||||
pinfo->fd, field_tree);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dissect_comp_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
{
|
||||
|
@ -1907,7 +2401,7 @@ dissect_pap( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
|
|||
if(tree) {
|
||||
if (length > 0) {
|
||||
tf = proto_tree_add_text(fh_tree, tvb, offset, length,
|
||||
"Data: (%d byte%s)", length, plurality(length, "", "s"));
|
||||
"Data (%d byte%s)", length, plurality(length, "", "s"));
|
||||
field_tree = proto_item_add_subtree(tf, ett_pap_data);
|
||||
peer_id_length = tvb_get_guint8(tvb, offset);
|
||||
tp = proto_tree_add_text(field_tree, tvb, offset, 1,
|
||||
|
@ -1938,7 +2432,7 @@ dissect_pap( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
|
|||
if(tree) {
|
||||
if (length > 0) {
|
||||
tf = proto_tree_add_text(fh_tree, tvb, offset, length,
|
||||
"Data: (%d byte%s)", length, plurality(length, "", "s"));
|
||||
"Data (%d byte%s)", length, plurality(length, "", "s"));
|
||||
field_tree = proto_item_add_subtree(tf, ett_pap_data);
|
||||
msg_length = tvb_get_guint8(tvb, offset);
|
||||
tm = proto_tree_add_text(field_tree, tvb, offset, 1,
|
||||
|
@ -2008,7 +2502,7 @@ dissect_chap( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
|
|||
if(tree) {
|
||||
if (length > 0) {
|
||||
tf = proto_tree_add_text(fh_tree, tvb, offset, length,
|
||||
"Data: (%d byte%s)", length,
|
||||
"Data (%d byte%s)", length,
|
||||
plurality(length, "", "s"));
|
||||
field_tree = proto_item_add_subtree(tf, ett_chap_data);
|
||||
value_size = tvb_get_guint8(tvb, offset);
|
||||
|
@ -2040,7 +2534,7 @@ dissect_chap( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
|
|||
if(tree) {
|
||||
if (length > 0) {
|
||||
tf = proto_tree_add_text(fh_tree, tvb, offset, length,
|
||||
"Data: (%d byte%s)", length,
|
||||
"Data (%d byte%s)", length,
|
||||
plurality(length, "", "s"));
|
||||
field_tree = proto_item_add_subtree(tf, ett_chap_data);
|
||||
tv = proto_tree_add_text(field_tree, tvb, offset, length,
|
||||
|
@ -2295,6 +2789,68 @@ proto_reg_handoff_cbcp(void)
|
|||
dissector_add("ethertype", PPP_CBCP, cbcp_handle);
|
||||
}
|
||||
|
||||
void
|
||||
proto_register_bacp(void)
|
||||
{
|
||||
static gint *ett[] = {
|
||||
&ett_bacp,
|
||||
&ett_bacp_options,
|
||||
&ett_bacp_favored_peer_opt
|
||||
};
|
||||
|
||||
proto_bacp = proto_register_protocol("PPP Bandwidth Allocation Control Protocol",
|
||||
"PPP BACP", "bacp");
|
||||
proto_register_subtree_array(ett, array_length(ett));
|
||||
}
|
||||
|
||||
void
|
||||
proto_reg_handoff_bacp(void)
|
||||
{
|
||||
dissector_handle_t bacp_handle;
|
||||
|
||||
bacp_handle = create_dissector_handle(dissect_bacp, proto_bacp);
|
||||
dissector_add("ppp.protocol", PPP_BACP, bacp_handle);
|
||||
|
||||
/*
|
||||
* See above comment about NDISWAN for an explanation of why we're
|
||||
* registering with the "ethertype" dissector table.
|
||||
*/
|
||||
dissector_add("ethertype", PPP_BACP, bacp_handle);
|
||||
}
|
||||
|
||||
void
|
||||
proto_register_bap(void)
|
||||
{
|
||||
static gint *ett[] = {
|
||||
&ett_bap,
|
||||
&ett_bap_options,
|
||||
&ett_bap_link_type_opt,
|
||||
&ett_bap_phone_delta_opt,
|
||||
&ett_bap_reason_opt,
|
||||
&ett_bap_link_disc_opt,
|
||||
&ett_bap_call_status_opt
|
||||
};
|
||||
|
||||
proto_bap = proto_register_protocol("PPP Bandwidth Allocation Protocol",
|
||||
"PPP BAP", "bap");
|
||||
proto_register_subtree_array(ett, array_length(ett));
|
||||
}
|
||||
|
||||
void
|
||||
proto_reg_handoff_bap(void)
|
||||
{
|
||||
dissector_handle_t bap_handle;
|
||||
|
||||
bap_handle = create_dissector_handle(dissect_bap, proto_bap);
|
||||
dissector_add("ppp.protocol", PPP_BAP, bap_handle);
|
||||
|
||||
/*
|
||||
* See above comment about NDISWAN for an explanation of why we're
|
||||
* registering with the "ethertype" dissector table.
|
||||
*/
|
||||
dissector_add("ethertype", PPP_BAP, bap_handle);
|
||||
}
|
||||
|
||||
void
|
||||
proto_register_comp_data(void)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* ppptypes.h
|
||||
* Defines PPP packet types.
|
||||
*
|
||||
* $Id: ppptypes.h,v 1.9 2001/08/05 10:09:38 guy Exp $
|
||||
* $Id: ppptypes.h,v 1.10 2001/12/08 01:03:19 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -57,5 +57,7 @@
|
|||
#define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */
|
||||
#define PPP_EAP 0xc227 /* Extensible Authentication Protocol */
|
||||
#define PPP_CBCP 0xc029 /* Callback Control Protocol */
|
||||
#define PPP_BACP 0xc02b /* Bandwidth Allocation Control Protocol */
|
||||
#define PPP_BAP 0xc02d /* Bandwidth Allocation Protocol */
|
||||
|
||||
#endif /* ppptypes.h */
|
||||
|
|
Loading…
Reference in New Issue