diff options
Diffstat (limited to 'epan/dissectors/packet-asap.c')
-rw-r--r-- | epan/dissectors/packet-asap.c | 102 |
1 files changed, 83 insertions, 19 deletions
diff --git a/epan/dissectors/packet-asap.c b/epan/dissectors/packet-asap.c index ae9432b2f8..e635bab241 100644 --- a/epan/dissectors/packet-asap.c +++ b/epan/dissectors/packet-asap.c @@ -2,6 +2,7 @@ * Routines for Aggregate Server Access Protocol (ASAP) * It is hopefully (needs testing) compilant to * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-common-param-09.txt + * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-policies-04.txt * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-asap-12.txt * * The code is not as simple as possible for the current protocol @@ -11,7 +12,7 @@ * TODO: * - check message lengths * - * Copyright 2004, 2005 Michael Tuexen <tuexen [AT] fh-muenster.de> + * Copyright 2004, 2005, 2006, 2007 Michael Tuexen <tuexen [AT] fh-muenster.de> * * $Id$ * @@ -65,6 +66,10 @@ static int hf_udp_port = -1; static int hf_udp_reserved = -1; static int hf_policy_type = -1; static int hf_policy_value = -1; +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_pool_handle = -1; static int hf_pe_pe_identifier = -1; static int hf_home_enrp_id = -1; @@ -311,29 +316,84 @@ dissect_udp_transport_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_t dissect_parameters(parameters_tvb, parameter_tree); } -#define POLICY_TYPE_LENGTH 1 -#define POLICY_VALUE_LENGTH 3 - -#define POLICY_TYPE_OFFSET PARAMETER_VALUE_OFFSET -#define POLICY_VALUE_OFFSET (POLICY_TYPE_OFFSET + POLICY_TYPE_LENGTH) - -#define ROUND_ROBIN_POLICY 1 -#define LEAST_USED_POLICY 2 -#define LEAST_USED_WITH_DEG 3 -#define WEIGHTED_ROUND_ROBIN 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_TYPE_OFFSET PARAMETER_VALUE_OFFSET +#define POLICY_VALUE_OFFSET (POLICY_TYPE_OFFSET + POLICY_TYPE_LENGTH) +#define POLICY_WEIGHT_OFFSET POLICY_VALUE_OFFSET +#define POLICY_PRIORITY_OFFSET POLICY_VALUE_OFFSET +#define POLICY_LOAD_OFFSET POLICY_VALUE_OFFSET +#define POLICY_DEGRADATION_OFFSET (POLICY_LOAD_OFFSET + POLICY_LOAD_LENGTH) + +#define ROUND_ROBIN_POLICY 0x00000001 +#define WEIGHTED_ROUND_ROBIN_POLICY 0x00000002 +#define RANDOM_POLICY 0x00000003 +#define WEIGHTED_RANDOM_POLICY 0x00000004 +#define PRIORITY_POLICY 0x00000005 +#define LEAST_USED_POLICY 0x40000001 +#define LEAST_USED_WITH_DEG_POLICY 0x40000002 +#define PRIORITY_LEAST_USED_POLICY 0x40000003 +#define RANDOMIZED_LEAST_USED_POLICY 0x40000004 static const value_string policy_type_values[] = { - { ROUND_ROBIN_POLICY, "Round robin" }, - { LEAST_USED_POLICY, "Least used" }, - { LEAST_USED_WITH_DEG, "Least used with degradation" }, - { WEIGHTED_ROUND_ROBIN, "Weighted round robin" }, - { 0, NULL } }; + { 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 } }; static void dissect_pool_member_selection_policy_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree) { + guint32 type; + guint length; + proto_tree_add_item(parameter_tree, hf_policy_type, parameter_tvb, POLICY_TYPE_OFFSET, POLICY_TYPE_LENGTH, NETWORK_BYTE_ORDER); - proto_tree_add_item(parameter_tree, hf_policy_value, parameter_tvb, POLICY_VALUE_OFFSET, POLICY_VALUE_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: + break; + case WEIGHTED_RANDOM_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); + 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); + 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); + break; + default: + length = tvb_length(parameter_tvb) - POLICY_TYPE_LENGTH; + if (length > 0) { + proto_tree_add_item(parameter_tree, hf_policy_value, parameter_tvb, POLICY_VALUE_OFFSET, length, NETWORK_BYTE_ORDER); + } + break; + } } #define POOL_HANDLE_OFFSET PARAMETER_VALUE_OFFSET @@ -716,8 +776,12 @@ proto_register_asap(void) { &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_policy_type, { "Policy type", "asap.pool_member_slection_policy_type", FT_UINT8, BASE_DEC, VALS(policy_type_values), 0x0, "", HFILL } }, - { &hf_policy_value, { "Policy value", "asap.pool_member_slection_policy_value", FT_INT24, 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_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 } }, |