diff options
author | Gilbert Ramirez <gram@alumni.rice.edu> | 2000-04-13 18:18:56 +0000 |
---|---|---|
committer | Gilbert Ramirez <gram@alumni.rice.edu> | 2000-04-13 18:18:56 +0000 |
commit | db187f965c6ca47932a009f3cb011770a687e289 (patch) | |
tree | 1d58b40531c9ca503d57229b9cc8c9bf394a2052 /packet-ethertype.c | |
parent | 2fa56170d39e86f703ee0a6c5d3ddc1d14afa905 (diff) |
Change the sub-dissector handoff registration routines so that the
sub-dissector table is not stored in the header_field_info struct, but
in a separate namespace. Dissector tables are now registered by name
and not by field ID. For example:
udp_dissector_table = register_dissector_table("udp.port");
Because of this different namespace, dissector tables can have names
that are not field names. This is useful for ethertype, since multiple
fields are "ethertypes".
packet-ethertype.c replaces ethertype.c (the name was changed so that it
would be named in the same fashion as all the filenames passed to make-reg-dotc)
Although it registers no protocol or field, it registers one dissector table:
ethertype_dissector_table = register_dissector_table("ethertype");
All protocols that can be called because of an ethertype field now register
that fact with dissector_add() calls.
In this way, one dissector_table services all ethertype fields
(hf_eth_type, hf_llc_type, hf_null_etype, hf_vlan_etype)
Furthermore, the code allows for names of protocols to exist in the
etype_vals, yet a dissector for that protocol doesn't exist. The name
of the dissector is printed in COL_INFO. You're welcome, Richard. :-)
svn path=/trunk/; revision=1848
Diffstat (limited to 'packet-ethertype.c')
-rw-r--r-- | packet-ethertype.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/packet-ethertype.c b/packet-ethertype.c new file mode 100644 index 0000000000..6a4fb20a49 --- /dev/null +++ b/packet-ethertype.c @@ -0,0 +1,136 @@ +/* ethertype.c + * Routines for calling the right protocol for the ethertype. + * + * $Id: packet-ethertype.c,v 1.1 2000/04/13 18:18:45 gram Exp $ + * + * Gilbert Ramirez <gram@xiexie.org> + * + * Ethereal - Network traffic analyzer + * By Gerald Combs <gerald@zing.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 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif + +#include <glib.h> +#include "packet.h" +#include "etypes.h" + +static dissector_table_t ethertype_dissector_table; + +const value_string etype_vals[] = { + {ETHERTYPE_IP, "IP" }, + {ETHERTYPE_IPv6, "IPv6" }, + {ETHERTYPE_X25L3, "X.25 Layer 3" }, + {ETHERTYPE_ARP, "ARP" }, + {ETHERTYPE_REVARP, "RARP" }, + {ETHERTYPE_ATALK, "Appletalk" }, + {ETHERTYPE_AARP, "AARP" }, + {ETHERTYPE_IPX, "Netware IPX/SPX"}, + {ETHERTYPE_VINES, "Vines" }, + {ETHERTYPE_TRAIN, "Netmon Train" }, + {ETHERTYPE_LOOP, "Loopback" }, /* Ethernet Loopback */ + {ETHERTYPE_PPPOED, "PPPoE Discovery"}, + {ETHERTYPE_PPPOES, "PPPoE Session" }, + {ETHERTYPE_VLAN, "802.1Q Virtual LAN" }, + {ETHERTYPE_MPLS, "MPLS label switched packet" }, + {ETHERTYPE_MPLS_MULTI, "MPLS multicast label switched packet" }, + {0, NULL } }; + +void +capture_ethertype(guint16 etype, int offset, + const u_char *pd, packet_counts *ld) +{ + switch (etype) { + case ETHERTYPE_IP: + capture_ip(pd, offset, ld); + break; + case ETHERTYPE_IPX: + capture_ipx(pd, offset, ld); + break; + case ETHERTYPE_VLAN: + capture_vlan(pd, offset, ld); + break; + case ETHERTYPE_VINES: + capture_vines(pd, offset, ld); + break; + default: + ld->other++; + break; + } +} + +void +ethertype(guint16 etype, int offset, + const u_char *pd, frame_data *fd, proto_tree *tree, proto_tree + *fh_tree, int item_id) +{ + dissector_t sub_dissector; + char *description; + + /* Add to proto_tree */ + if (tree) { + proto_tree_add_item(fh_tree, item_id, offset - 2, 2, etype); + } + + /* Look for sub-dissector */ + sub_dissector = dissector_lookup( ethertype_dissector_table, etype ); + + if (sub_dissector) { + /* Call sub-dissector */ + sub_dissector(pd, offset, fd, tree); + } + else { + /* Label rest of packet as "Data" */ + dissect_data(pd, offset, fd, tree); + + /* Label protocol */ + switch(etype) { + case ETHERTYPE_LOOP: + if (check_col(fd, COL_PROTOCOL)) { + col_add_fstr(fd, COL_PROTOCOL, "LOOP"); + } + break; + default: + if (check_col(fd, COL_PROTOCOL)) { + col_add_fstr(fd, COL_PROTOCOL, "0x%04x", etype); + } + break; + } + if (check_col(fd, COL_INFO)) { + description = match_strval(etype, etype_vals); + if (description) { + col_add_fstr(fd, COL_INFO, "%s", description); + } + } + } +} + + +void +proto_register_ethertype(void) +{ + /* subdissector code */ + ethertype_dissector_table = register_dissector_table("ethertype"); +} |