Convert LAPD and V.120 dissector to use tvbuff. Convert xdlc dissector-helper,

too.

svn path=/trunk/; revision=2030
This commit is contained in:
Gilbert Ramirez 2000-05-31 03:58:56 +00:00
parent fa8b1d4e8b
commit aa553f63ec
9 changed files with 154 additions and 150 deletions

View File

@ -2,7 +2,7 @@
* Routines for lapb frame disassembly
* Olivier Abad <oabad@cybercable.fr>
*
* $Id: packet-lapb.c,v 1.20 2000/05/28 17:04:10 oabad Exp $
* $Id: packet-lapb.c,v 1.21 2000/05/31 03:58:53 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -55,8 +55,6 @@ dissect_lapb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree *lapb_tree, *ti;
int is_response;
guint8 byte0;
const guint8 *this_pd;
int this_offset;
tvbuff_t *next_tvb;
pinfo->current_proto = "LAPB";
@ -105,8 +103,7 @@ dissect_lapb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
else
lapb_tree = NULL;
tvb_compat(tvb, &this_pd, &this_offset);
dissect_xdlc_control(this_pd, this_offset+1, pinfo->fd, lapb_tree, hf_lapb_control,
dissect_xdlc_control(tvb, 1, pinfo, lapb_tree, hf_lapb_control,
ett_lapb_control, is_response, FALSE);
/* not end of frame ==> X.25 */

View File

@ -2,7 +2,7 @@
* Routines for LAPD frame disassembly
* Gilbert Ramirez <gram@xiexie.org>
*
* $Id: packet-lapd.c,v 1.9 2000/05/29 08:57:37 guy Exp $
* $Id: packet-lapd.c,v 1.10 2000/05/31 03:58:54 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -84,79 +84,78 @@ static const value_string lapd_sapi_vals[] = {
};
void
dissect_lapd(const union wtap_pseudo_header *pseudo_header, const u_char *pd,
frame_data *fd, proto_tree *tree)
dissect_lapd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_tree *lapd_tree, *addr_tree;
proto_item *ti;
guint16 control;
int lapd_header_len;
tvbuff_t *new_tvb;
guint16 address, cr, sapi;
gboolean is_response;
tvbuff_t *next_tvb;
guint16 address, cr, sapi;
pinfo->current_proto = "LAPD";
gboolean is_response;
if (check_col(pinfo->fd, COL_PROTOCOL))
col_add_str(pinfo->fd, COL_PROTOCOL, "LAPD");
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "LAPD");
address = pntohs(&pd[0]);
address = tvb_get_ntohs(tvb, 0);
cr = address & LAPD_CR;
sapi = (address & LAPD_SAPI) >> LAPD_SAPI_SHIFT;
lapd_header_len = 2; /* address */
if (pseudo_header->lapd.from_network_to_user) {
if (pinfo->pseudo_header->lapd.from_network_to_user) {
is_response = cr ? FALSE : TRUE;
if(check_col(fd, COL_RES_DL_DST))
col_add_str(fd, COL_RES_DL_DST, "User");
if(check_col(fd, COL_RES_DL_SRC))
col_add_str(fd, COL_RES_DL_SRC, "Network");
if(check_col(pinfo->fd, COL_RES_DL_DST))
col_add_str(pinfo->fd, COL_RES_DL_DST, "User");
if(check_col(pinfo->fd, COL_RES_DL_SRC))
col_add_str(pinfo->fd, COL_RES_DL_SRC, "Network");
}
else {
is_response = cr ? TRUE : FALSE;
if(check_col(fd, COL_RES_DL_DST))
col_add_str(fd, COL_RES_DL_DST, "Network");
if(check_col(fd, COL_RES_DL_SRC))
col_add_str(fd, COL_RES_DL_SRC, "User");
if(check_col(pinfo->fd, COL_RES_DL_DST))
col_add_str(pinfo->fd, COL_RES_DL_DST, "Network");
if(check_col(pinfo->fd, COL_RES_DL_SRC))
col_add_str(pinfo->fd, COL_RES_DL_SRC, "User");
}
if (tree) {
ti = proto_tree_add_item(tree, proto_lapd, NullTVB, 0, 3, NULL);
ti = proto_tree_add_item(tree, proto_lapd, tvb, 0, 3, NULL);
lapd_tree = proto_item_add_subtree(ti, ett_lapd);
ti = proto_tree_add_item(lapd_tree, hf_lapd_address, NullTVB, 0, 2, address);
ti = proto_tree_add_item(lapd_tree, hf_lapd_address, tvb, 0, 2, address);
addr_tree = proto_item_add_subtree(ti, ett_lapd_address);
proto_tree_add_item(addr_tree, hf_lapd_sapi, NullTVB, 0, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_cr, NullTVB, 0, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_ea1, NullTVB, 0, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_tei, NullTVB, 1, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_ea2, NullTVB, 1, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_sapi,tvb, 0, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_cr, tvb, 0, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_ea1, tvb, 0, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_tei, tvb, 1, 1, address);
proto_tree_add_item(addr_tree, hf_lapd_ea2, tvb, 1, 1, address);
}
else {
lapd_tree = NULL;
}
control = dissect_xdlc_control(pd, 2, fd, lapd_tree, hf_lapd_control,
control = dissect_xdlc_control(tvb, 2, pinfo, lapd_tree, hf_lapd_control,
ett_lapd_control, is_response, TRUE);
lapd_header_len += XDLC_CONTROL_LEN(control, TRUE);
new_tvb = tvb_new_subset(pi.compat_top_tvb, lapd_header_len, -1, -1);
next_tvb = tvb_new_subset(tvb, lapd_header_len, -1, -1);
if (XDLC_IS_INFORMATION(control)) {
/* call next protocol */
switch (sapi) {
case LAPD_SAPI_Q931:
dissect_q931(new_tvb, &pi, tree);
dissect_q931(next_tvb, pinfo, tree);
break;
default:
dissect_data_tvb(new_tvb, &pi, tree);
dissect_data_tvb(next_tvb, pinfo, tree);
break;
}
} else
dissect_data_tvb(new_tvb, &pi, tree);
dissect_data_tvb(next_tvb, pinfo, tree);
}
void

View File

@ -1,6 +1,6 @@
/* packet-lapd.h
*
* $Id: packet-lapd.h,v 1.3 2000/05/19 23:06:09 gram Exp $
* $Id: packet-lapd.h,v 1.4 2000/05/31 03:58:54 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -22,5 +22,4 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
void dissect_lapd(const union wtap_pseudo_header *, const u_char *, frame_data *,
proto_tree *);
void dissect_lapd(tvbuff_t *, packet_info *, proto_tree *);

View File

@ -2,7 +2,7 @@
* Routines for IEEE 802.2 LLC layer
* Gilbert Ramirez <gram@xiexie.org>
*
* $Id: packet-llc.c,v 1.63 2000/05/28 22:02:17 guy Exp $
* $Id: packet-llc.c,v 1.64 2000/05/31 03:58:54 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -313,10 +313,9 @@ dissect_llc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
* uses extended operation, so we don't need to determine
* whether it's basic or extended operation; is that the case?
*/
tvb_compat(tvb, &pd, &offset);
control = dissect_xdlc_control(pd, offset+2, pinfo->fd, llc_tree,
control = dissect_xdlc_control(tvb, 2, pinfo, llc_tree,
hf_llc_ctrl, ett_llc_ctrl,
pd[offset+1] & SSAP_CR_BIT, TRUE);
tvb_get_guint8(tvb, 1) & SSAP_CR_BIT, TRUE);
llc_header_len += XDLC_CONTROL_LEN(control, TRUE);
if (is_snap)
llc_header_len += 5; /* 3 bytes of OUI, 2 bytes of protocol ID */

View File

@ -2,7 +2,7 @@
* Routines for v120 frame disassembly
* Bert Driehuis <driehuis@playbeing.org>
*
* $Id: packet-v120.c,v 1.8 2000/05/19 23:06:09 gram Exp $
* $Id: packet-v120.c,v 1.9 2000/05/31 03:58:54 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -51,75 +51,83 @@ static gint ett_v120_address = -1;
static gint ett_v120_control = -1;
static gint ett_v120_header = -1;
static int dissect_v120_header(const u_char *pd, int offset, frame_data *fd, proto_tree *tree);
static int dissect_v120_header(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree);
void
dissect_v120(const union wtap_pseudo_header *pseudo_header, const u_char *pd,
frame_data *fd, proto_tree *tree)
dissect_v120(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_tree *v120_tree, *ti, *tc, *address_tree;
int is_response;
int addr;
char info[80];
int v120len;
guint16 control;
proto_tree *v120_tree, *tc, *address_tree;
proto_item *ti;
int is_response;
int addr;
char info[80];
int v120len;
guint8 byte0, byte1;
guint16 control;
tvbuff_t *next_tvb;
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "V.120");
pinfo->current_proto = "V.120";
if(check_col(fd, COL_RES_DL_SRC))
col_add_fstr(fd, COL_RES_DL_SRC, "0x%02X", pd[0]);
if ((pd[0] & 0x01) != 0x00 && (pd[1] && 0x01) != 0x01)
if (check_col(pinfo->fd, COL_PROTOCOL))
col_add_str(pinfo->fd, COL_PROTOCOL, "V.120");
byte0 = tvb_get_guint8(tvb, 0);
if(check_col(pinfo->fd, COL_RES_DL_SRC))
col_add_fstr(pinfo->fd, COL_RES_DL_SRC, "0x%02X", byte0);
byte1 = tvb_get_guint8(tvb, 1);
if ((byte0 & 0x01) != 0x00 && (byte1 && 0x01) != 0x01)
{
if (check_col(fd, COL_INFO))
col_add_str(fd, COL_INFO, "Invalid V.120 frame");
if (check_col(pinfo->fd, COL_INFO))
col_add_str(pinfo->fd, COL_INFO, "Invalid V.120 frame");
if (tree)
ti = proto_tree_add_protocol_format(tree, proto_v120, NullTVB, 0, fd->cap_len,
ti = proto_tree_add_protocol_format(tree, proto_v120, tvb, 0, pinfo->fd->cap_len,
"Invalid V.120 frame");
return;
}
if (pseudo_header->x25.flags & FROM_DCE) {
if(check_col(fd, COL_RES_DL_DST))
col_add_str(fd, COL_RES_DL_DST, "DTE");
if(check_col(fd, COL_RES_DL_SRC))
col_add_str(fd, COL_RES_DL_SRC, "DCE");
if (pinfo->pseudo_header->x25.flags & FROM_DCE) {
if(check_col(pinfo->fd, COL_RES_DL_DST))
col_add_str(pinfo->fd, COL_RES_DL_DST, "DTE");
if(check_col(pinfo->fd, COL_RES_DL_SRC))
col_add_str(pinfo->fd, COL_RES_DL_SRC, "DCE");
}
else {
if(check_col(fd, COL_RES_DL_DST))
col_add_str(fd, COL_RES_DL_DST, "DCE");
if(check_col(fd, COL_RES_DL_SRC))
col_add_str(fd, COL_RES_DL_SRC, "DTE");
if(check_col(pinfo->fd, COL_RES_DL_DST))
col_add_str(pinfo->fd, COL_RES_DL_DST, "DCE");
if(check_col(pinfo->fd, COL_RES_DL_SRC))
col_add_str(pinfo->fd, COL_RES_DL_SRC, "DTE");
}
if (((pseudo_header->x25.flags & FROM_DCE) && pd[0] & 0x02) ||
(!(pseudo_header->x25.flags & FROM_DCE) && !(pd[0] & 0x02)))
if (((pinfo->pseudo_header->x25.flags & FROM_DCE) && byte0 & 0x02) ||
(!(pinfo->pseudo_header->x25.flags & FROM_DCE) && !(byte0 & 0x02)))
is_response = TRUE;
else
is_response = FALSE;
if (tree) {
ti = proto_tree_add_protocol_format(tree, proto_v120, NullTVB, 0, 0,
"V.120");
ti = proto_tree_add_protocol_format(tree, proto_v120, tvb, 0, 0, "V.120");
v120_tree = proto_item_add_subtree(ti, ett_v120);
addr = pd[1] << 8 | pd[0];
addr = byte1 << 8 | byte0;
sprintf(info, "LLI: %d C/R: %s",
((pd[0] & 0xfc) << 5) | ((pd[1] & 0xfe) >> 1),
pd[0] & 0x02 ? "R" : "C");
tc = proto_tree_add_text(v120_tree, NullTVB,
((byte0 & 0xfc) << 5) | ((byte1 & 0xfe) >> 1),
byte0 & 0x02 ? "R" : "C");
tc = proto_tree_add_text(v120_tree, tvb,
0, 2,
"Address field: %s", info);
address_tree = proto_item_add_subtree(tc, ett_v120_address);
proto_tree_add_text(address_tree, NullTVB, 0, 2,
proto_tree_add_text(address_tree, tvb, 0, 2,
decode_boolean_bitfield(addr, 0x0002, 2*8,
"Response", "Command"), NULL);
sprintf(info, "LLI: %d", ((pd[0] & 0xfc) << 5) | ((pd[1] & 0xfe) >> 1));
proto_tree_add_text(address_tree, NullTVB, 0, 2,
sprintf(info, "LLI: %d", ((byte0 & 0xfc) << 5) | ((byte1 & 0xfe) >> 1));
proto_tree_add_text(address_tree, tvb, 0, 2,
decode_numeric_bitfield(addr, 0xfefc, 2*8, info));
proto_tree_add_text(address_tree, NullTVB, 0, 2,
proto_tree_add_text(address_tree, tvb, 0, 2,
decode_boolean_bitfield(addr, 0x0001, 2*8,
"EA0 = 1 (Error)", "EA0 = 0"), NULL);
proto_tree_add_text(address_tree, NullTVB, 0, 2,
proto_tree_add_text(address_tree, tvb, 0, 2,
decode_boolean_bitfield(addr, 0x0100, 2*8,
"EA1 = 1", "EA1 = 0 (Error)"), NULL);
}
@ -127,66 +135,69 @@ dissect_v120(const union wtap_pseudo_header *pseudo_header, const u_char *pd,
v120_tree = NULL;
ti = NULL;
}
control = dissect_xdlc_control(pd, 2, fd, v120_tree, hf_v120_control,
control = dissect_xdlc_control(tvb, 2, pinfo, v120_tree, hf_v120_control,
ett_v120_control, is_response, TRUE);
if (tree) {
v120len = 2 + XDLC_CONTROL_LEN(control, TRUE);
if (BYTES_ARE_IN_FRAME(v120len, 1))
v120len += dissect_v120_header(pd, v120len, fd, v120_tree);
if (tvb_bytes_exist(tvb, v120len, 1))
v120len += dissect_v120_header(tvb, v120len, pinfo, v120_tree);
proto_item_set_len(ti, v120len);
if (IS_DATA_IN_FRAME(v120len))
dissect_data(&pd[v120len], v120len, fd, v120_tree);
next_tvb = tvb_new_subset(tvb, v120len, -1, -1);
dissect_data_tvb(next_tvb, pinfo, v120_tree);
}
}
static int
dissect_v120_header(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
dissect_v120_header(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
{
char info[80];
int header_len, nbits;
int header;
proto_tree *h_tree, *tc;
guint8 byte0;
if (pd[offset] & 0x80) {
byte0 = tvb_get_guint8(tvb, offset);
if (byte0 & 0x80) {
header_len = 1;
header = pd[offset];
header = byte0;
} else {
header_len = 2;
header = pd[offset] | pd[offset + 1] << 8;
header = byte0 | tvb_get_guint8(tvb, offset + 1) << 8;
}
nbits = header_len * 8;
sprintf(info, "Header: B: %d F: %d", pd[offset] & 0x02 ? 1:0,
pd[offset] & 0x01 ? 1:0);
tc = proto_tree_add_text(tree, NullTVB,
sprintf(info, "Header: B: %d F: %d", byte0 & 0x02 ? 1:0,
byte0 & 0x01 ? 1:0);
tc = proto_tree_add_text(tree, tvb,
offset, header_len,
"Header octet: %s (0x%02X)", info, pd[offset]);
"Header octet: %s (0x%02X)", info, byte0);
h_tree = proto_item_add_subtree(tc, ett_v120_header);
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_boolean_bitfield(header, 0x80, nbits,
"No extension octet", "Extension octet follows"), NULL);
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_boolean_bitfield(header, 0x40, nbits,
"Break condition", "No break condition"), NULL);
sprintf(info, "Error control C1/C2: %d", (header & 0x0c) >> 2);
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_numeric_bitfield(header, 0x0c, nbits, info));
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_boolean_bitfield(header, 0x02, nbits,
"Segmentation bit B", "No segmentation bit B"), NULL);
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_boolean_bitfield(header, 0x01, nbits,
"Segmentation bit F", "No segmentation bit F"), NULL);
if (header_len == 2) {
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_boolean_bitfield(header, 0x8000, nbits,
"E", "E bit not set (Error)"), NULL);
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_boolean_bitfield(header, 0x4000, nbits,
"DR", "No DR"), NULL);
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_boolean_bitfield(header, 0x2000, nbits,
"SR", "No SR"), NULL);
proto_tree_add_text(h_tree, NullTVB, offset, header_len,
proto_tree_add_text(h_tree, tvb, offset, header_len,
decode_boolean_bitfield(header, 0x1000, nbits,
"RR", "No RR"), NULL);
}

View File

@ -1,6 +1,6 @@
/* packet-v120.h
*
* $Id: packet-v120.h,v 1.3 2000/05/19 23:06:09 gram Exp $
* $Id: packet-v120.h,v 1.4 2000/05/31 03:58:55 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -22,5 +22,4 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
void dissect_v120(const union wtap_pseudo_header *, const u_char *, frame_data *,
proto_tree *);
void dissect_v120(tvbuff_t *, packet_info *, proto_tree *);

View File

@ -1,7 +1,7 @@
/* packet.c
* Routines for packet disassembly
*
* $Id: packet.c,v 1.92 2000/05/29 08:57:41 guy Exp $
* $Id: packet.c,v 1.93 2000/05/31 03:58:55 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -1209,10 +1209,10 @@ dissect_packet(union wtap_pseudo_header *pseudo_header, const u_char *pd,
dissect_ascend(tvb, &pi, tree);
break;
case WTAP_ENCAP_LAPD :
dissect_lapd(pseudo_header, pd, fd, tree);
dissect_lapd(tvb, &pi, tree);
break;
case WTAP_ENCAP_V120 :
dissect_v120(pseudo_header, pd, fd, tree);
dissect_v120(tvb, &pi, tree);
break;
}
}

74
xdlc.c
View File

@ -2,7 +2,7 @@
* Routines for use by various SDLC-derived protocols, such as HDLC
* and its derivatives LAPB, IEEE 802.2 LLC, etc..
*
* $Id: xdlc.c,v 1.14 2000/05/11 08:16:00 gram Exp $
* $Id: xdlc.c,v 1.15 2000/05/31 03:58:55 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -195,7 +195,7 @@ get_xdlc_control(const u_char *pd, int offset, int is_response, int is_extended)
}
int
dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
dissect_xdlc_control(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *xdlc_tree, int hf_xdlc_control, gint ett_xdlc_control,
int is_response, int is_extended)
{
@ -205,16 +205,16 @@ dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
gchar *frame_type = NULL;
gchar *modifier;
switch (pd[offset] & 0x03) {
switch (tvb_get_guint8(tvb, offset) & 0x03) {
case XDLC_S:
/*
* Supervisory frame.
*/
if (is_extended)
control = pletohs(&pd[offset]);
control = tvb_get_letohs(tvb, offset);
else
control = pd[offset];
control = tvb_get_guint8(tvb, offset);
switch (control & XDLC_S_FTYPE_MASK) {
case XDLC_RR:
frame_type = "RR";
@ -245,49 +245,49 @@ dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
""),
(control & XDLC_N_R_MASK) >> XDLC_N_R_SHIFT);
}
if (check_col(fd, COL_INFO))
col_add_str(fd, COL_INFO, info);
if (check_col(pinfo->fd, COL_INFO))
col_add_str(pinfo->fd, COL_INFO, info);
if (xdlc_tree) {
if (is_extended) {
tc = proto_tree_add_uint_format(xdlc_tree, hf_xdlc_control, NullTVB,
tc = proto_tree_add_uint_format(xdlc_tree, hf_xdlc_control, tvb,
offset, 2,
control,
"Control field: %s (0x%04X)", info, control);
control_tree = proto_item_add_subtree(tc, ett_xdlc_control);
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_numeric_bitfield(control, XDLC_N_R_EXT_MASK, 2*8,
"N(R) = %u"));
if (control & XDLC_P_F_EXT) {
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_boolean_bitfield(control, XDLC_P_F_EXT, 2*8,
(is_response ? "Final" : "Poll"), NULL));
}
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_enumerated_bitfield(control, XDLC_S_FTYPE_MASK, 2*8,
stype_vals, "Supervisory frame - %s"));
/* This will always say it's a supervisory frame */
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_boolean_bitfield(control, 0x03, 2*8,
"Supervisory frame", NULL));
} else {
tc = proto_tree_add_uint_format(xdlc_tree, hf_xdlc_control, NullTVB,
tc = proto_tree_add_uint_format(xdlc_tree, hf_xdlc_control, tvb,
offset, 1,
control,
"Control field: %s (0x%02X)", info, control);
control_tree = proto_item_add_subtree(tc, ett_xdlc_control);
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_numeric_bitfield(control, XDLC_N_R_MASK, 1*8,
"N(R) = %u"));
if (control & XDLC_P_F) {
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_boolean_bitfield(control, XDLC_P_F, 1*8,
(is_response ? "Final" : "Poll"), NULL));
}
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_enumerated_bitfield(control, XDLC_S_FTYPE_MASK, 1*8,
stype_vals, "%s"));
/* This will always say it's a supervisory frame */
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_boolean_bitfield(control, 0x03, 1*8,
"Supervisory frame", NULL));
}
@ -305,7 +305,7 @@ dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
* control field of a U frame, there doesn't appear to be any
* need for it to be 2 bytes in extended operation.
*/
control = pd[offset];
control = tvb_get_guint8(tvb, offset);
if (is_response) {
modifier = match_strval(control & XDLC_U_MODIFIER_MASK,
modifier_short_vals_resp);
@ -320,25 +320,25 @@ dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
(is_response ? " F" : " P") :
""),
modifier);
if (check_col(fd, COL_INFO))
col_add_str(fd, COL_INFO, info);
if (check_col(pinfo->fd, COL_INFO))
col_add_str(pinfo->fd, COL_INFO, info);
if (xdlc_tree) {
tc = proto_tree_add_uint_format(xdlc_tree, hf_xdlc_control, NullTVB,
tc = proto_tree_add_uint_format(xdlc_tree, hf_xdlc_control, tvb,
offset, 1,
control,
"Control field: %s (0x%02X)", info, control);
control_tree = proto_item_add_subtree(tc, ett_xdlc_control);
if (control & XDLC_P_F) {
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_boolean_bitfield(control, XDLC_P_F, 1*8,
(is_response ? "Final" : "Poll"), NULL));
}
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_enumerated_bitfield(control, XDLC_U_MODIFIER_MASK, 1*8,
(is_response ? modifier_vals_resp : modifier_vals_cmd),
"%s"));
/* This will always say it's an unnumbered frame */
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_boolean_bitfield(control, 0x03, 1*8,
"Unnumbered frame", NULL));
}
@ -349,9 +349,9 @@ dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
* Information frame.
*/
if (is_extended)
control = pletohs(&pd[offset]);
control = tvb_get_letohs(tvb, offset);
else
control = pd[offset];
control = tvb_get_guint8(tvb, offset);
if (is_extended) {
sprintf(info, "I%s, N(R) = %u, N(S) = %u",
((control & XDLC_P_F_EXT) ? " P" : ""),
@ -363,10 +363,10 @@ dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
(control & XDLC_N_R_MASK) >> XDLC_N_R_SHIFT,
(control & XDLC_N_S_MASK) >> XDLC_N_S_SHIFT);
}
if (check_col(fd, COL_INFO))
col_add_str(fd, COL_INFO, info);
if (check_col(pinfo->fd, COL_INFO))
col_add_str(pinfo->fd, COL_INFO, info);
if (xdlc_tree) {
tc = proto_tree_add_uint_format(xdlc_tree, hf_xdlc_control, NullTVB,
tc = proto_tree_add_uint_format(xdlc_tree, hf_xdlc_control, tvb,
offset, (is_extended) ? 2 : 1,
control,
(is_extended) ? "Control field: %s (0x%04X)"
@ -374,35 +374,35 @@ dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
info, control);
control_tree = proto_item_add_subtree(tc, ett_xdlc_control);
if (is_extended) {
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_numeric_bitfield(control, XDLC_N_R_EXT_MASK, 2*8,
"N(R) = %u"));
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_numeric_bitfield(control, XDLC_N_S_EXT_MASK, 2*8,
"N(S) = %u"));
if (control & XDLC_P_F_EXT) {
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_boolean_bitfield(control, XDLC_P_F_EXT, 2*8,
"Poll", NULL));
}
/* This will always say it's an information frame */
proto_tree_add_text(control_tree, NullTVB, offset, 2,
proto_tree_add_text(control_tree, tvb, offset, 2,
decode_boolean_bitfield(control, 0x01, 2*8,
NULL, "Information frame"));
} else {
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_numeric_bitfield(control, XDLC_N_R_MASK, 1*8,
"N(R) = %u"));
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_numeric_bitfield(control, XDLC_N_S_MASK, 1*8,
"N(S) = %u"));
if (control & XDLC_P_F) {
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_boolean_bitfield(control, XDLC_P_F, 1*8,
"Poll", NULL));
}
/* This will always say it's an information frame */
proto_tree_add_text(control_tree, NullTVB, offset, 1,
proto_tree_add_text(control_tree, tvb, offset, 1,
decode_boolean_bitfield(control, 0x01, 1*8,
NULL, "Information frame"));
}

4
xdlc.h
View File

@ -2,7 +2,7 @@
* Define *DLC frame types, and routine to dissect the control field of
* a *DLC frame.
*
* $Id: xdlc.h,v 1.12 2000/01/24 02:05:39 guy Exp $
* $Id: xdlc.h,v 1.13 2000/05/31 03:58:56 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -79,6 +79,6 @@
int get_xdlc_control(const u_char *pd, int offset, int is_response,
int extended);
int dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
int dissect_xdlc_control(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *xdlc_tree, int hf_xdlc_control, gint ett_xdlc_control,
int is_response, int extended);