aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-enrp.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-enrp.c
parent43ac3652a37e578e663743fa10e3b503613c7d4f (diff)
From Thomas Dreibholz:
Improvements for the ASAP and ENRP dissectors. svn path=/trunk/; revision=27141
Diffstat (limited to 'epan/dissectors/packet-enrp.c')
-rw-r--r--epan/dissectors/packet-enrp.c144
1 files changed, 100 insertions, 44 deletions
diff --git a/epan/dissectors/packet-enrp.c b/epan/dissectors/packet-enrp.c
index 31c0690a51..aabd9e62ae 100644
--- a/epan/dissectors/packet-enrp.c
+++ b/epan/dissectors/packet-enrp.c
@@ -1,9 +1,10 @@
/* packet-enrp.c
* Routines for Endpoint Handlespace Redundancy Protocol (ENRP)
* 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-enrp-20.txt
+ * RFC 5353
+ * RFC 5354
+ * RFC 5356
+ * http://www.ietf.org/internet-drafts/draft-dreibholz-enrp-takeover-00.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;
@@ -94,6 +98,7 @@ static int hf_reply_required_bit = -1;
static int hf_own_children_only_bit = -1;
static int hf_more_to_send_bit = -1;
static int hf_reject_bit = -1;
+static int hf_tos_bit = -1;
/* Initialize the subtree pointers */
static gint ett_enrp = -1;
@@ -369,11 +374,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)
@@ -382,6 +391,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
@@ -392,58 +407,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);
+ 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 RANDOMIZED_LEAST_USED_POLICY:
- proto_tree_add_item(parameter_tree, hf_policy_load, parameter_tvb, POLICY_LOAD_OFFSET, POLICY_LOAD_LENGTH, NETWORK_BYTE_ORDER);
+ 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;
}
@@ -455,9 +492,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
@@ -472,11 +514,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);
@@ -779,11 +823,19 @@ static const value_string update_action_values[] = {
{ 1, "Delete pool element" },
{ 0, NULL } };
+#define TOS_BIT_MASK 0x01
+
+static const true_false_string tos_bit_value = {
+ "Takeover suggested",
+ "Takeover not suggested"
+};
+
static void
dissect_enrp_handle_update_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
{
tvbuff_t *parameters_tvb;
+ proto_tree_add_item(flags_tree, hf_tos_bit, message_tvb, MESSAGE_FLAGS_OFFSET, MESSAGE_FLAGS_LENGTH, NETWORK_BYTE_ORDER);
proto_tree_add_item(message_tree, hf_sender_servers_id, message_tvb, SENDER_SERVERS_ID_OFFSET, SENDER_SERVERS_ID_LENGTH, NETWORK_BYTE_ORDER);
proto_tree_add_item(message_tree, hf_receiver_servers_id, message_tvb, RECEIVER_SERVERS_ID_OFFSET, RECEIVER_SERVERS_ID_LENGTH, NETWORK_BYTE_ORDER);
proto_tree_add_item(message_tree, hf_update_action, message_tvb, UPDATE_ACTION_OFFSET, UPDATE_ACTION_LENGTH, NETWORK_BYTE_ORDER);
@@ -992,12 +1044,15 @@ proto_register_enrp(void)
{ &hf_udp_reserved, { "Reserved", "enrp.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_policy_type, { "Policy Type", "enrp.pool_member_selection_policy_type", FT_UINT32, BASE_HEX, VALS(policy_type_values), 0x0, "", HFILL } },
+ { &hf_policy_weight, { "Policy Weight", "enrp.pool_member_selection_policy_weight", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_policy_priority, { "Policy Priority", "enrp.pool_member_selection_policy_priority", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_policy_load, { "Policy Load", "enrp.pool_member_selection_policy_load", FT_DOUBLE, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_policy_degradation, { "Policy Degradation", "enrp.pool_member_selection_policy_degradation", FT_DOUBLE, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_policy_loaddpf, { "Policy Load DPF", "enrp.pool_member_selection_policy_load_dpf", FT_DOUBLE, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_policy_weightdpf, { "Policy Weight DPF", "enrp.pool_member_selection_policy_weight_dpf", FT_DOUBLE, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_policy_distance, { "Policy Distance", "enrp.pool_member_selection_policy_distance", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_policy_value, { "Policy Value", "enrp.pool_member_selection_policy_value", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } },
{ &hf_pool_handle, { "Pool Handle", "enrp.pool_handle_pool_handle", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
{ &hf_pe_pe_identifier, { "PE Identifier", "enrp.pool_element_pe_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
{ &hf_home_enrp_id, { "Home ENRP Server Identifier", "enrp.pool_element_home_enrp_server_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
@@ -1015,6 +1070,7 @@ proto_register_enrp(void)
{ &hf_own_children_only_bit, { "W Bit", "enrp.w_bit", FT_BOOLEAN, 8, TFS(&own_children_only_bit_value), OWN_CHILDREN_ONLY_BIT_MASK, "", HFILL } },
{ &hf_more_to_send_bit, { "M Bit", "enrp.m_bit", FT_BOOLEAN, 8, TFS(&more_to_send_bit_value), MORE_TO_SEND_BIT_MASK, "", HFILL } },
{ &hf_reject_bit, { "R Bit", "enrp.r_bit", FT_BOOLEAN, 8, TFS(&reject_bit_value), REJECT_BIT_MASK, "", HFILL } },
+ { &hf_tos_bit, { "T Bit", "enrp.t_bit", FT_BOOLEAN, 8, TFS(&tos_bit_value), TOS_BIT_MASK, "", HFILL } },
};
/* Setup protocol subtree array */