forked from osmocom/wireshark
The only LLC frame types that should be dissected based on their SAP or,
if the SAPs are SNAP, based on their ethertype are I frames and UI frames; others don't have payload to be dissected as belonging to other protocols. svn path=/trunk/; revision=555
This commit is contained in:
parent
42aba512c6
commit
397b2be709
105
packet-llc.c
105
packet-llc.c
|
@ -2,7 +2,7 @@
|
|||
* Routines for IEEE 802.2 LLC layer
|
||||
* Gilbert Ramirez <gramirez@tivoli.com>
|
||||
*
|
||||
* $Id: packet-llc.c,v 1.19 1999/08/10 20:05:40 guy Exp $
|
||||
* $Id: packet-llc.c,v 1.20 1999/08/23 22:47:13 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@unicom.net>
|
||||
|
@ -162,29 +162,59 @@ sap_dissect_func(u_char sap) {
|
|||
void
|
||||
capture_llc(const u_char *pd, int offset, guint32 cap_len, packet_counts *ld) {
|
||||
|
||||
guint16 etype;
|
||||
int is_snap;
|
||||
int control;
|
||||
guint16 etype;
|
||||
capture_func_t *capture;
|
||||
|
||||
is_snap = (pd[offset] == 0xAA) && (pd[offset+1] == 0xAA);
|
||||
|
||||
/*
|
||||
* The low-order bit of the SSAP apparently determines whether this
|
||||
* is a request or a response. (RFC 1390, "Transmission of IP and
|
||||
* ARP over FDDI Networks", says
|
||||
*
|
||||
* Command frames are identified by having the low order
|
||||
* bit of the SSAP address reset to zero. Response frames
|
||||
* have the low order bit of the SSAP address set to one.
|
||||
*
|
||||
* and a page I've seen seems to imply that's part of 802.2.)
|
||||
*
|
||||
* XXX - that page also implies that LLC Type 2 always uses
|
||||
* extended operation, so we don't need to determine whether
|
||||
* it's basic or extended operation; is that the case?
|
||||
*/
|
||||
control = get_xdlc_control(pd, offset+2, pd[offset+1] & 0x01, TRUE);
|
||||
|
||||
if (is_snap) {
|
||||
etype = (pd[offset+6] << 8) | pd[offset+7];
|
||||
offset += 8;
|
||||
capture_ethertype(etype, offset, pd, cap_len, ld);
|
||||
if (control == XDLC_I || control == (XDLC_U|XDLC_UI)) {
|
||||
/*
|
||||
* Unnumbered Information - analyze it based on
|
||||
* the Ethernet packet type.
|
||||
*/
|
||||
etype = (pd[offset+6] << 8) | pd[offset+7];
|
||||
offset += 8;
|
||||
capture_ethertype(etype, offset, pd, cap_len, ld);
|
||||
}
|
||||
}
|
||||
else {
|
||||
capture = sap_capture_func(pd[offset]);
|
||||
if (control == XDLC_I || control == (XDLC_U|XDLC_UI)) {
|
||||
/*
|
||||
* Unnumbered Information - analyze it based on
|
||||
* the DSAP.
|
||||
*/
|
||||
capture = sap_capture_func(pd[offset]);
|
||||
|
||||
/* non-SNAP */
|
||||
offset += 3;
|
||||
/* non-SNAP */
|
||||
offset += 3;
|
||||
|
||||
if (capture) {
|
||||
capture(pd, offset, cap_len, ld);
|
||||
if (capture) {
|
||||
capture(pd, offset, cap_len, ld);
|
||||
}
|
||||
else {
|
||||
ld->other++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
ld->other++;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -193,8 +223,9 @@ dissect_llc(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
|
|||
|
||||
proto_tree *llc_tree = NULL;
|
||||
proto_item *ti;
|
||||
guint16 etype;
|
||||
int is_snap;
|
||||
int control;
|
||||
guint16 etype;
|
||||
dissect_func_t *dissect;
|
||||
|
||||
is_snap = (pd[offset] == 0xAA) && (pd[offset+1] == 0xAA);
|
||||
|
@ -226,17 +257,13 @@ dissect_llc(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
|
|||
* extended operation, so we don't need to determine whether
|
||||
* it's basic or extended operation; is that the case?
|
||||
*/
|
||||
dissect_xdlc_control(pd, offset+2, fd, llc_tree, hf_llc_ctrl,
|
||||
control = dissect_xdlc_control(pd, offset+2, fd, llc_tree, hf_llc_ctrl,
|
||||
pd[offset+1] & 0x01, TRUE);
|
||||
|
||||
/*
|
||||
* XXX - do we want to append the SAP information to the stuff
|
||||
* "dissect_xdlc_control()" put in the COL_INFO column, rather
|
||||
* than overwriting it?
|
||||
*
|
||||
* XXX - we shouldn't, as far as I know, pass S frames to
|
||||
* "ethertype" or "dissect", and we may have to treat I frames
|
||||
* differently from U frames.
|
||||
*/
|
||||
if (is_snap) {
|
||||
if (check_col(fd, COL_INFO)) {
|
||||
|
@ -246,10 +273,17 @@ dissect_llc(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
|
|||
proto_tree_add_item(llc_tree, hf_llc_oui, offset+3, 3,
|
||||
pd[offset+3] << 16 | pd[offset+4] << 8 | pd[offset+5]);
|
||||
}
|
||||
etype = pntohs(&pd[offset+6]);
|
||||
offset += 8;
|
||||
/* w/o even checking, assume OUI is ethertype */
|
||||
ethertype(etype, offset, pd, fd, tree, llc_tree, hf_llc_type);
|
||||
if (control == (XDLC_U|XDLC_UI)) {
|
||||
/*
|
||||
* Unnumbered Information - dissect it based on
|
||||
* the Ethernet packet type.
|
||||
*/
|
||||
etype = pntohs(&pd[offset+6]);
|
||||
offset += 8;
|
||||
/* w/o even checking, assume OUI is ethertype */
|
||||
ethertype(etype, offset, pd, fd, tree, llc_tree,
|
||||
hf_llc_type);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (check_col(fd, COL_INFO)) {
|
||||
|
@ -257,18 +291,23 @@ dissect_llc(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
|
|||
val_to_str(pd[offset], sap_vals, "%02x"));
|
||||
}
|
||||
|
||||
dissect = sap_dissect_func(pd[offset]);
|
||||
if (control == (XDLC_U|XDLC_UI)) {
|
||||
/*
|
||||
* Unnumbered Information - dissect it based on
|
||||
* the DSAP.
|
||||
*/
|
||||
dissect = sap_dissect_func(pd[offset]);
|
||||
|
||||
/* non-SNAP */
|
||||
offset += 3;
|
||||
/* non-SNAP */
|
||||
offset += 3;
|
||||
|
||||
if (dissect) {
|
||||
dissect(pd, offset, fd, tree);
|
||||
if (dissect) {
|
||||
dissect(pd, offset, fd, tree);
|
||||
}
|
||||
else {
|
||||
dissect_data(pd, offset, fd, tree);
|
||||
}
|
||||
}
|
||||
else {
|
||||
dissect_data(pd, offset, fd, tree);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
76
xdlc.c
76
xdlc.c
|
@ -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.3 1999/08/16 05:54:32 guy Exp $
|
||||
* $Id: xdlc.c,v 1.4 1999/08/23 22:47:13 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@unicom.net>
|
||||
|
@ -74,31 +74,6 @@ static const value_string stype_vals[] = {
|
|||
{ 0, NULL }
|
||||
};
|
||||
|
||||
/*
|
||||
* U-format modifiers.
|
||||
*/
|
||||
#define XDLC_U_MODIFIER_MASK 0xEC
|
||||
#define XDLC_UI 0x00 /* Unnumbered Information */
|
||||
#define XDLC_UP 0x20 /* Unnumbered Poll */
|
||||
#define XDLC_DISC 0x40 /* Disconnect (command) */
|
||||
#define XDLC_RD 0x40 /* Request Disconnect (response) */
|
||||
#define XDLC_UA 0x60 /* Unnumbered Acknowledge */
|
||||
#define XDLC_SNRM 0x80 /* Set Normal Response Mode */
|
||||
#define XDLC_TEST 0xC0 /* Test */
|
||||
#define XDLC_SIM 0x04 /* Set Initialization Mode (command) */
|
||||
#define XDLC_RIM 0x04 /* Request Initialization Mode (response) */
|
||||
#define XDLC_FRMR 0x84 /* Frame reject */
|
||||
#define XDLC_CFGR 0xC4 /* Configure */
|
||||
#define XDLC_SARM 0x0C /* Set Asynchronous Response Mode (command) */
|
||||
#define XDLC_DM 0x0C /* Disconnected mode (response) */
|
||||
#define XDLC_SABM 0x2C /* Set Asynchronous Balanced Mode */
|
||||
#define XDLC_SARME 0x4C /* Set Asynchronous Response Mode Extended */
|
||||
#define XDLC_SABME 0x6C /* Set Asynchronous Balanced Mode Extended */
|
||||
#define XDLC_RESET 0x8C /* Reset */
|
||||
#define XDLC_XID 0xAC /* Exchange identification */
|
||||
#define XDLC_SNRME 0xCC /* Set Normal Response Mode Extended */
|
||||
#define XDLC_BCN 0xEC /* Beacon */
|
||||
|
||||
static const value_string modifier_short_vals_cmd[] = {
|
||||
{ XDLC_UI, "UI" },
|
||||
{ XDLC_UP, "UP" },
|
||||
|
@ -183,6 +158,47 @@ static const value_string modifier_vals_resp[] = {
|
|||
{ 0, NULL }
|
||||
};
|
||||
|
||||
int
|
||||
get_xdlc_control(const u_char *pd, int offset, int is_response, int is_extended)
|
||||
{
|
||||
guint16 control;
|
||||
|
||||
switch (pd[offset] & 0x03) {
|
||||
|
||||
case XDLC_S:
|
||||
/*
|
||||
* Supervisory frame.
|
||||
*/
|
||||
return XDLC_S;
|
||||
|
||||
case XDLC_U:
|
||||
/*
|
||||
* Unnumbered frame.
|
||||
*
|
||||
* XXX - is this two octets, with a P/F bit, in HDLC extended
|
||||
* operation? It's one octet in LLC, even though the control
|
||||
* field of I and S frames is a 2-byte extended-operation field
|
||||
* in LLC. Given that there are no sequence numbers in the
|
||||
* 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];
|
||||
|
||||
/*
|
||||
* Return the modifier as well as the XDLC_U bits, so that
|
||||
* our caller knows whether the packet is UI or something
|
||||
* else.
|
||||
*/
|
||||
return control & (XDLC_U_MODIFIER_MASK|0x03);
|
||||
|
||||
default:
|
||||
/*
|
||||
* Information frame.
|
||||
*/
|
||||
return XDLC_I;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
|
||||
proto_tree *xdlc_tree, int hf_xdlc_control,
|
||||
|
@ -331,7 +347,13 @@ dissect_xdlc_control(const u_char *pd, int offset, frame_data *fd,
|
|||
decode_boolean_bitfield(control, 0x03, 1*8,
|
||||
"Unnumbered frame", NULL));
|
||||
}
|
||||
return XDLC_U;
|
||||
|
||||
/*
|
||||
* Return the modifier as well as the XDLC_U bits, so that
|
||||
* our caller knows whether the packet is UI or something
|
||||
* else.
|
||||
*/
|
||||
return control & (XDLC_U_MODIFIER_MASK|0x03);
|
||||
|
||||
default:
|
||||
/*
|
||||
|
|
30
xdlc.h
30
xdlc.h
|
@ -2,7 +2,7 @@
|
|||
* Define *DLC frame types, and routine to dissect the control field of
|
||||
* a *DLC frame.
|
||||
*
|
||||
* $Id: xdlc.h,v 1.1 1999/08/04 04:37:46 guy Exp $
|
||||
* $Id: xdlc.h,v 1.2 1999/08/23 22:47:13 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@unicom.net>
|
||||
|
@ -32,5 +32,33 @@
|
|||
#define XDLC_S 0x01 /* Supervisory frames */
|
||||
#define XDLC_U 0x03 /* Unnumbered frames */
|
||||
|
||||
/*
|
||||
* U-format modifiers.
|
||||
*/
|
||||
#define XDLC_U_MODIFIER_MASK 0xEC
|
||||
#define XDLC_UI 0x00 /* Unnumbered Information */
|
||||
#define XDLC_UP 0x20 /* Unnumbered Poll */
|
||||
#define XDLC_DISC 0x40 /* Disconnect (command) */
|
||||
#define XDLC_RD 0x40 /* Request Disconnect (response) */
|
||||
#define XDLC_UA 0x60 /* Unnumbered Acknowledge */
|
||||
#define XDLC_SNRM 0x80 /* Set Normal Response Mode */
|
||||
#define XDLC_TEST 0xC0 /* Test */
|
||||
#define XDLC_SIM 0x04 /* Set Initialization Mode (command) */
|
||||
#define XDLC_RIM 0x04 /* Request Initialization Mode (response) */
|
||||
#define XDLC_FRMR 0x84 /* Frame reject */
|
||||
#define XDLC_CFGR 0xC4 /* Configure */
|
||||
#define XDLC_SARM 0x0C /* Set Asynchronous Response Mode (command) */
|
||||
#define XDLC_DM 0x0C /* Disconnected mode (response) */
|
||||
#define XDLC_SABM 0x2C /* Set Asynchronous Balanced Mode */
|
||||
#define XDLC_SARME 0x4C /* Set Asynchronous Response Mode Extended */
|
||||
#define XDLC_SABME 0x6C /* Set Asynchronous Balanced Mode Extended */
|
||||
#define XDLC_RESET 0x8C /* Reset */
|
||||
#define XDLC_XID 0xAC /* Exchange identification */
|
||||
#define XDLC_SNRME 0xCC /* Set Normal Response Mode Extended */
|
||||
#define XDLC_BCN 0xEC /* Beacon */
|
||||
|
||||
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,
|
||||
proto_tree *xdlc_tree, int hf_xdlc_control, int is_response, int extended);
|
||||
|
|
Loading…
Reference in New Issue