aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-asap.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2008-12-31 16:27:18 +0000
committerAnders Broman <anders.broman@ericsson.com>2008-12-31 16:27:18 +0000
commit9e61f345b9ea1c9a8350865bc6d8275b1cfc2763 (patch)
tree89f5f6fc7ec9949f9f086a003f37d439ce9ef70d /epan/dissectors/packet-asap.c
parent43ac3652a37e578e663743fa10e3b503613c7d4f (diff)
From Thomas Dreibholz:
Improvements for the ASAP and ENRP dissectors. svn path=/trunk/; revision=27141
Diffstat (limited to 'epan/dissectors/packet-asap.c')
-rw-r--r--epan/dissectors/packet-asap.c148
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 } },