Add support for draft-ietf-rserpool-policies-04.txt.

svn path=/trunk/; revision=20996
This commit is contained in:
Michael Tüxen 2007-03-07 20:28:48 +00:00
parent 0204c1dc93
commit af7bdd06db
2 changed files with 162 additions and 34 deletions

View File

@ -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_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_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 1
#define LEAST_USED_POLICY 2
#define LEAST_USED_WITH_DEG 3
#define WEIGHTED_ROUND_ROBIN 4
#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 } },

View File

@ -2,6 +2,7 @@
* Routines for Endpoint Handlespace Redundancy Protocol (ENRP)
* 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-enrp-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$
*
@ -66,6 +67,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;
@ -320,29 +325,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_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_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 1
#define LEAST_USED_POLICY 2
#define LEAST_USED_WITH_DEG 3
#define WEIGHTED_ROUND_ROBIN 4
#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
@ -884,8 +944,12 @@ proto_register_enrp(void)
{ &hf_tcp_port, { "Port", "enrp.tcp_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
{ &hf_udp_port, { "Port", "enrp.udp_transport_port", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
{ &hf_udp_reserved, { "Reserved", "enrp.udp_transport_reserved", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
{ &hf_policy_type, { "Policy type", "enrp.pool_member_slection_policy_type", FT_UINT8, BASE_DEC, VALS(policy_type_values), 0x0, "", HFILL } },
{ &hf_policy_value, { "Policy value", "enrp.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", "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 } },