freeswitch/libs/sipcc/include/plat_api.h

721 lines
21 KiB
C

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef _PLAT_API_H_
#define _PLAT_API_H_
#include "cc_constants.h"
#include "cpr_socket.h"
#include "cc_types.h"
/**
* Define unregister reason
*/
#define CC_UNREG_REASON_UNSPECIFIED 0
//Common with what SCCP uses...need to match with J-Side
#define CC_UNREG_REASON_TCP_TIMEOUT 10
#define CC_UNREG_REASON_CM_RESET_TCP 12
#define CC_UNREG_REASON_CM_ABORTED_TCP 13
#define CC_UNREG_REASON_CM_CLOSED_TCP 14
#define CC_UNREG_REASON_REG_TIMEOUT 17
#define CC_UNREG_REASON_FALLBACK 18
#define CC_UNREG_REASON_PHONE_KEYPAD 20
#define CC_UNREG_REASON_RESET_RESET 22
#define CC_UNREG_REASON_RESET_RESTART 23
#define CC_UNREG_REASON_PHONE_REG_REJ 24
#define CC_UNREG_REASON_PHONE_INITIALIZED 25
#define CC_UNREG_REASON_VOICE_VLAN_CHANGED 26
#define CC_UNREG_REASON_POWER_SAVE_PLUS 32
//sip specific ones...need to match with J-Side
#define CC_UNREG_REASON_VERSION_STAMP_MISMATCH 100
#define CC_UNREG_REASON_VERSION_STAMP_MISMATCH_CONFIG 101
#define CC_UNREG_REASON_VERSION_STAMP_MISMATCH_SOFTKEY 102
#define CC_UNREG_REASON_VERSION_STAMP_MISMATCH_DIALPLAN 103
#define CC_UNREG_REASON_APPLY_CONFIG_RESTART 104
#define CC_UNREG_REASON_CONFIG_RETRY_RESTART 105
#define CC_UNREG_REASON_TLS_ERROR 106
#define CC_UNREG_REASON_RESET_TO_INACTIVE_PARTITION 107
#define CC_UNREG_REASON_VPN_CONNECTIVITY_LOST 108
#define CC_IPPROTO_UDP 17
#define CC_IPPROTO_TCP 6
/**
* socket security status
*/
typedef enum
{
PLAT_SOCK_SECURE,
PLAT_SOCK_NONSECURE
} plat_soc_status_e;
/**
* socket connection status
*/
typedef enum
{
PLAT_SOCK_CONN_OK,
PLAT_SOCK_CONN_WAITING,
PLAT_SOCK_CONN_FAILED
} plat_soc_connect_status_e;
/**
* socket connection type
*/
typedef enum
{
PLAT_SOCK_CUCM
} plat_soc_connect_type_e;
/**
* socket connection mode
*/
typedef enum
{
PLAT_SOCK_AUTHENTICATED,
PLAT_SOCK_ENCRYPTED,
PLAT_SOCK_NON_SECURE
} plat_soc_connect_mode_e;
/**
* psipcc core debug categories
*/
typedef enum
{
CC_DEBUG_CCAPP,
CC_DEBUG_CONFIG_CACHE,
CC_DEBUG_SIP_ADAPTER,
CC_DEBUG_CCAPI,
CC_DEBUG_CC_MSG,
CC_DEBUG_FIM,
CC_DEBUG_FSM,
CC_DEBUG_AUTH,
CC_DEBUG_GSM,
CC_DEBUG_LSM,
CC_DEBUG_FSM_CAC,
CC_DEBUG_DCSM,
CC_DEBUG_SIP_TASK,
CC_DEBUG_SIP_STATE,
CC_DEBUG_SIP_MSG,
CC_DEBUG_SIP_REG_STATE,
CC_DEBUG_SIP_TRX,
CC_DEBUG_TIMERS,
CC_DEBUG_SIP_DM,
CC_DEBUG_CCDEFAULT, /* Always ON by default */
CC_DEBUG_DIALPLAN,
CC_DEBUG_KPML,
CC_DEBUG_REMOTE_CC,
CC_DEBUG_SIP_PRESENCE,
CC_DEBUG_CONFIG_APP,
CC_DEBUG_CALL_EVENT,
CC_DEBUG_PLAT,
CC_DEBUG_NOTIFY,
CC_DEBUG_CPR_MEMORY, /* Has additional parameters - Tracking/poison */
CC_DEBUG_MAX /* NOT USED */
} cc_debug_category_e;
/**
* debug show categories
*/
typedef enum
{
CC_DEBUG_SHOW_FSMCNF,
CC_DEBUG_SHOW_FSMDEF,
CC_DEBUG_SHOW_FSMXFR,
CC_DEBUG_SHOW_FSMB2BCNF,
CC_DEBUG_SHOW_DCSM,
CC_DEBUG_SHOW_FIM,
CC_DEBUG_SHOW_FSM,
CC_DEBUG_SHOW_LSM,
CC_DEBUG_SHOW_BULK_REGISTER,
CC_DEBUG_SHOW_KPML,
CC_DEBUG_SHOW_REMOTE_CC,
CC_DEBUG_SHOW_CONFIG_CACHE,
CC_DEBUG_SHOW_SUBS_STATS,
CC_DEBUG_SHOW_PUBLISH_STATS,
CC_DEBUG_SHOW_REGISTER,
CC_DEBUG_SHOW_DIALPLAN,
CC_DEBUG_SHOW_CPR_MEMORY, /* Has additional parameters -
config/heap-gaurd/stat/tracking. */
CC_DEBUG_SHOW_MAX
} cc_debug_show_options_e;
/**
* debug clear categories
*/
typedef enum
{
CC_DEBUG_CLEAR_CPR_MEMORY,
CC_DEBUG_CLEAR_MAX
} cc_debug_clear_options_e;
/**
* cpr memory debug sub-categories
*/
typedef enum
{
CC_DEBUG_CPR_MEM_TRACKING,
CC_DEBUG_CPR_MEM_POISON
} cc_debug_cpr_mem_options_e;
/**
* cpr memory clear sub-commands
*/
typedef enum
{
CC_DEBUG_CLEAR_CPR_TRACKING,
CC_DEBUG_CLEAR_CPR_STATISTICS
} cc_debug_clear_cpr_options_e;
/**
* cpr memory show sub-commands
*/
typedef enum
{
CC_DEBUG_SHOW_CPR_CONFIG,
CC_DEBUG_SHOW_CPR_HEAP_GUARD,
CC_DEBUG_SHOW_CPR_STATISTICS,
CC_DEBUG_SHOW_CPR_TRACKING
} cc_debug_show_cpr_options_e;
/**
* Enabling/disabling debugs
*/
typedef enum
{
CC_DEBUG_DISABLE,
CC_DEBUG_ENABLE
} cc_debug_flag_e;
// Corresponds to the values for XML tags DHCPv4Status and DHCPv6Status
typedef enum {
DHCP_STATUS_GOOD = 1,
DHCP_STATUS_TIMEOUT,
DHCP_STATUS_DISABLED
} dhcp_status_e;
// Corresponds to the value for XML tag for DNSStatusUnifiedCMX
typedef enum {
DNS_STATUS_GOOD = 1,
DNS_STATUS_TIMEOUT,
DNS_STATUS_DID_NOT_RESOLVE,
DNS_STATUS_NA_IP_CONFIGURED
} ucm_dns_resolution_status_e;
#define LEN32 32
#define IP_ADDR_MAX_LEN 32
#define PORT_MAX_LEN 20
#define STATUS_MAX_LEN 4
#define LEN80 80
#define WIRED_PROP_PREFIX "dhcp.eth0"
#define WIRELESS_PROP_PREFIX "dhcp.mlan0"
#define WIRED_INT 1
#define WIFI_INT 2
/**
* Called by the thread to initialize any thread specific data
* once the thread is created.
*
* @param[in] tname thread name
*
* @return 0 - SUCCESS
* -1 - FAILURE
*/
int platThreadInit(char * tname);
/**
* The initial initialization function for any platform related
* modules
*
*
* @return 0 - SUCCESS
* -1 - FAILURE
*/
int platInit();
/**
* The initial initialization function for the debugging/logging
* modules
*
*/
void debugInit();
/**
* Get device model that will be sent to cucm in the UserAgent header
*
* @return char * Pointer to the string containing the model number of the phone.
*/
char *platGetModel();
/**
* plat_audio_device_t
* Enums for indicating audio device
*/
typedef enum vcm_audio_device_type {
VCM_AUDIO_DEVICE_NONE,
VCM_AUDIO_DEVICE_HEADSET,
VCM_AUDIO_DEVICE_SPEAKER
} plat_audio_device_t;
/**
* Add cc control classifier
*
* Called by SIP stack to specify addresses and ports that will be used for call control
*
* @param[in] myIPAddr - phone local interface IP Address
* @param[in] myPort - phone local interface Port
* @param[in] cucm1IPAddr - CUCM 1 IP Address
* @param[in] cucm1Port - CUCM 1 Port
* @param[in] cucm2IPAddr - CUCM 2 IP Address
* @param[in] cucm2Port - CUCM 2 Port
* @param[in] cucm3IPAddr - CUCM 3 IP Address
* @param[in] cucm3Port - CUCM 3 Port
* @param[in] protocol - CC_IPPROTO_UDP or CC_IP_PROTO_TCP
*
* @note : Needed only if using WiFi. If not using Wifi please provide a stub
*/
void platAddCallControlClassifiers(unsigned long myIPAddr, unsigned short myPort,
unsigned long cucm1IPAddr, unsigned short cucm1Port,
unsigned long cucm2IPAddr, unsigned short cucm2Port,
unsigned long cucm3IPAddr, unsigned short cucm3Port,
unsigned char protocol);
/**
* Remove cc control classifier.
*
* Undo platAddCallControlClassifiers
*/
void platRemoveCallControlClassifiers();
/**
* Tell whether wifi is supported and active
*
* @return boolean wether WLAN is active or not
*/
cc_boolean platWlanISActive();
/**
* Check if the netowrk interface changed.
*
* @return boolean returns TRUE if the network interface has changed
*
* @note Most common case is for softphone clients where if a PC is
* undocked the network interface changes from wired to wireless.
*/
boolean platIsNetworkInterfaceChanged();
/**
* Get active phone load name
*
* Returns the phone images in the active and inactive partitions
* The phone reports these phone loads to CUCM for display on the Admin page
*
* @param[in] image_a : Populate the image name from partition a
* @param[in] image_b : Populate the image name from partition b
* @param[in] len : Length of the pointers for image_a and image_b
* @return 1 - image_a is active
* 2 - image_b is active
* -1 - Failure
*/
int platGetActiveInactivePhoneLoadName(char * image_a, char * image_b, int len);
/**
* Get localized phrase for the specified index
*
* @param[in] index the phrase index, see
* @param[in] phrase the return phrase holder
* @param[in] len the input length to cap the maximum value
*
* @return SUCCESS or FAILURE
*/
int platGetPhraseText(int index, char* phrase, unsigned int len);
/**
* Set the unregistration reason
*
* @param[in] reason see the unregister reason definitions.
*
* @note we expect the platform to save this value in Non Volatile memory
* This will be retrieved later by using platGetUnregReason. This reason is reported to CUCM
*/
void platSetUnregReason(int reason);
/**
* Get the unregistration reason code.
*
* @return reason code for unregistration
*/
int platGetUnregReason();
/**
* Sets the time based on Date header in 200 OK from REGISTER request
* @param void
* @return void
*/
void platSetCucmRegTime (void);
/**
* Set the kpml value for application.
*
* @param kpml_config the kpml value
*/
void platSetKPMLConfig(cc_kpml_config_t kpml_config);
/**
* Check if a line has active MWI status
*
* @param line
*
* @return boolean
*
* @note The stack doesn't store the MWI status and expects
* the application to store that information. The stack
* queries the mwi status from the application using this method.
*/
boolean platGetMWIStatus(cc_lineid_t line);
/**
* Check if the speaker or headset is enabled.
*
* @return boolean if the speaker or headset is enabled, returns true.
*/
boolean platGetSpeakerHeadsetMode();
/**
* Secure Socket API's.
* The pSIPCC expects the following Secure Socket APIs to be implemented in the
* vendor porting layer.
*/
/**
* platSecIsServerSecure
*
* @brief Lookup the secure status of the server
*
* This function looks at the the CCM server type by using the security library
* and returns appropriate indication to the pSIPCC.
*
*
* @return Server is security enabled or not
* PLAT_SOCK_SECURE or PLAT_SOCK_NONSECURE
*
* @note This API maps to the following HandyIron API:
* int secIsServerSecure(SecServerType type) where type should be SRVR_TYPE_CCM
*/
plat_soc_status_e platSecIsServerSecure(void);
/**
* platSecSocConnect
* @brief Securely connect to a remote server
*
* This function uses the security library APIs to connect to a remote server.
* @param[in] host server addr
* @param[in] port port number
* @param[in] ipMode IP mode to indicate v6, v4 or both
* @param[in] mode blocking connect or not
* FALSE: non-blocking; TRUE: blocking
* @param[in] tos TOS value
* @param[in] connectionMode The mode of the connection
* (Authenticated/Encrypted)
* @param[out] localPort local port used for the connection
*
* @return client socket descriptor
* >=0: connected or in progress
* INVALID SOCKET: failed
*
* @pre (hostAndPort not_eq NULL)
* @pre (localPort not_eq NULL)
*
* @note localPort is undefined when the return value is INVALID_SOCKET
*
* @note This API maps to the HandyIron APIs as follows:
* If mode == TRUE (blocking):
* int secEstablishSecureConnection(const char* serverAddr, *uint32_t port, secConnectionType type)
* @li ipMode is UNUSED
* @li "host" maps to "serverAddr", "type" should be determined by an application and use the value from SecServerType.
* @li localPort is passed in as 0
* If mode == FALSE (non-blocking):
* int secConnect(const char* serverAddr, uint32_t port, *secConnectionType type, uint32_t localPort)
* @li ipMode is UNUSED
* @li "host" maps to "serverAddr", "type" should be determined by an application and use the value from SecServerType.
*
* @note The implementation should use the "setsockopt" to set the "tos" value passed
* in this API on the created socket.
*
*/
cpr_socket_t
platSecSocConnect (char *host,
int port,
int ipMode,
boolean mode,
unsigned int tos,
plat_soc_connect_mode_e connectionMode,
cc_uint16_t *localPort);
/**
* platSecSockIsConnected
* Determine the status of a secure connection that was initiated
* in non-blocking mode
*
* @param[in] sock socket descriptor
*
* @return connection status
* @li connection complete: PLAT_SOCK_CONN_OK
* @li connection waiting: PLAT_SOCK_CONN_WAITING
* @li connection failed: PLAT_SOCK_CONN_FAILED
*
* @note This API maps to the following HandyIron API:
* int secIsConnectionReady (int connDesc)
* The "sock" is the connection descriptor.
*/
plat_soc_connect_status_e platSecSockIsConnected (cpr_socket_t sock);
/**
* platGenerateCryptoRand
* @brief Generates a Random Number
*
* Generate crypto graphically random number for a desired length.
* The function is expected to be much slower than the cpr_rand().
* This function should be used when good random number is needed
* such as random number that to be used for SRTP key for an example.
*
* @param[in] buf - pointer to the buffer to store the result of random
* bytes requested.
* @param[in] len - pointer to the length of the desired random bytes.
* When calling the function, the integer's value
* should be set to the desired number of random
* bytes ('buf' should be of at least this size).
* upon success, its value will be set to the
* actual number of random bytes being returned.
* (realistically, there is a maximum number of
* random bytes that can be returned at a time.
* if the caller request more than that, the
* 'len' will indicate how many bytes are actually being
* returned) on failure, its value will be set to 0.
*
* @return
* 1 - success.
* 0 - fail.
*
* @note The intent of this function is to generate a cryptographically strong
* random number. Vendors can map this to HandyIron or OpenSSL random number
* generation functions.
*
* @note This API maps to the following HandyIron API:
* int secGetRandomData(uint8_t *buf, uint32_t size). Also note that a
* "secAddEntropy(...)" may be required the first time to feed entropy data to
* the random number generator.
*/
int platGenerateCryptoRand(cc_uint8_t *buf, int *len);
/**
* platSecSocSend
*
* @brief The platSecSocSend() function is used to send data over a secure
* socket.
*
* The platSecSocSend() function shall transmit a message from the specified socket to
* its peer. The platSecSocSend() function shall send a message only when the socket is
* connected. The length of the message to be sent is specified by the length
* argument. If the message is too long to pass through the underlying protocol,
* platSecSocSend() shall fail and no data is transmitted. Delivery of the message is
* not guaranteed.
*
* @param[in] soc Specifies the socket created with cprSocket() to send
* @param[in] buf A pointer to the buffer of the message to send.
* @param[in] len Specifies the length in bytes of the message pointed to by the buffer argument.
*
* @return Upon successful completion, platSecSocSend() shall return the number of
* bytes sent. Otherwise, SOCKET_ERROR shall be returned and cpr_errno set to
* indicate the error.
*
* @note The possible error values this function should return are
* @li [CPR_EBADF] The socket argument is not a valid file descriptor
* @li [CPR_ENOTSOCK] socket does not refer to a socket descriptor
* @li [CPR_EAGAIN] The socket is marked non-blocking and no data can
* be sent
* @li [CPR_EWOULDBLOCK] Same as CPR_EAGAIN
* @li [CPR_ENOTCONN] A connection-mode socket that is not connected
* @li [CPR_ENOTSUPP] The specified flags are not supported for this
* type of socket or protocol.
* @li [CPR_EMSGSIZE] The message is too large to be sent all at once
* @li [CPR_EDESTADDRREQ] The socket has no peer address set
*
*/
ssize_t
platSecSocSend (cpr_socket_t soc,
CONST void *buf,
size_t len);
/**
* platSecSocRecv
*
* @brief The platSecSocRecv() function shall receive a message from a secure socket.
*
* This function is normally used with connected sockets because it does not permit
* the application to retrieve the source address of received data. The
* platSecSocRecv() function shall return the length of the message written to
* the buffer pointed to by the "buf" argument.
*
* @param[in] soc - Specifies the socket to receive data
* @param[out] buf - Contains the data received
* @param[out] len - The length of the data received
*
* @return On success the length of the message in bytes (including zero).
* On failure SOCKET_ERROR shall be returned and cpr_errno set to
* indicate the error.
*
* @note The possible error values this function should return are
* @li [CPR_EBADF] The socket argument is not a valid file descriptor
* @li [CPR_ENOTSOCK] The descriptor references a file, not a socket.
* @li [CPR_EAGAIN] The socket is marked non-blocking and no data is
* waiting to be received.
* @li [CPR_EWOULDBLOCK] Same as CPR_EAGAIN
* @li [CPR_ENOTCONN] A receive attempt is made on a connection-mode socket that is not connected
* @li [CPR_ENOTSUPP] The specified flags are not supported for this type of socket or protocol
*
*/
ssize_t
platSecSocRecv (cpr_socket_t soc,
void * RESTRICT buf,
size_t len);
/**
* platSecSocClose
*
* @brief The platSecSocClose function shall close a secure socket
*
* The platSecSocClose() function shall destroy the socket descriptor indicated
* by socket.
*
* @param[in] soc - The socket that needs to be destroyed
*
* @return CPR_SUCCESS on success otherwise, CPR_FAILURE. cpr_errno needs to be set in this case.
*
* @note The possible error values this function should return are
* @li [CPR_EBADF] socket is not a valid socket descriptor.
*/
cpr_status_e
platSecSocClose (cpr_socket_t soc);
/**
* Sets the SIS protocol version
*
* @param a - major version
* @param b - minor version
* @param c - additional version information
* @param name - version name
*
* @return void
* @note the platform should store this information and provide it when asked via the platGetSISProtocolVer()
*/
void platSetSISProtocolVer(cc_uint32_t a, cc_uint32_t b, cc_uint32_t c, char* name);
/**
* Provides the SIS protocol version
*
* @param *a pointer to fill in the major version
* @param *b pointer to fill in the minor version
* @param *c pointer to fill in the additonal version
* @param *name pointer to fill in the version name
*
* @return void
*/
void
platGetSISProtocolVer (cc_uint32_t *a, cc_uint32_t *b, cc_uint32_t *c, char* name);
/**
* Provides the local IP address
*
* @return char * returns the local IP address
*/
char *platGetIPAddr();
/**
* Provides the local MAC address
*
* @param *maddr the pointer to the string holding MAC address
* in the MAC address format after converting from string format.
* @return void
*/
void platGetMacAddr(char *addr);
/**
* platGetFeatureAllowed
*
* Get whether the feature is allowed
*
* @param featureId - sis feature id
*
* @return 1 - allowed, 0 - not allowed
*
*/
int platGetFeatureAllowed(cc_sis_feature_id_e featureId);
/**
* Set the Status message for failure reasons
* @param char *msg
* @return void
*/
void platSetStatusMessage(char *msg);
/**
* The equivalent of the printf function.
*
* This function MUST be implemented by the vendors. This is called by the core
* library whenever some debugging information needs to be printed out.
* call this function in order to clear the CPR Memory/Tracking statistics
*
* Please also be aware that cpr_stdio.h has other logging functions as well.
* Vendors need to implement this function and the functions (err_msg,
* buginf....etc) found in cpr_stdio.h
*
* @param[in] _format format string
* @param[in] ... variable arg list
*
* @return Return code from printf
*/
int debugif_printf(const char *_format, ...);
/**
* Enable / disable speaker
*
* @param[in] state - true -> enable speaker, false -> disable speaker
*
* @return void
*/
void platSetSpeakerMode(cc_boolean state);
/**
* Get the status (on/off) of the audio device
*
* @param[in] device_type - headset or speaker (see vcm_audio_device_t)
*
* @return 1 -> On, 0 -> off, ERROR -> unknown (error)
*/
int platGetAudioDeviceStatus(plat_audio_device_t device_type);
/*
* Returns the default gateway
*
* @param void
* @return u_long
*/
cc_ulong_t platGetDefaultgw();
#endif /* _PLATFORM_API_H_ */