aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortuexen <tuexen@f5534014-38df-0310-8fa8-9805f1628bb7>2005-08-06 12:02:34 +0000
committertuexen <tuexen@f5534014-38df-0310-8fa8-9805f1628bb7>2005-08-06 12:02:34 +0000
commit01e304b13d4b16e4969e149925b5fbe69d5e27a7 (patch)
treee1b02bf106b93c337770d1b76e7e51855b4d2aed
parentf7030ee16531b21bf281489752a9a335540b1b6a (diff)
Update to
* http://www.ietf.org/internet-drafts/draft-ietf-rserpool-common-param-09.txt * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-enrp-12.txt * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-asap-12.txt git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@15243 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r--epan/dissectors/packet-asap.c242
-rw-r--r--epan/dissectors/packet-enrp.c183
2 files changed, 275 insertions, 150 deletions
diff --git a/epan/dissectors/packet-asap.c b/epan/dissectors/packet-asap.c
index bfbd30fdcf..b991a0cb87 100644
--- a/epan/dissectors/packet-asap.c
+++ b/epan/dissectors/packet-asap.c
@@ -1,10 +1,17 @@
/* packet-asap.c
- * Routines for Aggregate Server Access Protocol
+ * 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-06.txt
- * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-asap-09.txt
+ * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-common-param-09.txt
+ * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-asap-12.txt
*
- * Copyright 2004, Michael Tuexen <tuexen [AT] fh-muenster.de>
+ * The code is not as simple as possible for the current protocol
+ * but allows to be easily adopted to future versions of the protocol.
+ * I will reconsider this after the protocol is an RFC.
+ *
+ * TODO:
+ * - check message lengths
+ *
+ * Copyright 2004, 2005 Michael Tuexen <tuexen [AT] fh-muenster.de>
*
* $Id$
*
@@ -68,14 +75,22 @@ static int hf_reserved = -1;
static int hf_cookie = -1;
static int hf_pe_identifier = -1;
static int hf_pe_checksum = -1;
+static int hf_pe_checksum_reserved = -1;
+static int hf_home_enrp_server_bit = -1;
+static int hf_reject_bit = -1;
/* Initialize the subtree pointers */
static gint ett_asap = -1;
static gint ett_asap_parameter = -1;
static gint ett_asap_cause = -1;
+static gint ett_asap_flags = -1;
static void
dissect_parameters(tvbuff_t *, proto_tree *);
+static void
+dissect_parameter(tvbuff_t *, proto_tree *);
+static void
+dissect_asap_message(tvbuff_t *, packet_info *, proto_tree *);
#define NETWORK_BYTE_ORDER FALSE
#define ADD_PADDING(x) ((((x) + 3) >> 2) << 2)
@@ -83,7 +98,8 @@ dissect_parameters(tvbuff_t *, proto_tree *);
#define ASAP_UDP_PORT 3863
#define ASAP_TCP_PORT 3863
-/* Dissectors for error causes */
+/* Dissectors for error causes. This is common for ASAP and ENRP. */
+
#define CAUSE_CODE_LENGTH 2
#define CAUSE_LENGTH_LENGTH 2
#define CAUSE_HEADER_LENGTH (CAUSE_CODE_LENGTH + CAUSE_LENGTH_LENGTH)
@@ -115,6 +131,7 @@ dissect_unknown_cause(tvbuff_t *cause_tvb, proto_tree *cause_tree, proto_item *c
#define LACK_OF_RESOURCES_CAUSE_CODE 6
#define INCONSISTENT_TRANSPORT_TYPE_CAUSE_CODE 7
#define INCONSISTENT_DATA_CONTROL_CONFIGURATION_CAUSE_CODE 8
+#define UNKNOWN_POOL_HANDLE 9
static const value_string cause_code_values[] = {
{ UNRECOGNIZED_PARAMETER_CAUSE_CODE, "Unrecognized parameter" },
@@ -125,6 +142,7 @@ static const value_string cause_code_values[] = {
{ LACK_OF_RESOURCES_CAUSE_CODE, "Lack of resources" },
{ INCONSISTENT_TRANSPORT_TYPE_CAUSE_CODE, "Inconsistent transport type" },
{ INCONSISTENT_DATA_CONTROL_CONFIGURATION_CAUSE_CODE, "Inconsistent data/control type" },
+ { UNKNOWN_POOL_HANDLE, "Unknown pool handle" },
{ 0, NULL } };
static void
@@ -133,6 +151,7 @@ dissect_error_cause(tvbuff_t *cause_tvb, proto_tree *parameter_tree)
guint16 code, length, padding_length;
proto_item *cause_item;
proto_tree *cause_tree;
+ tvbuff_t *parameter_tvb, *message_tvb;
code = tvb_get_ntohs(cause_tvb, CAUSE_CODE_OFFSET);
length = tvb_get_ntohs(cause_tvb, CAUSE_LENGTH_OFFSET);
@@ -145,6 +164,35 @@ dissect_error_cause(tvbuff_t *cause_tvb, proto_tree *parameter_tree)
proto_tree_add_item(cause_tree, hf_cause_length, cause_tvb, CAUSE_LENGTH_OFFSET, CAUSE_LENGTH_LENGTH, NETWORK_BYTE_ORDER);
switch(code) {
+ case UNRECOGNIZED_PARAMETER_CAUSE_CODE:
+ parameter_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_parameter(parameter_tvb, parameter_tree);
+ break;
+ case UNRECONGNIZED_MESSAGE_CAUSE_CODE:
+ message_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_asap_message(message_tvb, NULL, parameter_tree);
+ break;
+ break;
+ case INVALID_VALUES:
+ parameter_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_parameter(parameter_tvb, parameter_tree);
+ break;
+ case NON_UNIQUE_PE_IDENTIFIER:
+ break;
+ case POOLING_POLICY_INCONSISTENT_CAUSE_CODE:
+ parameter_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_parameter(parameter_tvb, parameter_tree);
+ break;
+ case LACK_OF_RESOURCES_CAUSE_CODE:
+ break;
+ case INCONSISTENT_TRANSPORT_TYPE_CAUSE_CODE:
+ parameter_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_parameter(parameter_tvb, parameter_tree);
+ break;
+ case INCONSISTENT_DATA_CONTROL_CONFIGURATION_CAUSE_CODE:
+ break;
+ case UNKNOWN_POOL_HANDLE:
+ break;
default:
dissect_unknown_cause(cause_tvb, cause_tree, cause_item);
break;
@@ -170,7 +218,7 @@ dissect_error_causes(tvbuff_t *error_causes_tvb, proto_tree *parameter_tree)
}
}
-/* Dissectors for parameters. This is common for ASAP and ENRP */
+/* Dissectors for parameters. This is common for ASAP and ENRP. */
#define PARAMETER_TYPE_LENGTH 2
#define PARAMETER_LENGTH_LENGTH 2
@@ -378,14 +426,18 @@ dissect_pe_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_t
proto_item_append_text(parameter_item, " (0x%x)", tvb_get_ntohl(parameter_tvb, PE_IDENTIFIER_OFFSET));
}
-#define PE_CHECKSUM_LENGTH 4
+#define PE_CHECKSUM_LENGTH 2
+#define PE_CHECKSUM_RESERVED_LENGTH 2
+
#define PE_CHECKSUM_OFFSET PARAMETER_VALUE_OFFSET
+#define PE_CHECKSUM_RESERVED_OFFSET (PE_CHECKSUM_OFFSET + PE_CHECKSUM_LENGTH)
static void
dissect_pe_checksum_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- proto_tree_add_item(parameter_tree, hf_pe_checksum, parameter_tvb, PE_CHECKSUM_OFFSET, PE_CHECKSUM_LENGTH, NETWORK_BYTE_ORDER);
- proto_item_append_text(parameter_item, " (0x%x)", tvb_get_ntohl(parameter_tvb, PE_CHECKSUM_OFFSET));
+ proto_tree_add_item(parameter_tree, hf_pe_checksum, parameter_tvb, PE_CHECKSUM_OFFSET, PE_CHECKSUM_LENGTH, NETWORK_BYTE_ORDER);
+ proto_tree_add_item(parameter_tree, hf_pe_checksum_reserved, parameter_tvb, PE_CHECKSUM_RESERVED_OFFSET, PE_CHECKSUM_RESERVED_LENGTH, NETWORK_BYTE_ORDER);
+ proto_item_append_text(parameter_item, " (0x%x)", tvb_get_ntohs(parameter_tvb, PE_CHECKSUM_OFFSET));
}
static void
@@ -522,6 +574,8 @@ dissect_parameters(tvbuff_t *parameters_tvb, proto_tree *tree)
}
}
+/* Dissectors for messages. This is specific to ASAP */
+
#define MESSAGE_TYPE_LENGTH 1
#define MESSAGE_FLAGS_LENGTH 1
#define MESSAGE_LENGTH_LENGTH 2
@@ -531,51 +585,85 @@ dissect_parameters(tvbuff_t *parameters_tvb, proto_tree *tree)
#define MESSAGE_LENGTH_OFFSET (MESSAGE_FLAGS_OFFSET + MESSAGE_FLAGS_LENGTH)
#define MESSAGE_VALUE_OFFSET (MESSAGE_LENGTH_OFFSET + MESSAGE_LENGTH_LENGTH)
-#define REGISTRATION_MESSAGE_TYPE 0x01
-#define DEREGISTRATION_MESSAGE_TYPE 0x02
-#define REGISTRATION_RESPONSE_MESSAGE_TYPE 0x03
-#define DEREGISTRATION_RESPONSE_MESSAGE_TYPE 0x04
-#define NAME_RESOLUTION_MESSAGE_TYPE 0x05
-#define NAME_RESOLUTION_RESPONSE_MESSAGE_TYPE 0x06
-#define ENDPOINT_KEEP_ALIVE_MESSAGE_TYPE 0x07
-#define ENDPOINT_KEEP_ALIVE_ACK_MESSAGE_TYPE 0x08
-#define ENDPOINT_UNREACHABLE_MESSAGE_TYPE 0x09
-#define SERVER_ANNOUNCE_MESSAGE_TYPE 0x0a
-#define COOKIE_MESSAGE_TYPE 0x0b
-#define COOKIE_ECHO_MESSAGE_TYPE 0x0c
-#define BUSINESS_CARD_MESSAGE_TYPE 0x0d
-#define PEER_ERROR_MESSAGE_TYPE 0x0e
+#define REGISTRATION_MESSAGE_TYPE 0x01
+#define DEREGISTRATION_MESSAGE_TYPE 0x02
+#define REGISTRATION_RESPONSE_MESSAGE_TYPE 0x03
+#define DEREGISTRATION_RESPONSE_MESSAGE_TYPE 0x04
+#define HANDLE_RESOLUTION_MESSAGE_TYPE 0x05
+#define HANDLE_RESOLUTION_RESPONSE_MESSAGE_TYPE 0x06
+#define ENDPOINT_KEEP_ALIVE_MESSAGE_TYPE 0x07
+#define ENDPOINT_KEEP_ALIVE_ACK_MESSAGE_TYPE 0x08
+#define ENDPOINT_UNREACHABLE_MESSAGE_TYPE 0x09
+#define SERVER_ANNOUNCE_MESSAGE_TYPE 0x0a
+#define COOKIE_MESSAGE_TYPE 0x0b
+#define COOKIE_ECHO_MESSAGE_TYPE 0x0c
+#define BUSINESS_CARD_MESSAGE_TYPE 0x0d
+#define ERROR_MESSAGE_TYPE 0x0e
static const value_string message_type_values[] = {
- { REGISTRATION_MESSAGE_TYPE, "Registration" },
- { DEREGISTRATION_MESSAGE_TYPE, "Deregistration" },
- { REGISTRATION_RESPONSE_MESSAGE_TYPE, "Registration response" },
- { DEREGISTRATION_RESPONSE_MESSAGE_TYPE, "Deregistration response" },
- { NAME_RESOLUTION_MESSAGE_TYPE, "Name resolution" },
- { NAME_RESOLUTION_RESPONSE_MESSAGE_TYPE, "Name resolution response" },
- { ENDPOINT_KEEP_ALIVE_MESSAGE_TYPE, "Endpoint keep alive" },
- { ENDPOINT_KEEP_ALIVE_ACK_MESSAGE_TYPE, "Endpoint keep alive acknowledgement" },
- { ENDPOINT_UNREACHABLE_MESSAGE_TYPE, "Endpoint unreachable" },
- { SERVER_ANNOUNCE_MESSAGE_TYPE, "Server announce" },
- { COOKIE_MESSAGE_TYPE, "Cookie" },
- { COOKIE_ECHO_MESSAGE_TYPE, "Cookie echo" },
- { BUSINESS_CARD_MESSAGE_TYPE, "Business card" },
- { PEER_ERROR_MESSAGE_TYPE, "Peer error" },
- { 0, NULL } };
+ { REGISTRATION_MESSAGE_TYPE, "ASAP Registration" },
+ { DEREGISTRATION_MESSAGE_TYPE, "ASAP Deregistration" },
+ { REGISTRATION_RESPONSE_MESSAGE_TYPE, "ASAP Registration response" },
+ { DEREGISTRATION_RESPONSE_MESSAGE_TYPE, "ASAP Deregistration response" },
+ { HANDLE_RESOLUTION_MESSAGE_TYPE, "ASAP Name resolution" },
+ { HANDLE_RESOLUTION_RESPONSE_MESSAGE_TYPE, "ASAP Name resolution response" },
+ { ENDPOINT_KEEP_ALIVE_MESSAGE_TYPE, "ASAP Endpoint keep alive" },
+ { ENDPOINT_KEEP_ALIVE_ACK_MESSAGE_TYPE, "ASAP Endpoint keep alive acknowledgement" },
+ { ENDPOINT_UNREACHABLE_MESSAGE_TYPE, "ASAP Endpoint unreachable" },
+ { SERVER_ANNOUNCE_MESSAGE_TYPE, "ASAP Server announce" },
+ { COOKIE_MESSAGE_TYPE, "ASAP Cookie" },
+ { COOKIE_ECHO_MESSAGE_TYPE, "ASAP Cookie echo" },
+ { BUSINESS_CARD_MESSAGE_TYPE, "ASAP Business card" },
+ { ERROR_MESSAGE_TYPE, "ASAP Peer error" },
+ { 0, NULL } };
+
+#define SERVER_IDENTIFIER_OFFSET MESSAGE_VALUE_OFFSET
+#define SERVER_IDENTIFIER_LENGTH 4
+
+#define HOME_ENRP_SERVER_BIT_MASK 0x01
+#define REJECT_BIT_MASK 0x01
+
+static const true_false_string home_enrp_server_bit_value = {
+ "Want to be new ENRP server",
+ "Do not want to be new ENRP server"
+};
+
+static const true_false_string reject_bit_value = {
+ "Rejected",
+ "Accepted"
+};
static void
dissect_asap_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *asap_tree)
{
tvbuff_t *parameters_tvb;
-
- if (check_col(pinfo->cinfo, COL_INFO))
- col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(tvb_get_guint8(message_tvb, MESSAGE_TYPE_OFFSET), message_type_values, "Unknown ASAP type"));
+ proto_item *flags_item;
+ proto_tree *flags_tree;
+ guint8 type;
+
+ /* pinfo is NULL only if dissect_enrp_message is called from dissect_error cause */
+
+ type = tvb_get_guint8(message_tvb, MESSAGE_TYPE_OFFSET);
+ if (pinfo && (check_col(pinfo->cinfo, COL_INFO)))
+ col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(type, message_type_values, "Unknown ASAP type"));
if (asap_tree) {
proto_tree_add_item(asap_tree, hf_message_type, message_tvb, MESSAGE_TYPE_OFFSET, MESSAGE_TYPE_LENGTH, NETWORK_BYTE_ORDER);
- proto_tree_add_item(asap_tree, hf_message_flags, message_tvb, MESSAGE_FLAGS_OFFSET, MESSAGE_FLAGS_LENGTH, NETWORK_BYTE_ORDER);
+ flags_item = proto_tree_add_item(asap_tree, hf_message_flags, message_tvb, MESSAGE_FLAGS_OFFSET, MESSAGE_FLAGS_LENGTH, NETWORK_BYTE_ORDER);
+ flags_tree = proto_item_add_subtree(flags_item, ett_asap_flags);
+ if (type == REGISTRATION_RESPONSE_MESSAGE_TYPE) {
+ proto_tree_add_item(flags_tree, hf_reject_bit, message_tvb, MESSAGE_FLAGS_OFFSET, MESSAGE_FLAGS_LENGTH, NETWORK_BYTE_ORDER);
+ }
+ if (type == ENDPOINT_KEEP_ALIVE_MESSAGE_TYPE) {
+ proto_tree_add_item(flags_tree, hf_home_enrp_server_bit, message_tvb, MESSAGE_FLAGS_OFFSET, MESSAGE_FLAGS_LENGTH, NETWORK_BYTE_ORDER);
+ }
proto_tree_add_item(asap_tree, hf_message_length, message_tvb, MESSAGE_LENGTH_OFFSET, MESSAGE_LENGTH_LENGTH, NETWORK_BYTE_ORDER);
- parameters_tvb = tvb_new_subset(message_tvb, MESSAGE_VALUE_OFFSET, -1, -1);
+ if (type == SERVER_ANNOUNCE_MESSAGE_TYPE) {
+ proto_tree_add_item(asap_tree, hf_server_identifier, message_tvb, SERVER_IDENTIFIER_OFFSET, SERVER_IDENTIFIER_LENGTH, NETWORK_BYTE_ORDER);
+ parameters_tvb = tvb_new_subset(message_tvb, MESSAGE_VALUE_OFFSET + SERVER_IDENTIFIER_LENGTH, -1, -1);
+ } else {
+ parameters_tvb = tvb_new_subset(message_tvb, MESSAGE_VALUE_OFFSET, -1, -1);
+ }
dissect_parameters(parameters_tvb, asap_tree);
}
}
@@ -586,8 +674,8 @@ dissect_asap(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *tree)
proto_item *asap_item;
proto_tree *asap_tree;
- /* make entry in the Protocol column on summary display */
- if (check_col(pinfo->cinfo, COL_PROTOCOL))
+ /* pinfo is NULL only if dissect_asap_message is called from dissect_error cause */
+ if (pinfo && (check_col(pinfo->cinfo, COL_PROTOCOL)))
col_set_str(pinfo->cinfo, COL_PROTOCOL, "ASAP");
/* In the interest of speed, if "tree" is NULL, don't do any work not
@@ -610,41 +698,45 @@ proto_register_asap(void)
/* Setup list of header fields */
static hf_register_info hf[] = {
- { &hf_message_type, { "Type", "asap.message_type", FT_UINT8, BASE_DEC, VALS(message_type_values), 0x0, "", HFILL } },
- { &hf_message_flags, { "Flags", "asap.message_flags", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL } },
- { &hf_message_length, { "Length", "asap.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
- { &hf_cause_code, { "Cause code", "asap.cause_code", FT_UINT16, BASE_HEX, VALS(cause_code_values), 0x0, "", HFILL } },
- { &hf_cause_length, { "Cause length", "asap.cause_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
- { &hf_cause_info, { "Cause info", "asap.cause_info", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } },
- { &hf_cause_padding, { "Padding", "asap.cause_padding", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } },
- { &hf_parameter_type, { "Parameter Type", "asap.parameter_type", FT_UINT16, BASE_HEX, VALS(parameter_type_values), 0x0, "", HFILL } },
- { &hf_parameter_length, { "Parameter length", "asap.parameter_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
- { &hf_parameter_value, { "Parameter value", "asap.parameter_value", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } },
- { &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_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_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_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 } },
- { &hf_reg_life, { "Registration life", "asap.pool_element_registration_life", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
- { &hf_server_identifier, { "Server identifier", "asap.server_information_server_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
- { &hf_m_bit, { "M-Bit", "asap.server_information_m_bit", FT_BOOLEAN, 32, NULL, M_BIT_MASK, "", HFILL } },
- { &hf_reserved, { "Reserved", "asap.server_information_reserved", FT_UINT32, BASE_HEX, NULL, RESERVED_MASK, "", HFILL } },
- { &hf_cookie, { "Cookie", "asap.cookie", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
- { &hf_pe_identifier, { "PE identifier", "asap.pe_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
- { &hf_pe_checksum, { "PE checksum", "asap.pe_checksum", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_message_type, { "Type", "asap.message_type", FT_UINT8, BASE_DEC, VALS(message_type_values), 0x0, "", HFILL } },
+ { &hf_message_flags, { "Flags", "asap.message_flags", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_message_length, { "Length", "asap.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_cause_code, { "Cause code", "asap.cause_code", FT_UINT16, BASE_HEX, VALS(cause_code_values), 0x0, "", HFILL } },
+ { &hf_cause_length, { "Cause length", "asap.cause_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_cause_info, { "Cause info", "asap.cause_info", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } },
+ { &hf_cause_padding, { "Padding", "asap.cause_padding", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } },
+ { &hf_parameter_type, { "Parameter Type", "asap.parameter_type", FT_UINT16, BASE_HEX, VALS(parameter_type_values), 0x0, "", HFILL } },
+ { &hf_parameter_length, { "Parameter length", "asap.parameter_length", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_parameter_value, { "Parameter value", "asap.parameter_value", FT_BYTES, BASE_NONE, NULL, 0x0, "", HFILL } },
+ { &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_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_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_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 } },
+ { &hf_reg_life, { "Registration life", "asap.pool_element_registration_life", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+ { &hf_m_bit, { "M-Bit", "asap.server_information_m_bit", FT_BOOLEAN, 32, NULL, M_BIT_MASK, "", HFILL } },
+ { &hf_reserved, { "Reserved", "asap.server_information_reserved", FT_UINT32, BASE_HEX, NULL, RESERVED_MASK, "", HFILL } },
+ { &hf_cookie, { "Cookie", "asap.cookie", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_pe_identifier, { "PE identifier", "asap.pe_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_pe_checksum, { "PE checksum", "asap.pe_checksum", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_pe_checksum_reserved, { "Reserved", "asap.pe_checksum_reserved", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_server_identifier, { "Server identifier", "asap.server_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_home_enrp_server_bit, { "H bit", "asap.h_bit", FT_BOOLEAN, 8, TFS(&home_enrp_server_bit_value), HOME_ENRP_SERVER_BIT_MASK, "", HFILL } },
+ { &hf_reject_bit, { "R bit", "asap.r_bit", FT_BOOLEAN, 8, TFS(&reject_bit_value), REJECT_BIT_MASK, "", HFILL } },
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_asap,
+ &ett_asap_flags,
&ett_asap_parameter,
&ett_asap_cause,
};
diff --git a/epan/dissectors/packet-enrp.c b/epan/dissectors/packet-enrp.c
index e78a5a82da..5e289cbc2b 100644
--- a/epan/dissectors/packet-enrp.c
+++ b/epan/dissectors/packet-enrp.c
@@ -1,8 +1,8 @@
/* packet-enrp.c
* Routines for Endpoint Name Resolution Protocol (ENRP)
* It is hopefully (needs testing) compilant to
- * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-common-param-06.txt
- * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-enrp-09.txt
+ * http://www.ietf.org/internet-drafts/draft-ietf-rserpool-common-param-09.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
* but allows to be easily adopted to future versions of the protocol.
@@ -11,7 +11,7 @@
* TODO:
* - check message lengths
*
- * Copyright 2004, Michael Tuexen <tuexen [AT] fh-muenster.de>
+ * Copyright 2004, 2005 Michael Tuexen <tuexen [AT] fh-muenster.de>
*
* $Id$
*
@@ -76,6 +76,7 @@ static int hf_reserved = -1;
static int hf_cookie = -1;
static int hf_pe_identifier = -1;
static int hf_pe_checksum = -1;
+static int hf_pe_checksum_reserved = -1;
static int hf_sender_servers_id = -1;
static int hf_receiver_servers_id = -1;
static int hf_target_servers_id = -1;
@@ -94,10 +95,18 @@ static gint ett_enrp_flags = -1;
static void
dissect_parameters(tvbuff_t *, proto_tree *);
+static void
+dissect_parameter(tvbuff_t *, proto_tree *);
+static void
+dissect_enrp_message(tvbuff_t *, packet_info *, proto_tree *);
#define NETWORK_BYTE_ORDER FALSE
#define ADD_PADDING(x) ((((x) + 3) >> 2) << 2)
+/* These following ports are NOT reserved. */
+#define ENRP_UDP_PORT 3864
+#define ASAP_SCTP_PORT 3864
+
/* Dissectors for error causes. This is common for ASAP and ENRP. */
#define CAUSE_CODE_LENGTH 2
@@ -131,6 +140,7 @@ dissect_unknown_cause(tvbuff_t *cause_tvb, proto_tree *cause_tree, proto_item *c
#define LACK_OF_RESOURCES_CAUSE_CODE 6
#define INCONSISTENT_TRANSPORT_TYPE_CAUSE_CODE 7
#define INCONSISTENT_DATA_CONTROL_CONFIGURATION_CAUSE_CODE 8
+#define UNKNOWN_POOL_HANDLE 9
static const value_string cause_code_values[] = {
{ UNRECOGNIZED_PARAMETER_CAUSE_CODE, "Unrecognized parameter" },
@@ -141,6 +151,7 @@ static const value_string cause_code_values[] = {
{ LACK_OF_RESOURCES_CAUSE_CODE, "Lack of resources" },
{ INCONSISTENT_TRANSPORT_TYPE_CAUSE_CODE, "Inconsistent transport type" },
{ INCONSISTENT_DATA_CONTROL_CONFIGURATION_CAUSE_CODE, "Inconsistent data/control type" },
+ { UNKNOWN_POOL_HANDLE, "Unknown pool handle" },
{ 0, NULL } };
static void
@@ -149,6 +160,7 @@ dissect_error_cause(tvbuff_t *cause_tvb, proto_tree *parameter_tree)
guint16 code, length, padding_length;
proto_item *cause_item;
proto_tree *cause_tree;
+ tvbuff_t *parameter_tvb, *message_tvb;
code = tvb_get_ntohs(cause_tvb, CAUSE_CODE_OFFSET);
length = tvb_get_ntohs(cause_tvb, CAUSE_LENGTH_OFFSET);
@@ -161,6 +173,35 @@ dissect_error_cause(tvbuff_t *cause_tvb, proto_tree *parameter_tree)
proto_tree_add_item(cause_tree, hf_cause_length, cause_tvb, CAUSE_LENGTH_OFFSET, CAUSE_LENGTH_LENGTH, NETWORK_BYTE_ORDER);
switch(code) {
+ case UNRECOGNIZED_PARAMETER_CAUSE_CODE:
+ parameter_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_parameter(parameter_tvb, parameter_tree);
+ break;
+ case UNRECONGNIZED_MESSAGE_CAUSE_CODE:
+ message_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_enrp_message(message_tvb, NULL, parameter_tree);
+ break;
+ break;
+ case INVALID_VALUES:
+ parameter_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_parameter(parameter_tvb, parameter_tree);
+ break;
+ case NON_UNIQUE_PE_IDENTIFIER:
+ break;
+ case POOLING_POLICY_INCONSISTENT_CAUSE_CODE:
+ parameter_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_parameter(parameter_tvb, parameter_tree);
+ break;
+ case LACK_OF_RESOURCES_CAUSE_CODE:
+ break;
+ case INCONSISTENT_TRANSPORT_TYPE_CAUSE_CODE:
+ parameter_tvb = tvb_new_subset(cause_tvb, CAUSE_INFO_OFFSET, -1, -1);
+ dissect_parameter(parameter_tvb, parameter_tree);
+ break;
+ case INCONSISTENT_DATA_CONTROL_CONFIGURATION_CAUSE_CODE:
+ break;
+ case UNKNOWN_POOL_HANDLE:
+ break;
default:
dissect_unknown_cause(cause_tvb, cause_tree, cause_item);
break;
@@ -394,14 +435,18 @@ dissect_pe_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_t
proto_item_append_text(parameter_item, " (0x%x)", tvb_get_ntohl(parameter_tvb, PE_IDENTIFIER_OFFSET));
}
-#define PE_CHECKSUM_LENGTH 4
+#define PE_CHECKSUM_LENGTH 2
+#define PE_CHECKSUM_RESERVED_LENGTH 2
+
#define PE_CHECKSUM_OFFSET PARAMETER_VALUE_OFFSET
+#define PE_CHECKSUM_RESERVED_OFFSET (PE_CHECKSUM_OFFSET + PE_CHECKSUM_LENGTH)
static void
dissect_pe_checksum_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- proto_tree_add_item(parameter_tree, hf_pe_checksum, parameter_tvb, PE_CHECKSUM_OFFSET, PE_CHECKSUM_LENGTH, NETWORK_BYTE_ORDER);
- proto_item_append_text(parameter_item, " (0x%x)", tvb_get_ntohl(parameter_tvb, PE_CHECKSUM_OFFSET));
+ proto_tree_add_item(parameter_tree, hf_pe_checksum, parameter_tvb, PE_CHECKSUM_OFFSET, PE_CHECKSUM_LENGTH, NETWORK_BYTE_ORDER);
+ proto_tree_add_item(parameter_tree, hf_pe_checksum_reserved, parameter_tvb, PE_CHECKSUM_RESERVED_OFFSET, PE_CHECKSUM_RESERVED_LENGTH, NETWORK_BYTE_ORDER);
+ proto_item_append_text(parameter_item, " (0x%x)", tvb_get_ntohs(parameter_tvb, PE_CHECKSUM_OFFSET));
}
static void
@@ -565,7 +610,7 @@ static const true_false_string reply_required_bit_value = {
};
static void
-dissect_peer_presence_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree)
+dissect_enrp_presence_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree)
{
tvbuff_t *parameters_tvb;
@@ -585,7 +630,7 @@ static const true_false_string own_children_only_bit_value = {
static void
-dissect_peer_name_table_request_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree)
+dissect_enrp_handle_table_request_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree)
{
/* FIXME: ensure that the length is 12 bytes. */
proto_tree_add_item(flags_tree, hf_own_children_only_bit, message_tvb, MESSAGE_FLAGS_OFFSET, MESSAGE_FLAGS_LENGTH, NETWORK_BYTE_ORDER);
@@ -607,7 +652,7 @@ static const true_false_string more_to_send_bit_value = {
};
static void
-dissect_peer_name_table_response_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree)
+dissect_enrp_handle_table_response_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree)
{
tvbuff_t *parameters_tvb;
@@ -632,7 +677,7 @@ static const value_string update_action_values[] = {
{ 0, NULL } };
static void
-dissect_peer_name_update_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
+dissect_enrp_handle_update_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
{
tvbuff_t *parameters_tvb;
@@ -645,7 +690,7 @@ dissect_peer_name_update_message(tvbuff_t *message_tvb, proto_tree *message_tree
}
static void
-dissect_peer_list_request_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
+dissect_enrp_list_request_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
{
/* FIXME: ensure that the length is 12 bytes. */
proto_tree_add_item(message_tree, hf_sender_servers_id, message_tvb, SENDER_SERVERS_ID_OFFSET, SENDER_SERVERS_ID_LENGTH, NETWORK_BYTE_ORDER);
@@ -653,7 +698,7 @@ dissect_peer_list_request_message(tvbuff_t *message_tvb, proto_tree *message_tre
}
static void
-dissect_peer_list_response_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree)
+dissect_enrp_list_response_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree)
{
tvbuff_t *parameters_tvb;
@@ -668,7 +713,7 @@ dissect_peer_list_response_message(tvbuff_t *message_tvb, proto_tree *message_tr
#define TARGET_SERVERS_ID_OFFSET (RECEIVER_SERVERS_ID_OFFSET + RECEIVER_SERVERS_ID_LENGTH)
static void
-dissect_peer_init_takeover_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
+dissect_enrp_init_takeover_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
{
/* FIXME: ensure that the length is 16 bytes. */
proto_tree_add_item(message_tree, hf_sender_servers_id, message_tvb, SENDER_SERVERS_ID_OFFSET, SENDER_SERVERS_ID_LENGTH, NETWORK_BYTE_ORDER);
@@ -677,7 +722,7 @@ dissect_peer_init_takeover_message(tvbuff_t *message_tvb, proto_tree *message_tr
}
static void
-dissect_peer_init_takeover_ack_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
+dissect_enrp_init_takeover_ack_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
{
/* FIXME: ensure that the length is 16 bytes. */
proto_tree_add_item(message_tree, hf_sender_servers_id, message_tvb, SENDER_SERVERS_ID_OFFSET, SENDER_SERVERS_ID_LENGTH, NETWORK_BYTE_ORDER);
@@ -686,7 +731,7 @@ dissect_peer_init_takeover_ack_message(tvbuff_t *message_tvb, proto_tree *messag
}
static void
-dissect_peer_init_takeover_server_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
+dissect_enrp_init_takeover_server_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
{
/* FIXME: ensure that the length is 16 bytes. */
proto_tree_add_item(message_tree, hf_sender_servers_id, message_tvb, SENDER_SERVERS_ID_OFFSET, SENDER_SERVERS_ID_LENGTH, NETWORK_BYTE_ORDER);
@@ -695,18 +740,7 @@ dissect_peer_init_takeover_server_message(tvbuff_t *message_tvb, proto_tree *mes
}
static void
-dissect_peer_ownership_change_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
-{
- tvbuff_t *parameters_tvb;
-
- 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);
- parameters_tvb = tvb_new_subset(message_tvb, MESSAGE_PARAMETERS_OFFSET, -1, -1);
- dissect_parameters(parameters_tvb, message_tree);
-}
-
-static void
-dissect_peer_error_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
+dissect_enrp_error_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_tree *flags_tree _U_)
{
tvbuff_t *parameters_tvb;
@@ -722,31 +756,29 @@ dissect_unknown_message(tvbuff_t *message_tvb, proto_tree *message_tree, proto_t
proto_tree_add_item(message_tree, hf_message_value, message_tvb, MESSAGE_VALUE_OFFSET, tvb_length(message_tvb) - MESSAGE_HEADER_LENGTH, NETWORK_BYTE_ORDER);
}
-#define PEER_PRESENCE_MESSAGE_TYPE 0x01
-#define PEER_NAME_TABLE_REQUEST_MESSAGE_TYPE 0x02
-#define PEER_NAME_TABLE_RESPONSE_MESSAGE_TYPE 0x03
-#define PEER_NAME_UPDATE_MESSAGE_TYPE 0x04
-#define PEER_LIST_REQUEST_MESSAGE_TYPE 0x05
-#define PEER_LIST_RESPONSE_MESSAGE_TYPE 0x06
-#define PEER_INIT_TAKEOVER_MESSAGE_TYPE 0x07
-#define PEER_INIT_TAKEOVER_ACK_MESSAGE_TYPE 0x08
-#define PEER_TAKEOVER_SERVER_MESSAGE_TYPE 0x09
-#define PEER_OWNERSHIP_CHANGE_MESSAGE_TYPE 0x0a
-#define PEER_ERROR_MESSAGE_TYPE 0x0b
+#define ENRP_PRESENCE_MESSAGE_TYPE 0x01
+#define ENRP_HANDLE_TABLE_REQUEST_MESSAGE_TYPE 0x02
+#define ENRP_HANDLE_TABLE_RESPONSE_MESSAGE_TYPE 0x03
+#define ENRP_HANDLE_UPDATE_MESSAGE_TYPE 0x04
+#define ENRP_LIST_REQUEST_MESSAGE_TYPE 0x05
+#define ENRP_LIST_RESPONSE_MESSAGE_TYPE 0x06
+#define ENRP_INIT_TAKEOVER_MESSAGE_TYPE 0x07
+#define ENRP_INIT_TAKEOVER_ACK_MESSAGE_TYPE 0x08
+#define ENRP_TAKEOVER_SERVER_MESSAGE_TYPE 0x09
+#define ENRP_ERROR_MESSAGE_TYPE 0x0a
static const value_string message_type_values[] = {
- { PEER_PRESENCE_MESSAGE_TYPE, "Peer presence" },
- { PEER_NAME_TABLE_REQUEST_MESSAGE_TYPE, "Peer name table request" },
- { PEER_NAME_TABLE_RESPONSE_MESSAGE_TYPE, "Peer name table response" },
- { PEER_NAME_UPDATE_MESSAGE_TYPE, "Peer name update" },
- { PEER_LIST_REQUEST_MESSAGE_TYPE, "Peer list request" },
- { PEER_LIST_RESPONSE_MESSAGE_TYPE, "Peer list response" },
- { PEER_INIT_TAKEOVER_MESSAGE_TYPE, "Peer init takeover" },
- { PEER_INIT_TAKEOVER_ACK_MESSAGE_TYPE, "Peer init takeover ack" },
- { PEER_TAKEOVER_SERVER_MESSAGE_TYPE, "Peer takeover server" },
- { PEER_OWNERSHIP_CHANGE_MESSAGE_TYPE, "Peer ownership change" },
- { PEER_ERROR_MESSAGE_TYPE, "Peer error" },
- { 0, NULL } };
+ { ENRP_PRESENCE_MESSAGE_TYPE, "ENRP presence" },
+ { ENRP_HANDLE_TABLE_REQUEST_MESSAGE_TYPE, "ENRP handle table request" },
+ { ENRP_HANDLE_TABLE_RESPONSE_MESSAGE_TYPE, "ENRP handle table response" },
+ { ENRP_HANDLE_UPDATE_MESSAGE_TYPE, "ENRP handle update" },
+ { ENRP_LIST_REQUEST_MESSAGE_TYPE, "ENRP list request" },
+ { ENRP_LIST_RESPONSE_MESSAGE_TYPE, "ENRP list response" },
+ { ENRP_INIT_TAKEOVER_MESSAGE_TYPE, "ENRP init takeover" },
+ { ENRP_INIT_TAKEOVER_ACK_MESSAGE_TYPE, "ENRP init takeover ack" },
+ { ENRP_TAKEOVER_SERVER_MESSAGE_TYPE, "ENRP takeover server" },
+ { ENRP_ERROR_MESSAGE_TYPE, "ENRP error" },
+ { 0, NULL } };
static void
dissect_enrp_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *enrp_tree)
@@ -756,7 +788,8 @@ dissect_enrp_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *enrp
guint8 type;
type = tvb_get_guint8(message_tvb, MESSAGE_TYPE_OFFSET);
- if (check_col(pinfo->cinfo, COL_INFO))
+ /* pinfo is NULL only if dissect_enrp_message is called from dissect_error cause */
+ if (pinfo && (check_col(pinfo->cinfo, COL_INFO)))
col_add_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(type, message_type_values, "Unknown ENRP type"));
if (enrp_tree) {
@@ -765,38 +798,35 @@ dissect_enrp_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *enrp
flags_tree = proto_item_add_subtree(flags_item, ett_enrp_flags);
proto_tree_add_item(enrp_tree, hf_message_length, message_tvb, MESSAGE_LENGTH_OFFSET, MESSAGE_LENGTH_LENGTH, NETWORK_BYTE_ORDER);
switch (type) {
- case PEER_PRESENCE_MESSAGE_TYPE:
- dissect_peer_presence_message(message_tvb, enrp_tree, flags_tree);
- break;
- case PEER_NAME_TABLE_REQUEST_MESSAGE_TYPE:
- dissect_peer_name_table_request_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_PRESENCE_MESSAGE_TYPE:
+ dissect_enrp_presence_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_NAME_TABLE_RESPONSE_MESSAGE_TYPE:
- dissect_peer_name_table_response_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_HANDLE_TABLE_REQUEST_MESSAGE_TYPE:
+ dissect_enrp_handle_table_request_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_NAME_UPDATE_MESSAGE_TYPE:
- dissect_peer_name_update_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_HANDLE_TABLE_RESPONSE_MESSAGE_TYPE:
+ dissect_enrp_handle_table_response_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_LIST_REQUEST_MESSAGE_TYPE:
- dissect_peer_list_request_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_HANDLE_UPDATE_MESSAGE_TYPE:
+ dissect_enrp_handle_update_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_LIST_RESPONSE_MESSAGE_TYPE:
- dissect_peer_list_response_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_LIST_REQUEST_MESSAGE_TYPE:
+ dissect_enrp_list_request_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_INIT_TAKEOVER_MESSAGE_TYPE:
- dissect_peer_init_takeover_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_LIST_RESPONSE_MESSAGE_TYPE:
+ dissect_enrp_list_response_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_INIT_TAKEOVER_ACK_MESSAGE_TYPE:
- dissect_peer_init_takeover_ack_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_INIT_TAKEOVER_MESSAGE_TYPE:
+ dissect_enrp_init_takeover_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_TAKEOVER_SERVER_MESSAGE_TYPE:
- dissect_peer_init_takeover_server_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_INIT_TAKEOVER_ACK_MESSAGE_TYPE:
+ dissect_enrp_init_takeover_ack_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_OWNERSHIP_CHANGE_MESSAGE_TYPE:
- dissect_peer_ownership_change_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_TAKEOVER_SERVER_MESSAGE_TYPE:
+ dissect_enrp_init_takeover_server_message(message_tvb, enrp_tree, flags_tree);
break;
- case PEER_ERROR_MESSAGE_TYPE:
- dissect_peer_error_message(message_tvb, enrp_tree, flags_tree);
+ case ENRP_ERROR_MESSAGE_TYPE:
+ dissect_enrp_error_message(message_tvb, enrp_tree, flags_tree);
break;
default:
dissect_unknown_message(message_tvb, enrp_tree, flags_tree);
@@ -865,7 +895,8 @@ proto_register_enrp(void)
{ &hf_reserved, { "Reserved", "enrp.server_information_reserved", FT_UINT32, BASE_HEX, NULL, RESERVED_MASK, "", HFILL } },
{ &hf_cookie, { "Cookie", "enrp.cookie", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
{ &hf_pe_identifier, { "PE identifier", "enrp.pe_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
- { &hf_pe_checksum, { "PE checksum", "enrp.pe_checksum", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_pe_checksum, { "PE checksum", "enrp.pe_checksum", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL } },
+ { &hf_pe_checksum_reserved, { "Reserved", "enrp.pe_checksum_reserved", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL } },
{ &hf_sender_servers_id, { "Sender server's ID", "enrp.sender_servers_id", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
{ &hf_receiver_servers_id, { "Receiver server's ID", "enrp.receiver_servers_id", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
{ &hf_target_servers_id, { "Target server's ID", "enrp.target_servers_id", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
@@ -901,4 +932,6 @@ proto_reg_handoff_enrp(void)
enrp_handle = create_dissector_handle(dissect_enrp, proto_enrp);
dissector_add("sctp.ppi", ENRP_PAYLOAD_PROTOCOL_ID, enrp_handle);
+/* The following line will be uncommented AFTER a port number is assinged. */
+/* dissector_add("udp.port", ENRP_UDP_PORT, enrp_handle); */
}