* Routines for calling the right protocol for the ethertype.
* This is called by both packet-eth.c (Ethernet II) and packet-llc.c (SNAP)
*
+ * $Id: ethertype.c,v 1.21 1999/12/05 20:05:44 nneul Exp $
+ *
* Gilbert Ramirez <gram@verdict.uthscsa.edu>
*
* Ethereal - Network traffic analyzer
# include "config.h"
#endif
-#include <gtk/gtk.h>
-
-#include <stdio.h>
-
-#include <pcap.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <glib.h>
#include "packet.h"
-#include "ethereal.h"
#include "etypes.h"
+const value_string etype_vals[] = {
+ {ETHERTYPE_IP, "IP" },
+ {ETHERTYPE_IPv6, "IPv6" },
+ {ETHERTYPE_ARP, "ARP" },
+ {ETHERTYPE_REVARP, "RARP" },
+ {ETHERTYPE_ATALK, "Appletalk" },
+ {ETHERTYPE_AARP, "AARP" },
+ {ETHERTYPE_IPX, "Netware IPX/SPX"},
+ {ETHERTYPE_VINES, "Vines" },
+ {ETHERTYPE_CDP, "CDP" }, /* Cisco Discovery Protocol */
+ {ETHERTYPE_TRAIN, "Netmon Train" },
+ {ETHERTYPE_LOOP, "Loopback" }, /* Ethernet Loopback */
+ {ETHERTYPE_PPPOED, "PPPoE Discovery"},
+ {ETHERTYPE_PPPOES, "PPPoE Session" },
+ {ETHERTYPE_VLAN, "802.1Q Virtual LAN" },
+ {0, NULL } };
+
void
-ethertype(guint16 etype, int offset,
- const u_char *pd, frame_data *fd, GtkTree *tree, GtkWidget
- *fh_tree)
+capture_ethertype(guint16 etype, int offset,
+ const u_char *pd, guint32 cap_len, packet_counts *ld)
{
- gchar etype_str[][10] = {"IP", "ARP", "RARP", "AppleTalk", "AARP"};
+ switch (etype) {
+ case ETHERTYPE_IP:
+ capture_ip(pd, offset, cap_len, ld);
+ break;
+ case ETHERTYPE_IPX:
+ capture_ipx(pd, offset, cap_len, ld);
+ break;
+ case ETHERTYPE_VLAN:
+ capture_vlan(pd, offset, cap_len, 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)
+{
+ if (tree) {
+ proto_tree_add_item(fh_tree, item_id, offset - 2, 2, etype);
+ }
switch (etype) {
case ETHERTYPE_IP:
- if (tree) {
- add_item_to_tree(fh_tree, offset - 2, 2, "Type: IP (0x%04x)",
- etype);
- }
dissect_ip(pd, offset, fd, tree);
break;
case ETHERTYPE_IPv6:
- if (tree) {
- add_item_to_tree(fh_tree, offset - 2, 2, "Type: IPv6 (0x%04x)",
- etype);
- }
dissect_ipv6(pd, offset, fd, tree);
break;
case ETHERTYPE_ARP:
- if (tree) {
- add_item_to_tree(fh_tree, offset - 2, 2,
- "Type: ARP (0x%04x)", etype);
- }
dissect_arp(pd, offset, fd, tree);
break;
case ETHERTYPE_REVARP:
- if (tree) {
- add_item_to_tree(fh_tree, offset - 2, 2,
- "Type: RARP (0x%04x)", etype);
- }
dissect_arp(pd, offset, fd, tree);
break;
case ETHERTYPE_ATALK:
- if (tree) {
- add_item_to_tree(fh_tree, offset - 2, 2,
- "Type: AppleTalk (0x%04x)", etype);
- }
- if (fd->win_info[0]) { strcpy(fd->win_info[3], etype_str[3]); }
+ dissect_ddp(pd, offset, fd, tree);
break;
case ETHERTYPE_AARP:
- if (tree) {
- add_item_to_tree(fh_tree, offset - 2, 2,
- "Type: AARP (0x%04x)", etype);
- }
- if (fd->win_info[0]) { strcpy(fd->win_info[3], etype_str[4]); }
+ dissect_aarp(pd, offset, fd, tree);
break;
case ETHERTYPE_IPX:
- if (tree) {
- add_item_to_tree(fh_tree, offset - 2, 2,
- "Type: Netware IPX/SPX (0x%04x)", etype);
- }
dissect_ipx(pd, offset, fd, tree);
break;
+ case ETHERTYPE_VINES:
+ dissect_vines(pd, offset, fd, tree);
+ break;
+ case ETHERTYPE_CDP:
+ dissect_cdp(pd, offset, fd, tree);
+ break;
+ case ETHERTYPE_LOOP:
+ dissect_data(pd, offset, fd, tree);
+ if (check_col(fd, COL_PROTOCOL)) { col_add_fstr(fd, COL_PROTOCOL, "LOOP"); }
+ break;
+ case ETHERTYPE_PPPOED:
+ dissect_pppoed(pd, offset, fd, tree);
+ break;
+ case ETHERTYPE_PPPOES:
+ dissect_pppoes(pd, offset, fd, tree);
+ break;
+ case ETHERTYPE_VLAN:
+ dissect_vlan(pd, offset, fd, tree);
+ break;
+ case ETHERTYPE_SNMP:
+ dissect_snmp(pd, offset, fd, tree);
+ break;
default:
- if (tree) {
- add_item_to_tree(fh_tree, offset - 2, 2,
- "Type: Unknown (0x%04x)", etype);
- dissect_data(pd, offset, fd, tree);
- }
- if (fd->win_info[0]) { sprintf(fd->win_info[3], "0x%04x", etype); }
+ dissect_data(pd, offset, fd, tree);
+ if (check_col(fd, COL_PROTOCOL)) { col_add_fstr(fd, COL_PROTOCOL, "0x%04x", etype); }
break;
}
- }
+}
+
+
+