aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-bootp.c
diff options
context:
space:
mode:
authorpascal <pascal@localhost>2012-04-28 13:20:41 +0000
committerpascal <pascal@localhost>2012-04-28 13:20:41 +0000
commitf8f3756ab00f67186afcd1c0a290d35e9b2bd718 (patch)
treecc99d6dd18c1bc110d0552a5366dd67f8ad2f88f /epan/dissectors/packet-bootp.c
parentd307c7fcd8a23513362e14b8fd9e294c86fc29c9 (diff)
Fix https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=7051 :
Add option 82 suboptions 150/151/152 decoding to DHCP dissector svn path=/trunk/; revision=42308
Diffstat (limited to 'epan/dissectors/packet-bootp.c')
-rw-r--r--epan/dissectors/packet-bootp.c94
1 files changed, 65 insertions, 29 deletions
diff --git a/epan/dissectors/packet-bootp.c b/epan/dissectors/packet-bootp.c
index 9dde51b54c..9e49ca3795 100644
--- a/epan/dissectors/packet-bootp.c
+++ b/epan/dissectors/packet-bootp.c
@@ -18,6 +18,7 @@
* RFC 2242: NetWare/IP Domain Name and Information
* RFC 2489: Procedure for Defining New DHCP Options
* RFC 2610: DHCP Options for Service Location Protocol
+ * RFC 2685: Virtual Private Networks Identifier
* RFC 3046: DHCP Relay Agent Information Option
* RFC 3118: Authentication for DHCP Messages
* RFC 3203: DHCP reconfigure extension
@@ -342,6 +343,13 @@ static int hf_bootp_option82_vi_cl_docsis_version = -1;
/* 82:9 suboptions end */
static int hf_bootp_option82_flags = -1; /* 82:10 */
static int hf_bootp_option82_server_id_override = -1; /* 82:11 */
+static int hf_bootp_option82_link_selection_cisco = -1; /* 82:150 */
+static int hf_bootp_option82_vrf_name_vpn_id = -1; /* 82:151 */
+ /* 82:151 suboptions */
+static int hf_bootp_option82_vrf_name_vpn_id_oui = -1;
+static int hf_bootp_option82_vrf_name_vpn_id_index = -1;
+ /* 82:151 suboptions end */
+static int hf_bootp_option82_server_id_override_cisco = -1; /* 82:152 */
static int hf_bootp_option_novell_dss_string = -1; /* 85 */
static int hf_bootp_option_novell_dss_ip = -1; /* 85 */
@@ -2323,6 +2331,9 @@ static const value_string option82_suboption_vals[] = {
{ 9, "Vendor-Specific Information" },
{ 10, "Flags" },
{ 11, "Server ID Override" },
+ { 150, "Link selection (Cisco proprietary)" },
+ { 151, "VRF name/VPN ID" },
+ { 152, "Server ID Override (Cisco proprietary)" },
{ 0, NULL }
};
@@ -2331,29 +2342,35 @@ bootp_dhcp_decode_agent_info(packet_info *pinfo, proto_item *v_ti, proto_tree *v
int optend)
{
int suboptoff = optoff;
- guint8 subopt, vs_opt, vs_len;
+ guint8 subopt, idx, vs_opt, vs_len;
int subopt_len, subopt_end, datalen;
guint32 enterprise;
proto_item *vti;
- proto_tree *o82_v_tree, *o82_9_tree;
+ proto_tree *o82_v_tree, *o82_sub_tree;
guint8 tag, tag_len;
struct basic_types_hfs default_hfs = {&hf_bootp_option82_value, &hf_bootp_option82_value_ip_address, &hf_bootp_option82_value_ip_address,
&hf_bootp_option82_value_stringz, NULL, &hf_bootp_option82_value_8,
NULL, NULL, &hf_bootp_option82_value_32, NULL, NULL};
-
- static struct opt_info o82_opt[]= {
- /* 0 */ {"nop", bytes, &hf_bootp_option82_padding}, /* dummy */
- /* 1 */ {"Agent Circuit ID", bytes, &hf_bootp_option82_agent_circuit_id}, /* [RFC3046] */
- /* 2 */ {"Agent Remote ID", bytes, &hf_bootp_option82_agent_remote_id}, /* [RFC3046] */
- /* 3 */ {"Reserved", bytes, &hf_bootp_option82_reserved},
- /* 4 */ {"DOCSIS Device Class", val_u_long, &hf_bootp_option82_docsis_device_class}, /* [RFC3256] */
- /* 5 */ {"Link selection", ipv4, &hf_bootp_option82_link_selection}, /* [RFC3527] */
- /* 6 */ {"Subscriber ID", string, &hf_bootp_option82_subscriber_id}, /* [RFC3993] */ /***** CHECK STRING TYPE */
- /* 7 */ {"RADIUS Attributes", bytes, &hf_bootp_option82_radius_attributes}, /* [RFC4014] */
- /* 8 */ {"Authentication", bytes, &hf_bootp_option82_authentication}, /* [RFC4030] */
- /* 9 */ {"Vendor-Specific Information", special, &hf_bootp_option82_vi}, /* [RFC 4243] */
- /* 10 */ {"Flags", val_u_byte, &hf_bootp_option82_flags}, /* [RFC5010] */
- /* 11 */ {"Server ID Override", ipv4, &hf_bootp_option82_server_id_override}, /* [RFC 5107] */
+ struct opt82_info {
+ int id;
+ struct opt_info info;
+ };
+ static struct opt82_info o82_opt[]= {
+ {0, {"nop", bytes, &hf_bootp_option82_padding}}, /* dummy */
+ {1, {"Agent Circuit ID", bytes, &hf_bootp_option82_agent_circuit_id}}, /* [RFC3046] */
+ {2, {"Agent Remote ID", bytes, &hf_bootp_option82_agent_remote_id}}, /* [RFC3046] */
+ {3, {"Reserved", bytes, &hf_bootp_option82_reserved}},
+ {4, {"DOCSIS Device Class", val_u_long, &hf_bootp_option82_docsis_device_class}}, /* [RFC3256] */
+ {5, {"Link selection", ipv4, &hf_bootp_option82_link_selection}}, /* [RFC3527] */
+ {6, {"Subscriber ID", string, &hf_bootp_option82_subscriber_id}}, /* [RFC3993] */ /***** CHECK STRING TYPE */
+ {7, {"RADIUS Attributes", bytes, &hf_bootp_option82_radius_attributes}}, /* [RFC4014] */
+ {8, {"Authentication", bytes, &hf_bootp_option82_authentication}}, /* [RFC4030] */
+ {9, {"Vendor-Specific Information", special, &hf_bootp_option82_vi}}, /* [RFC 4243] */
+ {10, {"Flags", val_u_byte, &hf_bootp_option82_flags}}, /* [RFC5010] */
+ {11, {"Server ID Override", ipv4, &hf_bootp_option82_server_id_override}}, /* [RFC 5107] */
+ {150, {"Link selection (Cisco proprietary)", ipv4, &hf_bootp_option82_link_selection_cisco}}, /* [RFC3527] */
+ {151, {"VRF name/VPN ID", special, &hf_bootp_option82_vrf_name_vpn_id}}, /* [RFC2685] */
+ {152, {"Server ID Override (Cisco proprietary)", ipv4, &hf_bootp_option82_server_id_override_cisco}} /* [RFC 5107] */
};
subopt = tvb_get_guint8(tvb, optoff);
@@ -2380,9 +2397,14 @@ bootp_dhcp_decode_agent_info(packet_info *pinfo, proto_item *v_ti, proto_tree *v
return (optend);
}
- if ( (subopt < 1 ) || (subopt >= array_length(o82_opt)) ) {
+ for (idx = 0; idx < array_length(o82_opt); idx++) {
+ if (o82_opt[idx].id == subopt) {
+ break;
+ }
+ }
+ if ( (idx < 1 ) || (idx == array_length(o82_opt)) ) {
proto_tree_add_item(o82_v_tree, hf_bootp_option82_value, tvb, suboptoff, subopt_len, ENC_NA);
- } else if (o82_opt[subopt].ftype == special) {
+ } else if (o82_opt[idx].info.ftype == special) {
switch(subopt)
{
case 9:
@@ -2391,18 +2413,18 @@ bootp_dhcp_decode_agent_info(packet_info *pinfo, proto_item *v_ti, proto_tree *v
vti = proto_tree_add_item(o82_v_tree, hf_bootp_option82_vi_enterprise, tvb, suboptoff, 4, ENC_BIG_ENDIAN);
suboptoff += 4;
- o82_9_tree = proto_item_add_subtree(vti, ett_bootp_option82_suboption9);
+ o82_sub_tree = proto_item_add_subtree(vti, ett_bootp_option82_suboption9);
datalen = tvb_get_guint8(tvb, suboptoff);
- proto_tree_add_item(o82_9_tree, hf_bootp_option82_vi_data_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(o82_sub_tree, hf_bootp_option82_vi_data_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
suboptoff++;
switch (enterprise) {
case 4491: /* CableLab */
vs_opt = tvb_get_guint8(tvb, suboptoff);
- proto_tree_add_item(o82_9_tree, hf_bootp_option82_vi_cl_option, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(o82_sub_tree, hf_bootp_option82_vi_cl_option, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
suboptoff++;
vs_len = tvb_get_guint8(tvb, suboptoff);
- proto_tree_add_item(o82_9_tree, hf_bootp_option82_vi_cl_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(o82_sub_tree, hf_bootp_option82_vi_cl_length, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
suboptoff++;
switch (vs_opt) {
@@ -2410,12 +2432,12 @@ bootp_dhcp_decode_agent_info(packet_info *pinfo, proto_item *v_ti, proto_tree *v
case 1:
if (vs_len == 4) {
tag = tvb_get_guint8(tvb, suboptoff);
- proto_tree_add_item(o82_9_tree, hf_bootp_option82_vi_cl_tag, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(o82_sub_tree, hf_bootp_option82_vi_cl_tag, tvb, suboptoff, 1, ENC_BIG_ENDIAN);
tag_len = tvb_get_guint8(tvb, suboptoff+1);
- proto_tree_add_item(o82_9_tree, hf_bootp_option82_vi_cl_tag_length, tvb, suboptoff+1, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(o82_sub_tree, hf_bootp_option82_vi_cl_tag_length, tvb, suboptoff+1, 1, ENC_BIG_ENDIAN);
suboptoff+=2;
if (tag == 1) {
- proto_tree_add_uint_format_value(o82_9_tree, hf_bootp_option82_vi_cl_docsis_version,
+ proto_tree_add_uint_format_value(o82_sub_tree, hf_bootp_option82_vi_cl_docsis_version,
tvb, suboptoff, 2, 0, "%d.%d",
tvb_get_guint8(tvb, suboptoff), tvb_get_guint8(tvb, suboptoff+1));
suboptoff+=2;
@@ -2443,17 +2465,26 @@ bootp_dhcp_decode_agent_info(packet_info *pinfo, proto_item *v_ti, proto_tree *v
}
}
break;
+ case 151:
+ if (subopt_len != 7) {
+ expert_add_info_format(pinfo, vti, PI_PROTOCOL, PI_ERROR,
+ "Invalid length (expected 7 bytes, found %d bytes)", subopt_len);
+ break;
+ }
+ proto_tree_add_item(o82_v_tree, hf_bootp_option82_vrf_name_vpn_id_oui, tvb, suboptoff, 3, ENC_BIG_ENDIAN);
+ proto_tree_add_item(o82_v_tree, hf_bootp_option82_vrf_name_vpn_id_index, tvb, suboptoff+3, 4, ENC_BIG_ENDIAN);
+ break;
default:
- if (o82_opt[subopt].phf != NULL)
- proto_tree_add_item(o82_v_tree, *o82_opt[subopt].phf, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
+ if (o82_opt[idx].info.phf != NULL)
+ proto_tree_add_item(o82_v_tree, *o82_opt[idx].info.phf, tvb, suboptoff, subopt_len, ENC_BIG_ENDIAN);
else
proto_tree_add_item(o82_v_tree, hf_bootp_option82_value, tvb, suboptoff, subopt_len, ENC_NA);
break;
}
}
else {
- if (bootp_handle_basic_types(pinfo, o82_v_tree, vti, tvb, o82_opt[subopt].ftype,
- suboptoff, subopt_len, o82_opt[subopt].phf, &default_hfs) == 0) {
+ if (bootp_handle_basic_types(pinfo, o82_v_tree, vti, tvb, o82_opt[idx].info.ftype,
+ suboptoff, subopt_len, o82_opt[idx].info.phf, &default_hfs) == 0) {
expert_add_info_format(pinfo, vti, PI_PROTOCOL, PI_ERROR, "ERROR, please report: Unknown subopt type handler %d", subopt);
}
}
@@ -5201,6 +5232,11 @@ proto_register_bootp(void)
{ &hf_bootp_option82_vi_cl_docsis_version, { "DOCSIS Version Number", "bootp.option.agent_information_option.vi.cl.docsis_version", FT_UINT16, BASE_HEX, NULL, 0x0, "Option 82:9 VI CL DOCSIS Version Number", HFILL }},
{ &hf_bootp_option82_flags, { "Flags", "bootp.option.agent_information_option.flags", FT_UINT8, BASE_HEX, NULL, 0x0, "Option 82:10 Flags", HFILL }},
{ &hf_bootp_option82_server_id_override, { "Server ID Override", "bootp.option.agent_information_option.server_id_override", FT_IPv4, BASE_NONE, NULL, 0x00, "Option 82:11 Server ID Override", HFILL }},
+ { &hf_bootp_option82_link_selection_cisco, { "Link selection (Cisco proprietary)", "bootp.option.agent_information_option.link_selection_cisco", FT_IPv4, BASE_NONE, NULL, 0x00, "Option 82:150 Link selection (Cisco proprietary)", HFILL }},
+ { &hf_bootp_option82_vrf_name_vpn_id, { "VRF name/VPN ID", "bootp.option.agent_information_option.vrf_name_vpn_id", FT_BYTES, BASE_NONE, NULL, 0x00, "Option 82:151 VRF name/VPN ID", HFILL }},
+ { &hf_bootp_option82_vrf_name_vpn_id_oui, { "VRF name/VPN ID OUI", "bootp.option.agent_information_option.vrf_name_vpn_id_oui", FT_UINT24, BASE_HEX, NULL, 0x00, "Option 82:151 VRF name/VPN ID OUI", HFILL }},
+ { &hf_bootp_option82_vrf_name_vpn_id_index, { "VRF name/VPN ID Index", "bootp.option.agent_information_option.vrf_name_vpn_id_index", FT_UINT32, BASE_HEX, NULL, 0x00, "Option 82:151 VRF name/VPN ID Index", HFILL }},
+ { &hf_bootp_option82_server_id_override_cisco, { "Server ID Override (Cisco proprietary)", "bootp.option.agent_information_option.server_id_override_cisco", FT_IPv4, BASE_NONE, NULL, 0x00, "Option 82:152 Server ID Override (Cisco proprietary)", HFILL }},
{ &hf_bootp_option_novell_dss_string, { "Novell Directory Services Servers String", "bootp.option.novell_dss.string", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Option 85: Novell Directory Services Servers String", HFILL }},
{ &hf_bootp_option_novell_dss_ip, { "IP Address", "bootp.option.novell_dss.ip", FT_IPv4, BASE_NONE, NULL, 0x00, "Option 85: Novell Directory Services Servers IP Address", HFILL }},