diff options
author | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2008-12-31 16:27:18 +0000 |
---|---|---|
committer | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2008-12-31 16:27:18 +0000 |
commit | b58c4f242b7157c7287669a50232b6f0ad98be8a (patch) | |
tree | 89f5f6fc7ec9949f9f086a003f37d439ce9ef70d /epan/dissectors/packet-asap.c | |
parent | e771c7a49c9d8c3b58688e6d67d57b6c91b533f6 (diff) |
From Thomas Dreibholz:
Improvements for the ASAP and ENRP dissectors.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@27141 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-asap.c')
-rw-r--r-- | epan/dissectors/packet-asap.c | 148 |
1 files changed, 97 insertions, 51 deletions
diff --git a/epan/dissectors/packet-asap.c b/epan/dissectors/packet-asap.c index e77d9fbeea..bd098dec15 100644 --- a/epan/dissectors/packet-asap.c +++ b/epan/dissectors/packet-asap.c @@ -1,10 +1,11 @@ /* packet-asap.c * Routines for Aggregate Server Access Protocol (ASAP) * It is hopefully (needs testing) compliant to - * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-common-param-17.txt - * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-policies-08.txt - * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-asap-20.txt - * http://www.ietf.org/internet-drafts/draft-dreibholz-asap-hropt-01.txt + * RFC 5352 + * RFC 5354 + * RFC 5356 + * http://www.ietf.org/internet-drafts/draft-dreibholz-asap-hropt-03.txt + * http://www.ietf.org/internet-drafts/draft-dreibholz-rserpool-delay-02.txt * * The code is not as simple as possible for the current protocol * but allows to be easily adopted to future versions of the protocol. @@ -77,6 +78,9 @@ static int hf_policy_weight = -1; static int hf_policy_priority = -1; static int hf_policy_load = -1; static int hf_policy_degradation = -1; +static int hf_policy_loaddpf = -1; +static int hf_policy_weightdpf = -1; +static int hf_policy_distance = -1; static int hf_pool_handle = -1; static int hf_pe_pe_identifier = -1; static int hf_home_enrp_id = -1; @@ -365,11 +369,15 @@ dissect_udp_lite_transport_parameter(tvbuff_t *parameter_tvb, proto_tree *parame dissect_parameters(parameters_tvb, parameter_tree); } -#define POLICY_TYPE_LENGTH 4 -#define POLICY_WEIGHT_LENGTH 4 -#define POLICY_PRIORITY_LENGTH 4 -#define POLICY_LOAD_LENGTH 4 -#define POLICY_DEGRADATION_LENGTH 4 +#define POLICY_TYPE_LENGTH 4 +#define POLICY_WEIGHT_LENGTH 4 +#define POLICY_PRIORITY_LENGTH 4 +#define POLICY_LOAD_LENGTH 4 +#define POLICY_DEGRADATION_LENGTH 4 +#define POLICY_LUDPF_LOADDPF_LENGTH 4 +#define POLICY_LUDPF_DISTANCE_LENGTH 4 +#define POLICY_WRANDDPF_WEIGHTDPF_LENGTH 4 +#define POLICY_WRANDDPF_DISTANCE_LENGTH 4 #define POLICY_TYPE_OFFSET PARAMETER_VALUE_OFFSET #define POLICY_VALUE_OFFSET (POLICY_TYPE_OFFSET + POLICY_TYPE_LENGTH) @@ -378,6 +386,12 @@ dissect_udp_lite_transport_parameter(tvbuff_t *parameter_tvb, proto_tree *parame #define POLICY_LOAD_OFFSET POLICY_VALUE_OFFSET #define POLICY_DEGRADATION_OFFSET (POLICY_LOAD_OFFSET + POLICY_LOAD_LENGTH) +#define POLICY_LUDPF_LOADDPF_OFFSET (POLICY_LOAD_OFFSET + POLICY_LOAD_LENGTH) +#define POLICY_LUDPF_DISTANCE_OFFSET (POLICY_LUDPF_LOADDPF_OFFSET + POLICY_LUDPF_LOADDPF_LENGTH) +#define POLICY_WRANDDPF_WEIGHTDPF_OFFSET (POLICY_WEIGHT_OFFSET + POLICY_WEIGHT_LENGTH) +#define POLICY_WRANDDPF_DISTANCE_OFFSET (POLICY_WRANDDPF_WEIGHTDPF_OFFSET + POLICY_WRANDDPF_WEIGHTDPF_LENGTH) + + #define ROUND_ROBIN_POLICY 0x00000001 #define WEIGHTED_ROUND_ROBIN_POLICY 0x00000002 #define RANDOM_POLICY 0x00000003 @@ -388,58 +402,80 @@ dissect_udp_lite_transport_parameter(tvbuff_t *parameter_tvb, proto_tree *parame #define PRIORITY_LEAST_USED_POLICY 0x40000003 #define RANDOMIZED_LEAST_USED_POLICY 0x40000004 +#define PRIORITY_LEAST_USED_DEG_POLICY 0xb0001003 +#define WEIGHTED_RANDOM_DPF_POLICY 0xb0002001 +#define LEAST_USED_DPF_POLICY 0xb0002002 + static const value_string policy_type_values[] = { - { ROUND_ROBIN_POLICY, "Round robin" }, - { WEIGHTED_ROUND_ROBIN_POLICY, "Weighted round robin" }, - { RANDOM_POLICY, "Random"}, - { WEIGHTED_RANDOM_POLICY, "Weighted random" }, - { PRIORITY_POLICY, "Priority" }, - { LEAST_USED_POLICY, "Least used" }, - { LEAST_USED_WITH_DEG_POLICY, "Least used with degradation" }, - { PRIORITY_LEAST_USED_POLICY, "Priority least used" }, - { RANDOMIZED_LEAST_USED_POLICY, "Randomized least used" }, - { 0, NULL } }; + { ROUND_ROBIN_POLICY, "Round Robin (RR)" }, + { WEIGHTED_ROUND_ROBIN_POLICY, "Weighted Round Robin (WRR)" }, + { RANDOM_POLICY, "Random (RAND)"}, + { WEIGHTED_RANDOM_POLICY, "Weighted Random (WRAND)" }, + { PRIORITY_POLICY, "Priority (PRI)" }, + { LEAST_USED_POLICY, "Least Used (LU)" }, + { LEAST_USED_WITH_DEG_POLICY, "Least Used with Degradation (LUD)" }, + { PRIORITY_LEAST_USED_POLICY, "Priority Least Used (PLU)" }, + { PRIORITY_LEAST_USED_DEG_POLICY, "Priority Least Used with Degradation (PLUD)" }, + { RANDOMIZED_LEAST_USED_POLICY, "Randomized Least Used (RLU)" }, + { LEAST_USED_DPF_POLICY, "Least Used with Delay Penalty Factor (LU-DPF)" }, + { WEIGHTED_RANDOM_DPF_POLICY, "Weighted Random with Delay Penalty Factor (WRAND-DPF)" }, + { 0, NULL } }; static void dissect_pool_member_selection_policy_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree) { guint32 type; - guint length; + guint length; proto_tree_add_item(parameter_tree, hf_policy_type, parameter_tvb, POLICY_TYPE_OFFSET, POLICY_TYPE_LENGTH, NETWORK_BYTE_ORDER); type = tvb_get_ntohl(parameter_tvb, POLICY_TYPE_OFFSET); switch (type) { - case ROUND_ROBIN_POLICY: - break; - case WEIGHTED_ROUND_ROBIN_POLICY: - proto_tree_add_item(parameter_tree, hf_policy_weight, parameter_tvb, POLICY_WEIGHT_OFFSET, POLICY_WEIGHT_LENGTH, NETWORK_BYTE_ORDER); - break; case RANDOM_POLICY: + case ROUND_ROBIN_POLICY: break; case WEIGHTED_RANDOM_POLICY: + case WEIGHTED_ROUND_ROBIN_POLICY: proto_tree_add_item(parameter_tree, hf_policy_weight, parameter_tvb, POLICY_WEIGHT_OFFSET, POLICY_WEIGHT_LENGTH, NETWORK_BYTE_ORDER); break; case PRIORITY_POLICY: - proto_tree_add_item(parameter_tree, hf_policy_weight, parameter_tvb, POLICY_PRIORITY_OFFSET, POLICY_PRIORITY_LENGTH, NETWORK_BYTE_ORDER); + proto_tree_add_item(parameter_tree, hf_policy_priority, parameter_tvb, POLICY_PRIORITY_OFFSET, POLICY_PRIORITY_LENGTH, NETWORK_BYTE_ORDER); break; case LEAST_USED_POLICY: - proto_tree_add_item(parameter_tree, hf_policy_load, parameter_tvb, POLICY_LOAD_OFFSET, POLICY_LOAD_LENGTH, NETWORK_BYTE_ORDER); + case RANDOMIZED_LEAST_USED_POLICY: + proto_tree_add_double_format_value(parameter_tree, hf_policy_load, parameter_tvb, POLICY_LOAD_OFFSET, POLICY_LOAD_LENGTH, + 100.0 * tvb_get_ntohl(parameter_tvb, POLICY_LOAD_OFFSET) / (double)0xffffffff, "%1.2f%%", + 100.0 * tvb_get_ntohl(parameter_tvb, POLICY_LOAD_OFFSET) / (double)0xffffffff); break; case LEAST_USED_WITH_DEG_POLICY: - proto_tree_add_item(parameter_tree, hf_policy_load, parameter_tvb, POLICY_LOAD_OFFSET, POLICY_LOAD_LENGTH, NETWORK_BYTE_ORDER); - proto_tree_add_item(parameter_tree, hf_policy_degradation, parameter_tvb, POLICY_DEGRADATION_OFFSET, POLICY_DEGRADATION_LENGTH, NETWORK_BYTE_ORDER); - break; case PRIORITY_LEAST_USED_POLICY: - proto_tree_add_item(parameter_tree, hf_policy_load, parameter_tvb, POLICY_LOAD_OFFSET, POLICY_LOAD_LENGTH, NETWORK_BYTE_ORDER); - proto_tree_add_item(parameter_tree, hf_policy_degradation, parameter_tvb, POLICY_DEGRADATION_OFFSET, POLICY_DEGRADATION_LENGTH, NETWORK_BYTE_ORDER); - break; - case RANDOMIZED_LEAST_USED_POLICY: - proto_tree_add_item(parameter_tree, hf_policy_load, parameter_tvb, POLICY_LOAD_OFFSET, POLICY_LOAD_LENGTH, NETWORK_BYTE_ORDER); + proto_tree_add_double_format_value(parameter_tree, hf_policy_load, parameter_tvb, POLICY_LOAD_OFFSET, POLICY_LOAD_LENGTH, + 100.0 * tvb_get_ntohl(parameter_tvb, POLICY_LOAD_OFFSET) / (double)0xffffffff, "%1.2f%%", + 100.0 * tvb_get_ntohl(parameter_tvb, POLICY_LOAD_OFFSET) / (double)0xffffffff); + proto_tree_add_double_format_value(parameter_tree, hf_policy_degradation, parameter_tvb, POLICY_DEGRADATION_OFFSET, POLICY_DEGRADATION_LENGTH, + 100.0 * tvb_get_ntohl(parameter_tvb, POLICY_DEGRADATION_OFFSET) / (double)0xffffffff, "%1.2f%%", + 100.0 * tvb_get_ntohl(parameter_tvb, POLICY_DEGRADATION_OFFSET) / (double)0xffffffff); + break; + case LEAST_USED_DPF_POLICY: + proto_tree_add_double_format_value(parameter_tree, hf_policy_load, parameter_tvb, POLICY_LOAD_OFFSET, POLICY_LOAD_LENGTH, + 100.0 * tvb_get_ntohl(parameter_tvb, POLICY_LOAD_OFFSET) / (double)0xffffffff, "%1.2f%%", + 100.0 * tvb_get_ntohl(parameter_tvb, POLICY_LOAD_OFFSET) / (double)0xffffffff); + proto_tree_add_double_format_value(parameter_tree, hf_policy_loaddpf, parameter_tvb, POLICY_LUDPF_LOADDPF_OFFSET, POLICY_LUDPF_LOADDPF_LENGTH, + tvb_get_ntohl(parameter_tvb, POLICY_LUDPF_LOADDPF_OFFSET) / (double)0xffffffff, "%1.5f", + tvb_get_ntohl(parameter_tvb, POLICY_LUDPF_LOADDPF_OFFSET) / (double)0xffffffff); + proto_tree_add_item(parameter_tree, hf_policy_distance, parameter_tvb, POLICY_LUDPF_DISTANCE_OFFSET, POLICY_LUDPF_DISTANCE_LENGTH, NETWORK_BYTE_ORDER); + break; + case WEIGHTED_RANDOM_DPF_POLICY: + proto_tree_add_item(parameter_tree, hf_policy_weight, parameter_tvb, POLICY_WEIGHT_OFFSET, POLICY_WEIGHT_LENGTH, NETWORK_BYTE_ORDER); + proto_tree_add_double_format_value(parameter_tree, hf_policy_weightdpf, parameter_tvb, POLICY_WRANDDPF_WEIGHTDPF_OFFSET, POLICY_WRANDDPF_WEIGHTDPF_LENGTH, + tvb_get_ntohl(parameter_tvb, POLICY_WRANDDPF_WEIGHTDPF_OFFSET) / (double)0xffffffff, "%1.5f", + tvb_get_ntohl(parameter_tvb, POLICY_WRANDDPF_WEIGHTDPF_OFFSET) / (double)0xffffffff); + proto_tree_add_item(parameter_tree, hf_policy_distance, parameter_tvb, POLICY_WRANDDPF_DISTANCE_OFFSET, POLICY_WRANDDPF_DISTANCE_LENGTH, NETWORK_BYTE_ORDER); break; default: - length = tvb_length(parameter_tvb) - POLICY_TYPE_LENGTH; + length = tvb_length(parameter_tvb) - POLICY_VALUE_OFFSET; if (length > 0) { - proto_tree_add_item(parameter_tree, hf_policy_value, parameter_tvb, POLICY_VALUE_OFFSET, length, NETWORK_BYTE_ORDER); + proto_tree_add_bytes(parameter_tree, hf_policy_value, parameter_tvb, POLICY_VALUE_OFFSET, length, + tvb_get_ptr(parameter_tvb, POLICY_VALUE_OFFSET, length)); } break; } @@ -451,9 +487,14 @@ static void dissect_pool_handle_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree) { guint16 handle_length; + proto_item* pi; + char* tmp; handle_length = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET) - PARAMETER_HEADER_LENGTH; - proto_tree_add_item(parameter_tree, hf_pool_handle, parameter_tvb, POOL_HANDLE_OFFSET, handle_length, NETWORK_BYTE_ORDER); + pi = proto_tree_add_item(parameter_tree, hf_pool_handle, parameter_tvb, POOL_HANDLE_OFFSET, handle_length, NETWORK_BYTE_ORDER); + + tmp = (gchar*)tvb_get_ephemeral_string(parameter_tvb, POOL_HANDLE_OFFSET, handle_length); + proto_item_append_text(pi, " (%s)", tmp); } #define PE_PE_IDENTIFIER_LENGTH 4 @@ -468,11 +509,13 @@ dissect_pool_handle_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tre static void dissect_pool_element_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree) { - tvbuff_t *parameters_tvb; + tvbuff_t* parameters_tvb; + proto_item* pi; proto_tree_add_item(parameter_tree, hf_pe_pe_identifier, parameter_tvb, PE_PE_IDENTIFIER_OFFSET, PE_PE_IDENTIFIER_LENGTH, NETWORK_BYTE_ORDER); proto_tree_add_item(parameter_tree, hf_home_enrp_id, parameter_tvb, HOME_ENRP_INDENTIFIER_OFFSET, HOME_ENRP_INDENTIFIER_LENGTH, NETWORK_BYTE_ORDER); - proto_tree_add_item(parameter_tree, hf_reg_life, parameter_tvb, REGISTRATION_LIFE_OFFSET, REGISTRATION_LIFE_LENGTH, NETWORK_BYTE_ORDER); + pi = proto_tree_add_item(parameter_tree, hf_reg_life, parameter_tvb, REGISTRATION_LIFE_OFFSET, REGISTRATION_LIFE_LENGTH, NETWORK_BYTE_ORDER); + proto_item_append_text(pi, "ms"); parameters_tvb = tvb_new_subset(parameter_tvb, USER_TRANSPORT_PARAMETER_OFFSET, -1, -1); dissect_parameters(parameters_tvb, parameter_tree); @@ -832,22 +875,25 @@ proto_register_asap(void) { &hf_parameter_padding, { "Padding", "asap.parameter_padding", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } }, { &hf_parameter_ipv4_address, { "IP Version 4 Address", "asap.ipv4_address", FT_IPv4, BASE_NONE, NULL, 0x0, "", HFILL } }, { &hf_parameter_ipv6_address, { "IP Version 6 Address", "asap.ipv6_address", FT_IPv6, BASE_NONE, NULL, 0x0, "", HFILL } }, - { &hf_dccp_port, { "Port", "enrp.dccp_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_dccp_reserved, { "Reserved", "enrp.dccp_transport_reserved", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_dccp_service_code, { "Service Code", "enrp.dccp_transport_service_code", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_dccp_port, { "Port", "asap.dccp_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_dccp_reserved, { "Reserved", "asap.dccp_transport_reserved", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_dccp_service_code, { "Service Code", "asap.dccp_transport_service_code", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, { &hf_sctp_port, { "Port", "asap.sctp_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, { &hf_transport_use, { "Transport Use", "asap.transport_use", FT_UINT16, BASE_DEC, VALS(transport_use_values), 0x0, "", HFILL } }, { &hf_tcp_port, { "Port", "asap.tcp_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, { &hf_udp_port, { "Port", "asap.udp_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, { &hf_udp_reserved, { "Reserved", "asap.udp_transport_reserved", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_udp_lite_port, { "Port", "enrp.udp_lite_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_udp_lite_reserved, { "Reserved", "enrp.udp_lite_transport_reserved", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_policy_type, { "Policy Type", "asap.pool_member_slection_policy_type", FT_UINT32, BASE_DEC, VALS(policy_type_values), 0x0, "", HFILL } }, - { &hf_policy_weight, { "Policy Weight", "asap.pool_member_slection_policy_weight", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_policy_priority, { "Policy Priority", "asap.pool_member_slection_policy_priority", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_policy_load, { "Policy Load", "asap.pool_member_slection_policy_load", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_policy_degradation, { "Policy Degradation", "asap.pool_member_slection_policy_degradation", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_policy_value, { "Policy Value", "asap.pool_member_slection_policy_value", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } }, + { &hf_udp_lite_port, { "Port", "asap.udp_lite_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_udp_lite_reserved, { "Reserved", "asap.udp_lite_transport_reserved", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_policy_type, { "Policy Type", "asap.pool_member_selection_policy_type", FT_UINT32, BASE_HEX, VALS(policy_type_values), 0x0, "", HFILL } }, + { &hf_policy_weight, { "Policy Weight", "asap.pool_member_selection_policy_weight", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_policy_priority, { "Policy Priority", "asap.pool_member_selection_policy_priority", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_policy_load, { "Policy Load", "asap.pool_member_selection_policy_load", FT_DOUBLE, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_policy_degradation, { "Policy Degradation", "asap.pool_member_selection_policy_degradation", FT_DOUBLE, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_policy_loaddpf, { "Policy Load DPF", "asap.pool_member_selection_policy_load_dpf", FT_DOUBLE, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_policy_weightdpf, { "Policy Weight DPF", "asap.pool_member_selection_policy_weight_dpf", FT_DOUBLE, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_policy_distance, { "Policy Distance", "asap.pool_member_selection_policy_distance", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_policy_value, { "Policy Value", "asap.pool_member_selection_policy_value", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } }, { &hf_pool_handle, { "Pool Handle", "asap.pool_handle_pool_handle", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } }, { &hf_pe_pe_identifier, { "PE Identifier", "asap.pool_element_pe_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } }, { &hf_home_enrp_id, { "Home ENRP Server Identifier", "asap.pool_element_home_enrp_server_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } }, |