2022-11-22 09:27:10 +00:00
/* packet-sapms.c
* Routines for SAP MS ( Message Server ) dissection
* Copyright 2022 , Martin Gallo < martin . gallo [ AT ] gmail . com >
* Code contributed by SecureAuth Corp .
*
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
* Copyright 1998 Gerald Combs
*
* SPDX - License - Identifier : GPL - 2.0 - or - later
*/
/*
* This is a simple dissector for the SAP MS protocol .
*
* Some details and example requests can be found in pysap ' s documentation : https : //pysap.readthedocs.io/en/latest/protocols/SAPMS.html.
*/
# include <config.h>
# include <epan/packet.h>
# include <epan/prefs.h>
# include <epan/expert.h>
# include <wsutil/wmem/wmem.h>
/* Define default ports. The right range should be 36NN and 39NN, but as port numbers are proprietary and not
* IANA assigned , we leave only the ones corresponding to the instance 00.
*/
# define SAPMS_PORT_RANGE "3600,3900"
/* MS Domain values */
static const value_string sapms_domain_vals [ ] = {
{ 0x00 , " ABAP " } ,
{ 0x01 , " J2EE " } ,
{ 0x02 , " JSTARTUP " } ,
/* NULL */
{ 0 , NULL }
} ;
/* MS Flag values */
static const value_string sapms_flag_vals [ ] = {
{ 1 , " MS_ONE_WAY " } ,
{ 2 , " MS_REQUEST " } ,
{ 3 , " MS_REPLY " } ,
{ 4 , " MS_ADMIN " } ,
/* NULL */
{ 0 , NULL }
} ;
/* MS IFlag values */
static const value_string sapms_iflag_vals [ ] = {
{ 1 , " MS_SEND_NAME " } ,
{ 2 , " MS_SEND_TYPE " } ,
{ 3 , " MS_LOGIN " } ,
{ 4 , " MS_LOGOUT " } ,
{ 5 , " MS_ADM_OPCODES " } ,
{ 6 , " MS_MOD_MSGTYPES " } ,
{ 7 , " MS_SEND_TYPE_ONCE " } ,
{ 8 , " MS_LOGIN_2 " } ,
{ 9 , " MS_MOD_STATE " } ,
{ 10 , " MS_J2EE_LOGIN " } ,
{ 12 , " MS_J2EE_SEND_TO_CLUSTERID " } ,
{ 13 , " MS_J2EE_SEND_BROADCAST " } ,
{ 14 , " MS_SEND_TYPE_ACK " } ,
{ 15 , " MS_J2EE_LOGIN_2 " } ,
{ 16 , " MS_SEND_SERVICE " } ,
{ 17 , " MS_J2EE_LOGIN_3 " } ,
{ 18 , " MS_J2EE_LOGIN_4 " } ,
/* NULL */
{ 0 , NULL }
} ;
/* MS Error number values */
static const value_string sapms_errorno_vals [ ] = {
{ 0 , " MSERECONNECTION " } ,
{ 1 , " MSENISELWRITE " } ,
{ 2 , " MSENISELREAD " } ,
{ 3 , " MSENIQUEUE " } ,
{ 4 , " MSENILAYER " } ,
{ 71 , " MSETESTSOFTSHUTDOWN " } ,
{ 72 , " MSENOTINIT " } ,
{ 73 , " MSEALREADYINIT " } ,
{ 74 , " MSEINVHDL " } ,
{ 75 , " MSEWRONGSERVER " } ,
{ 76 , " MSEMOREDATA " } ,
{ 77 , " MSESNDTYPEFAILED " } ,
{ 78 , " MSEDUPKEY " } ,
{ 79 , " MSESOFTSHUTDOWN " } ,
{ 81 , " MSENOMEM " } ,
{ 82 , " MSEHEADERINCOMPLETE " } ,
{ 83 , " MSETYPESNOTALLOWED " } ,
{ 84 , " MSEACCESSDENIED " } ,
{ 85 , " MSEWRITEINCOMPLETE " } ,
{ 86 , " MSEREADINCOMPLETE " } ,
{ 87 , " MSEADMIN " } ,
{ 88 , " MSESOCKTOOLARGE " } ,
{ 89 , " MSENOSLOTFREE " } ,
{ 90 , " MSESHUTDOWN " } ,
{ 91 , " MSEREPLYTOOLARGE " } ,
{ 92 , " MSEWRONGVERSION " } ,
{ 93 , " MSEMSGDESTROYED " } ,
{ 94 , " MSENOTUNIQUE " } ,
{ 95 , " MSEPARTNERUNKNOWN " } ,
{ 96 , " MSEPARTNERDIED " } ,
{ 97 , " MSEWRONGTYPE " } ,
{ 98 , " MSEWRONGNAME " } ,
{ 99 , " MSEWAKEUP " } ,
{ 100 , " MSENOTFOUND " } ,
{ 101 , " MSEINVAL " } ,
{ 102 , " MSENOMSG " } ,
{ 103 , " MSEINTERN " } ,
/* NULL */
{ 0 , NULL }
} ;
/* MS Adm Message Types values */
static const value_string sapms_adm_msgtype_vals [ ] = {
{ 1 , " ADM_REQUEST " } ,
{ 2 , " ADM_REPLY " } ,
/* NULL */
{ 0 , NULL }
} ;
/* MS Adm Record Opcode values */
static const value_string sapms_adm_record_opcode_vals [ ] = {
{ 0x00 , " AD_GENERAL " } ,
{ 0x01 , " AD_PROFILE " } ,
{ 0x02 , " AD_WPSTAT " } ,
{ 0x03 , " AD_QUEUE " } ,
{ 0x04 , " AD_STARTSTOP " } ,
{ 0x05 , " AD_WPCONF " } ,
{ 0x06 , " AD_USRLST " } ,
{ 0x07 , " AD_WPKILL " } ,
{ 0x08 , " AD_TIMEINFO " } ,
{ 0x09 , " AD_TM_RECONNECT " } ,
{ 0x0a , " AD_ALRT_GET_STATE " } ,
{ 0x0b , " AD_ALRT_OPERATION " } ,
{ 0x0c , " AD_ALRT_SET_PARAM " } ,
{ 0x0d , " AD_DB_RECONNECT " } ,
{ 0x0e , " AD_ECHO " } ,
{ 0x0f , " AD_MSGSERVER " } ,
{ 0x10 , " AD_WPCONF2 " } ,
{ 0x11 , " AD_GENERAL2 " } ,
{ 0x12 , " AD_SET_LIST_PARAM " } ,
{ 0x13 , " AD_DUMP_STATUS " } ,
{ 0x14 , " AD_RZL " } ,
{ 0x15 , " AD_RZL_STRG " } ,
{ 0x16 , " AD_COUNT_WPS " } ,
{ 0x17 , " AD_QUEUE2 " } ,
{ 0x19 , " AD_EM " } ,
{ 0x1a , " AD_ES " } ,
{ 0x1b , " AD_SHUTDOWN_STATE " } ,
{ 0x1c , " AD_SHUTDOWN_INFO " } ,
{ 0x1d , " AD_SHUTDOWN_ERROR " } ,
{ 0x1f , " AD_DISPLACE " } ,
{ 0x20 , " AD_GET_TIMETAB " } ,
{ 0x21 , " AD_SET_TIMETAB " } ,
{ 0x28 , " AD_MSBUF " } ,
{ 0x29 , " AD_ARFC_NOREQ " } ,
{ 0x2a , " AD_ENQID_INFO " } ,
{ 0x2b , " AD_DEL_USER " } ,
{ 0x2c , " AD_SPO_ADM " } ,
{ 0x2d , " AD_NTAB_SYNC " } ,
{ 0x2e , " AD_SHARED_PARAMETER " } ,
{ 0x2f , " AD_RESET_TRACE " } ,
{ 0x30 , " AD_RESET_USR02 " } ,
{ 0x31 , " AD_WALL_CREATE " } ,
{ 0x32 , " AD_WALL_DELETE " } ,
{ 0x33 , " AD_WALL_MODIFY " } ,
{ 0x34 , " AD_SERVER_STATE " } ,
{ 0x3c , " AD_SELFIDENT " } ,
{ 0x3d , " AD_DP_TRACE_CHANGE " } ,
{ 0x3e , " AD_DP_DUMP_NIHDL " } ,
{ 0x3f , " AD_DP_CALL_DELAYED " } ,
{ 0x40 , " AD_GW_ADM " } ,
{ 0x41 , " AD_DP_WAKEUP_MODE " } ,
{ 0x42 , " AD_VMC_SYS_EVENT " } ,
{ 0x43 , " AD_SHARED_PARAM_ALL_WPS " } ,
{ 0x44 , " AD_SECSESSION_UPDATE " } ,
{ 0x45 , " AD_SECSESSION_TERMINATE " } ,
{ 0x46 , " AD_ASRF_REQUEST " } ,
{ 0x47 , " AD_GET_NILIST " } ,
{ 0x48 , " AD_LOAD_INFO " } ,
{ 0x49 , " AD_TEST " } ,
{ 0x4a , " AD_HANDLE_ACL " } ,
{ 0x4b , " AD_PROFILE2 " } ,
{ 0x4c , " AD_RSCP_ASYNC " } ,
{ 0x4d , " AD_BATCH_INFO " } ,
{ 0x4e , " AD_SOFT_CANCEL " } ,
{ 0x55 , " AD_SYNC_LOAD_FMT " } ,
{ 0x56 , " AD_GET_NILIST_PORT " } ,
/* NULL */
{ 0x00 , NULL }
} ;
/* MS Adm AD_RZL_STRG Type values */
static const value_string sapms_adm_rzl_strg_type_vals [ ] = {
{ 10 , " STRG_TYPE_READALL " } ,
{ 11 , " STRG_TYPE_READALL_I " } ,
{ 12 , " STRG_TYPE_READALL_C " } ,
{ 13 , " STRG_TYPE_READALL_LC " } ,
{ 15 , " STRG_TYPE_READALL_OFFSET_I " } ,
{ 16 , " STRG_TYPE_READALL_OFFSET_C " } ,
{ 17 , " STRG_TYPE_READALL_OFFSET_LC " } ,
{ 20 , " STRG_TYPE_READALL_OFFSET " } ,
{ 21 , " STRG_TYPE_READ_I " } ,
{ 22 , " STRG_TYPE_READ_C " } ,
{ 23 , " STRG_TYPE_READ_LC " } ,
{ 31 , " STRG_TYPE_WRITE_I " } ,
{ 32 , " STRG_TYPE_WRITE_C " } ,
{ 33 , " STRG_TYPE_WRITE_LC " } ,
{ 41 , " STRG_TYPE_DEL_I " } ,
{ 42 , " STRG_TYPE_DEL_C " } ,
{ 43 , " STRG_TYPE_DEL_LC " } ,
{ 51 , " STRG_TYPE_CREATE_I " } ,
{ 52 , " STRG_TYPE_CREATE_C " } ,
{ 53 , " STRG_TYPE_CREATE_LC " } ,
{ 90 , " STRG_TYPE_DUMP " } ,
/* NULL */
{ 0 , NULL }
} ;
/* MS OP Code values */
static const value_string sapms_opcode_vals [ ] = {
{ 0 , " MS_DP_ADM " } ,
{ 1 , " MS_SERVER_CHG " } ,
{ 2 , " MS_SERVER_ADD " } ,
{ 3 , " MS_SERVER_SUB " } ,
{ 4 , " MS_SERVER_MOD " } ,
{ 5 , " MS_SERVER_LST " } ,
{ 6 , " MS_CHANGE_IP " } ,
{ 7 , " MS_SET_SECURITY_KEY " } ,
{ 8 , " MS_GET_SECURITY_KEY " } ,
{ 9 , " MS_GET_SECURITY_KEY2 " } ,
{ 10 , " MS_GET_HWID " } ,
{ 11 , " MS_INCRE_TRACE " } ,
{ 12 , " MS_DECRE_TRACE " } ,
{ 13 , " MS_RESET_TRACE " } ,
{ 14 , " MS_ACT_STATISTIC " } ,
{ 15 , " MS_DEACT_STATISTIC " } ,
{ 16 , " MS_RESET_STATISTIC " } ,
{ 17 , " MS_GET_STATISTIC " } ,
{ 18 , " MS_DUMP_NIBUFFER " } ,
{ 19 , " MS_RESET_NIBUFFER " } ,
{ 20 , " MS_OPEN_REQ_LST " } ,
{ 21 , " MS_SERVER_INFO " } ,
{ 22 , " MS_SERVER_LIST " } ,
{ 23 , " MS_SERVER_ENTRY " } ,
{ 24 , " MS_DOMAIN_INFO " } ,
{ 25 , " MS_DOMAIN_LIST " } ,
{ 26 , " MS_DOMAIN_ENTRY " } ,
{ 27 , " MS_MAP_URL_TO_ADDR " } ,
{ 28 , " MS_GET_CODEPAGE " } ,
{ 29 , " MS_SOFT_SHUTDOWN " } ,
{ 30 , " MS_DUMP_INFO " } ,
{ 31 , " MS_FILE_RELOAD " } ,
{ 32 , " MS_RESET_DOMAIN_CONN " } ,
{ 33 , " MS_NOOP " } ,
{ 34 , " MS_SET_TXT " } ,
{ 35 , " MS_GET_TXT " } ,
{ 36 , " MS_COUNTER_CREATE " } ,
{ 37 , " MS_COUNTER_DELETE " } ,
{ 38 , " MS_COUNTER_INCREMENT " } ,
{ 39 , " MS_COUNTER_DECREMENT " } ,
{ 40 , " MS_COUNTER_REGISTER " } ,
{ 41 , " MS_COUNTER_GET " } ,
{ 42 , " MS_COUNTER_LST " } ,
{ 43 , " MS_SET_LOGON " } ,
{ 44 , " MS_GET_LOGON " } ,
{ 45 , " MS_DEL_LOGON " } ,
{ 46 , " MS_SERVER_DISC " } ,
{ 47 , " MS_SERVER_SHUTDOWN " } ,
{ 48 , " MS_SERVER_SOFT_SHUTDOWN " } ,
{ 49 , " MS_J2EE_CLUSTERNODE_CHG " } ,
{ 50 , " MS_J2EE_CLUSTERNODE_ADD " } ,
{ 51 , " MS_J2EE_CLUSTERNODE_SUB " } ,
{ 52 , " MS_J2EE_CLUSTERNODE_MOD " } ,
{ 53 , " MS_J2EE_CLUSTERNODE_LST " } ,
{ 54 , " MS_J2EE_SERVICE_REG " } ,
{ 55 , " MS_J2EE_SERVICE_UNREG " } ,
{ 56 , " MS_J2EE_SERVICE_LST " } ,
{ 57 , " MS_J2EE_SERVICE_ADD " } ,
{ 58 , " MS_J2EE_SERVICE_SUB " } ,
{ 59 , " MS_J2EE_SERVICE_MOD " } ,
{ 60 , " MS_J2EE_MOD_STATE " } ,
{ 61 , " MS_J2EE_SERVICE_GET " } ,
{ 62 , " MS_J2EE_SERVICE_REG2 " } ,
{ 63 , " MS_NITRACE_SETGET " } ,
{ 64 , " MS_SERVER_LONG_LIST " } ,
{ 65 , " MS_J2EE_DEBUG_ENABLE " } ,
{ 66 , " MS_J2EE_DEBUG_DISABLE " } ,
{ 67 , " MS_SET_PROPERTY " } ,
{ 68 , " MS_GET_PROPERTY " } ,
{ 69 , " MS_DEL_PROPERTY " } ,
{ 70 , " MS_IP_PORT_TO_NAME " } ,
{ 71 , " MS_CHECK_ACL " } ,
{ 72 , " MS_LICENSE_SRV " } ,
{ 74 , " MS_SERVER_TEST_SOFT_SHUTDOWN " } ,
{ 75 , " MS_J2EE_RECONNECT_P1 " } ,
{ 76 , " MS_J2EE_RECONNECT_P2 " } ,
/* NULL */
{ 0 , NULL } ,
} ;
/* MS OP Code Error values */
static const value_string sapms_opcode_error_vals [ ] = {
{ 0 , " MSOP_OK " } ,
{ 1 , " MSOP_UNKNOWN_OPCODE " } ,
{ 2 , " MSOP_NOMEM " } ,
{ 3 , " MSOP_SECURITY_KEY_NOTSET " } ,
{ 4 , " MSOP_UNKNOWN_CLIENT " } ,
{ 5 , " MSOP_ACCESS_DENIED " } ,
{ 6 , " MSOP_REQUEST_REQUIRED " } ,
{ 7 , " MSOP_NAME_REQUIRED " } ,
{ 8 , " MSOP_GET_HWID_FAILED " } ,
{ 9 , " MSOP_SEND_FAILED " } ,
{ 10 , " MSOP_UNKNOWN_DOMAIN " } ,
{ 11 , " MSOP_UNKNOWN_SERVER " } ,
{ 12 , " MSOP_NO_DOMAIN_SERVER " } ,
{ 13 , " MSOP_INVALID_URL " } ,
{ 14 , " MSOP_UNKNOWN_DUMP_REQ " } ,
{ 15 , " MSOP_FILENOTFOUND " } ,
{ 16 , " MSOP_UNKNOWN_RELOAD_REQ " } ,
{ 17 , " MSOP_FILENOTDEFINED " } ,
{ 18 , " MSOP_CONVERT_FAILED " } ,
{ 19 , " MSOP_NOTSET " } ,
{ 20 , " MSOP_COUNTER_EXCEEDED " } ,
{ 21 , " MSOP_COUNTER_NOTFOUND " } ,
{ 22 , " MSOP_COUNTER_DELETED " } ,
{ 23 , " MSOP_COUNTER_EXISTS " } ,
{ 24 , " MSOP_EINVAL " } ,
{ 25 , " MSOP_NO_J2EE_CLUSTERNODE " } ,
{ 26 , " MSOP_UNKNOWN_PROPERTY " } ,
{ 27 , " MSOP_UNKNOWN_VERSION " } ,
{ 28 , " MSOP_ICTERROR " } ,
{ 29 , " MSOP_KERNEL_INCOMPATIBLE " } ,
{ 30 , " MSOP_NIACLCREATE_FAILED " } ,
{ 31 , " MSOP_NIACLSYNTAX_ERROR " } ,
/* NULL */
{ 0 , NULL } ,
} ;
/* MS Set/Get Property ID values */
static const value_string sapms_property_id_vals [ ] = {
{ 1 , " MS_PROPERTY_TEXT " } ,
{ 2 , " MS_PROPERTY_VHOST " } ,
{ 3 , " MS_PROPERTY_IPADR " } ,
{ 4 , " MS_PROPERTY_PARAM " } ,
{ 5 , " MS_PROPERTY_SERVICE " } ,
{ 6 , " MS_PROPERTY_DELALT " } ,
{ 7 , " Release information " } ,
/* NULL */
{ 0 , NULL } ,
} ;
/* MS Dump Info Dump values */
static const value_string sapms_dump_command_vals [ ] = {
{ 1 , " MS_DUMP_MSADM " } ,
{ 2 , " MS_DUMP_CON " } ,
{ 3 , " MS_DUMP_PARAMS " } ,
{ 4 , " MS_DUMP_ALL_CLIENTS " } ,
{ 5 , " MS_DUMP_ALL_SERVER " } ,
{ 6 , " MS_DUMP_ALL_DOMAIN " } ,
{ 7 , " MS_DUMP_DOMAIN_CONN " } ,
{ 8 , " MS_DUMP_RELEASE " } ,
{ 9 , " MS_DUMP_SIZEOF " } ,
{ 10 , " MS_DUMP_FIADM " } ,
{ 11 , " MS_DUMP_FICON " } ,
{ 12 , " MS_DUMP_COUNTER " } ,
{ 13 , " MS_DUMP_STATISTIC " } ,
{ 14 , " MS_DUMP_NIBUF " } ,
{ 15 , " MS_DUMP_URLMAP " } ,
{ 16 , " MS_DUMP_URLPREFIX " } ,
{ 17 , " MS_DUMP_URLHANDLER " } ,
{ 18 , " MS_DUMP_NOSERVER " } ,
{ 19 , " MS_DUMP_ACLINFO " } ,
{ 20 , " MS_DUMP_PERMISSION_TABLE " } ,
{ 21 , " MS_DUMP_J2EE_CLUSTER_STAT " } ,
{ 22 , " MS_DUMP_ACL_FILE_EXT " } ,
{ 23 , " MS_DUMP_ACL_FILE_INT " } ,
{ 24 , " MS_DUMP_ACL_FILE_ADMIN " } ,
{ 25 , " MS_DUMP_ACL_FILE_EXTBND " } ,
{ 26 , " MS_DUMP_ACL_FILE_HTTP " } ,
{ 27 , " MS_DUMP_ACL_FILE_HTTPS " } ,
/* NULL */
{ 0 , NULL } ,
} ;
/* MS Reload file values */
static const value_string sapms_file_reload_vals [ ] = {
{ 1 , " MS_RELOAD_CLIENT_TAB " } ,
{ 2 , " MS_RELOAD_SERVER_TAB " } ,
{ 3 , " MS_RELOAD_DOMAIN_TAB " } ,
{ 4 , " MS_RELOAD_URLMAP " } ,
{ 5 , " MS_RELOAD_URLPREFIX " } ,
{ 6 , " MS_RELOAD_ACL_INFO " } ,
{ 7 , " MS_RELOAD_PERMISSION_TABLE " } ,
{ 8 , " MS_RELOAD_STOC " } ,
{ 9 , " MS_RELOAD_ACL_FILE_EXT " } ,
{ 10 , " MS_RELOAD_ACL_FILE_INT " } ,
{ 11 , " MS_RELOAD_ACL_FILE_ADMIN " } ,
{ 12 , " MS_RELOAD_ACL_FILE_EXTBND " } ,
{ 13 , " MS_RELOAD_ACL_FILE_HTTP " } ,
{ 14 , " MS_RELOAD_ACL_FILE_HTTPS " } ,
/* NULL */
{ 0 , NULL }
} ;
/* MS Logon Type values */
static const value_string sapms_logon_type_vals [ ] = {
{ 0 , " MS_LOGON_DIAG_LB " } ,
{ 1 , " MS_LOGON_DIAG_LBS " } ,
{ 2 , " MS_LOGON_DIAG " } ,
{ 3 , " MS_LOGON_DIAGS " } ,
{ 4 , " MS_LOGON_RFC " } ,
{ 5 , " MS_LOGON_RFCS " } ,
{ 6 , " MS_LOGON_HTTP " } ,
{ 7 , " MS_LOGON_HTTPS " } ,
{ 8 , " MS_LOGON_FTP " } ,
{ 9 , " MS_LOGON_SMTP " } ,
{ 10 , " MS_LOGON_NNTP " } ,
{ 11 , " MS_LOGON_DIAG_E " } ,
{ 12 , " MS_LOGON_DIAGS_E " } ,
{ 13 , " MS_LOGON_RFC_E " } ,
{ 14 , " MS_LOGON_RFCS_E " } ,
{ 15 , " MS_LOGON_HTTP_E " } ,
{ 16 , " MS_LOGON_HTTPS_E " } ,
{ 17 , " MS_LOGON_FTP_E " } ,
{ 18 , " MS_LOGON_SMTP_E " } ,
{ 19 , " MS_LOGON_NNTP_E " } ,
{ 20 , " MS_LOGON_J2EE " } ,
{ 21 , " MS_LOGON_J2EES " } ,
{ 22 , " MS_LOGON_J2EE_E " } ,
{ 23 , " MS_LOGON_J2EES_E " } ,
{ 24 , " MS_LOGON_P4 " } ,
{ 25 , " MS_LOGON_P4S " } ,
{ 26 , " MS_LOGON_IIOP " } ,
{ 27 , " MS_LOGON_IIOPS " } ,
{ 28 , " MS_LOGON_SDM " } ,
{ 29 , " MS_LOGON_TELNET " } ,
{ 30 , " MS_LOGON_DEBUG " } ,
{ 31 , " MS_LOGON_DPROXY " } ,
{ 32 , " MS_LOGON_P4HTTP " } ,
{ 33 , " MS_LOGON_HTTPRI " } ,
{ 34 , " MS_LOGON_HTTPSRI " } ,
{ 35 , " MS_LOGON_J2EERI " } ,
{ 36 , " MS_LOGON_J2EESRI " } ,
{ 37 , " MS_LOGON_TRXNS " } ,
/* NULL */
{ 0 , NULL }
} ;
/* MS Client Status values */
static const value_string sapms_server_lst_status_vals [ ] = {
{ 0 , " MS_STATE_UNKNOWN " } ,
{ 1 , " ACTIVE " } ,
{ 2 , " INACTIVE " } ,
{ 3 , " MS_STATE_SHUTDOWN " } ,
{ 4 , " MS_STATE_STOP " } ,
{ 5 , " MS_STATE_STARTING " } ,
{ 6 , " MS_STATE_INIT " } ,
/* NULL */
{ 0 , NULL }
} ;
/* Message Type values */
# define SAPMS_MSG_TYPE_DIA 0x01
# define SAPMS_MSG_TYPE_UPD 0x02
# define SAPMS_MSG_TYPE_ENQ 0x04
# define SAPMS_MSG_TYPE_BTC 0x08
# define SAPMS_MSG_TYPE_SPO 0x10
# define SAPMS_MSG_TYPE_UP2 0x20
# define SAPMS_MSG_TYPE_ATP 0x40
# define SAPMS_MSG_TYPE_ICM 0x80
static int proto_sapms = - 1 ;
static int hf_sapms_eyecatcher = - 1 ;
static int hf_sapms_version = - 1 ;
static int hf_sapms_errorno = - 1 ;
static int hf_sapms_toname = - 1 ;
static int hf_sapms_msgtypes = - 1 ;
static int hf_sapms_msgtypes_dia = - 1 ;
static int hf_sapms_msgtypes_upd = - 1 ;
static int hf_sapms_msgtypes_enq = - 1 ;
static int hf_sapms_msgtypes_btc = - 1 ;
static int hf_sapms_msgtypes_spo = - 1 ;
static int hf_sapms_msgtypes_up2 = - 1 ;
static int hf_sapms_msgtypes_atp = - 1 ;
static int hf_sapms_msgtypes_icm = - 1 ;
static int hf_sapms_domain = - 1 ;
static int hf_sapms_reserved = - 1 ;
static int hf_sapms_key = - 1 ;
static int hf_sapms_flag = - 1 ;
static int hf_sapms_iflag = - 1 ;
static int hf_sapms_fromname = - 1 ;
static int hf_sapms_diagport = - 1 ;
static int hf_sapms_dp_adm_dp_version = - 1 ;
static int hf_sapms_adm_eyecatcher = - 1 ;
static int hf_sapms_adm_version = - 1 ;
static int hf_sapms_adm_msgtype = - 1 ;
static int hf_sapms_adm_recsize = - 1 ;
static int hf_sapms_adm_recno = - 1 ;
static int hf_sapms_adm_record = - 1 ;
static int hf_sapms_adm_record_opcode = - 1 ;
static int hf_sapms_adm_record_serial_number = - 1 ;
static int hf_sapms_adm_record_executed = - 1 ;
static int hf_sapms_adm_record_errorno = - 1 ;
static int hf_sapms_adm_record_value = - 1 ;
static int hf_sapms_adm_parameter = - 1 ;
static int hf_sapms_adm_rzl_strg_type = - 1 ;
static int hf_sapms_adm_rzl_strg_name = - 1 ;
static int hf_sapms_adm_rzl_strg_value = - 1 ;
static int hf_sapms_adm_rzl_strg_value_integer = - 1 ;
static int hf_sapms_adm_rzl_strg_uptime = - 1 ;
static int hf_sapms_adm_rzl_strg_delay = - 1 ;
static int hf_sapms_adm_rzl_strg_users = - 1 ;
static int hf_sapms_adm_rzl_strg_quality = - 1 ;
static int hf_sapms_opcode = - 1 ;
static int hf_sapms_opcode_error = - 1 ;
static int hf_sapms_opcode_version = - 1 ;
static int hf_sapms_opcode_charset = - 1 ;
static int hf_sapms_opcode_value = - 1 ;
static int hf_sapms_property_client = - 1 ;
static int hf_sapms_property_id = - 1 ;
static int hf_sapms_property_value = - 1 ;
static int hf_sapms_property_vhost_logon = - 1 ;
static int hf_sapms_property_vhost_length = - 1 ;
static int hf_sapms_property_vhost_value = - 1 ;
static int hf_sapms_property_ip_address = - 1 ;
static int hf_sapms_property_ip_address6 = - 1 ;
static int hf_sapms_property_param_name_length = - 1 ;
static int hf_sapms_property_param_name_value = - 1 ;
static int hf_sapms_property_param_value_length = - 1 ;
static int hf_sapms_property_param_value_value = - 1 ;
static int hf_sapms_property_service_number = - 1 ;
static int hf_sapms_property_service_value = - 1 ;
static int hf_sapms_property_release = - 1 ;
static int hf_sapms_property_release_patchno = - 1 ;
static int hf_sapms_property_release_supplvl = - 1 ;
static int hf_sapms_property_release_platform = - 1 ;
static int hf_sapms_text_name = - 1 ;
static int hf_sapms_text_length = - 1 ;
static int hf_sapms_text_value = - 1 ;
static int hf_sapms_counter_uuid = - 1 ;
static int hf_sapms_counter_count = - 1 ;
static int hf_sapms_counter_no = - 1 ;
static int hf_sapms_change_ip_address = - 1 ;
static int hf_sapms_change_ip_address6 = - 1 ;
static int hf_sapms_security_name = - 1 ;
static int hf_sapms_security_key = - 1 ;
static int hf_sapms_security_port = - 1 ;
static int hf_sapms_security_address = - 1 ;
static int hf_sapms_security_address6 = - 1 ;
static int hf_sapms_file_reload = - 1 ;
static int hf_sapms_file_filler = - 1 ;
static int hf_sapms_logon_type = - 1 ;
static int hf_sapms_logon_port = - 1 ;
static int hf_sapms_logon_address = - 1 ;
static int hf_sapms_logon_name_length = - 1 ;
static int hf_sapms_logon_name = - 1 ;
static int hf_sapms_logon_prot_length = - 1 ;
static int hf_sapms_logon_prot = - 1 ;
static int hf_sapms_logon_host_length = - 1 ;
static int hf_sapms_logon_host = - 1 ;
static int hf_sapms_logon_misc_length = - 1 ;
static int hf_sapms_logon_misc = - 1 ;
static int hf_sapms_logon_address6_length = - 1 ;
static int hf_sapms_logon_address6 = - 1 ;
static int hf_sapms_logon_end = - 1 ;
static int hf_sapms_shutdown_reason_length = - 1 ;
static int hf_sapms_shutdown_reason = - 1 ;
static int hf_sapms_ip_to_name_address4 = - 1 ;
static int hf_sapms_ip_to_name_address6 = - 1 ;
static int hf_sapms_ip_to_name_port = - 1 ;
static int hf_sapms_ip_to_name_length = - 1 ;
static int hf_sapms_ip_to_name = - 1 ;
static int hf_sapms_check_acl_error_code = - 1 ;
static int hf_sapms_check_acl_acl = - 1 ;
static int hf_sapms_codepage = - 1 ;
static int hf_sapms_dump_dest = - 1 ;
static int hf_sapms_dump_filler = - 1 ;
static int hf_sapms_dump_index = - 1 ;
static int hf_sapms_dump_command = - 1 ;
static int hf_sapms_dump_name = - 1 ;
static int hf_sapms_server_lst_client = - 1 ;
static int hf_sapms_server_lst_name = - 1 ;
static int hf_sapms_server_lst_host = - 1 ;
static int hf_sapms_server_lst_service = - 1 ;
static int hf_sapms_server_lst_msgtypes = - 1 ;
static int hf_sapms_server_lst_msgtypes_dia = - 1 ;
static int hf_sapms_server_lst_msgtypes_upd = - 1 ;
static int hf_sapms_server_lst_msgtypes_enq = - 1 ;
static int hf_sapms_server_lst_msgtypes_btc = - 1 ;
static int hf_sapms_server_lst_msgtypes_spo = - 1 ;
static int hf_sapms_server_lst_msgtypes_up2 = - 1 ;
static int hf_sapms_server_lst_msgtypes_atp = - 1 ;
static int hf_sapms_server_lst_msgtypes_icm = - 1 ;
static int hf_sapms_server_lst_hostaddr = - 1 ;
static int hf_sapms_server_lst_hostaddrv4 = - 1 ;
static int hf_sapms_server_lst_servno = - 1 ;
static int hf_sapms_server_lst_status = - 1 ;
static int hf_sapms_server_lst_nitrc = - 1 ;
static int hf_sapms_server_lst_sys_service = - 1 ;
static gint ett_sapms = - 1 ;
/* Expert info */
static expert_field ei_sapms_adm_opcode_partial = EI_INIT ;
static expert_field ei_sapms_opcode_partial = EI_INIT ;
static expert_field ei_sapms_unknown_version = EI_INIT ;
static expert_field ei_sapms_client_invalid_offset = EI_INIT ;
static expert_field ei_sapms_client_invalid_length = EI_INIT ;
static expert_field ei_sapms_text_invalid_length = EI_INIT ;
static expert_field ei_sapms_ip_invalid_length = EI_INIT ;
/* Global port preference */
static range_t * global_sapms_port_range ;
/* Global highlight preference */
static gboolean global_sapms_highlight_items = TRUE ;
/* Protocol handle */
static dissector_handle_t sapms_handle ;
void proto_reg_handoff_sapms ( void ) ;
void proto_register_sapms ( void ) ;
static void
dissect_sapms_adm_record ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , guint32 offset , guint32 length ) {
proto_item * record = NULL , * value = NULL ;
proto_tree * record_tree = NULL , * value_tree = NULL ;
2022-11-20 21:18:22 +00:00
guint8 adm_opcode ;
2022-11-22 09:27:10 +00:00
while ( length > = 104 ) {
record = proto_tree_add_item ( tree , hf_sapms_adm_record , tvb , offset , 104 , ENC_NA ) ;
record_tree = proto_item_add_subtree ( record , ett_sapms ) ;
adm_opcode = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_item ( record_tree , hf_sapms_adm_record_opcode , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_item_append_text ( record_tree , " , Adm Opcode=%s " , val_to_str ( adm_opcode , sapms_adm_record_opcode_vals , " Unknown " ) ) ;
offset + = 1 ;
length - = 1 ;
proto_tree_add_item ( record_tree , hf_sapms_adm_record_serial_number , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
length - = 1 ;
proto_tree_add_item ( record_tree , hf_sapms_adm_record_executed , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
length - = 1 ;
proto_tree_add_item ( record_tree , hf_sapms_adm_record_errorno , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
length - = 1 ;
/* Dissect the value in function of the opcode */
switch ( adm_opcode ) {
case 0x01 : /* AD_PROFILE */
case 0x2e : { /* AD_SHARED_PARAMETER */
proto_tree_add_item ( record_tree , hf_sapms_adm_parameter , tvb , offset , 100 , ENC_ASCII | ENC_NA ) ;
offset + = 100 ;
length - = 100 ;
break ;
}
case 0x15 : { /* AD_RZL_STRG */
guint8 strg_type = 0 ;
strg_type = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_item ( record_tree , hf_sapms_adm_rzl_strg_type , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
length - = 1 ;
offset + = 3 ; /* Skip 3 bytes */
length - = 3 ;
proto_tree_add_item ( record_tree , hf_sapms_adm_rzl_strg_name , tvb , offset , 20 , ENC_ASCII | ENC_NA ) ;
offset + = 20 ;
length - = 20 ;
value = proto_tree_add_item ( record_tree , hf_sapms_adm_rzl_strg_value , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
value_tree = proto_item_add_subtree ( value , ett_sapms ) ;
switch ( strg_type ) {
case 11 : /* STRG_TYPE_READALL_I */
case 15 : /* STRG_TYPE_READALL_OFFSET_I */
case 21 : /* STRG_TYPE_READ_I */
case 31 : /* STRG_TYPE_WRITE_I */
case 41 : /* STRG_TYPE_DEL_I */
case 51 : { /* STRG_TYPE_CREATE_I */
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_uptime , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_value_integer , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_delay , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_value_integer , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_users , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_quality , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_value_integer , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_value_integer , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_value_integer , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_adm_rzl_strg_value_integer , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
break ;
}
default : {
offset + = 40 ;
length - = 40 ;
break ;
}
}
offset + = 36 ;
length - = 36 ; /* Skip the last 36 bytes */
break ;
}
default : {
proto_tree_add_item ( record_tree , hf_sapms_adm_record_value , tvb , offset , 100 , ENC_NA ) ;
offset + = 100 ;
length - = 100 ;
if ( global_sapms_highlight_items ) {
expert_add_info_format ( pinfo , record_tree , & ei_sapms_adm_opcode_partial , " The ADM opcode is dissected partially (0x%.2x) " , adm_opcode ) ;
}
break ;
}
}
}
}
static gint
dissect_sapms_client ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , guint32 offset , guint8 opcode_version ) {
proto_item * client = NULL , * msg_types = NULL ;
proto_tree * client_tree = NULL , * msg_types_tree = NULL ;
struct e_in6_addr address_ipv6 ;
guint32 address_ipv4 = 0 ;
gint client_length = 0 , client_length_remaining = 0 ;
/* Chose the client length according to the version number */
if ( opcode_version = = 0x01 ) { /* This version was seen in the older releases (6.40) */
client_length = 67 ;
} else if ( opcode_version = = 0x02 ) { /* This version was seen in the older releases (6.40) */
client_length = 115 ;
} else if ( opcode_version = = 0x03 ) {
client_length = 150 ;
} else if ( opcode_version = = 0x04 ) { /* Version 4 was seen in releases >7.0 */
client_length = 160 ;
} else { /* Default to version 4 */
client_length = 160 ;
if ( global_sapms_highlight_items ) {
expert_add_info_format ( pinfo , tree , & ei_sapms_unknown_version , " This version has not been seen, dissection of this packet could be wrong for this version (0x%.2x) " , opcode_version ) ;
}
}
client_length_remaining = tvb_reported_length_remaining ( tvb , offset ) ;
if ( client_length_remaining < 0 ) {
expert_add_info ( pinfo , tree , & ei_sapms_client_invalid_offset ) ;
return ( 0 ) ;
}
if ( client_length_remaining < client_length ) {
expert_add_info_format ( pinfo , tree , & ei_sapms_client_invalid_length , " Invalid client length (expected=%d, actual=%d) " , client_length , client_length_remaining ) ;
return ( client_length_remaining ) ;
}
/* Add the client tree */
client = proto_tree_add_item ( tree , hf_sapms_server_lst_client , tvb , offset , client_length , ENC_NA ) ;
client_tree = proto_item_add_subtree ( client , ett_sapms ) ;
/* Client name field */
if ( opcode_version = = 0x01 ) {
proto_tree_add_item ( client_tree , hf_sapms_server_lst_name , tvb , offset , 20 , ENC_ASCII | ENC_NA ) ;
offset + = 20 ;
} else {
proto_tree_add_item ( client_tree , hf_sapms_server_lst_name , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
offset + = 40 ;
}
/* Host field (version 1 is 20 bytes, 2 is 32 bytes and version 3/4 is 64 bytes) */
if ( opcode_version = = 0x01 ) {
proto_tree_add_item ( client_tree , hf_sapms_server_lst_host , tvb , offset , 20 , ENC_ASCII | ENC_NA ) ;
offset + = 20 ;
} else if ( opcode_version = = 0x02 ) {
proto_tree_add_item ( client_tree , hf_sapms_server_lst_host , tvb , offset , 32 , ENC_ASCII | ENC_NA ) ;
offset + = 32 ;
} else {
proto_tree_add_item ( client_tree , hf_sapms_server_lst_host , tvb , offset , 64 , ENC_ASCII | ENC_NA ) ;
offset + = 64 ;
}
/* Service field */
proto_tree_add_item ( client_tree , hf_sapms_server_lst_service , tvb , offset , 20 , ENC_ASCII | ENC_NA ) ;
offset + = 20 ;
/* Message type flags */
msg_types = proto_tree_add_item ( client_tree , hf_sapms_server_lst_msgtypes , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
msg_types_tree = proto_item_add_subtree ( msg_types , ett_sapms ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_server_lst_msgtypes_dia , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_server_lst_msgtypes_upd , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_server_lst_msgtypes_enq , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_server_lst_msgtypes_btc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_server_lst_msgtypes_spo , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_server_lst_msgtypes_up2 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_server_lst_msgtypes_atp , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_server_lst_msgtypes_icm , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
/* Add the IPv6 address (only for version 3/4) */
if ( opcode_version > = 0x03 ) {
tvb_get_ipv6 ( tvb , offset , & address_ipv6 ) ;
proto_tree_add_ipv6 ( client_tree , hf_sapms_server_lst_hostaddr , tvb , offset , 16 , & address_ipv6 ) ;
offset + = 16 ;
}
/* Add the IPv4 address */
address_ipv4 = tvb_get_ipv4 ( tvb , offset ) ;
proto_tree_add_ipv4 ( client_tree , hf_sapms_server_lst_hostaddrv4 , tvb , offset , 4 , address_ipv4 ) ;
offset + = 4 ;
/* Service Number field */
proto_tree_add_item ( client_tree , hf_sapms_server_lst_servno , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
/* Other fields only on version 2/3/4 */
if ( opcode_version > = 0x02 ) {
proto_tree_add_item ( client_tree , hf_sapms_server_lst_status , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( client_tree , hf_sapms_server_lst_nitrc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
}
/* Add the Sys Server field (only for v4) */
if ( opcode_version = = 0x04 ) {
proto_tree_add_item ( client_tree , hf_sapms_server_lst_sys_service , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
}
/* Return the client length according to the version */
return ( client_length ) ;
}
static void
dissect_sapms_counter ( tvbuff_t * tvb , proto_tree * tree , guint32 offset ) {
proto_tree_add_item ( tree , hf_sapms_counter_uuid , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
offset + = 40 ;
proto_tree_add_item ( tree , hf_sapms_counter_count , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
proto_tree_add_item ( tree , hf_sapms_counter_no , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
}
static void
dissect_sapms_property ( tvbuff_t * tvb , proto_tree * tree , guint32 offset ) {
guint32 property_id = 0 ;
proto_item * value = NULL ;
proto_tree * value_tree = NULL ;
proto_tree_add_item ( tree , hf_sapms_property_client , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
offset + = 40 ;
property_id = tvb_get_guint32 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_property_id , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
/* Check if the property item has a value */
if ( ! tvb_offset_exists ( tvb , offset ) ) {
return ;
}
value = proto_tree_add_item ( tree , hf_sapms_property_value , tvb , offset , - 1 , ENC_NA ) ;
value_tree = proto_item_add_subtree ( value , ett_sapms ) ;
switch ( property_id ) {
case 0x02 : { /* MS_PROPERTY_VHOST */
guint16 vhost_length = 0 ;
proto_tree_add_item ( value_tree , hf_sapms_property_vhost_logon , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
offset + = 12 ; /* Padding */
vhost_length = tvb_get_guint16 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( value_tree , hf_sapms_property_vhost_length , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
if ( vhost_length > 0 ) {
proto_tree_add_item ( value_tree , hf_sapms_property_vhost_value , tvb , offset , vhost_length , ENC_ASCII | ENC_NA ) ;
}
break ;
}
case 0x03 : { /* MS_PROPERTY_IPADR */
proto_tree_add_item ( value_tree , hf_sapms_property_ip_address , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_property_ip_address6 , tvb , offset , 16 , ENC_NA ) ;
break ;
}
case 0x04 : { /* MS_PROPERTY_PARAM */
guint32 param_length = 0 ;
guint16 value_length = 0 ;
param_length = tvb_get_guint32 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( value_tree , hf_sapms_property_param_name_length , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
if ( param_length > 0 ) {
proto_tree_add_item ( value_tree , hf_sapms_property_param_name_value , tvb , offset , param_length , ENC_ASCII | ENC_NA ) ;
offset + = param_length ;
}
offset + = 100 - param_length ; /* Padding */
offset + = 2 ; /* Padding */
value_length = tvb_get_guint16 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( value_tree , hf_sapms_property_param_value_length , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
if ( param_length > 0 ) {
proto_tree_add_item ( value_tree , hf_sapms_property_param_value_value , tvb , offset , value_length , ENC_ASCII | ENC_NA ) ;
}
break ;
}
case 0x05 : { /* MS_PROPERTY_SERVICE */
proto_tree_add_item ( value_tree , hf_sapms_property_service_number , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
proto_tree_add_item ( value_tree , hf_sapms_property_service_value , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
break ;
}
case 0x07 : { /* Release Information */
proto_tree_add_item ( value_tree , hf_sapms_property_release , tvb , offset , 10 , ENC_ASCII | ENC_NA ) ;
offset + = 10 ;
proto_tree_add_item ( value_tree , hf_sapms_property_release_patchno , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_property_release_supplvl , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
proto_tree_add_item ( value_tree , hf_sapms_property_release_platform , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
break ;
}
}
}
static void
dissect_sapms_opcode ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , guint32 offset , guint8 flag , guint8 opcode , guint8 opcode_version , guint32 length ) {
gint client_length = 0 ;
switch ( opcode ) {
case 0x00 : { /* MS_DP_ADM */
tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_item ( tree , hf_sapms_dp_adm_dp_version , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
break ;
}
case 0x02 : /* MS_SERVER_ADD */
case 0x03 : /* MS_SERVER_SUB */
case 0x04 : { /* MS_SERVER_MOD */
dissect_sapms_client ( tvb , pinfo , tree , offset , opcode_version ) ;
break ;
}
case 0x05 : { /* MS_SERVER_LST */
if ( flag = = 0x03 ) { /* If it's a reply (flag=MS_REPLY) */
while ( tvb_reported_length_remaining ( tvb , offset ) > 0 ) {
client_length = dissect_sapms_client ( tvb , pinfo , tree , offset , opcode_version ) ;
offset + = client_length ;
}
}
break ;
}
case 0x06 : { /* MS_CHANGE_IP */
proto_tree_add_item ( tree , hf_sapms_change_ip_address , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
if ( opcode_version > = 0x02 ) {
proto_tree_add_item ( tree , hf_sapms_change_ip_address6 , tvb , offset , 16 , ENC_NA ) ;
}
break ;
}
case 0x07 : /* MS_SET_SECURITY_KEY */
case 0x08 : { /* MS_GET_SECURITY_KEY */
proto_tree_add_item ( tree , hf_sapms_security_name , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
offset + = 40 ;
proto_tree_add_item ( tree , hf_sapms_security_key , tvb , offset , 256 , ENC_ASCII | ENC_NA ) ;
break ;
}
case 0x09 : { /* MS_GET_SECURITY_KEY2 */
guint32 address_ipv4 ;
struct e_in6_addr address_ipv6 ;
address_ipv4 = tvb_get_ipv4 ( tvb , offset ) ;
proto_tree_add_ipv4 ( tree , hf_sapms_security_address , tvb , offset , 4 , address_ipv4 ) ;
offset + = 4 ;
proto_tree_add_item ( tree , hf_sapms_security_port , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
proto_tree_add_item ( tree , hf_sapms_security_key , tvb , offset , 256 , ENC_ASCII | ENC_NA ) ;
offset + = 256 ;
tvb_get_ipv6 ( tvb , offset , & address_ipv6 ) ;
proto_tree_add_ipv6 ( tree , hf_sapms_security_address6 , tvb , offset , 16 , & address_ipv6 ) ;
break ;
}
case 0x0a : { /* MS_GET_HWID */
proto_tree_add_none_format ( tree , hf_sapms_opcode_value , tvb , offset , length , " Hardware ID: %s " , tvb_get_string_enc ( pinfo - > pool , tvb , offset , length , ENC_ASCII ) ) ;
break ;
}
case 0x11 : { /* MS_GET_STATISTIC */
/* XXX: Fill fields for statistics */
break ;
}
case 0x1C : { /* MS_GET_CODEPAGE */
if ( flag = = 0x03 ) {
proto_tree_add_item ( tree , hf_sapms_codepage , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
}
break ;
}
case 0x1E : { /* MS_DUMP_INFO */
if ( flag = = 0x02 ) { /* If it's a request (flag=MS_REQUEST) */
proto_tree_add_item ( tree , hf_sapms_dump_dest , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( tree , hf_sapms_dump_filler , tvb , offset , 3 , ENC_NA ) ;
offset + = 3 ;
proto_tree_add_item ( tree , hf_sapms_dump_index , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
proto_tree_add_item ( tree , hf_sapms_dump_command , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
if ( length > = 48 ) {
proto_tree_add_item ( tree , hf_sapms_dump_name , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
}
} else if ( flag = = 0x03 ) { /* If it's a reply (flag=MS_REPLY) */
guint32 string_length = 0 ;
length = tvb_strsize ( tvb , offset ) ;
/* Add each string in a different item */
while ( length > 1 ) {
string_length = tvb_find_line_end ( tvb , offset , - 1 , NULL , FALSE ) ;
if ( string_length > 0 ) {
proto_tree_add_none_format ( tree , hf_sapms_opcode_value , tvb , offset , string_length , " %s " , tvb_get_string_enc ( pinfo - > pool , tvb , offset , string_length , ENC_ASCII ) ) ;
offset + = string_length ; length - = string_length ;
}
offset + = 1 ;
length - = 1 ;
}
}
break ;
}
case 0x1f : { /* MS_FILE_RELOAD */
proto_tree_add_item ( tree , hf_sapms_file_reload , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( tree , hf_sapms_file_filler , tvb , offset , 3 , ENC_NA ) ;
break ;
}
case 0x22 : /* MS_SET_TXT */
case 0x23 : { /* MS_GET_TXT */
guint32 text_length = 0 ;
proto_tree_add_item ( tree , hf_sapms_text_name , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
offset + = 40 ;
length - = 40 ;
text_length = tvb_get_guint32 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_text_length , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
/* Check length */
if ( text_length ! = length ) {
expert_add_info_format ( pinfo , tree , & ei_sapms_text_invalid_length , " Invalid text length (expected=%d, actual=%d) " , text_length , length ) ;
}
proto_tree_add_item ( tree , hf_sapms_text_value , tvb , offset , length , ENC_ASCII | ENC_NA ) ;
break ;
}
case 0x24 : /* MS_COUNTER_CREATE */
case 0x25 : /* MS_COUNTER_DELETE */
case 0x26 : /* MS_COUNTER_INCREMENT */
case 0x27 : /* MS_COUNTER_DECREMENT */
case 0x28 : /* MS_COUNTER_REGISTER */
case 0x29 : { /* MS_COUNTER_GET */
if ( tvb_reported_length_remaining ( tvb , offset ) > = 48 ) {
dissect_sapms_counter ( tvb , tree , offset ) ;
}
break ;
}
case 0x2a : { /* MS_COUNTER_LST */
while ( tvb_reported_length_remaining ( tvb , offset ) > = 48 ) {
dissect_sapms_counter ( tvb , tree , offset ) ;
offset + = 48 ;
}
break ;
}
case 0x2b : /* MS_SET_LOGON */
case 0x2c : /* MS_GET_LOGON */
case 0x2d : { /* MS_DEL_LOGON */
guint16 name_length = 0 , prot_length = 0 , host_length = 0 , misc_length = 0 , address6_length = 0 ;
guint32 address_ipv4 ;
struct e_in6_addr address_ipv6 ;
proto_tree_add_item ( tree , hf_sapms_logon_type , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
proto_tree_add_item ( tree , hf_sapms_logon_port , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
address_ipv4 = tvb_get_ipv4 ( tvb , offset ) ;
proto_tree_add_ipv4 ( tree , hf_sapms_logon_address , tvb , offset , 4 , address_ipv4 ) ;
offset + = 4 ;
length - = 4 ;
name_length = tvb_get_guint16 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_logon_name_length , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
if ( name_length > 0 & & length > = name_length ) {
proto_tree_add_item ( tree , hf_sapms_logon_name , tvb , offset , name_length , ENC_ASCII | ENC_NA ) ;
offset + = name_length ;
length - = name_length ;
}
prot_length = tvb_get_guint16 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_logon_prot_length , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
if ( prot_length > 0 & & length > = prot_length ) {
proto_tree_add_item ( tree , hf_sapms_logon_prot , tvb , offset , prot_length , ENC_ASCII | ENC_NA ) ;
offset + = prot_length ;
length - = prot_length ;
}
host_length = tvb_get_guint16 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_logon_host_length , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
if ( host_length > 0 & & length > = host_length ) {
proto_tree_add_item ( tree , hf_sapms_logon_host , tvb , offset , host_length , ENC_ASCII | ENC_NA ) ;
offset + = host_length ;
length - = host_length ;
}
misc_length = tvb_get_guint16 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_logon_misc_length , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
if ( misc_length > 0 & & length > = misc_length ) {
proto_tree_add_item ( tree , hf_sapms_logon_misc , tvb , offset , misc_length , ENC_ASCII | ENC_NA ) ;
offset + = misc_length ;
length - = misc_length ;
}
address6_length = tvb_get_guint16 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_logon_address6_length , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
if ( ( address6_length = = 16 ) & & ( length > = ( address6_length + ( guint32 ) 4 ) ) ) {
tvb_get_ipv6 ( tvb , offset , & address_ipv6 ) ;
proto_tree_add_ipv6 ( tree , hf_sapms_logon_address6 , tvb , offset , 16 , & address_ipv6 ) ;
offset + = 16 ;
proto_tree_add_item ( tree , hf_sapms_logon_end , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
} else { /* Add expert info if wrong IPv6 address length */
expert_add_info_format ( pinfo , tree , & ei_sapms_ip_invalid_length , " Invalid IPv6 address length (%d) or data " , address6_length ) ;
}
break ;
}
case 0x2e : /* MS_SERVER_DISC */
case 0x2f : /* MS_SERVER_SHUTDOWN */
case 0x30 : /* MS_SERVER_SOFT_SHUTDOWN */
case 0x4a : { /* MS_SERVER_TEST_SOFT_SHUTDOWN */
guint16 reason_length = 0 ;
client_length = dissect_sapms_client ( tvb , pinfo , tree , offset , opcode_version ) ;
offset + = client_length ;
length - = client_length ;
reason_length = tvb_get_guint16 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_shutdown_reason_length , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
if ( reason_length > 0 & & length > 0 ) {
reason_length = length < reason_length ? length : reason_length ;
proto_tree_add_item ( tree , hf_sapms_shutdown_reason , tvb , offset , reason_length , ENC_ASCII | ENC_NA ) ;
}
break ;
}
case 0x43 : /* MS_SET_PROPERTY */
case 0x44 : /* MS_GET_PROPERTY */
case 0x45 : { /* MS_DEL_PROPERTY */
dissect_sapms_property ( tvb , tree , offset ) ;
break ;
}
case 0x46 : { /* MS_IP_PORT_TO_NAME */
guint32 name_length = 0 ;
if ( opcode_version = = 0x01 ) {
guint32 address_ipv4 = tvb_get_ipv4 ( tvb , offset ) ;
proto_tree_add_ipv4 ( tree , hf_sapms_ip_to_name_address4 , tvb , offset , 4 , address_ipv4 ) ;
offset + = 4 ;
length - = 4 ;
} else if ( opcode_version = = 0x02 ) {
struct e_in6_addr address_ipv6 ;
tvb_get_ipv6 ( tvb , offset , & address_ipv6 ) ;
proto_tree_add_ipv6 ( tree , hf_sapms_ip_to_name_address6 , tvb , offset , 16 , & address_ipv6 ) ;
offset + = 16 ;
length - = 16 ;
}
proto_tree_add_item ( tree , hf_sapms_ip_to_name_port , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
name_length = tvb_get_guint32 ( tvb , offset , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_sapms_ip_to_name_length , tvb , offset , 4 , ENC_BIG_ENDIAN ) ;
offset + = 4 ;
length - = 4 ;
if ( name_length > 0 & & length > = name_length ) {
proto_tree_add_item ( tree , hf_sapms_ip_to_name , tvb , offset , name_length , ENC_ASCII | ENC_NA ) ;
}
break ;
}
case 0x47 : { /* MS_CHECK_ACL */
guint32 string_length = 0 ;
proto_tree_add_item ( tree , hf_sapms_check_acl_error_code , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
length - = 2 ;
string_length = tvb_strnlen ( tvb , offset , length ) + 1 ;
proto_tree_add_item ( tree , hf_sapms_check_acl_acl , tvb , offset , string_length , ENC_ASCII | ENC_NA ) ;
offset + = string_length ;
length - = string_length ;
string_length = tvb_strnlen ( tvb , offset , length ) + 1 ;
proto_tree_add_item ( tree , hf_sapms_check_acl_acl , tvb , offset , string_length , ENC_ASCII | ENC_NA ) ;
break ;
}
default : {
if ( global_sapms_highlight_items ) {
expert_add_info_format ( pinfo , tree , & ei_sapms_opcode_partial , " The opcode is dissected partially (0x%.2x) " , opcode ) ;
}
break ;
}
}
}
static int
dissect_sapms ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
{
guint32 offset = 0 ;
proto_item * ti = NULL , * oi = NULL , * msg_types = NULL ;
proto_tree * sapms_tree = NULL , * sapms_opcode_tree = NULL , * msg_types_tree = NULL ;
/* Add the protocol to the column */
col_add_str ( pinfo - > cinfo , COL_PROTOCOL , " SAPMS " ) ;
/* Clear out stuff in the info column */
col_clear ( pinfo - > cinfo , COL_INFO ) ;
/* Add the main sapms subtree */
ti = proto_tree_add_item ( tree , proto_sapms , tvb , 0 , - 1 , ENC_NA ) ;
sapms_tree = proto_item_add_subtree ( ti , ett_sapms ) ;
/* Check for the eye catcher string */
if ( tvb_strneql ( tvb , offset , " **MESSAGE** \00 " , 12 ) = = 0 ) {
gint remaining_length = 0 ;
guint8 flag = 0 , iflag = 0 , opcode = 0 , opcode_version = 0 ;
proto_tree_add_item ( sapms_tree , hf_sapms_eyecatcher , tvb , offset , 12 , ENC_ASCII | ENC_NA ) ;
offset + = 12 ;
proto_tree_add_item ( sapms_tree , hf_sapms_version , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_errorno , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_toname , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
offset + = 40 ;
msg_types = proto_tree_add_item ( sapms_tree , hf_sapms_msgtypes , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
msg_types_tree = proto_item_add_subtree ( msg_types , ett_sapms ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_msgtypes_dia , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_msgtypes_upd , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_msgtypes_enq , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_msgtypes_btc , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_msgtypes_spo , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_msgtypes_up2 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_msgtypes_atp , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( msg_types_tree , hf_sapms_msgtypes_icm , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_reserved , tvb , offset , 1 , ENC_NA ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_domain , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_reserved , tvb , offset , 1 , ENC_NA ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_key , tvb , offset , 8 , ENC_NA ) ;
offset + = 8 ;
flag = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_item ( sapms_tree , hf_sapms_flag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_item_append_text ( sapms_tree , " , Flag=%s " , val_to_str ( flag , sapms_flag_vals , " Unknown " ) ) ;
iflag = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_item ( sapms_tree , hf_sapms_iflag , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_item_append_text ( sapms_tree , " , IFlag=%s " , val_to_str ( iflag , sapms_iflag_vals , " Unknown " ) ) ;
col_append_fstr ( pinfo - > cinfo , COL_INFO , " Flag=%s,IFlag=%s " , val_to_str ( flag , sapms_flag_vals , " Unknown " ) , val_to_str ( iflag , sapms_iflag_vals , " Unknown " ) ) ;
proto_tree_add_item ( sapms_tree , hf_sapms_fromname , tvb , offset , 40 , ENC_ASCII | ENC_NA ) ;
offset + = 40 ;
if ( flag = = 0x00 & & iflag = = 0x00 ) { /* For MS_REQUEST+MS_LOGIN_2 it's the diag port */
proto_tree_add_item ( sapms_tree , hf_sapms_diagport , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
} else {
offset + = 2 ; /* Skip 2 bytes */
}
if ( ! tvb_offset_exists ( tvb , offset ) ) {
return 0 ;
}
/* The remaining of the packet is dissected based on the flag */
switch ( iflag ) {
/* MS_SEND_NAME or unknown (forwarded messages) */
case 0x00 : /* MS_UNKNOWN */
case 0x01 : /* MS_SEND_NAME */
case 0x02 : /* MS_SEND_TYPE */
case 0x07 : { /* MS_SEND_TYPE_ONCE */
opcode = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_item ( sapms_tree , hf_sapms_opcode , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_opcode_error , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
opcode_version = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_item ( sapms_tree , hf_sapms_opcode_version , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_opcode_charset , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_item_append_text ( sapms_tree , " , Opcode=%s " , val_to_str ( opcode , sapms_opcode_vals , " Unknown " ) ) ;
col_append_fstr ( pinfo - > cinfo , COL_INFO , " , Opcode=%s " , val_to_str ( opcode , sapms_opcode_vals , " Unknown " ) ) ;
/* Add the opcode value subtree */
remaining_length = tvb_reported_length_remaining ( tvb , offset ) ;
if ( remaining_length > 0 ) {
oi = proto_tree_add_item ( sapms_tree , hf_sapms_opcode_value , tvb , offset , remaining_length , ENC_NA ) ;
sapms_opcode_tree = proto_item_add_subtree ( oi , ett_sapms ) ;
dissect_sapms_opcode ( tvb , pinfo , sapms_opcode_tree , offset , flag , opcode , opcode_version , remaining_length ) ;
}
break ;
} case 0x05 : { /* MS_ADM_OPCODES */
proto_tree_add_item ( sapms_tree , hf_sapms_adm_eyecatcher , tvb , offset , 12 , ENC_ASCII | ENC_NA ) ;
offset + = 12 ;
proto_tree_add_item ( sapms_tree , hf_sapms_adm_version , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_adm_msgtype , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
proto_tree_add_item ( sapms_tree , hf_sapms_adm_recsize , tvb , offset , 11 , ENC_ASCII | ENC_NA ) ;
offset + = 11 ;
proto_tree_add_item ( sapms_tree , hf_sapms_adm_recno , tvb , offset , 11 , ENC_ASCII | ENC_NA ) ;
offset + = 11 ;
/* Add the records subtree */
remaining_length = tvb_reported_length_remaining ( tvb , offset ) ;
if ( remaining_length > 0 ) {
dissect_sapms_adm_record ( tvb , pinfo , sapms_tree , offset , remaining_length ) ;
}
break ;
}
}
}
return tvb_reported_length ( tvb ) ;
}
void
proto_register_sapms ( void )
{
static hf_register_info hf [ ] = {
/* General Header fields */
{ & hf_sapms_eyecatcher ,
{ " Eye Catcher " , " sapms.eyecatcher " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_version ,
{ " Version " , " sapms.version " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_errorno ,
{ " Error Number " , " sapms.errorno " , FT_UINT8 , BASE_HEX , VALS ( sapms_errorno_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_toname ,
{ " To Name " , " sapms.toname " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_msgtypes ,
{ " Message Type " , " sapms.msgtype " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_msgtypes_dia ,
{ " DIA " , " sapms.msgtype.dia " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_DIA , NULL , HFILL } } ,
{ & hf_sapms_msgtypes_upd ,
{ " UPD " , " sapms.msgtype.upd " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_UPD , NULL , HFILL } } ,
{ & hf_sapms_msgtypes_enq ,
{ " ENQ " , " sapms.msgtype.enq " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_ENQ , NULL , HFILL } } ,
{ & hf_sapms_msgtypes_btc ,
{ " BTC " , " sapms.msgtype.btc " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_BTC , NULL , HFILL } } ,
{ & hf_sapms_msgtypes_spo ,
{ " SPO " , " sapms.msgtype.spo " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_SPO , NULL , HFILL } } ,
{ & hf_sapms_msgtypes_up2 ,
{ " UP2 " , " sapms.msgtype.up2 " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_UP2 , NULL , HFILL } } ,
{ & hf_sapms_msgtypes_atp ,
{ " ATP " , " sapms.msgtype.atp " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_ATP , NULL , HFILL } } ,
{ & hf_sapms_msgtypes_icm ,
{ " ICM " , " sapms.msgtype.icm " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_ICM , NULL , HFILL } } ,
{ & hf_sapms_domain ,
{ " Domain " , " sapms.domain " , FT_UINT8 , BASE_HEX , VALS ( sapms_domain_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_reserved ,
{ " Reserved " , " sapms.reserved " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_key ,
{ " Key " , " sapms.key " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_flag ,
{ " Flag " , " sapms.flag " , FT_UINT8 , BASE_HEX , VALS ( sapms_flag_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_iflag ,
{ " IFlag " , " sapms.iflag " , FT_UINT8 , BASE_HEX , VALS ( sapms_iflag_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_fromname ,
{ " From Name " , " sapms.fromname " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_diagport ,
{ " Diag Port " , " sapms.diag_port " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
/* MS_DP_ADM fiels */
{ & hf_sapms_dp_adm_dp_version ,
{ " Dispatcher Version " , " sapms.dp_adm.version " , FT_UINT8 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
/* ADM Message fields */
{ & hf_sapms_adm_eyecatcher ,
{ " Adm Eye Catcher " , " sapms.adm.eyecatcher " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_version ,
{ " Adm Version " , " sapms.adm.version " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_msgtype ,
{ " Adm Message Type " , " sapms.adm.msgtype " , FT_UINT8 , BASE_HEX , VALS ( sapms_adm_msgtype_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_recsize ,
{ " Adm Record Size " , " sapms.adm.recsize " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_recno ,
{ " Adm Records Number " , " sapms.adm.recno " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_record ,
{ " Adm Record " , " sapms.adm.records " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_record_opcode ,
{ " Adm Record Opcode " , " sapms.adm.record.opcode " , FT_UINT8 , BASE_HEX , VALS ( sapms_adm_record_opcode_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_record_serial_number ,
{ " Adm Record Serial Number " , " sapms.adm.record.serial_number " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_record_executed ,
{ " Adm Record Executed " , " sapms.adm.record.executed " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_record_errorno ,
{ " Adm Record Error Number " , " sapms.adm.record.errorno " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_record_value ,
{ " Adm Record Value " , " sapms.adm.record.value " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_parameter ,
{ " Adm Profile Parameter " , " sapms.adm.parameter " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_rzl_strg_type ,
{ " Adm RZL String Type " , " sapms.adm.rzl_strg.type " , FT_UINT8 , BASE_HEX , VALS ( sapms_adm_rzl_strg_type_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_rzl_strg_name ,
{ " Adm RZL String Name " , " sapms.adm.rzl_strg.name " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_rzl_strg_value ,
{ " Adm RZL String Value " , " sapms.adm.rzl_strg.value " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_rzl_strg_value_integer ,
{ " Adm RZL String Integer Value " , " sapms.adm.rzl_strg.integer " , FT_INT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_rzl_strg_uptime ,
{ " Adm RZL String Uptime " , " sapms.adm.rzl_strg.uptime " , FT_INT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_rzl_strg_delay ,
{ " Adm RZL String Delay " , " sapms.adm.rzl_strg.delay " , FT_INT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_rzl_strg_users ,
{ " Adm RZL String Users " , " sapms.adm.rzl_strg.users " , FT_INT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_adm_rzl_strg_quality ,
{ " Adm RZL String Quality " , " sapms.adm.rzl_strg.quality " , FT_INT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
/* OPCODE fields */
{ & hf_sapms_opcode ,
{ " Opcode " , " sapms.opcode " , FT_UINT8 , BASE_HEX , VALS ( sapms_opcode_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_opcode_error ,
{ " Opcode Error " , " sapms.opcode.error " , FT_UINT8 , BASE_HEX , VALS ( sapms_opcode_error_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_opcode_version ,
{ " Opcode Version " , " sapms.opcode.version " , FT_UINT8 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_opcode_charset ,
{ " Opcode Character Set " , " sapms.opcode.charset " , FT_UINT8 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_opcode_value ,
{ " Opcode Value " , " sapms.opcode.value " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
/* MS_SET/GET/DEL_PROPERTY opcode fields */
{ & hf_sapms_property_client ,
{ " Property Client " , " sapms.property.client " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_id ,
{ " Property ID " , " sapms.property.id " , FT_UINT32 , BASE_DEC , VALS ( sapms_property_id_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_value ,
{ " Property " , " sapms.property.value " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_vhost_logon ,
{ " Property VHost Logon " , " sapms.property.vhost.logon " , FT_UINT16 , BASE_DEC , VALS ( sapms_logon_type_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_vhost_length ,
{ " Property VHost Length " , " sapms.property.vhost.length " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_vhost_value ,
{ " Property VHost Value " , " sapms.property.vhost.value " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_ip_address ,
{ " Property IP Address v4 " , " sapms.property.ipaddr4 " , FT_IPv4 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_ip_address6 ,
{ " Property IP Address v6 " , " sapms.property.ipaddr6 " , FT_IPv6 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_param_name_length ,
{ " Property Parameter Name Length " , " sapms.property.param.name_length " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_param_name_value ,
{ " Property Parameter Name " , " sapms.property.param.name " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_param_value_length ,
{ " Property Parameter Value Length " , " sapms.property.param.value_length " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_param_value_value ,
{ " Property Parameter Value " , " sapms.property.param.value " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_service_number ,
{ " Property Service Number " , " sapms.property.service.number " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_service_value ,
{ " Property Service Value " , " sapms.property.service.value " , FT_UINT8 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_release ,
{ " Property Release " , " sapms.property.release " , FT_STRINGZ , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_release_patchno ,
{ " Property Patch Number " , " sapms.property.patchno " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_release_supplvl ,
{ " Property Support Level " , " sapms.property.supplvl " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_property_release_platform ,
{ " Property Platform " , " sapms.property.platform " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
/* MS_GET_CODEPAGE */
{ & hf_sapms_codepage ,
{ " Codepage " , " sapms.codepage " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
/* MS_DUMP fields */
{ & hf_sapms_dump_dest ,
{ " Dump Dest " , " sapms.dump.dest " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_dump_filler ,
{ " Dump Filler " , " sapms.dump.filler " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_dump_index ,
{ " Dump Index " , " sapms.dump.index " , FT_UINT16 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_dump_command ,
{ " Dump Command " , " sapms.dump.command " , FT_UINT16 , BASE_HEX , VALS ( sapms_dump_command_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_dump_name ,
{ " Dump Name " , " sapms.dump.name " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
/* MS_SERVER_LIST fields */
{ & hf_sapms_server_lst_client ,
{ " Client " , " sapms.serverlst.client " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_name ,
{ " Client Name " , " sapms.serverlst.name " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_host ,
{ " Host " , " sapms.serverlst.host " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_service ,
{ " Service " , " sapms.serverlst.service " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes ,
{ " Message Types " , " sapms.serverlst.msgtypes " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes_dia ,
{ " DIA " , " sapms.serverlst.msgtype.dia " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_DIA , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes_upd ,
{ " UPD " , " sapms.serverlst.msgtype.upd " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_UPD , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes_enq ,
{ " ENQ " , " sapms.serverlst.msgtype.enq " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_ENQ , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes_btc ,
{ " BTC " , " sapms.serverlst.msgtype.btc " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_BTC , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes_spo ,
{ " SPO " , " sapms.serverlst.msgtype.spo " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_SPO , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes_up2 ,
{ " UP2 " , " sapms.serverlst.msgtype.up2 " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_UP2 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes_atp ,
{ " ATP " , " sapms.serverlst.msgtype.atp " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_ATP , NULL , HFILL } } ,
{ & hf_sapms_server_lst_msgtypes_icm ,
{ " ICM " , " sapms.serverlst.msgtype.icm " , FT_BOOLEAN , 8 , NULL , SAPMS_MSG_TYPE_ICM , NULL , HFILL } } ,
{ & hf_sapms_server_lst_hostaddr ,
{ " Host Address v6 " , " sapms.serverlst.hostaddr " , FT_IPv6 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_hostaddrv4 ,
{ " Host Address v4 " , " sapms.serverlst.hostaddr4 " , FT_IPv4 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_servno ,
{ " Service Number " , " sapms.serverlst.servno " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_status ,
{ " Status " , " sapms.serverlst.status " , FT_UINT8 , BASE_HEX , VALS ( sapms_server_lst_status_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_nitrc ,
{ " NI Trace " , " sapms.serverlst.nitrc " , FT_UINT8 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_server_lst_sys_service ,
{ " Sys Service " , " sapms.serverlst.sysservice " , FT_UINT32 , BASE_HEX , NULL , 0x0 , NULL , HFILL } } ,
/* MS_SET_SECURITY_KEY, MS_GET_SECURITY_KEY and MS_GET_SECURITY_KEY2 fields */
{ & hf_sapms_security_name ,
{ " Security Name " , " sapms.security.name " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_security_key ,
{ " Security Key " , " sapms.security.key " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_security_port ,
{ " Security Port " , " sapms.security.port " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_security_address ,
{ " Security Address v4 " , " sapms.security.addr " , FT_IPv4 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_security_address6 ,
{ " Security Address v6 " , " sapms.security.addr6 " , FT_IPv6 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
/* MS_SET_TEXT, MS_GET_TEXT */
{ & hf_sapms_text_name ,
{ " Text Name " , " sapms.text.name " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_text_length ,
{ " Text Length " , " sapms.text.length " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_text_value ,
{ " Text Value " , " sapms.text.value " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
/* COUNTER fields */
{ & hf_sapms_counter_uuid ,
{ " Counter UUID " , " sapms.counter.uuid " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_counter_count ,
{ " Counter Count " , " sapms.counter.count " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_counter_no ,
{ " Counter Number " , " sapms.counter.no " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
/* CHANGE_IP fields */
{ & hf_sapms_change_ip_address ,
{ " Change IP Address IPv4 " , " sapms.change.addr " , FT_IPv4 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_change_ip_address6 ,
{ " Change IP Address IPv6 " , " sapms.change.addr6 " , FT_IPv6 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
/* FILE RELOAD fields */
{ & hf_sapms_file_reload ,
{ " File Reload Name " , " sapms.filereload.name " , FT_UINT8 , BASE_HEX , VALS ( sapms_file_reload_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_file_filler ,
{ " File Reload Filler " , " sapms.filereload.filler " , FT_NONE , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
/* MS_GET_LOGON, MS_SET_LOGON and MS_DEL_LOGON fields */
{ & hf_sapms_logon_type ,
{ " Logon Type " , " sapms.logon.type " , FT_UINT16 , BASE_HEX , VALS ( sapms_logon_type_vals ) , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_port ,
{ " Logon Port " , " sapms.logon.port " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_address ,
{ " Logon Address IPv4 " , " sapms.logon.addr " , FT_IPv4 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_name_length ,
{ " Logon Name Length " , " sapms.logon.name_length " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_name ,
{ " Logon Name " , " sapms.logon.name " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_prot_length ,
{ " Logon Protocol Length " , " sapms.logon.prot_length " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_prot ,
{ " Logon Protocol " , " sapms.logon.prot " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_host_length ,
{ " Logon Host Length " , " sapms.logon.host_length " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_host ,
{ " Logon Host " , " sapms.logon.host " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_misc_length ,
{ " Logon Misc Length " , " sapms.logon.misc_length " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_misc ,
{ " Logon Misc " , " sapms.logon.misc " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_address6_length ,
{ " Logon Address IPv6 Length " , " sapms.logon.addr6_length " , FT_INT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_address6 ,
{ " Logon Address IPv6 " , " sapms.logon.address6 " , FT_IPv6 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_logon_end ,
{ " Logon Address End " , " sapms.logon.end " , FT_INT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_shutdown_reason_length ,
{ " Shutdown Reason Length " , " sapms.shutdown.reason_length " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_shutdown_reason ,
{ " Shutdown Reason " , " sapms.shutdown.reason " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
/* MS_IP_PORT_TO_NAME fields */
{ & hf_sapms_ip_to_name_address4 ,
{ " IP to Name Address IPv4 " , " sapms.ip_to_name.addr4 " , FT_IPv4 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_ip_to_name_address6 ,
{ " IP to Name Address IPv6 " , " sapms.ip_to_name.addr6 " , FT_IPv6 , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_ip_to_name_port ,
{ " IP to Name Port " , " sapms.ip_to_name.port " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_ip_to_name_length ,
{ " IP to Name Length " , " sapms.ip_to_name.name_length " , FT_UINT32 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_ip_to_name ,
{ " IP to Name " , " sapms.ip_to_name.name " , FT_STRING , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
/* MS_CHECK_ACL fields */
{ & hf_sapms_check_acl_error_code ,
{ " Check ACL Error Code " , " sapms.check_acl.error_code " , FT_UINT16 , BASE_DEC , NULL , 0x0 , NULL , HFILL } } ,
{ & hf_sapms_check_acl_acl ,
{ " Check ACL Entry " , " sapms.check_acl.acl " , FT_STRINGZ , BASE_NONE , NULL , 0x0 , NULL , HFILL } } ,
} ;
/* Setup protocol subtree array */
static gint * ett [ ] = {
& ett_sapms
} ;
/* Register the expert info */
static ei_register_info ei [ ] = {
{ & ei_sapms_adm_opcode_partial , { " sapms.adm.record.opcode.unknown " , PI_UNDECODED , PI_WARN , " The ADM opcode is dissected partially " , EXPFILL } } ,
{ & ei_sapms_opcode_partial , { " sapms.opcode.unknown " , PI_UNDECODED , PI_WARN , " The opcode is dissected partially " , EXPFILL } } ,
{ & ei_sapms_unknown_version , { " sapms.serverlst.unknown " , PI_UNDECODED , PI_WARN , " This version has not been seen, dissection of this packet could be wrong for this version " , EXPFILL } } ,
{ & ei_sapms_client_invalid_offset , { " sapms.serverlst.offset.invalid " , PI_MALFORMED , PI_WARN , " Invalid offset " , EXPFILL } } ,
{ & ei_sapms_client_invalid_length , { " sapms.serverlst.length.invalid " , PI_MALFORMED , PI_WARN , " Invalid client length " , EXPFILL } } ,
{ & ei_sapms_text_invalid_length , { " sapms.text.length.invalid " , PI_MALFORMED , PI_WARN , " Invalid text length " , EXPFILL } } ,
{ & ei_sapms_ip_invalid_length , { " sapms.logon.address6.invalid " , PI_MALFORMED , PI_WARN , " Invalid IPv6 address length or data " , EXPFILL } } ,
} ;
module_t * sapms_module ;
expert_module_t * sapms_expert ;
/* Register the protocol */
proto_sapms = proto_register_protocol ( " SAP Message Server Protocol " , " SAPMS " , " sapms " ) ;
register_dissector ( " sapms " , dissect_sapms , proto_sapms ) ;
proto_register_field_array ( proto_sapms , hf , array_length ( hf ) ) ;
proto_register_subtree_array ( ett , array_length ( ett ) ) ;
sapms_expert = expert_register_protocol ( proto_sapms ) ;
expert_register_field_array ( sapms_expert , ei , array_length ( ei ) ) ;
/* Register the preferences */
sapms_module = prefs_register_protocol ( proto_sapms , proto_reg_handoff_sapms ) ;
range_convert_str ( wmem_epan_scope ( ) , & global_sapms_port_range , SAPMS_PORT_RANGE , MAX_TCP_PORT ) ;
prefs_register_range_preference ( sapms_module , " tcp_ports " , " SAP MS Protocol TCP port numbers " , " Port numbers used for SAP MS Protocol (default " SAPMS_PORT_RANGE " ) " , & global_sapms_port_range , MAX_TCP_PORT ) ;
prefs_register_bool_preference ( sapms_module , " highlight_unknown_items " , " Highlight unknown SAP MS messages " , " Whether the SAP MS Protocol dissector should highlight unknown MS messages (migth be noise and generate a lot of expert warnings) " , & global_sapms_highlight_items ) ;
}
/**
* Helpers for dealing with the port range
*/
static void range_delete_callback ( guint32 port , gpointer ptr _U_ )
{
dissector_delete_uint ( " sapni.port " , port , sapms_handle ) ;
}
static void range_add_callback ( guint32 port , gpointer ptr _U_ )
{
dissector_add_uint ( " sapni.port " , port , sapms_handle ) ;
}
/**
* Register Hand off for the SAP MS Protocol
*/
void
proto_reg_handoff_sapms ( void )
{
static range_t * sapms_port_range ;
static gboolean initialized = FALSE ;
if ( ! initialized ) {
sapms_handle = create_dissector_handle ( dissect_sapms , proto_sapms ) ;
initialized = TRUE ;
} else {
range_foreach ( sapms_port_range , range_delete_callback , NULL ) ;
wmem_free ( wmem_epan_scope ( ) , sapms_port_range ) ;
}
sapms_port_range = range_copy ( wmem_epan_scope ( ) , global_sapms_port_range ) ;
range_foreach ( sapms_port_range , range_add_callback , NULL ) ;
}
/*
* Editor modelines - https : //www.wireshark.org/tools/modelines.html
*
* Local variables :
* c - basic - offset : 8
* tab - width : 8
* indent - tabs - mode : t
* End :
*
* vi : set shiftwidth = 8 tabstop = 8 noexpandtab :
* : indentSize = 8 : tabSize = 8 : noTabs = false :
*/