From 77c01f388ed59d3efcbf0ebfa56e021481534f84 Mon Sep 17 00:00:00 2001 From: Klaus Kurzmann Date: Thu, 28 Apr 2011 16:45:12 +0200 Subject: [PATCH] add dissector for gpds resource Signed-off-by: Klaus Kurzmann --- Makefile | 1 + src/isi-gpds.c | 967 +++++++++++++++++++++++++++++++++++++++++++++++ src/isi-gpds.h | 9 + src/packet-isi.c | 2 + 4 files changed, 979 insertions(+) create mode 100644 src/isi-gpds.c create mode 100644 src/isi-gpds.h diff --git a/Makefile b/Makefile index 393b268..a384992 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ OBJECTS:=src/packet-isi.o \ src/isi-call.o \ src/isi-light.o \ src/isi-commgr.o \ + src/isi-gpds.o \ src/isi-selftest.o all: isi.so diff --git a/src/isi-gpds.c b/src/isi-gpds.c new file mode 100644 index 0000000..3bdd771 --- /dev/null +++ b/src/isi-gpds.c @@ -0,0 +1,967 @@ +/* isi-gpds.c + * Dissector for ISI's gpds resource + * Copyright 2011, Klaus Kurzmann + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + + +#include +#include +#include + +#include "packet-isi.h" +#include "isi-gpds.h" + +static const value_string isi_gpds_id[] = { + {0x00, "GPDS_LL_CONFIGURE_REQ"}, + {0x01, "GPDS_LL_CONFIGURE_RESP"}, + {0x02, "GPDS_CONTEXT_ID_CREATE_REQ"}, + {0x03, "GPDS_CONTEXT_ID_CREATE_RESP"}, + {0x04, "GPDS_CONTEXT_ID_CREATE_IND"}, + {0x05, "GPDS_CONTEXT_ID_DELETE_IND"}, + {0x20, "GPDS_LL_BIND_REQ"}, + {0x21, "GPDS_LL_BIND_RESP"}, + {0x06, "GPDS_CONTEXT_CONFIGURE_REQ"}, + {0x07, "GPDS_CONTEXT_CONFIGURE_RESP"}, + {0x2A, "GPDS_CONTEXT_MODIFY_REQ"}, + {0x2B, "GPDS_CONTEXT_MODIFY_RESP"}, + {0x2C, "GPDS_CONTEXT_MODIFY_IND"}, + {0x08, "GPDS_CONTEXT_ACTIVATE_REQ"}, + {0x09, "GPDS_CONTEXT_ACTIVATE_RESP"}, + {0x0A, "GPDS_CONTEXT_ACTIVATE_IND"}, + {0x25, "GPDS_CONTEXT_ACTIVATING_IND"}, + {0x1F, "GPDS_CONTEXT_ACTIVATE_FAIL_IND"}, + {0x0B, "GPDS_CONTEXT_DEACTIVATE_REQ"}, + {0x0C, "GPDS_CONTEXT_DEACTIVATE_RESP"}, + {0x0D, "GPDS_CONTEXT_DEACTIVATE_IND"}, + {0x2F, "GPDS_CONTEXT_DEACTIVATING_IND"}, + {0x0E, "GPDS_CONTEXT_NWI_ACT_REQUEST_IND"}, + {0x0F, "GPDS_CONTEXT_NWI_ACT_REJECT_REQ"}, + {0x10, "GPDS_CONTEXT_NWI_ACT_REJECT_RESP"}, + {0x11, "GPDS_CONFIGURE_REQ"}, + {0x12, "GPDS_CONFIGURE_RESP"}, + {0x13, "GPDS_ATTACH_REQ"}, + {0x14, "GPDS_ATTACH_RESP"}, + {0x15, "GPDS_ATTACH_IND"}, + {0x2D, "GPDS_ATTACH_FAIL_IND"}, + {0x16, "GPDS_DETACH_REQ"}, + {0x17, "GPDS_DETACH_RESP"}, + {0x18, "GPDS_DETACH_IND"}, + {0x19, "GPDS_STATUS_REQ"}, + {0x1A, "GPDS_STATUS_RESP"}, + {0x22, "GPDS_CONTEXT_STATUS_REQ"}, + {0x23, "GPDS_CONTEXT_STATUS_RESP"}, + {0x24, "GPDS_CONTEXT_STATUS_IND"}, + {0x1B, "GPDS_SMS_PDU_SEND_REQ"}, + {0x1C, "GPDS_SMS_PDU_SEND_RESP"}, + {0x1D, "GPDS_SMS_PDU_RECEIVE_IND"}, + {0x1E, "GPDS_TRANSFER_STATUS_IND"}, + {0x30, "GPDS_CONFIGURATION_INFO_REQ"}, + {0x31, "GPDS_CONFIGURATION_INFO_RESP"}, + {0x32, "GPDS_CONFIGURATION_INFO_IND"}, + {0x33, "GPDS_CONTEXT_AUTH_REQ"}, + {0x34, "GPDS_CONTEXT_AUTH_RESP"}, + {0x35, "GPDS_TEST_MODE_REQ"}, + {0x36, "GPDS_TEST_MODE_RESP"}, + {0x37, "GPDS_RADIO_ACTIVITY_IND"}, + {0x38, "GPDS_FORCED_READY_STATE_REQ"}, + {0x39, "GPDS_FORCED_READY_STATE_RESP"}, + {0x3A, "GPDS_CONTEXTS_CLEAR_REQ"}, + {0x3B, "GPDS_CONTEXTS_CLEAR_RESP"}, + {0x3C, "GPDS_MBMS_SERVICE_SELECTION_REQ"}, + {0x3D, "GPDS_MBMS_SERVICE_SELECTION_RESP"}, + {0x3E, "GPDS_MBMS_STATUS_IND"}, + {0x3F, "GPDS_MBMS_CONTEXT_CREATE_REQ"}, + {0x40, "GPDS_MBMS_CONTEXT_CREATE_RESP"}, + {0x41, "GPDS_MBMS_CONTEXT_ACTIVATE_REQ"}, + {0x42, "GPDS_MBMS_CONTEXT_ACTIVATE_RESP"}, + {0x43, "GPDS_MBMS_CONTEXT_DELETE_REQ"}, + {0x44, "GPDS_MBMS_CONTEXT_DELETE_RESP"}, + {0x45, "GPDS_MBMS_CONTEXT_DELETE_IND"}, + {0x46, "GPDS_MBMS_SERVICE_SELECTION_IND"}, + {0x47, "GPDS_MBMS_SERVICE_AVAILABLE_IND"}, + {0x48, "GPDS_TEST_REQ"}, + {0x49, "GPDS_TEST_RESP"}, + {0x50, "GPDS_RESOURCE_CONTROL_IND"}, + {0x51, "GPDS_RESOURCE_CONTROL_REQ"}, + {0x52, "GPDS_RESOURCE_CONTROL_RESP"}, + {0x54, "GPDS_RESOURCE_CONF_REQ"}, + {0x55, "GPDS_RESOURCE_CONF_RESP"}, + {0x53, "GPDS_RESOURCE_CONF_IND"}, + {0x56, "GPDS_PROPERTY_SET_REQ"}, + {0x57, "GPDS_PROPERTY_SET_RESP"}, + {0xEE, "GPDS_RESP"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_subblock_id[] = { + {0x00, "GPDS_COMP_INFO"}, + {0x01, "GPDS_QOS_REQ_INFO"}, + {0x02, "GPDS_QOS_MIN_INFO"}, + {0x03, "GPDS_QOS_NEG_INFO"}, + {0x04, "GPDS_PDP_ADDRESS_INFO"}, + {0x05, "GPDS_APN_INFO"}, + {0x10, "GPDS_FILT_SRC_IPV4_ADDR_INFO"}, + {0x20, "GPDS_FILT_SRC_IPV6_ADDR_INFO"}, + {0x30, "GPDS_FILT_PROTOCOL_INFO"}, + {0x40, "GPDS_FILT_DST_PORT_INFO"}, + {0x41, "GPDS_FILT_DST_PORT_RANGE_INFO"}, + {0x50, "GPDS_FILT_SRC_PORT_INFO"}, + {0x51, "GPDS_FILT_SRC_PORT_RANGE_INFO"}, + {0x60, "GPDS_FILT_SPI_INFO"}, + {0x70, "GPDS_FILT_TOS_INFO"}, + {0x80, "GPDS_FILT_FLOW_LABEL_INFO"}, + {0x0A, "GPDS_TFT_FILTER_INFO"}, + {0x09, "GPDS_TFT_INFO"}, + {0x06, "GPDS_QOS99_REQ_INFO"}, + {0x07, "GPDS_QOS99_MIN_INFO"}, + {0x08, "GPDS_QOS99_NEG_INFO"}, + {0x0D, "GPDS_PDNS_ADDRESS_INFO"}, + {0x0E, "GPDS_SDNS_ADDRESS_INFO"}, + {0x0B, "GPDS_USERNAME_INFO"}, + {0x0C, "GPDS_PASSWORD_INFO"}, + {0x90, "GPDS_DNS_ADDRESS_REQ_INFO"}, + {0x0F, "GPDS_CHALLENGE_INFO"}, + {0xA0, "GPDS_CONDITIONAL_DETACH_INFO"}, + {0x11, "GPDS_RESPONSE_INFO"}, + {0xA1, "GPDS_MBMS_SERVICE_BEARER_STATE"}, + {0xA2, "GPDS_MBMS_MULTICAST_PARAMS"}, + {0xA4, "GPDS_ACTIVATE_PDP_CONTEXT_REQUEST"}, + {0xA5, "GPDS_RESOURCE_CONF"}, + {0xA3, "GPDS_RESOURCE"}, + {0xA6, "GPDS_RESOURCE_CONF_REQUIRED"}, + {0xA7, "GPDS_PIPE_REDIRECTION_INFO"}, + {0xE1, "GPDS_SHARED_APN_INFO"}, + {0xE0, "GPDS_SHARED_COMP_INFO"}, + {0xE2, "GPDS_SHARED_QOS99_REQ_INFO"}, + {0xE3, "GPDS_SHARED_QOS99_MIN_INFO"}, + {0xE4, "GPDS_SHARED_QOS99_NEG_INFO"}, + {0xE6, "GPDS_SHARED_FILT_SRC_IPV4_ADDR_INFO"}, + {0xE8, "GPDS_SHARED_FILT_PROTOCOL_INFO"}, + {0xE9, "GPDS_SHARED_FILT_DST_PORT_INFO"}, + {0xEA, "GPDS_SHARED_FILT_DST_PORT_RANGE_INFO"}, + {0xEB, "GPDS_SHARED_FILT_SRC_PORT_INFO"}, + {0xEC, "GPDS_SHARED_FILT_SRC_PORT_RANGE_INFO"}, + {0xED, "GPDS_SHARED_FILT_SPI_INFO"}, + {0xEE, "GPDS_SHARED_FILT_TOS_INFO"}, + {0xEF, "GPDS_SHARED_FILT_FLOW_LABEL_INFO"}, + {0xF6, "GPDS_SHARED_TFT_PACKET_FILTER_INFO"}, + {0xF2, "GPDS_SHARED_TFT_PARAMETER_IP_FLOW_INFO"}, + {0xF1, "GPDS_SHARED_TFT_PARAMETER_AUTH_TOKEN_INFO"}, + {0xE5, "GPDS_SHARED_TFT_INFO"}, + {0xF3, "GPDS_SHARED_PCSCF_ADDRESS_REQ_INFO"}, + {0xF4, "GPDS_SHARED_PCSCF_ADDRESS_INFO"}, + {0xF5, "GPDS_SHARED_POLICY_CONTROL_REJ_CODE_INFO"}, + {0xF7, "GPDS_SHARED_IM_CN_SIGNALING_FLAG_INFO"}, + {0xF8, "GPDS_SHARED_REL5_QOS_INFO"}, + {0xF9, "GPDS_SHARED_RADIO_ACTIVITY_REQ_INFO"}, + {0xFB, "GPDS_SHARED_MBMS_SERVICE_LIST_INFO"}, + {0xFC, "GPDS_SHARED_INITIAL_DL_DCH_RATE"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_cid[] = { + {0xFE, "GPDS_CID_ALL"}, + {0xFF, "GPDS_CID_VOID"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_ppp_mode[] = { + {0x00, "GPDS_LL_FRAMED_PPP"}, + {0x01, "GPDS_LL_NONFRAMED_PPP"}, + {0x02, "GPDS_LL_PLAIN"}, + {0x00, NULL} +}; + + +static const value_string isi_gpds_status[] = { + {0x00, "GPDS_ERROR"}, + {0x01, "GPDS_OK"}, + {0x02, "GPDS_FAIL"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_pdp_type[] = { + {0x01, "GPDS_PDP_TYPE_PPP"}, + {0x21, "GPDS_PDP_TYPE_IPV4"}, + {0x57, "GPDS_PDP_TYPE_IPV6"}, + {0xFF, "GPDS_PDP_TYPE_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_context_type[] = { + {0x00, "GPDS_CONT_TYPE_NORMAL"}, + {0x01, "GPDS_CONT_TYPE_NWI"}, + {0x02, "GPDS_CONT_TYPE_SEC"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_cause[] = { + {0x00, "GPDS_CAUSE_UNKNOWN"}, + {0x02, "GPDS_CAUSE_IMSI"}, + {0x03, "GPDS_CAUSE_MS_ILLEGAL"}, + {0x06, "GPDS_CAUSE_ME_ILLEGAL"}, + {0x07, "GPDS_CAUSE_GPRS_NOT_ALLOWED"}, + {0x08, "GPDS_NOT_ALLOWED"}, + {0x09, "GPDS_CAUSE_MS_IDENTITY"}, + {0x0A, "GPDS_CAUSE_DETACH"}, + {0x0B, "GPDS_PLMN_NOT_ALLOWED"}, + {0x0C, "GPDS_LA_NOT_ALLOWED"}, + {0x0D, "GPDS_ROAMING_NOT_ALLOWED"}, + {0x0E, "GPDS_CAUSE_GPRS_NOT_ALLOWED_IN_PLMN"}, + {0x10, "GPDS_CAUSE_MSC_NOT_REACH"}, + {0x11, "GPDS_CAUSE_PLMN_FAIL"}, + {0x16, "GPDS_CAUSE_NETWORK_CONGESTION"}, + {0x18, "GPDS_CAUSE_MBMS_BEARER_CAPABILITY_INSUFFICIENT"}, + {0x19, "GPDS_CAUSE_LLC_SNDCP_FAILURE"}, + {0x1A, "GPDS_CAUSE_RESOURCE_INSUFF"}, + {0x1B, "GPDS_CAUSE_APN"}, + {0x1C, "GPDS_CAUSE_PDP_UNKNOWN"}, + {0x1D, "GPDS_CAUSE_AUTHENTICATION"}, + {0x1E, "GPDS_CAUSE_ACT_REJECT_GGSN"}, + {0x1F, "GPDS_CAUSE_ACT_REJECT"}, + {0x20, "GPDS_CAUSE_SERV_OPT_NOT_SUPPORTED"}, + {0x21, "GPDS_CAUSE_SERV_OPT_NOT_SUBSCRIBED"}, + {0x22, "GPDS_CAUSE_SERV_OPT_OUT_OF_ORDER"}, + {0x23, "GPDS_CAUSE_NSAPI_ALREADY_USED"}, + {0x24, "GPDS_CAUSE_DEACT_REGULAR"}, + {0x25, "GPDS_CAUSE_QOS"}, + {0x26, "GPDS_CAUSE_NETWORK_FAIL"}, + {0x27, "GPDS_CAUSE_REACTIVATION_REQ"}, + {0x28, "GPDS_CAUSE_FEAT_NOT_SUPPORTED"}, + {0x29, "GPDS_CAUSE_TFT_SEMANTIC_ERROR"}, + {0x2A, "GPDS_CAUSE_TFT_SYNTAX_ERROR"}, + {0x2B, "GPDS_CAUSE_CONTEXT_UNKNOWN"}, + {0x2C, "GPDS_CAUSE_FILTER_SEMANTIC_ERROR"}, + {0x2D, "GPDS_CAUSE_FILTER_SYNTAX_ERROR"}, + {0x2E, "GPDS_CAUSE_CONT_WITHOUT_TFT"}, + {0x2F, "GPDS_CAUSE_MULTICAST_MEMBERSHIP_TIMEOUT"}, + {0x60, "GPDS_CAUSE_INVALID_MANDATORY_INFO"}, + {0x61, "GPDS_CAUSE_MSG_TYPE_NON_EXISTENTOR_NOT_IMPLTD"}, + {0x62, "GPDS_CAUSE_MSG_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE"}, + {0x63, "GPDS_CAUSE_IE_NON_EXISTENT_OR_NOT_IMPLEMENTED"}, + {0x64, "GPDS_CAUSE_CONDITIONAL_IE_ERROR"}, + {0x65, "GPDS_CUASEMSG_NOT_COMPATIBLE_WITH_PROTOCOL_STATE"}, + {0x6F, "GPDS_CAUSE_UNSPECIFIED"}, + {0x70, "GPDS_CAUSE_APN_INCOMPATIBLE_WITH_CURR_CTXT"}, + {0xA0, "GPDS_CAUSE_FDN"}, + {0xA1, "GPDS_CAUSE_USER_ABORT"}, + {0xA2, "GPDS_CAUSE_CS_INACTIVE"}, + {0xA3, "GPDS_CAUSE_CSD_OVERRIDE"}, + {0xA4, "GPDS_CAUSE_APN_CONTROL"}, + {0xA5, "GPDS_CAUSE_CALL_CONTROL"}, + {0xA6, "GPDS_CAUSE_TEMPERATURE_LIMIT"}, + {0xC8, "GPDS_CAUSE_RETRY_COUNTER_EXPIRED"}, + {0xC9, "GPDS_CAUSE_NO_CONNECTION"}, + {0xF5, "GPDS_CAUSE_DETACHED"}, + {0xF7, "GPDS_CAUSE_NO_SERVICE_POWER_SAVE"}, + {0xF9, "GPDS_CAUSE_SIM_REMOVED"}, + {0xFA, "GPDS_CAUSE_POWER_OFF"}, + {0xFB, "GPDS_CAUSE_LAI_FORBIDDEN_NATIONAL_ROAM_LIST"}, + {0xFC, "GPDS_CAUSE_LAI_FORBIDDEN_REG_PROVISION_LIST"}, + {0xFD, "GPDS_CAUSE_ACCESS_BARRED"}, + {0xFE, "GPDS_CAUSE_FATAL_FAILURE"}, + {0xFF, "GPDS_CAUSE_AUT_FAILURE"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_attach_type[] = { + {0x01, "GPDS_ATTACH_TYPE_GPRS"}, + {0x03, "GPDS_ATTACH_TYPE_COMBINED"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_attach_status[] = { + {0x00, "GPDS_DETACHED"}, + {0x01, "GPDS_ATTACHED"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_transfer_status[] = { + {0x00, "GPDS_TRANSFER_NOT_AVAIL"}, + {0x01, "GPDS_TRANSFER_AVAIL"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_transfer_cause[] = { + {0x02, "GPDS_TRANSFER_CAUSE_ATTACHED"}, + {0x03, "GPDS_TRANSFER_CAUSE_DETACHED"}, + {0x04, "GPDS_TRANSFER_CAUSE_RESUMED"}, + {0x05, "GPDS_TRANSFER_CAUSE_SUSPENDED_NO_COVERAGE"}, + {0x07, "GPDS_TRANSFER_CAUSE_SUSPENDED_CALL_SMS"}, + {0x08, "GPDS_TRANSFER_CAUSE_SUSPENDED_CALL"}, + {0x09, "GPDS_TRANSFER_CAUSE_SUSPENDED_RAU"}, + {0x0A, "GPDS_TRANSFER_CAUSE_SUSPENDED_LU"}, + {0x0B, "GPDS_TRANSFER_CAUSE_DSAC_RESTRICTION"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_client_type[] = { + {0x01, "GPDS_CONTEXT_CLIENT_SOCKET"}, + {0x02, "GPDS_CONTEXT_CLIENT_DIAL_UP"}, + {0x00, "GPDS_CONTEXT_CLIENT_UNKNOWN"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_attach_mode[] = { + {0x00, "GPDS_ATTACH_MODE_MANUAL"}, + {0x01, "GPDS_ATTACH_MODE_AUTOMATIC"}, + {0xFF, "GPDS_ATTACH_MODE_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_mt_act_mode[] = { + {0x00, "GPDS_MT_ACT_MODE_REJECT"}, + {0x01, "GPDS_MT_ACT_MODE_ACCEPT"}, + {0xFF, "GPDS_MT_ACT_MODE_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_aol_context[] = { + {0x00, "GPDS_AOL_CTX_NOT_ACTIVE"}, + {0x01, "GPDS_AOL_CTX_HPLMN_ACTIVE"}, + {0x02, "GPDS_AOL_CTX_VPLMN_ACTIVE"}, + {0x03, "GPDS_AOL_CTX_ACTIVE"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_classc_mode[] = { + {0x00, "GPDS_CLASSC_MODE_GPRS"}, + {0x01, "GPDS_CLASSC_MODE_GSM"}, + {0xFF, "GPDS_CLASSC_MODE_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_precedence[] = { + {0x00, "GPDS_QOS_PREC_0"}, + {0x01, "GPDS_QOS_PREC_1"}, + {0x02, "GPDS_QOS_PREC_2"}, + {0x03, "GPDS_QOS_PREC_3"}, + {0xFF, "GPDS_QOS_PREC_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_delay[] = { + {0x00, "GPDS_QOS_DELC_0"}, + {0x01, "GPDS_QOS_DELC_1"}, + {0x02, "GPDS_QOS_DELC_2"}, + {0x03, "GPDS_QOS_DELC_3"}, + {0x04, "GPDS_QOS_DELC_4"}, + {0xFF, "GPDS_QOS_DELC_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_reliability[] = { + {0x00, "GPDS_QOS_RELC_0"}, + {0x01, "GPDS_QOS_RELC_1"}, + {0x02, "GPDS_QOS_RELC_2"}, + {0x03, "GPDS_QOS_RELC_3"}, + {0x04, "GPDS_QOS_RELC_4"}, + {0x05, "GPDS_QOS_RELC_5"}, + {0xFF, "GPDS_QOS_RELC_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_peak_throughput[] = { + {0x00, "GPDS_QOS_PETC_0"}, + {0x01, "GPDS_QOS_PETC_1"}, + {0x02, "GPDS_QOS_PETC_2"}, + {0x03, "GPDS_QOS_PETC_3"}, + {0x04, "GPDS_QOS_PETC_4"}, + {0x05, "GPDS_QOS_PETC_5"}, + {0x06, "GPDS_QOS_PETC_6"}, + {0x07, "GPDS_QOS_PETC_7"}, + {0x08, "GPDS_QOS_PETC_8"}, + {0x09, "GPDS_QOS_PETC_9"}, + {0xFF, "GPDS_QOS_PETC_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_mean_throughput[] = { + {0x00, "GPDS_QOS_METC_0"}, + {0x01, "GPDS_QOS_METC_1"}, + {0x02, "GPDS_QOS_METC_2"}, + {0x03, "GPDS_QOS_METC_3"}, + {0x04, "GPDS_QOS_METC_4"}, + {0x05, "GPDS_QOS_METC_5"}, + {0x06, "GPDS_QOS_METC_6"}, + {0x07, "GPDS_QOS_METC_7"}, + {0x08, "GPDS_QOS_METC_8"}, + {0x09, "GPDS_QOS_METC_9"}, + {0x0A, "GPDS_QOS_METC_10"}, + {0x0B, "GPDS_QOS_METC_11"}, + {0x0C, "GPDS_QOS_METC_12"}, + {0x0D, "GPDS_QOS_METC_13"}, + {0x0E, "GPDS_QOS_METC_14"}, + {0x0F, "GPDS_QOS_METC_15"}, + {0x10, "GPDS_QOS_METC_16"}, + {0x11, "GPDS_QOS_METC_17"}, + {0x12, "GPDS_QOS_METC_18"}, + {0x1F, "GPDS_QOS_METC_31"}, + {0xFF, "GPDS_QOS_METC_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_traffic_class[] = { + {0x00, "GPDS_QOS99_TRAC_SUBSCRIBED"}, + {0x01, "GPDS_QOS99_TRAC_CONVERSATIONAL"}, + {0x02, "GPDS_QOS99_TRAC_STREAMING"}, + {0x03, "GPDS_QOS99_TRAC_INTERACTIVE"}, + {0x04, "GPDS_QOS99_TRAC_BACKGROUND"}, + {0xFF, "GPDS_QOS99_TRAC_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_delivery_order[] = { + {0x00, "GPDS_QOS99_DELO_SUBSCRIBED"}, + {0x01, "GPDS_QOS99_DELO_YES"}, + {0x02, "GPDS_QOS99_DELO_NO"}, + {0xFF, "GPDS_QOS99_DELO_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_delivery_of_erroneous_sdus[] = { + {0x00, "GPDS_QOS99_DOES_SUBSCRIBED"}, + {0x01, "GPDS_QOS99_DOES_NO_DETECT"}, + {0x02, "GPDS_QOS99_DOES_YES"}, + {0x03, "GPDS_QOS99_DOES_NO"}, + {0xFF, "GPDS_QOS99_DOES_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_residual_bers[] = { + {0x00, "GPDS_QOS99_RBER_SUBSCRIBED"}, + {0x52, "GPDS_QOS99_RBER_1"}, + {0x12, "GPDS_QOS99_RBER_2"}, + {0x53, "GPDS_QOS99_RBER_3"}, + {0x43, "GPDS_QOS99_RBER_4"}, + {0x13, "GPDS_QOS99_RBER_5"}, + {0x14, "GPDS_QOS99_RBER_6"}, + {0x15, "GPDS_QOS99_RBER_7"}, + {0x16, "GPDS_QOS99_RBER_8"}, + {0x68, "GPDS_QOS99_RBER_9"}, + {0xFF, "GPDS_QOS99_RBER_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_error_ratio[] = { + {0x00, "GPDS_QOS99_SDER_SUBSCRIBED"}, + {0x12, "GPDS_QOS99_SDER_1"}, + {0x73, "GPDS_QOS99_SDER_2"}, + {0x13, "GPDS_QOS99_SDER_3"}, + {0x14, "GPDS_QOS99_SDER_4"}, + {0x15, "GPDS_QOS99_SDER_5"}, + {0x16, "GPDS_QOS99_SDER_6"}, + {0x11, "GPDS_QOS99_SDER_7"}, + {0xFF, "GPDS_QOS99_SDER_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_priority[] = { + {0x00, "GPDS_QOS99_TRHP_SUBSCRIBED"}, + {0x01, "GPDS_QOS99_TRHP_1"}, + {0x02, "GPDS_QOS99_TRHP_2"}, + {0x03, "GPDS_QOS99_TRHP_3"}, + {0xFF, "GPDS_QOS99_TRHP_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_rel5_source_desc[] = { + {0x00, "GPDS_SOURCE_UNKNOWN"}, + {0x01, "GPDS_SOURCE_SPEECH"}, + {0xFF, "GPDS_SOURCE_DEFAULT"}, + {0x00, NULL} +}; + +static const value_string isi_gpds_rel5_sgn_ind_flag[] = { + {0x00, "GPDS_QOS_NOT_OPT_SGN"}, + {0x01, "GPDS_QOS_OPT_SGN"}, + {0xFF, "GPDS_QOS_OPT_DEFAULT"}, + {0x00, NULL} +}; + + + + + +static dissector_handle_t isi_gpds_handle; +static void dissect_isi_gpds(tvbuff_t *tvb, packet_info *pinfo, proto_item *tree); + +static guint32 hf_isi_gpds_cmd = -1; +static guint32 hf_isi_gpds_subblock_type = -1; +static guint32 hf_isi_gpds_cid = -1; +static guint32 hf_isi_gpds_primary_cid = -1; +static guint32 hf_isi_gpds_pipe_handle = -1; +static guint32 hf_isi_gpds_ppp_mode = -1; +static guint32 hf_isi_gpds_status = -1; +static guint32 hf_isi_gpds_pdp_type = -1; +static guint32 hf_isi_gpds_context_type = -1; +static guint32 hf_isi_gpds_cause = -1; +static guint32 hf_isi_gpds_attach_type = -1; +static guint32 hf_isi_gpds_context_count = -1; +static guint32 hf_isi_gpds_tx_byte_count = -1; +static guint32 hf_isi_gpds_rx_byte_count = -1; +static guint32 hf_isi_gpds_transfer_status = -1; +static guint32 hf_isi_gpds_transfer_cause = -1; +static guint32 hf_isi_gpds_attach_status = -1; +static guint32 hf_isi_gpds_client_type = -1; +static guint32 hf_isi_gpds_mt_act_mode = -1; +static guint32 hf_isi_gpds_aol_context = -1; +static guint32 hf_isi_gpds_classc_mode = -1; +static guint32 hf_isi_gpds_attach_mode = -1; +static guint32 hf_isi_gpds_apn = -1; +static guint32 hf_isi_gpds_pdp_address = -1; +static guint32 hf_isi_gpds_reliability = -1; +static guint32 hf_isi_gpds_delay = -1; +static guint32 hf_isi_gpds_precedence = -1; +static guint32 hf_isi_gpds_peak_throughput = -1; +static guint32 hf_isi_gpds_mean_throughput = -1; +static guint32 hf_isi_gpds_traffic_class = -1; +static guint32 hf_isi_gpds_delivery_order = -1; +static guint32 hf_isi_gpds_delivery_of_erroneous_sdus = -1; +static guint32 hf_isi_gpds_residual_ber = -1; +static guint32 hf_isi_gpds_error_ratio = -1; +static guint32 hf_isi_gpds_transfer_delay = -1; +static guint32 hf_isi_gpds_max_sdu_size = -1; +static guint32 hf_isi_gpds_max_bitrate_uplink = -1; +static guint32 hf_isi_gpds_max_bitrate_downlink = -1; +static guint32 hf_isi_gpds_gua_bitrate_uplink = -1; +static guint32 hf_isi_gpds_gua_bitrate_downlink = -1; +static guint32 hf_isi_gpds_priority = -1; +static guint32 hf_isi_gpds_rel5_source_desc = -1; +static guint32 hf_isi_gpds_rel5_sgn_ind_flag = -1; +static guint32 hf_isi_gpds_pdns_address = -1; +static guint32 hf_isi_gpds_sdns_address = -1; + + + +void proto_reg_handoff_isi_gpds(void) { + static gboolean initialized=FALSE; + + if (!initialized) { + isi_gpds_handle = create_dissector_handle(dissect_isi_gpds, proto_isi); + dissector_add("isi.resource", 0x31, isi_gpds_handle); + } +} + +void proto_register_isi_gpds(void) { + static hf_register_info hf[] = { + { &hf_isi_gpds_cmd, + { "Command", "isi.gpds.cmd", FT_UINT8, BASE_HEX, isi_gpds_id, 0x0, "Command", HFILL }}, + { &hf_isi_gpds_subblock_type, + { "Subblock-Id", "isi.gpds.subblock_id", FT_UINT8, BASE_HEX, isi_gpds_subblock_id, 0x0, "Subblock-Id", HFILL }}, + { &hf_isi_gpds_cid, + { "CID", "isi.gpds.cid", FT_UINT8, BASE_HEX, isi_gpds_cid, 0x0, "CID", HFILL }}, + { &hf_isi_gpds_primary_cid, + { "Primary CID", "isi.gpds.primary_cid", FT_UINT8, BASE_HEX, isi_gpds_cid, 0x0, "Primary CID", HFILL }}, + { &hf_isi_gpds_pipe_handle, + { "Pipe-Handle", "isi.gpds.pipe_handle", FT_UINT8, BASE_HEX, NULL, 0x0, "Pipe-Handle", HFILL }}, + { &hf_isi_gpds_ppp_mode, + { "PPP Mode", "isi.gpds.ppp_mode", FT_UINT8, BASE_HEX, isi_gpds_ppp_mode, 0x0, "PPP Mode", HFILL }}, + { &hf_isi_gpds_status, + { "Status", "isi.gpds.status", FT_UINT8, BASE_HEX, isi_gpds_status, 0x0, "Status", HFILL }}, + { &hf_isi_gpds_pdp_type, + { "PDP Type", "isi.gpds.pdp_type", FT_UINT8, BASE_HEX, isi_gpds_pdp_type, 0x0, "PDP Type", HFILL }}, + { &hf_isi_gpds_context_type, + { "Context Type", "isi.gpds.context_type", FT_UINT8, BASE_HEX, isi_gpds_context_type, 0x0, "Context Type", HFILL }}, + { &hf_isi_gpds_cause, + { "Cause", "isi.gpds.cause", FT_UINT8, BASE_HEX, isi_gpds_cause, 0x0, "Cause", HFILL }}, + { &hf_isi_gpds_attach_type, + { "Attach Type", "isi.gpds.attach_type", FT_UINT8, BASE_HEX, isi_gpds_attach_type, 0x0, "Attach Type", HFILL }}, + { &hf_isi_gpds_attach_status, + { "Attach Status", "isi.gpds.attach_status", FT_UINT8, BASE_HEX, isi_gpds_attach_status, 0x0, "Attach Status", HFILL }}, + { &hf_isi_gpds_context_count, + { "Context Count", "isi.gpds.context_count", FT_UINT8, BASE_DEC, NULL, 0x0, "Context Count", HFILL }}, + { &hf_isi_gpds_tx_byte_count, + { "TX Bytes", "isi.gpds.tx_bytes", FT_UINT32, BASE_DEC, NULL, 0x0, "TX Bytes", HFILL }}, + { &hf_isi_gpds_rx_byte_count, + { "RX Bytes", "isi.gpds.rx_bytes", FT_UINT32, BASE_DEC, NULL, 0x0, "RX Bytes", HFILL }}, + { &hf_isi_gpds_transfer_status, + { "Transfer Status", "isi.gpds.transfer_status", FT_UINT8, BASE_HEX, isi_gpds_transfer_status, 0x0, "Transfer Status", HFILL }}, + { &hf_isi_gpds_transfer_cause, + { "Transfer Cause", "isi.gpds.transfer_cause", FT_UINT8, BASE_HEX, isi_gpds_transfer_cause, 0x0, "Transfer Cause", HFILL }}, + { &hf_isi_gpds_client_type, + { "Client Type", "isi.gpds.client_type", FT_UINT8, BASE_HEX, isi_gpds_client_type, 0x0, "Client Type", HFILL }}, + { &hf_isi_gpds_mt_act_mode, + { "MT Act Mode", "isi.gpds.mt_act_mode", FT_UINT8, BASE_HEX, isi_gpds_mt_act_mode, 0x0, "MT Act Mode", HFILL }}, + { &hf_isi_gpds_aol_context, + { "AOL Context", "isi.gpds.aol_context", FT_UINT8, BASE_HEX, isi_gpds_aol_context, 0x0, "AOL Context", HFILL }}, + { &hf_isi_gpds_classc_mode, + { "ClassC Mode", "isi.gpds.classc_mode", FT_UINT8, BASE_HEX, isi_gpds_classc_mode, 0x0, "ClassC Mode", HFILL }}, + { &hf_isi_gpds_attach_mode, + { "Attach Mode", "isi.gpds.attach_mode", FT_UINT8, BASE_HEX, isi_gpds_attach_mode, 0x0, "Attach Mode", HFILL }}, + { &hf_isi_gpds_apn, + { "APN", "isi.gpds.apn", FT_STRING, BASE_NONE, NULL, 0x0, "APN", HFILL }}, + { &hf_isi_gpds_pdp_address, + { "PDP Address", "isi.gpds.pdp_address", FT_STRING, BASE_NONE, NULL, 0x0, "PDP Address", HFILL }}, + { &hf_isi_gpds_precedence, + { "Precedence", "isi.gpds.precedence", FT_UINT8, BASE_HEX, isi_gpds_precedence, 0x0, "Precedence", HFILL }}, + { &hf_isi_gpds_delay, + { "Delay", "isi.gpds.delay", FT_UINT8, BASE_HEX, isi_gpds_delay, 0x0, "Delay", HFILL }}, + { &hf_isi_gpds_reliability, + { "Relilability", "isi.gpds.reliability", FT_UINT8, BASE_HEX, isi_gpds_reliability, 0x0, "Reliability", HFILL }}, + { &hf_isi_gpds_peak_throughput, + { "Peak Throughput", "isi.gpds.peak_througput", FT_UINT8, BASE_HEX, isi_gpds_peak_throughput, 0x0, "Peak Throughput", HFILL }}, + { &hf_isi_gpds_mean_throughput, + { "Mean Throughput", "isi.gpds.mean_througput", FT_UINT8, BASE_HEX, isi_gpds_mean_throughput, 0x0, "Mean Througput", HFILL }}, + { &hf_isi_gpds_traffic_class, + { "Traffic Class", "isi.gpds.traffic_class", FT_UINT8, BASE_HEX, isi_gpds_traffic_class, 0x0, "Traffic Class", HFILL }}, + { &hf_isi_gpds_delivery_order, + { "Delivery Order", "isi.gpds.delivery_order", FT_UINT8, BASE_HEX, isi_gpds_delivery_order, 0x0, "Delivery Order", HFILL }}, + { &hf_isi_gpds_delivery_of_erroneous_sdus, + { "Delivery of erroneous SDUs", "isi.gpds.deliver_of_erroneous_sdus", FT_UINT8, BASE_HEX, isi_gpds_delivery_of_erroneous_sdus, 0x0, "Delivery of erroneous SDUs", HFILL }}, + { &hf_isi_gpds_residual_ber, + { "Residual BER", "isi.gpds.residual_ber", FT_UINT8, BASE_HEX, isi_gpds_residual_bers, 0x0, "Residual BER", HFILL }}, + { &hf_isi_gpds_error_ratio, + { "Error Ratio", "isi.gpds.error_ratio", FT_UINT8, BASE_HEX, isi_gpds_error_ratio, 0x0, "Error Ratio", HFILL }}, + { &hf_isi_gpds_transfer_delay, + { "Transfer Delay", "isi.gpds.transfer_delay", FT_UINT16, BASE_DEC, NULL, 0x0, "Transfer Delay", HFILL }}, + { &hf_isi_gpds_max_sdu_size, + { "Max SDU size", "isi.gpds.max_sdu", FT_UINT16, BASE_DEC, NULL, 0x0, "Max SDU size", HFILL }}, + { &hf_isi_gpds_max_bitrate_uplink, + { "Max Bitrate Uplink", "isi.gpds.max_bitrate_uplink", FT_UINT16, BASE_DEC, NULL, 0x0, "Max Bitrate Uplink", HFILL }}, + { &hf_isi_gpds_max_bitrate_downlink, + { "Max Bitrate Downlink", "isi.gpds.max_bitrate_downlink", FT_UINT16, BASE_DEC, NULL, 0x0, "Max Bitrate Downlink", HFILL }}, + { &hf_isi_gpds_gua_bitrate_uplink, + { "GUA Bitrate Uplink", "isi.gpds.gua_bitrate_uplink", FT_UINT16, BASE_DEC, NULL, 0x0, "GUA Bitrate Uplink", HFILL }}, + { &hf_isi_gpds_gua_bitrate_downlink, + { "GUA Bitrate Downlink", "isi.gpds.gua_bitrate_downlink", FT_UINT16, BASE_DEC, NULL, 0x0, "GUA Bitrate Downlink", HFILL }}, + { &hf_isi_gpds_priority, + { "Priority", "isi.gpds.priority", FT_UINT8, BASE_HEX, isi_gpds_priority, 0x0, "Priority", HFILL }}, + { &hf_isi_gpds_rel5_source_desc, + { "Source Desc", "isi.gpds.rel5_source_desc", FT_UINT8, BASE_HEX, isi_gpds_rel5_source_desc, 0x0, "Source Desc", HFILL }}, + { &hf_isi_gpds_rel5_sgn_ind_flag, + { "Sgn Ind Flag", "isi.gpds.rel5_sgn_ind_flag", FT_UINT8, BASE_HEX, isi_gpds_rel5_sgn_ind_flag, 0x0, "Sgn Ind Flag", HFILL }}, + { &hf_isi_gpds_pdns_address, + { "PDNS Address", "isi.gpds.pdns_address", FT_STRING, BASE_NONE, NULL, 0x0, "PDNS Adress", HFILL }}, + { &hf_isi_gpds_sdns_address, + { "SDNS Address", "isi.gpds.sdns_address", FT_STRING, BASE_NONE, NULL, 0x0, "SDNS Adress", HFILL }}, + }; + + proto_register_field_array(proto_isi, hf, array_length(hf)); + register_dissector("isi.gpds", dissect_isi_gpds, proto_isi); +} + + +static void _sub_gpds_qos99_neg_info(tvbuff_t *tvb, proto_tree *tree) { + proto_tree_add_item(tree, hf_isi_gpds_traffic_class, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_delivery_order, tvb, 3, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_delivery_of_erroneous_sdus, tvb, 4, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_residual_ber, tvb, 5, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_error_ratio, tvb, 6, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_priority, tvb, 7, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_transfer_delay, tvb, 8, 2, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_max_sdu_size, tvb, 10, 2, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_max_bitrate_uplink, tvb, 12, 2, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_max_bitrate_downlink, tvb, 14, 2, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_gua_bitrate_uplink, tvb, 16, 2, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_gua_bitrate_downlink, tvb, 18, 2, FALSE); +} + +static void _sub_gpds_qos_neg_info(tvbuff_t *tvb, proto_tree *tree) { + proto_tree_add_item(tree, hf_isi_gpds_precedence, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_delay, tvb, 3, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_reliability, tvb, 4, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_peak_throughput, tvb, 5, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_mean_throughput, tvb, 6, 1, FALSE); +} + +static void _sub_gpds_string(guint32 hf, guint8 offset, tvbuff_t *tvb, proto_tree *tree) { + guint8 l = tvb_get_guint8(tvb, offset); + proto_tree_add_string(tree, hf, tvb, offset+1, l, tvb_memdup(tvb, offset+1, l)); +} + +static void _sub_gpds_dns_address_req_info(tvbuff_t *tvb, proto_tree *tree) { + /* seems to be empty */ +} + +static void _sub_gpds_shared_rel5_qos_info(tvbuff_t *tvb, proto_tree *tree) { + proto_tree_add_item(tree, hf_isi_gpds_rel5_source_desc, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_rel5_sgn_ind_flag, tvb, 3, 1, FALSE); +} + + +static void dissect_isi_gpds_subblock(guint8 sptype, tvbuff_t *tvb, packet_info *pinfo, proto_item *item, proto_tree *tree) { + switch(sptype) { + case 0x03: _sub_gpds_qos_neg_info(tvb, tree); break; /* GPDS_QOS_NEG_INFO */ + case 0x04: _sub_gpds_string(hf_isi_gpds_pdp_address, 3, tvb, tree); break; /* GPDS_PDP_ADDRESS_INFO */ + case 0x05: _sub_gpds_string(hf_isi_gpds_apn, 2, tvb, tree); break; /* GPDS_APN_INFO */ + case 0x08: _sub_gpds_qos99_neg_info(tvb, tree); break; /* GPDS_QOS99_NEG_INFO */ + case 0x0D: _sub_gpds_string(hf_isi_gpds_pdns_address, 3, tvb, tree); break; /* GPDS_PDNS_ADDRESS_INFO */ + case 0x0E: _sub_gpds_string(hf_isi_gpds_sdns_address, 3, tvb, tree); break; /* GPDS_SDNS_ADDRESS_INFO */ + case 0x90: _sub_gpds_dns_address_req_info(tvb, tree); break; /* GPDS_DNS_ADDRESS_REQ_INFO */ + case 0xE4: _sub_gpds_qos99_neg_info(tvb, tree); break; /* GPDS_SHARED_QOS99_NEG_INFO */ + case 0xF8: _sub_gpds_shared_rel5_qos_info(tvb, tree); break; /* GPDS_SHARED_REL5_QOS_INFO */ + case 0x00: /* GPDS_COMP_INFO */ + case 0x01: /* GPDS_QOS_REQ_INFO */ + case 0x02: /* GPDS_QOS_MIN_INFO */ + case 0x10: /* GPDS_FILT_SRC_IPV4_ADDR_INFO */ + case 0x20: /* GPDS_FILT_SRC_IPV6_ADDR_INFO */ + case 0x30: /* GPDS_FILT_PROTOCOL_INFO */ + case 0x40: /* GPDS_FILT_DST_PORT_INFO */ + case 0x41: /* GPDS_FILT_DST_PORT_RANGE_INFO */ + case 0x50: /* GPDS_FILT_SRC_PORT_INFO */ + case 0x51: /* GPDS_FILT_SRC_PORT_RANGE_INFO */ + case 0x60: /* GPDS_FILT_SPI_INFO */ + case 0x70: /* GPDS_FILT_TOS_INFO */ + case 0x80: /* GPDS_FILT_FLOW_LABEL_INFO */ + case 0x0A: /* GPDS_TFT_FILTER_INFO */ + case 0x09: /* GPDS_TFT_INFO */ + case 0x06: /* GPDS_QOS99_REQ_INFO */ + case 0x07: /* GPDS_QOS99_MIN_INFO */ + case 0x0B: /* GPDS_USERNAME_INFO */ + case 0x0C: /* GPDS_PASSWORD_INFO */ + case 0x0F: /* GPDS_CHALLENGE_INFO */ + case 0xA0: /* GPDS_CONDITIONAL_DETACH_INFO */ + case 0x11: /* GPDS_RESPONSE_INFO */ + case 0xA1: /* GPDS_MBMS_SERVICE_BEARER_STATE */ + case 0xA2: /* GPDS_MBMS_MULTICAST_PARAMS */ + case 0xA4: /* GPDS_ACTIVATE_PDP_CONTEXT_REQUEST */ + case 0xA5: /* GPDS_RESOURCE_CONF */ + case 0xA3: /* GPDS_RESOURCE */ + case 0xA6: /* GPDS_RESOURCE_CONF_REQUIRED */ + case 0xA7: /* GPDS_PIPE_REDIRECTION_INFO */ + case 0xE1: /* GPDS_SHARED_APN_INFO */ + case 0xE0: /* GPDS_SHARED_COMP_INFO */ + case 0xE2: /* GPDS_SHARED_QOS99_REQ_INFO */ + case 0xE3: /* GPDS_SHARED_QOS99_MIN_INFO */ + case 0xE6: /* GPDS_SHARED_FILT_SRC_IPV4_ADDR_INFO */ + case 0xE8: /* GPDS_SHARED_FILT_PROTOCOL_INFO */ + case 0xE9: /* GPDS_SHARED_FILT_DST_PORT_INFO */ + case 0xEA: /* GPDS_SHARED_FILT_DST_PORT_RANGE_INFO */ + case 0xEB: /* GPDS_SHARED_FILT_SRC_PORT_INFO */ + case 0xEC: /* GPDS_SHARED_FILT_SRC_PORT_RANGE_INFO */ + case 0xED: /* GPDS_SHARED_FILT_SPI_INFO */ + case 0xEE: /* GPDS_SHARED_FILT_TOS_INFO */ + case 0xEF: /* GPDS_SHARED_FILT_FLOW_LABEL_INFO */ + case 0xF6: /* GPDS_SHARED_TFT_PACKET_FILTER_INFO */ + case 0xF2: /* GPDS_SHARED_TFT_PARAMETER_IP_FLOW_INFO */ + case 0xF1: /* GPDS_SHARED_TFT_PARAMETER_AUTH_TOKEN_INFO */ + case 0xE5: /* GPDS_SHARED_TFT_INFO */ + case 0xF3: /* GPDS_SHARED_PCSCF_ADDRESS_REQ_INFO */ + case 0xF4: /* GPDS_SHARED_PCSCF_ADDRESS_INFO */ + case 0xF5: /* GPDS_SHARED_POLICY_CONTROL_REJ_CODE_INFO */ + case 0xF7: /* GPDS_SHARED_IM_CN_SIGNALING_FLAG_INFO */ + case 0xF9: /* GPDS_SHARED_RADIO_ACTIVITY_REQ_INFO */ + case 0xFB: /* GPDS_SHARED_MBMS_SERVICE_LIST_INFO */ + case 0xFC: /* GPDS_SHARED_INITIAL_DL_DCH_RATE */ + default: + expert_add_info_format(pinfo, item, PI_PROTOCOL, PI_WARN, "unsupported subblock"); + break; + } +} + +static void dissect_isi_gpds(tvbuff_t *tvb, packet_info *pinfo, proto_item *isitree) { + proto_item *item = NULL; + proto_tree *tree = NULL; + guint8 cmd, code; + + if(isitree) { + item = proto_tree_add_text(isitree, tvb, 0, -1, "Payload"); + tree = proto_item_add_subtree(item, ett_isi_msg); + + proto_tree_add_item(tree, hf_isi_gpds_cmd, tvb, 0, 1, FALSE); + cmd = tvb_get_guint8(tvb, 0); + + switch (cmd) { + + case 0x00: /* GPDS_LL_CONFIGURE_REQ */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS LL Configure Request"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_pipe_handle, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_ppp_mode, tvb, 3, 1, FALSE); + break; + case 0x01: /* GPDS_LL_CONFIGURE_RESP */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS LL Configure Response"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_status, tvb, 2, 1, FALSE); + break; + case 0x02: /* GPDS_CONTEXT_ID_CREATE_REQ */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context ID Create Request"); + break; + case 0x03: /* GPDS_CONTEXT_ID_CREATE_RESP */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context ID Create Response"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_status, tvb, 2, 1, FALSE); + break; + case 0x04: /* GPDS_CONTEXT_ID_CREATE_IND */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context ID Create Indication"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + break; + case 0x06: /* GPDS_CONTEXT_CONFIGURE_REQ */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Configure Request"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_pdp_type, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_context_type, tvb, 3, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_primary_cid, tvb, 4, 1, FALSE); + dissect_isi_subpacket(hf_isi_gpds_subblock_type, 7, tvb, pinfo, item, tree, dissect_isi_gpds_subblock); + break; + case 0x07: /* GPDS_CONTEXT_CONFIGURE_RESP */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Configure Response"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_status, tvb, 2, 1, FALSE); + break; + case 0x08: /* GPDS_CONTEXT_ACTIVATE_REQ */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Activate Request"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + dissect_isi_subpacket(hf_isi_gpds_subblock_type, 3, tvb, pinfo, item, tree, dissect_isi_gpds_subblock); + break; + case 0x09: /* GPDS_CONTEXT_ACTIVATE_RESP */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Activate Response"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_status, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_cause, tvb, 3, 1, FALSE); + dissect_isi_subpacket(hf_isi_gpds_subblock_type, 7, tvb, pinfo, item, tree, dissect_isi_gpds_subblock); + break; + case 0x0A: /* GPDS_CONTEXT_ACTIVATE_IND */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Activate Indication"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + dissect_isi_subpacket(hf_isi_gpds_subblock_type, 3, tvb, pinfo, item, tree, dissect_isi_gpds_subblock); + break; + case 0x15: /* GPDS_ATTACH_IND */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Attach Indication"); + proto_tree_add_item(tree, hf_isi_gpds_attach_type, tvb, 1, 1, FALSE); + break; + case 0x19: /* GPDS_STATUS_REQ */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Status Request"); + break; + case 0x1A: /* GPDS_STATUS_RESP */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Status Response"); + proto_tree_add_item(tree, hf_isi_gpds_attach_status, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_context_count, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_tx_byte_count, tvb, 3, 4, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_rx_byte_count, tvb, 7, 4, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_transfer_status, tvb, 11, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_transfer_cause, tvb, 12, 1, FALSE); + // TODO: the cid list + break; + case 0x1E: /* GPDS_TRANSFER_STATUS_IND */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Transfer Status Indication"); + proto_tree_add_item(tree, hf_isi_gpds_transfer_status, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_transfer_cause, tvb, 2, 1, FALSE); + break; + case 0x22: /* GPDS_CONTEXT_STATUS_REQ */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Status Request"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + break; + case 0x23: /* GPDS_CONTEXT_STATUS_RESP */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Status Response"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_status, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_tx_byte_count, tvb, 3, 4, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_rx_byte_count, tvb, 7, 4, FALSE); + dissect_isi_subpacket(hf_isi_gpds_subblock_type, 15, tvb, pinfo, item, tree, dissect_isi_gpds_subblock); + break; + case 0x24: /* GPDS_CONTEXT_STATUS_IND */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Status Indication"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_tx_byte_count, tvb, 3, 4, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_rx_byte_count, tvb, 7, 4, FALSE); + break; + case 0x25: /* GPDS_CONTEXT_ACTIVATING_IND */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Context Activating Indication"); + proto_tree_add_item(tree, hf_isi_gpds_cid, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_client_type, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_pdp_type, tvb, 3, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_context_type, tvb, 4, 1, FALSE); + dissect_isi_subpacket(hf_isi_gpds_subblock_type, 7, tvb, pinfo, item, tree, dissect_isi_gpds_subblock); + break; + case 0x30: /* GPDS_CONFIGURATION_INFO_REQ */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Configuration Info Request"); + break; + case 0x31: /* GPDS_CONFIGURATION_INFO_RESP */ + col_set_str(pinfo->cinfo, COL_INFO, "GPDS Configuration Info Response"); + proto_tree_add_item(tree, hf_isi_gpds_attach_mode, tvb, 1, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_mt_act_mode, tvb, 2, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_classc_mode, tvb, 3, 1, FALSE); + proto_tree_add_item(tree, hf_isi_gpds_aol_context, tvb, 4, 1, FALSE); + break; + + case 0xF0: /* GPDS_COMMON_MESSAGE */ + dissect_isi_common("GPDS", tvb, pinfo, tree); + break; + case 0x05: /* GPDS_CONTEXT_ID_DELETE_IND */ + case 0x20: /* GPDS_LL_BIND_REQ */ + case 0x21: /* GPDS_LL_BIND_RESP */ + case 0x2A: /* GPDS_CONTEXT_MODIFY_REQ */ + case 0x2B: /* GPDS_CONTEXT_MODIFY_RESP */ + case 0x2C: /* GPDS_CONTEXT_MODIFY_IND */ + case 0x1F: /* GPDS_CONTEXT_ACTIVATE_FAIL_IND */ + case 0x0B: /* GPDS_CONTEXT_DEACTIVATE_REQ */ + case 0x0C: /* GPDS_CONTEXT_DEACTIVATE_RESP */ + case 0x0D: /* GPDS_CONTEXT_DEACTIVATE_IND */ + case 0x2F: /* GPDS_CONTEXT_DEACTIVATING_IND */ + case 0x0E: /* GPDS_CONTEXT_NWI_ACT_REQUEST_IND */ + case 0x0F: /* GPDS_CONTEXT_NWI_ACT_REJECT_REQ */ + case 0x10: /* GPDS_CONTEXT_NWI_ACT_REJECT_RESP */ + case 0x11: /* GPDS_CONFIGURE_REQ */ + case 0x12: /* GPDS_CONFIGURE_RESP */ + case 0x13: /* GPDS_ATTACH_REQ */ + case 0x14: /* GPDS_ATTACH_RESP */ + case 0x2D: /* GPDS_ATTACH_FAIL_IND */ + case 0x16: /* GPDS_DETACH_REQ */ + case 0x17: /* GPDS_DETACH_RESP */ + case 0x18: /* GPDS_DETACH_IND */ + case 0x1B: /* GPDS_SMS_PDU_SEND_REQ */ + case 0x1C: /* GPDS_SMS_PDU_SEND_RESP */ + case 0x1D: /* GPDS_SMS_PDU_RECEIVE_IND */ + case 0x32: /* GPDS_CONFIGURATION_INFO_IND */ + case 0x33: /* GPDS_CONTEXT_AUTH_REQ */ + case 0x34: /* GPDS_CONTEXT_AUTH_RESP */ + case 0x35: /* GPDS_TEST_MODE_REQ */ + case 0x36: /* GPDS_TEST_MODE_RESP */ + case 0x37: /* GPDS_RADIO_ACTIVITY_IND */ + case 0x38: /* GPDS_FORCED_READY_STATE_REQ */ + case 0x39: /* GPDS_FORCED_READY_STATE_RESP */ + case 0x3A: /* GPDS_CONTEXTS_CLEAR_REQ */ + case 0x3B: /* GPDS_CONTEXTS_CLEAR_RESP */ + case 0x3C: /* GPDS_MBMS_SERVICE_SELECTION_REQ */ + case 0x3D: /* GPDS_MBMS_SERVICE_SELECTION_RESP */ + case 0x3E: /* GPDS_MBMS_STATUS_IND */ + case 0x3F: /* GPDS_MBMS_CONTEXT_CREATE_REQ */ + case 0x40: /* GPDS_MBMS_CONTEXT_CREATE_RESP */ + case 0x41: /* GPDS_MBMS_CONTEXT_ACTIVATE_REQ */ + case 0x42: /* GPDS_MBMS_CONTEXT_ACTIVATE_RESP */ + case 0x43: /* GPDS_MBMS_CONTEXT_DELETE_REQ */ + case 0x44: /* GPDS_MBMS_CONTEXT_DELETE_RESP */ + case 0x45: /* GPDS_MBMS_CONTEXT_DELETE_IND */ + case 0x46: /* GPDS_MBMS_SERVICE_SELECTION_IND */ + case 0x47: /* GPDS_MBMS_SERVICE_AVAILABLE_IND */ + case 0x48: /* GPDS_TEST_REQ */ + case 0x49: /* GPDS_TEST_RESP */ + case 0x50: /* GPDS_RESOURCE_CONTROL_IND */ + case 0x51: /* GPDS_RESOURCE_CONTROL_REQ */ + case 0x52: /* GPDS_RESOURCE_CONTROL_RESP */ + case 0x54: /* GPDS_RESOURCE_CONF_REQ */ + case 0x55: /* GPDS_RESOURCE_CONF_RESP */ + case 0x53: /* GPDS_RESOURCE_CONF_IND */ + case 0x56: /* GPDS_PROPERTY_SET_REQ */ + case 0x57: /* GPDS_PROPERTY_SET_RESP */ + case 0xEE: /* GPDS_RESP */ + default: + col_set_str(pinfo->cinfo, COL_INFO, "unhandled GPDS packet"); + expert_add_info_format(pinfo, item, PI_PROTOCOL, PI_WARN, "unsupported packet"); + break; + } + } +} + + + + + diff --git a/src/isi-gpds.h b/src/isi-gpds.h new file mode 100644 index 0000000..d0e93f1 --- /dev/null +++ b/src/isi-gpds.h @@ -0,0 +1,9 @@ + +#ifndef _ISI_GPDS_H +#define _ISI_GPDS_H + +void proto_reg_handoff_isi_gpds(void); +void proto_register_isi_gpds(void); + +#endif + diff --git a/src/packet-isi.c b/src/packet-isi.c index 3e4a28e..747c2d2 100644 --- a/src/packet-isi.c +++ b/src/packet-isi.c @@ -371,6 +371,7 @@ void proto_reg_handoff_isi(void) { proto_reg_handoff_isi_call(); proto_reg_handoff_isi_light(); proto_reg_handoff_isi_commgr(); + proto_reg_handoff_isi_gpds(); proto_reg_handoff_isi_selftest(); #ifdef ISI_USB @@ -445,6 +446,7 @@ void proto_register_isi(void) { proto_register_isi_call(); proto_register_isi_light(); proto_register_isi_commgr(); + proto_register_isi_gpds(); proto_register_isi_selftest(); }