diff options
author | Guy Harris <guy@alum.mit.edu> | 2002-04-30 18:58:16 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2002-04-30 18:58:16 +0000 |
commit | 105efda4044b2f031b1c36d666f7cb6b0221694f (patch) | |
tree | 33a4c7bd7deb9227ad48f5b8187c5f05419aa1e3 /wiretap/atm.c | |
parent | da74615c7998037094df81255d4dd3d55e36ab47 (diff) |
Move the code to guess the traffic type based on the packet contents
into Wiretap, so that if you read a frame from Wiretap you have what
traffic type information could be gleaned from the information in the
capture file, and can write the frame out to a capture file where the
file contains some or all of that information without having to
determine it outside of Wiretap.
svn path=/trunk/; revision=5314
Diffstat (limited to 'wiretap/atm.c')
-rw-r--r-- | wiretap/atm.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/wiretap/atm.c b/wiretap/atm.c new file mode 100644 index 0000000000..d4bace9a1a --- /dev/null +++ b/wiretap/atm.c @@ -0,0 +1,116 @@ +/* atm.c + * + * $Id: atm.c,v 1.1 2002/04/30 18:58:15 guy Exp $ + * + * Wiretap Library + * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu> + * + * 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 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "wtap-int.h" +#include "atm.h" + +/* + * Routines to use with ATM capture file types that don't include information + * about the *type* of ATM traffic (or, at least, where we haven't found + * that information). + * + * We assume the traffic is AAL5, unless it's VPI 0/VCI 5, in which case + * we assume it's the signalling AAL. + */ + +void +atm_guess_traffic_type(const guint8 *pd, guint32 len, + guint16 vpi, guint16 vci, union wtap_pseudo_header *pseudo_header) +{ + /* + * Start out assuming nothing other than that it's AAL5. + */ + pseudo_header->atm.aal = AAL_5; + pseudo_header->atm.type = TRAF_UNKNOWN; + pseudo_header->atm.subtype = TRAF_ST_UNKNOWN; + + if (vpi == 0) { + /* + * Traffic on some PVCs with a VPI of 0 and certain + * VCIs is of particular types. + */ + switch (vci) { + + case 5: + /* + * Signalling AAL. + */ + pseudo_header->atm.aal = AAL_SIGNALLING; + return; + + case 16: + /* + * ILMI. + */ + pseudo_header->atm.type = TRAF_ILMI; + return; + } + } + + /* + * OK, we can't tell what it is based on the VPI/VCI; try + * guessing based on the contents, if we have enough data + * to guess. + */ + if (len >= 3) { + if (pd[0] == 0xaa && pd[1] == 0xaa && pd[2] == 0x03) { + /* + * Looks like a SNAP header; assume it's LLC + * multiplexed RFC 1483 traffic. + */ + pseudo_header->atm.type = TRAF_LLCMX; + } else { + /* + * Assume it's LANE. + */ + pseudo_header->atm.type = TRAF_LANE; + atm_guess_lane_type(pd, len, pseudo_header); + } + } +} + +void +atm_guess_lane_type(const guint8 *pd, guint32 len, + union wtap_pseudo_header *pseudo_header) +{ + if (len >= 2) { + if (pd[0] == 0xff && pd[1] == 0x00) { + /* + * Looks like LE Control traffic. + */ + pseudo_header->atm.subtype = TRAF_ST_LANE_LE_CTRL; + } else { + /* + * XXX - Ethernet, or Token Ring? + * Assume Ethernet for now; if we see earlier + * LANE traffic, we may be able to figure out + * the traffic type from that, but there may + * still be situations where the user has to + * tell us. + */ + pseudo_header->atm.subtype = TRAF_ST_LANE_802_3; + } + } +} |