diff --git a/epan/Makefile.common b/epan/Makefile.common index e71f28b12f..88244e1ad3 100644 --- a/epan/Makefile.common +++ b/epan/Makefile.common @@ -76,6 +76,7 @@ LIBETHEREAL_INCLUDES = \ address.h \ adler32.h \ afn.h \ + arptypes.h \ atalk-utils.h \ base64.h \ bitswap.h \ diff --git a/epan/arptypes.h b/epan/arptypes.h new file mode 100644 index 0000000000..6f6ba29bb7 --- /dev/null +++ b/epan/arptypes.h @@ -0,0 +1,64 @@ +/* arptypes.h + * Declarations of ARP address types. + * + * $Id$ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs + * 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. + */ + +#ifndef __ARPTYPES_H__ +#define __ARPTYPES_H__ + +/* Definitions taken from Linux "linux/if_arp.h" header file, and from + + http://www.iana.org/assignments/arp-parameters + + */ + +/* ARP protocol HARDWARE identifiers. */ +#define ARPHRD_NETROM 0 /* from KA9Q: NET/ROM pseudo */ +#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */ +#define ARPHRD_EETHER 2 /* Experimental Ethernet */ +#define ARPHRD_AX25 3 /* AX.25 Level 2 */ +#define ARPHRD_PRONET 4 /* PROnet token ring */ +#define ARPHRD_CHAOS 5 /* Chaosnet */ +#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */ +#define ARPHRD_ARCNET 7 /* ARCnet */ +#define ARPHRD_HYPERCH 8 /* Hyperchannel */ +#define ARPHRD_LANSTAR 9 /* Lanstar */ +#define ARPHRD_AUTONET 10 /* Autonet Short Address */ +#define ARPHRD_LOCALTLK 11 /* Localtalk */ +#define ARPHRD_LOCALNET 12 /* LocalNet (IBM PCNet/Sytek LocalNET) */ +#define ARPHRD_ULTRALNK 13 /* Ultra link */ +#define ARPHRD_SMDS 14 /* SMDS */ +#define ARPHRD_DLCI 15 /* Frame Relay DLCI */ +#define ARPHRD_ATM 16 /* ATM */ +#define ARPHRD_HDLC 17 /* HDLC */ +#define ARPHRD_FIBREC 18 /* Fibre Channel */ +#define ARPHRD_ATM2225 19 /* ATM (RFC 2225) */ +#define ARPHRD_SERIAL 20 /* Serial Line */ +#define ARPHRD_ATM2 21 /* ATM */ +#define ARPHRD_MS188220 22 /* MIL-STD-188-220 */ +#define ARPHRD_METRICOM 23 /* Metricom STRIP */ +#define ARPHRD_IEEE1394 24 /* IEEE 1394.1995 */ +#define ARPHRD_MAPOS 25 /* MAPOS */ +#define ARPHRD_TWINAX 26 /* Twinaxial */ +#define ARPHRD_EUI_64 27 /* EUI-64 */ + +#endif /* arptypes.h */ diff --git a/epan/dissectors/packet-arp.c b/epan/dissectors/packet-arp.c index 1af20b4a2f..15d310bea9 100644 --- a/epan/dissectors/packet-arp.c +++ b/epan/dissectors/packet-arp.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include "packet-arp.h" #include "etypes.h" @@ -78,36 +79,6 @@ static dissector_handle_t atmarp_handle; */ -/* ARP protocol HARDWARE identifiers. */ -#define ARPHRD_NETROM 0 /* from KA9Q: NET/ROM pseudo */ -#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */ -#define ARPHRD_EETHER 2 /* Experimental Ethernet */ -#define ARPHRD_AX25 3 /* AX.25 Level 2 */ -#define ARPHRD_PRONET 4 /* PROnet token ring */ -#define ARPHRD_CHAOS 5 /* Chaosnet */ -#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */ -#define ARPHRD_ARCNET 7 /* ARCnet */ -#define ARPHRD_HYPERCH 8 /* Hyperchannel */ -#define ARPHRD_LANSTAR 9 /* Lanstar */ -#define ARPHRD_AUTONET 10 /* Autonet Short Address */ -#define ARPHRD_LOCALTLK 11 /* Localtalk */ -#define ARPHRD_LOCALNET 12 /* LocalNet (IBM PCNet/Sytek LocalNET) */ -#define ARPHRD_ULTRALNK 13 /* Ultra link */ -#define ARPHRD_SMDS 14 /* SMDS */ -#define ARPHRD_DLCI 15 /* Frame Relay DLCI */ -#define ARPHRD_ATM 16 /* ATM */ -#define ARPHRD_HDLC 17 /* HDLC */ -#define ARPHRD_FIBREC 18 /* Fibre Channel */ -#define ARPHRD_ATM2225 19 /* ATM (RFC 2225) */ -#define ARPHRD_SERIAL 20 /* Serial Line */ -#define ARPHRD_ATM2 21 /* ATM */ -#define ARPHRD_MS188220 22 /* MIL-STD-188-220 */ -#define ARPHRD_METRICOM 23 /* Metricom STRIP */ -#define ARPHRD_IEEE1394 24 /* IEEE 1394.1995 */ -#define ARPHRD_MAPOS 25 /* MAPOS */ -#define ARPHRD_TWINAX 26 /* Twinaxial */ -#define ARPHRD_EUI_64 27 /* EUI-64 */ - /* ARP / RARP structs and definitions */ #ifndef ARPOP_REQUEST #define ARPOP_REQUEST 1 /* ARP request. */ diff --git a/epan/dissectors/packet-bootp.c b/epan/dissectors/packet-bootp.c index da086cd19c..58bb88187e 100644 --- a/epan/dissectors/packet-bootp.c +++ b/epan/dissectors/packet-bootp.c @@ -70,10 +70,11 @@ #include #include "packet-arp.h" #include "packet-dns.h" /* for get_dns_name() */ - +#include #include #include #include +#include static int bootp_dhcp_tap = -1; static int proto_bootp = -1; @@ -107,6 +108,7 @@ static int hf_bootp_fqdn_name = -1; static int hf_bootp_fqdn_asciiname = -1; static int hf_bootp_pkt_mtacap_len = -1; static int hf_bootp_docsis_cmcap_len = -1; +static int hf_bootp_hw_ether_addr = -1; static gint ett_bootp = -1; static gint ett_bootp_flags = -1; @@ -859,7 +861,6 @@ bootp_option(tvbuff_t *tvb, proto_tree *bp_tree, int voff, int eoff, (e.g. a fully qualified domain name). */ if (optlen == 7 && byte > 0 && byte < 48) { - vti = proto_tree_add_text(bp_tree, tvb, voff, consumed, "Option %d: %s", code, text); v_tree = proto_item_add_subtree(vti, ett_bootp_option); @@ -867,9 +868,14 @@ bootp_option(tvbuff_t *tvb, proto_tree *bp_tree, int voff, int eoff, "Hardware type: %s", arphrdtype_to_str(byte, "Unknown (0x%02x)")); - proto_tree_add_text(v_tree, tvb, optoff+1, 6, - "Client hardware address: %s", - arphrdaddr_to_str(tvb_get_ptr(tvb, optoff+1, 6), + if (byte == ARPHRD_ETHER || byte == ARPHRD_IEEE802) + proto_tree_add_item(v_tree, + hf_bootp_hw_ether_addr, tvb, optoff+1, 6, + FALSE); + else + proto_tree_add_text(v_tree, tvb, optoff+1, 6, + "Client hardware address: %s", + arphrdaddr_to_str(tvb_get_ptr(tvb, optoff+1, 6), 6, byte)); } else { /* otherwise, it's opaque data */ @@ -2725,8 +2731,14 @@ dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) switch (op) { case BOOTREQUEST: - col_add_fstr(pinfo->cinfo, COL_INFO, "Boot Request from %s", - arphrdaddr_to_str(tvb_get_ptr(tvb, 28, hlen), + if ((htype == ARPHRD_ETHER || htype == ARPHRD_IEEE802) && hlen == 6) + col_add_fstr(pinfo->cinfo, COL_INFO, "Boot Request from %s (%s)", + arphrdaddr_to_str(tvb_get_ptr(tvb, 28, hlen), + hlen, htype), + get_ether_name(tvb_get_ptr(tvb, 28, hlen))); + else + col_add_fstr(pinfo->cinfo, COL_INFO, "Boot Request from %s", + arphrdaddr_to_str(tvb_get_ptr(tvb, 28, hlen), hlen, htype)); break; @@ -2781,8 +2793,11 @@ dissect_bootp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree_add_item(bp_tree, hf_bootp_ip_relay, tvb, 24, 4, FALSE); - if (hlen > 0) { + if (hlen > 0 && hlen <= 16) { haddr = tvb_get_ptr(tvb, 28, hlen); + if((htype == 1 || htype == 6) && hlen == 6) + proto_tree_add_ether(bp_tree, hf_bootp_hw_ether_addr, tvb, 28, 6, haddr); + else proto_tree_add_bytes_format(bp_tree, hf_bootp_hw_addr, tvb, /* The chaddr element is 16 bytes in length, although only the first hlen bytes are used */ @@ -2984,6 +2999,11 @@ proto_register_bootp(void) BASE_NONE, NULL, 0x0, "", HFILL }}, + { &hf_bootp_hw_ether_addr, + { "Client MAC address", "bootp.hw.mac_addr", FT_ETHER, + BASE_NONE, NULL, 0x0, + "", HFILL }}, + { &hf_bootp_server, { "Server host name", "bootp.server", FT_STRING, BASE_NONE, NULL, 0x0,