init ems server code

This commit is contained in:
2024-09-27 15:39:34 +08:00
parent 9d4009aaca
commit 9930e4e58f
1551 changed files with 110216 additions and 102864 deletions

720
plat/sip/src/include/sip.h Normal file
View File

@@ -0,0 +1,720 @@
#ifndef _SIP__H
#define _SIP__H
#include "sip_pub.h"
// SIP general constant
#define SIP_MAX_USER_NAME_LEN 64//128
#define SIP_MAX_PASSWORD_LEN 16
#define SIP_MAX_DOMAIN_NAME_LEN 128//256
#define SIP_MAX_REASON_PHRASE_LEN 128
#define SIP_MAX_HDR_FLAG_NUM 2
#define SIP_MAX_BODY_LEN 1500
#define SIP_MAX_DISPLAY_NAME_LEN 64
#define SIP_MAX_CALL_ID_LEN 128
#define SIP_MAX_GEN_PARA_NUM 8
#define SIP_MAX_PARA_STRING_LEN 64//128
#define SIP_MAX_PARA_VAL_LEN 4
#define SIP_MAX_PARA_NUM 4//8
#define SIP_MAX_NUM_OF_TRANS 4096//8192
#define SIP_MAX_NUM_OF_VIAS 8//32
#define SIP_MAX_NUM_OF_CONTACTS 4
#define SIP_MAX_NUM_OF_RECORD_ROUTES 8//32
#define SIP_MAX_NUM_OF_ROUTES 8//32
#define SIP_MAX_NUM_OF_ALLOW 8//32
#define SIP_MAX_NUM_OF_ACCEPT 8
#define SIP_MAX_NUM_OF_ACCEPT_ENCODING 4
#define SIP_MAX_NUM_OF_ACCEPT_LANGUAGE 8
#define SIP_MAX_LENGTH_OF_EVENT 32
#define SIP_MAX_LENGTH_OF_USER_AGENT 64
#define SIP_MAX_LENGTH_OF_SUBJECT 128
#define SIP_MAX_LENGTH_OF_SUB_STATE 128
#define SIP_MAX_VIA_DOMAIN_NAME_LEN 64
#define SIP_MAX_NUM_OF_SIP_SUB_BODY 2
#define SIP_URI_TYPE_SIP 1
#define SIP_URI_TYPE_SIPS 2
#define SIP_URI_TYPE_TEL 3
#define SIP_API_TYPE_REQUEST 1
#define SIP_API_TYPE_RESPONSE 2
#define SIP_API_TYPE_MANAGEMENT 3
#define SIP_API_PNAME_TAG 1
#define SIP_API_PNAME_BRANCH 2
#define SIP_API_PNAME_EXPIRES 3
#define SIP_API_PNAME_USER 4
#define SIP_API_PNAME_LR 5
#define SIP_API_PNAME_BOUNDARY 6
#define SIP_API_PNAME_HANDLING 7
#define SIP_API_PNAME_TRANSPORT 8
#define SIP_API_PNAME_RPOTR 9
#define SIP_API_PNAME_VERSION 10
#define SIP_API_PNAME_BASE 11
#define SIP_API_PTYPE_STRING 1
#define SIP_API_PTYPE_VALUE 2
#define SIP_API_PTYPE_TAG 3
#define SIP_API_PROTO_UDP 1
#define SIP_API_PROTO_TCP 2
#define SIP_API_PROTO_SCTP 3
#define SIP_NULL_TRANS_ID 0xFFFF
#define SIP_NULL_UP_PORT 0xFFFF
#define SIP_TRANSPORT_LAYER 1
#define SIP_TRANSACTION_LAYER 2
#define SIP_API_REQ_MSG 1
#define SIP_API_RES_MSG 2
#define SIP_API_MANAGE_MSG 3
#define SIP_TRANS_CLIENT 1
#define SIP_TRANS_SERVER 2
#define SIP_TRANS_INVITE 1
#define SIP_TRANS_NON_INVITE 2
#define SIP_ACCEPT_TYPE_APPLICATION 1
#define SIP_ACCEPT_TYPE_MULTIPART 2
#define SIP_ACCEPT_TYPE_WILDCARD 3
#define SIP_ACCEPT_SUB_TYPE_SDP 1
#define SIP_ACCEPT_SUB_TYPE_ISUP 2
#define SIP_ACCEPT_SUB_TYPE_MIXED 3
#define SIP_ACCEPT_SUB_TYPE_WILDCARD 4
#define SIP_ACCEPT_ENCODING_IDENTITY 1
#define SIP_ACCEPT_ENCODING_GZIP 2
#define SIP_ACCEPT_ENCODING_TAR 3
#define SIP_ACCEPT_LANGUAGE_EN 1
#define SIP_CONTENT_TYPE_APPLICATION 1
#define SIP_CONTENT_TYPE_MULTIPART 2
#define SIP_CONTENT_TYPE_TEXT 3
#define SIP_CONTENT_TYPE_IMAGE 4
#define SIP_CONTENT_TYPE_AUDIO 5
#define SIP_CONTENT_TYPE_VEDIO 6
#define SIP_CONTENT_SUB_TYPE_SDP 1
#define SIP_CONTENT_SUB_TYPE_ISUP 2
#define SIP_CONTENT_SUB_TYPE_MIXED 3
#define SIP_CONTENT_SUB_TYPE_MESSAGE 4
#define SIP_CONTENT_SUB_TYPE_SIGNED 5
#define SIP_CONTENT_SUB_TYPE_PKCS7_MIME 6
#define SIP_CONTENT_DISPOSITION_SIGNAL 1
#define SIP_CONTENT_ENCODING_IDENTITY 1
#define SIP_CONTENT_ENCODING_GZIP 2
#define SIP_CONTENT_ENCODING_TAR 3
#define SIP_CONTENT_LANGUAGE_EN 1
#define SIP_DATE_TYPE_GMT 1
#define SIP_DATE_WEEK_DAY_SUN 1
#define SIP_DATE_WEEK_DAY_MON 2
#define SIP_DATE_WEEK_DAY_TUE 3
#define SIP_DATE_WEEK_DAY_WED 4
#define SIP_DATE_WEEK_DAY_THU 5
#define SIP_DATE_WEEK_DAY_FRI 6
#define SIP_DATE_WEEK_DAY_SAT 7
#define SIP_DATE_MONTH_JAN 1
#define SIP_DATE_MONTH_FEB 2
#define SIP_DATE_MONTH_MAR 3
#define SIP_DATE_MONTH_APR 4
#define SIP_DATE_MONTH_MAY 5
#define SIP_DATE_MONTH_JUN 6
#define SIP_DATE_MONTH_JUL 7
#define SIP_DATE_MONTH_AUG 8
#define SIP_DATE_MONTH_SEP 9
#define SIP_DATE_MONTH_OCT 10
#define SIP_DATE_MONTH_NOV 11
#define SIP_DATE_MONTH_DEC 12
#define SIP_OPTION_TAG_100_REL 1
#define SIP_OPTION_TAG_FOO 2
#define SIP_TRANSACTION_TIMEOUT 99
#define SIP_TRANSPORT_ERROR 98
// SIP general headers mask
#define SIP_HDR_ACCEPT_MASK 0x00000001
#define SIP_HDR_ACCEPT_ENCODING_MASK 0x00000002
#define SIP_HDR_ACCEPT_LANGUAGE_MASK 0x00000004
#define SIP_HDR_ALLOW_MASK 0x00000008
#define SIP_HDR_CALL_ID_MASK 0x00000010
#define SIP_HDR_CONTACT_MASK 0x00000020
#define SIP_HDR_CSEQ_MASK 0x00000040
#define SIP_HDR_DATE_MASK 0x00000080
#define SIP_HDR_EXPIRES_MASK 0x00000100
#define SIP_HDR_FROM_MASK 0x00000200
#define SIP_HDR_TO_MASK 0x00000400
#define SIP_HDR_VIA_MASK 0x00000800
#define SIP_HDR_CONTENT_DISPOSITION_MASK 0x00001000
#define SIP_HDR_CONTENT_TYPE_MASK 0x00002000
#define SIP_HDR_CONTENT_ENCODING_MASK 0x00004000
#define SIP_HDR_CONTENT_LANGUAGE_MASK 0x00008000
#define SIP_HDR_CONTENT_LENGTH_MASK 0x00010000
#define SIP_HDR_RECORD_ROUTE_MASK 0x00020000
#define SIP_HDR_TIMESTAMP_MASK 0x00040000
#define SIP_HDR_MIME_VERSION_MASK 0x00080000
#define SIP_HDR_SUPPORTED_MASK 0x00100000
#define SIP_HDR_USER_AGENT_MASK 0x00200000
// SIP request headers mask
#define SIP_HDR_MAX_FORWARDS_MASK 0x00000001
#define SIP_HDR_ROUTE_MASK 0x00000002
#define SIP_HDR_PROXY_REQUIRE_MASK 0x00000004
#define SIP_HDR_SUBJECT_MASK 0x00000008
#define SIP_HDR_REQUIRE_MASK 0x00000010
#define SIP_HDR_REFER_TO_MASK 0x00000020
#define SIP_HDR_EVENT_MASK 0x00000040
#define SIP_HDR_SUBSCRIPTION_STATE_MASK 0x00000080
//SIP response headers mask
#define SIP_HDR_UNSUPPORTED_MASK 0x00000001//just used in 420 response
#define SIP_HDR_SERVER_MASK 0x00000002
#define SIP_METHOD_REGISTER 1
#define SIP_METHOD_INVITE 2
#define SIP_METHOD_ACK 3
#define SIP_METHOD_CANCEL 4
#define SIP_METHOD_BYE 5
#define SIP_METHOD_OPTIONS 6
#define SIP_METHOD_INFO 7
#define SIP_METHOD_PRACK 8
#define SIP_METHOD_UPDATE 9
#define SIP_METHOD_REFER 10
#define SIP_METHOD_NOTIFY 11
#define SIP_METHOD_RE_INVITE 12
#define SIP_METHOD_RESPONSE_INV_RINGING 30
#define SIP_METHOD_RESPONSE_INV_PROGRESS 31
#define SIP_METHOD_RESPONSE_INV_CONFIRM 32
#define SIP_METHOD_RESPONSE_INV_REDIR 33
#define SIP_METHOD_RESPONSE_INV_REL 34
#define SIP_METHOD_RESPONSE_CANCEL 35
#define SIP_METHOD_RESPONSE_BYE 36
#define SIP_METHOD_RESPONSE_CONFIRM 37//just for other method response
#define SIP_METHOD_RESPONSE_REL 38//just for other method response
#define SIP_METHOD_RESPONSE_TIMEOUT 39
#define SIP_METHOD_RESPONSE_RE_INV_RINGING 40
#define SIP_METHOD_RESPONSE_RE_INV_PROGRESS 41
#define SIP_METHOD_RESPONSE_RE_INV_CONFIRM 43
#define SIP_METHOD_RESPONSE_RE_INV_RETRANSMIT 44
#define SIP_METHOD_RESPONSE_RE_INV_FAILED 45
#define SIP_METHOD_RESPONSE_RE_INV_RELEASE 46
#define SIP_METHOD_RESPONSE_UPDATE_CONFIRM 47
#define SIP_METHOD_RESPONSE_UPDATE_FAILED 48
#define SIP_PROXY_TYPE_NONE 0
#define SIP_PROXY_TYPE_STATEFUL 1
#define SIP_PROXY_TYPE_STATELESS 2
// SIP general parameters struct
typedef struct _SIP_GEN_PARA
{
BYTE paraName;
BYTE paraType;
// char paraStr[SIP_MAX_PARA_STRING_LEN];
// DWORD paraVal[SIP_MAX_PARA_VAL_LEN];
union
{
char paraStr[SIP_MAX_PARA_STRING_LEN];
DWORD paraVal[SIP_MAX_PARA_VAL_LEN];
}para;
}SIP_GEN_PARA;
typedef struct _SIP_GEN_PARAMS
{
BYTE paraNum;
SIP_GEN_PARA para[SIP_MAX_PARA_NUM];
}SIP_GEN_PARAMS;
// SIP URI struct
typedef struct _SIP_URI
{
BYTE uriType;
char userName[SIP_MAX_USER_NAME_LEN];
char password[SIP_MAX_PASSWORD_LEN];
struct
{
BYTE type;
union
{
DWORD ipV4;
DWORD ipV6[4];
char domain[SIP_MAX_DOMAIN_NAME_LEN];
}addr;
}host;
WORD port;
BYTE transport;
SIP_GEN_PARAMS params;
}SIP_URI;
typedef struct _SIP_VIA_URI
{
char domain[SIP_MAX_VIA_DOMAIN_NAME_LEN];
WORD port;
// SIP_GEN_PARAMS params;
}SIP_VIA_URI;
// SIP general header struct
typedef struct _SIP_HDR_ACCEPT
{
BYTE type;
BYTE subType;
SIP_GEN_PARAMS params;
}SIP_HDR_ACCEPT;
typedef struct _SIP_HDR_ACCEPT_ENCODING
{
BYTE acceptEncoding;
SIP_GEN_PARAMS params;
}SIP_HDR_ACCEPT_ENCODING;
typedef struct _SIP_HDR_ACCEPT_LANGUAGE
{
BYTE acceptLanguage;
SIP_GEN_PARAMS params;
}SIP_HDR_ACCEPT_LANGUAGE;
typedef struct _SIP_HDR_CALL_ID
{
char value[SIP_MAX_CALL_ID_LEN];
char host[SIP_MAX_DOMAIN_NAME_LEN];
}SIP_HDR_CALL_ID;
typedef struct _SIP_HDR_CONTACT
{
char dispName[SIP_MAX_DISPLAY_NAME_LEN];
SIP_URI url;
SIP_GEN_PARAMS params;
}SIP_HDR_CONTACT;
typedef struct _SIP_HDR_CONTACTS
{
BYTE num;
BYTE head;
SIP_HDR_CONTACT contacts[SIP_MAX_NUM_OF_CONTACTS];
}SIP_HDR_CONTACTS;
typedef struct _SIP_HDR_CSEQ
{
DWORD value;
BYTE method;
}SIP_HDR_CSEQ;
typedef struct _SIP_HDR_DATE
{
BYTE wkDay;
BYTE mDay;
BYTE mon;
DWORD year;
BYTE hour;
BYTE min;
BYTE sec;
BYTE dateType;
}SIP_HDR_DATE;
typedef struct _SIP_HDR_MIME_VERSION
{
BYTE mimeVersion;
}SIP_HDR_MIME_VERSION;
typedef struct _SIP_HDR_ENCRYPTION
{
}SIP_HDR_ENCRYPTION;
typedef struct _SIP_HDR_EXPIRES
{
DWORD value;
}SIP_HDR_EXPIRES;
typedef struct _SIP_HDR_FROM
{
char dispName[SIP_MAX_DISPLAY_NAME_LEN];
SIP_URI url;
SIP_GEN_PARAMS params;
}SIP_HDR_FROM;
typedef struct _SIP_HDR_ORGANIZATION
{
}SIP_HDR_ORGANIZATION;
typedef struct _SIP_HDR_RECORD_ROUTE
{
char dispName[SIP_MAX_DISPLAY_NAME_LEN];
SIP_URI url;
SIP_GEN_PARAMS params;
}SIP_HDR_RECORD_ROUTE;
typedef struct _SIP_HDR_RECORD_ROUTES
{
BYTE num;
BYTE head;
SIP_HDR_RECORD_ROUTE recRoutes[SIP_MAX_NUM_OF_RECORD_ROUTES];
}SIP_HDR_RECORD_ROUTES;
typedef struct _SIP_HDR_TIMESTAMP
{
DWORD timeStamp;
}SIP_HDR_TIMESTAMP;
typedef struct _SIP_HDR_TO
{
char dispName[SIP_MAX_DISPLAY_NAME_LEN];
SIP_URI url;
SIP_GEN_PARAMS params;
}SIP_HDR_TO;
typedef struct _SIP_HDR_USER_AGENT
{
BYTE agent[SIP_MAX_LENGTH_OF_USER_AGENT];
}SIP_HDR_USER_AGENT;
typedef struct _SIP_HDR_VIA
{
BYTE version;
BYTE protocol;
// SIP_URI url;
SIP_VIA_URI url;
SIP_GEN_PARAMS params;
}SIP_HDR_VIA;
typedef struct _SIP_HDR_VIAS
{
BYTE num;
BYTE head;
SIP_HDR_VIA vias[SIP_MAX_NUM_OF_VIAS];
}SIP_HDR_VIAS;
// SIP request header struct
typedef struct _SIP_HDR_AUTHORIZATION
{
}SIP_HDR_AUTHORIZATION;
typedef struct _SIP_HDR_HIDE
{
}SIP_HDR_HIDE;
typedef struct _SIP_HDR_MAX_FORWARDS
{
WORD value;
}SIP_HDR_MAX_FORWARDS;
typedef struct _SIP_HDR_PRIORITY
{
}SIP_HDR_PRIORITY;
typedef struct _SIP_HDR_PROXY_AUTHORIZATION
{
}SIP_HDR_PROXY_AUTHORIZATION;
typedef struct _SIP_HDR_PROXY_REQUIRE
{
BYTE optionTag;
}SIP_HDR_PROXY_REQUIRE;
typedef struct _SIP_HDR_ROUTE
{
char dispName[SIP_MAX_DISPLAY_NAME_LEN];
SIP_URI url;
SIP_GEN_PARAMS params;
}SIP_HDR_ROUTE;
typedef struct _SIP_HDR_ROUTES
{
BYTE num;
BYTE head;
SIP_HDR_ROUTE routes[SIP_MAX_NUM_OF_ROUTES];
}SIP_HDR_ROUTES;
typedef struct _SIP_HDR_REFER_TO
{
char dispName[SIP_MAX_DISPLAY_NAME_LEN];
SIP_URI url;
SIP_GEN_PARAMS params;
}SIP_HDR_REFER_TO;
typedef struct _SIP_HDR_SUBSCRIPTION_STATE
{
char subscriptionState[SIP_MAX_LENGTH_OF_SUB_STATE];
}SIP_HDR_SUBSCRIPTION_STATE;
typedef struct _SIP_HDR_EVENT
{
char event[SIP_MAX_LENGTH_OF_EVENT];
}SIP_HDR_EVENT;
typedef struct _SIP_HDR_REQUIRE
{
BYTE optionTag;
}SIP_HDR_REQUIRE;
typedef struct _SIP_HDR_RESPONSE_KEY
{
}SIP_HDR_RESPONSE_KEY;
typedef struct _SIP_HDR_SUBJECT
{
BYTE subject[SIP_MAX_LENGTH_OF_SUBJECT];
}SIP_HDR_SUBJECT;
typedef struct _SIP_HDR_SUPPORTED
{
BYTE optionTag;
}SIP_HDR_SUPPORTED;
// SIP response header struct
typedef struct _SIP_HDR_ALLOW
{
BYTE num;
BYTE allowMethod[SIP_MAX_NUM_OF_ALLOW];
}SIP_HDR_ALLOW;
typedef struct _SIP_HDR_PROXY_AUTHENTICATE
{
}SIP_HDR_PROXY_AUTHENTICATE;
typedef struct _SIP_HDR_RETRY_AFTER
{
}SIP_HDR_RETRY_AFTER;
typedef struct _SIP_HDR_SERVER
{
BYTE server[64];
}SIP_HDR_SERVER;
typedef struct _SIP_HDR_UNSUPPORTED
{
BYTE optionTag;
}SIP_HDR_UNSUPPORTED;
typedef struct _SIP_HDR_WARNING
{
}SIP_HDR_WARNING;
typedef struct _SIP_HDR_WWW_AUTHENTICATE
{
}SIP_HDR_WWW_AUTHENTICATE;
// SIP message struct
typedef struct _SIP_START_LINE
{
BYTE sipVersion; // Public
BYTE sipMethod; // Request
SIP_URI requestUri;
int statusCode; // Response
char reasonPhrase[SIP_MAX_REASON_PHRASE_LEN];
}SIP_START_LINE;
typedef struct _SIP_CONTENT_TYPE
{
BYTE type;
BYTE subType;
SIP_GEN_PARAMS params;
}SIP_CONTENT_TYPE;
typedef struct _SIP_CONTENT_DISPOSITION
{
BYTE contentDisposition;
SIP_GEN_PARAMS params;
}SIP_CONTENT_DISPOSITION;
typedef struct _SIP_MESSAGE_BODY
{
DWORD sipBodyHdrFlg[SIP_MAX_HDR_FLAG_NUM];
SIP_CONTENT_TYPE sipBodyContentType;
SIP_CONTENT_DISPOSITION sipBodyContentDisposition;
BYTE msgBody[SIP_MAX_BODY_LEN];
}SIP_MESSAGE_BODY;
typedef struct _SIP_MESSAGE_BODYS
{
BYTE sipBodyNum;
SIP_MESSAGE_BODY sipBody[SIP_MAX_NUM_OF_SIP_SUB_BODY];
}SIP_MESSAGE_BODYS;
typedef struct _SIP_ENTITY
{
DWORD sipEntityHdrFlag[SIP_MAX_HDR_FLAG_NUM];
BYTE sipHdrContentEncoding;
SIP_CONTENT_DISPOSITION sipHdrContentDisposition;
WORD sipHdrContentLength;
SIP_CONTENT_TYPE sipHdrContentType;
BYTE sipHdrContentLanguage;
// BYTE sipBody[SIP_MAX_BODY_LEN];
SIP_MESSAGE_BODYS sipBodys;
}SIP_ENTITY;
typedef struct _SIP_REQUEST_HDR
{
SIP_HDR_AUTHORIZATION sipHdrAuthorization;
SIP_HDR_HIDE sipHdrHide;
SIP_HDR_MAX_FORWARDS sipHdrMaxForwards;
SIP_HDR_PRIORITY sipHdrPriority;
SIP_HDR_PROXY_AUTHORIZATION sipHdrProxyAuthorization;
SIP_HDR_PROXY_REQUIRE sipHdrProxyRequire;
SIP_HDR_ROUTES sipHdrRoutes;
SIP_HDR_REQUIRE sipHdrRequire;
SIP_HDR_RESPONSE_KEY sipHdrResKey;
SIP_HDR_SUBJECT sipHdrSubject;
SIP_HDR_REFER_TO sipHdrReferTo;
SIP_HDR_SUBSCRIPTION_STATE sipHdrSubscriptionState;
SIP_HDR_EVENT sipHdrEvent;
}SIP_REQUEST_HDR;
typedef struct _SIP_RESPONSE_HDR
{
SIP_HDR_PROXY_AUTHENTICATE sipHdrProxyAuthenticate;
SIP_HDR_RETRY_AFTER sipHdrRetryAfter;
SIP_HDR_SERVER sipHdrServer;
SIP_HDR_UNSUPPORTED sipHdrUnsupported;
SIP_HDR_WARNING sipHdrWarning;
SIP_HDR_WWW_AUTHENTICATE sipHdrWWWAuthenticate;
}SIP_RESPONSE_HDR;
typedef struct _SIP_MSG
{
SIP_START_LINE sipStartLine;
// General Headers
DWORD sipGenHdrFlag[SIP_MAX_HDR_FLAG_NUM];
SIP_HDR_ACCEPT sipHdrAccept;
SIP_HDR_ALLOW sipHdrAllow;
SIP_HDR_ACCEPT_ENCODING sipHdrAcceptEncoding;
SIP_HDR_ACCEPT_LANGUAGE sipHdrAcceptLanguage;
SIP_HDR_CALL_ID sipHdrCallId;
SIP_HDR_CONTACTS sipHdrContacts;
SIP_HDR_CSEQ sipHdrCseq;
SIP_HDR_DATE sipHdrDate;
SIP_HDR_MIME_VERSION sipHdrMimeVer;
SIP_HDR_ENCRYPTION sipHdrEncryption;
SIP_HDR_EXPIRES sipHdrExpires;
SIP_HDR_FROM sipHdrFrom;
SIP_HDR_ORGANIZATION sipHdrOrganization;
SIP_HDR_RECORD_ROUTES sipHdrRecordRoutes;
SIP_HDR_TIMESTAMP sipHdrStamp;
SIP_HDR_SUPPORTED sipHdrSupported;
SIP_HDR_TO sipHdrTo;
SIP_HDR_VIAS sipHdrVias;
SIP_HDR_USER_AGENT sipHdrUserAgent;
struct
{
DWORD sipReHdrFlag[SIP_MAX_HDR_FLAG_NUM];
union
{
SIP_REQUEST_HDR sipReqHdr;
SIP_RESPONSE_HDR sipRspHdr;
}sipReHdr;
}sipReStruct;
SIP_ENTITY sipEntity;
}SIP_MSG;
typedef struct _SIP_MANAGE
{
BYTE cmd;
}SIP_MANAGE;
typedef struct _SIP_TRANSPORT_ADDR
{
BYTE type;
WORD port;
union
{
DWORD ipV4;
DWORD ipV6[4];
}addr;
}SIP_TRANSPORT_ADDR;
typedef struct _SIP_API_STRUCT
{
BYTE sipApiType; // SIP_API_REQ_MSG/SIP_API_RES_MSG/SIP_API_MANAGE_MSG
SIP_TRANSPORT_ADDR sipTransAddr; // Transport address of the SIP message
union
{
SIP_MSG sipMsg; // Including request and response
SIP_MANAGE sipManage;
}sipApiMsg;
}SIP_API_STRUCT;
typedef struct _SIP_CR_MSG
{
SIP_TRANSPORT_ADDR sipTransAddr;
SIP_START_LINE sipCrStartLine;
SIP_HDR_VIA sipCrHdrVia;
SIP_HDR_CSEQ sipCrHdrCseq;
SIP_HDR_TO sipCrHdrTo;
SIP_HDR_FROM sipCrHdrFrom;
SIP_HDR_CALL_ID sipCrHdrCallId;
}SIP_CR_MSG;
// SIP USER struct
/* The upper layer register recv_proc call-back function to receive sip messages
upPort: destination UP port the message will be sent to, if unknown, it should be set to 0xFFFF.
sipPort: source SIP port the UP message is sent from, if no sip_port is maintained, it's set to 0xFFFF
transFlag: indicates whether this message sent from SIP transport layer directly or sent from SIP transaction layer.
sipApiMsg: a pointer to the message pointer that is pointing to the message struct of the upper layer, so the received message can be accessed at that address
returns 0 if succeeds, otherwise returns -1
*/
typedef struct _SIP_USER
{
BYTE proxyType;
char userName[16];
char domain[SIP_MAX_DOMAIN_NAME_LEN];
int (*recv_proc)(WORD sipPort, WORD upPort, BYTE transFlag, SIP_API_STRUCT *sipApiMsg);
}SIP_USER;
/*typedef struct _SIP_SIP_UA_USER
{
char domain[SIP_MAX_DOMAIN_NAME_LEN];
}SIP_SIP_UA_USER;*/
// Should be called in the main program when system starts up,
// Returns 0 if succeeds, otherwise returns -1
int sip_init();
// Should be called every 10 ms in the platform section of the main program
void sip_timer();
void sip_t10ms();
/* The upper layer uses this function to send sip message to the peer
sipTransId: destination SIP port the UP message will be sent to, if unknown, it should be set to 0xFFFF
upPort: source UP port the message is sent from
transFlag: indicates whether this message will be sent within SIP transaction layer (stateful proxy or user agent),
or directly goes to the SIP transport layer (stateless proxy)
sipApiMsg: a pointer pointing to the actual struct of the message to be sent to the SIP module
if succeeds, returns sip_port, otherwise return a negative value
if succeeds, and no sip_port is maintained for this message, returns 0xFFFF
*/
int sip_send_msg(WORD sipTransId, WORD upPort, BYTE transFlag, SIP_API_STRUCT *sipApiMsg);
/* The upper layer register its domain name and message receive callback function to the SIP module
if succeeds, returns 0, otherwise returns -1
*/
int sip_register_user(SIP_USER *sipUser);
/* The upper layer use this function to create trascation
client: clent/server
method: invite/non-invite
*/
int sip_create_transaction(BYTE client, BYTE method, BYTE userIndex, WORD upPort, SIP_API_STRUCT *msg);
int sip_create_trans_branch(WORD transId, SIP_GEN_PARA *branch);
#endif

View File

@@ -0,0 +1,154 @@
#ifndef _SIP_CONST__H
#define _SIP_CONST__H
#define SIP_TCP_BACKLOG 64
#define SIP_MAX_NUM_OF_TCP_SOCK 512
#define SIP_MAX_NUM_OF_USERS 4
#define SIP_MAX_NUM_OF_SIP_UA_USER 4
#define SIP_MAX_NUM_OF_TRANS_1 4095//8191
#define SIP_MAX_TCP_MSG_LEN 1500
#define SIP_MAX_UDP_MSG_LEN 1500
#define SIP_MAX_UDP_MSG_GET_TIMES 64
#define SIP_MAX_ESCAPE_BUF_LEN 64
#define SIP_STR_TO_API 1
#define SIP_API_TO_STR 2
#define SIP_MESSAGE_BODY_FLAG 1
#define SIP_SUB_BODY_FLAG 2
#define SIP_COMMAND_IDLE 0
#define SIP_VERSION_2_0 20
#define SIP_MIME_VERSION_1_0 10
#define SIP_HASH_TABLE_SIZE 200 // 150 is the first size where no conflicts occur
#define SIP_MAX_NUM_OF_HEADERS 48
#define SIP_HNAME_ACCEPT "accept"
#define SIP_HNAME_ACCEPT_ENCODING "accept-encoding"
#define SIP_HNAME_ACCEPT_LANGUAGE "accept-language"
#define SIP_HNAME_ALERT_INFO "alert-info"
#define SIP_HNAME_ALLOW "allow"
#define SIP_HNAME_AUTHENTICATION_INFO "authentication-info"
#define SIP_HNAME_AUTHORIZATION "authorization"
#define SIP_HNAME_CALL_ID "call-id"
#define SIP_HNAME_CALL_ID_SHORT "i"
#define SIP_HNAME_CALL_INFO "call-info"
#define SIP_HNAME_CONTACT "contact"
#define SIP_HNAME_CONTACT_SHORT "m"
#define SIP_HNAME_CONTENT_DISPOSITION "content-disposition"
#define SIP_HNAME_CONTENT_ENCODING_SHORT "e"
#define SIP_HNAME_CONTENT_ENCODING "content-encoding"
#define SIP_HNAME_CONTENT_LANGUAGE "content-language"
#define SIP_HNAME_CONTENT_LENGTH_SHORT "l"
#define SIP_HNAME_CONTENT_LENGTH "content-length"
#define SIP_HNAME_CONTENT_TYPE_SHORT "c"
#define SIP_HNAME_CONTENT_TYPE "content-type"
#define SIP_HNAME_CSEQ "cseq"
#define SIP_HNAME_SIPDATE "date"
#define SIP_HNAME_ERROR_INFO "error-info"
#define SIP_HNAME_EVENT "event"
#define SIP_HNAME_EXPIRES "expires"
#define SIP_HNAME_FROM "from"
#define SIP_HNAME_FROM_SHORT "f"
#define SIP_HNAME_IN_REPLY_TO "in-reply-to"
#define SIP_HNAME_MAX_FORWARDS "max-forwards"
#define SIP_HNAME_MIME_VERSION "mime-version"
#define SIP_HNAME_MIN_EXPIRES "min-expires"
#define SIP_HNAME_ORGANIZATION "organization"
#define SIP_HNAME_PRIORITY "priority"
#define SIP_HNAME_PROXY_AUTHENTICATE "proxy-authenticate"
#define SIP_HNAME_PROXY_AUTHENTICATION_INFO "proxy-authentication-info"
#define SIP_HNAME_PROXY_AUTHORIZATION "proxy-authorization"
#define SIP_HNAME_PROXY_REQUIRE "proxy-require"
#define SIP_HNAME_RECORD_ROUTE "record-route"
#define SIP_HNAME_REFER_TO "refer-to"
#define SIP_HNAME_REFER_TO_SHORT "r"
#define SIP_HNAME_REPLY_TO "reply-to"
#define SIP_HNAME_REQUIRE "require"
#define SIP_HNAME_RETRY_AFTER "retry-after"
#define SIP_HNAME_ROUTE "route"
#define SIP_HNAME_SERVER "server"
#define SIP_HNAME_SUBJECT "subject"
#define SIP_HNAME_SUBJECT_SHORT "s"
#define SIP_HNAME_SUPPORTED "supported"
#define SIP_HNAME_SUPPORTED_SHORT "k"
#define SIP_HNAME_SUBSCRIPTION_STATE "subscription-state"
#define SIP_HNAME_TIMESTAMP "timestamp"
#define SIP_HNAME_TO "to"
#define SIP_HNAME_TO_SHORT "t"
#define SIP_HNAME_UNSUPPORTED "unsupported"
#define SIP_HNAME_USER_AGENT "user-agent"
#define SIP_HNAME_VIA "via"
#define SIP_HNAME_VIA_SHORT "v"
#define SIP_HNAME_WARNING "warning"
#define SIP_HNAME_WWW_AUTHENTICATE "www-authenticate"
#define SIP_HNAME_MAX_FORWARDS "max-forwards"
#define SIP_TRANS_MAIN_STATE_INIT 0
#define SIP_TRANS_MAIN_STATE_SVR_NON_INV 1
#define SIP_TRANS_MAIN_STATE_SVR_INV 2
#define SIP_TRANS_MAIN_STATE_CLT_NON_INV 3
#define SIP_TRANS_MAIN_STATE_CLT_INV 4
#define SIP_TRANS_STATE_IDLE 0
#define SIP_TRANS_STATE_TRYING 1
#define SIP_TRANS_STATE_CALLING 2
#define SIP_TRANS_STATE_PROCEEDING 3
#define SIP_TRANS_STATE_COMPLETED 4
#define SIP_TRANS_STATE_CONFIRMED 5
#define SIP_TRANS_STATE_TERMINATED 6
#define SIP_PNAME_TAG "tag"
#define SIP_PNAME_BRANCH "branch"
#define SIP_PNAME_EXPIRES "expires"
#define SIP_PNAME_USER "user"
#define SIP_PNAME_LR "lr"
#define SIP_PNAME_BOUNDARY "boundary"
#define SIP_PNAME_HANDLING "handling"
#define SIP_PNAME_TRANSPORT "transport"
#define SIP_PNAME_RPORT "rport"
#define SIP_PNAME_VERSION "version"
#define SIP_PNAME_BASE "base"
#define SIP_TIMER_T1 25 // default: 500 ms
#define SIP_TIMER_T2 400 // default: 4 s
#define SIP_TIMER_T4 500 // default: 5 s
#define SIP_TIMER_A SIP_TIMER_T1
#define SIP_TIMER_B (128 * SIP_TIMER_T1)//(64 * SIP_TIMER_T1)
#define SIP_TIMER_D (32 *SIP_TIMER_T1)//(64 * SIP_TIMER_T1)//
#define SIP_TIMER_E_INITIAL SIP_TIMER_T1
#define SIP_TIMER_F (32 * SIP_TIMER_T1)//(64 * SIP_TIMER_T1)//
#define SIP_TIMER_G SIP_TIMER_T1
#define SIP_TIMER_H (32 * SIP_TIMER_T1)//(64 * SIP_TIMER_T1)//
#define SIP_TIMER_I 2//SIP_TIMER_T4
#define SIP_TIMER_J (32 * SIP_TIMER_T1)//(64 * SIP_TIMER_T1)//
#define SIP_TIMER_K 2//SIP_TIMER_T4
#define SIP_TIMER_200MS 20
#define SIP_ENCODE_URL_ALL 0x00
#define SIP_ENCODE_URL_NO_BRACKETS 0x01
#define SIP_ENCODE_URL_NO_USER_PART 0x02
#define SIP_BRANCH_BASE_TRANS_ID 10000
#define SIP_BRANCH_BASE_TRANS_ID_LEN 5
#define SIP_MAX_ASCIIIN_LEN 4096
#define SIP_MAX_ASCIIOUT_LEN 4096
#define SIP_MAX_ASCITMP_LEN 4096
#define SIP_MONITOR_NONE 0x0000
#define MONITOR_SIP_MSG 0x0001
#define SIP_MONITOR_ERROR 0x0002
#define SIP_MONITOR_ALL 0xffff
#endif

View File

@@ -0,0 +1,10 @@
#ifndef _SIP_DEBUG__H
#define _SIP_DEBUG__H
void sip_mon(void);
int sip_debug_set(void);
int sip_asciout_proc(BYTE *outStr);
int sip_hex_to_ascii(BYTE *fromHex, BYTE fromLen, BYTE *toAsc);
int sip_log_err(BYTE *errMsg);
#endif

View File

@@ -0,0 +1,49 @@
#ifndef _SIP_DEF__H
#define _SIP_DEF__H
#include "sip_pub.h"
#include "sip.h"
#include "sip_const.h"
#include "sip_struct.h"
int sipUdpSocketFd;
int sipTcpServerSocketFd;
char sipHostName[50];
char sipDottedHostIp[20];
DWORD sipHostIp;
BYTE sipUdpMsgSdBuf[SIP_MAX_UDP_MSG_LEN];
BYTE sipUdpMsgRvBuf[SIP_MAX_UDP_MSG_LEN];
BYTE sipTcpMsgRvBuf[SIP_MAX_TCP_MSG_LEN];
BYTE sipEncBuf[SIP_MAX_UDP_MSG_LEN];
char sipEscapeBuf[SIP_MAX_ESCAPE_BUF_LEN];
SIP_TCP_SOCK sipTcpSock[SIP_MAX_NUM_OF_TCP_SOCK];
SIP_API_STRUCT sipRecvMsg;
SIP_API_STRUCT sipSendMsg;
SIP_API_STRUCT sipToUpMsg;
struct sockaddr_in sipSrcInAddr;
struct sockaddr_in sipDstInAddr;
int sipHdrRefTable[SIP_HASH_TABLE_SIZE]; // the hash table contains indices to the sipParseConfig table
SIP_HDR_CONFIG sipParseConfig[SIP_MAX_NUM_OF_HEADERS];
SIP_USERS_STRUCT sipUsers;
SIP_TRANSACTION sipTrans[SIP_MAX_NUM_OF_TRANS];
//SIP_SIP_UA_USER sipSipUaUser[SIP_MAX_NUM_OF_SIP_UA_USER];
WORD sipTransHead;
WORD sipDlgSelect;
BYTE sipAsciInBuf[SIP_MAX_ASCIIIN_LEN];
BYTE sipAsciOutBuf[SIP_MAX_ASCIIOUT_LEN];
BYTE sipAsciTempBuf[SIP_MAX_ASCITMP_LEN];
WORD sipMonitorFg;
#endif

View File

@@ -0,0 +1,48 @@
#ifndef _SIP_EXT__H
#define _SIP_EXT__H
#include "sip_pub.h"
#include "sip.h"
#include "sip_const.h"
#include "sip_struct.h"
extern int sipUdpSocketFd;
extern int sipTcpServerSocketFd;
extern char sipHostName[50];
extern char sipDottedHostIp[20];
extern DWORD sipHostIp;
extern BYTE sipUdpMsgSdBuf[SIP_MAX_UDP_MSG_LEN];
extern BYTE sipUdpMsgRvBuf[SIP_MAX_UDP_MSG_LEN];
extern BYTE sipTcpMsgRvBuf[SIP_MAX_TCP_MSG_LEN];
extern BYTE sipEncBuf[SIP_MAX_UDP_MSG_LEN];
extern char sipEscapeBuf[SIP_MAX_ESCAPE_BUF_LEN];
extern SIP_TCP_SOCK sipTcpSock[SIP_MAX_NUM_OF_TCP_SOCK];
extern SIP_API_STRUCT sipRecvMsg;
extern SIP_API_STRUCT sipSendMsg;
extern SIP_API_STRUCT sipToUpMsg;
extern struct sockaddr_in sipSrcInAddr;
extern struct sockaddr_in sipDstInAddr;
extern int sipHdrRefTable[SIP_HASH_TABLE_SIZE];
extern SIP_HDR_CONFIG sipParseConfig[SIP_MAX_NUM_OF_HEADERS];
extern SIP_USERS_STRUCT sipUsers;
extern SIP_TRANSACTION sipTrans[SIP_MAX_NUM_OF_TRANS];
//extern SIP_SIP_UA_USER sipSipUaUser[SIP_MAX_NUM_OF_SIP_UA_USER];
extern WORD sipTransHead;
extern BYTE sipAsciInBuf[SIP_MAX_ASCIIIN_LEN];
extern BYTE sipAsciOutBuf[SIP_MAX_ASCIIOUT_LEN];
extern BYTE sipAsciTempBuf[SIP_MAX_ASCITMP_LEN];
extern WORD sipMonitorFg;
#endif

View File

@@ -0,0 +1,36 @@
#ifndef _SIP_MSG__H
#define _SIP_MSG__H
#define sip_generic_param_add(LIST,NAME,VALUE) sip_uri_param_add(LIST,NAME,VALUE)
#define sip_uri_uparam_add(url,name,value) sip_uri_param_add((&(url)->params),name,value)
int sip_recv_msg_handling(char *msg, WORD len, int tcpSockIndex);
int sip_method_api_conv(char *str, BYTE *method, BYTE flag);
int sip_uri_type_api_conv(char *str, BYTE *uriType, BYTE flag);
int sip_ver_api_conv(char *str, BYTE *ver, BYTE flag);
int sip_proto_api_conv(char *str, BYTE *proto, BYTE flag);
int sip_content_type_api_conv(char *str, BYTE *contentType, BYTE flag);
int sip_content_sub_type_api_conv(char *str, BYTE *contentSubType, BYTE flag);
int sip_accept_type_api_conv(char *str, BYTE *acceptType, BYTE flag);
int sip_accept_sub_type_api_conv(char *str, BYTE *acceptSubType, BYTE flag);
int sip_accept_encoding_api_conv(char *str, BYTE *acceptEncoding, BYTE flag);
int sip_accept_language_api_conv(char *str, BYTE *acceptLanguage, BYTE flag) ;
int sip_allow_api_conv(char *str, BYTE *allowMethod, BYTE flag);
int sip_option_tag_api_conv(char *str, BYTE *option, BYTE flag);
int sip_mime_version_api_conv(char *str, BYTE *mimeVersion, BYTE flag);
int sip_date_weekday_api_conv(char *str, BYTE *weekday, BYTE flag);
int sip_date_month_api_conv(char *str, BYTE *month, BYTE flag);
int sip_date_type_api_conv(char *str, BYTE *dateType, BYTE flag);
int sip_content_disposition_api_conv(char *str, BYTE *contentDisposition, BYTE flag);
int sip_content_encoding_api_conv(char *str, BYTE *contentEncoding, BYTE flag);
int sip_content_language_api_conv(char *str, BYTE *contentLanguage, BYTE flag);
void sip_fill_msg_with_cr(SIP_MSG *sipMsg, SIP_CR_MSG *sipCrMsg);
void sip_fill_cr_msg(SIP_CR_MSG *sipCrMsg, SIP_API_STRUCT *sipApiMsg);
int sip_send_ack(SIP_API_STRUCT *ackMsg, SIP_TRANSACTION *trans);
int sip_send_100(SIP_CR_MSG *ackMsg, SIP_TRANSACTION *trans);
int sip_send_option_rsp(SIP_API_STRUCT *sipApiMsg);
BYTE sip_search_user_by_domain(SIP_URI *sipUri);
int sip_send_call_not_exit_rsp(SIP_API_STRUCT *sipApiMsg);
int sip_send_not_find_rsp(SIP_API_STRUCT *sipApiMsg);
#endif

View File

@@ -0,0 +1,24 @@
#ifndef _SIP_MSG_ENCODE__H
#define _SIP_MSG_ENCODE__H
#define _ALPHANUM_ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\0"
#define _RESERVED_ ";/?:@&=+$\0"
#define _MARK_ "-_.!~*'()\0"
#define _MARK__USER_UNRESERVED_ "-_.!~*'()&=+$,;?/\0"
#define _MARK__PWORD_UNRESERVED_ "-_.!~*'()&=+$,\0"
#define _MARK__URI_PARAM_UNRESERVED_ "-_.!~*'()[]/:&+$\0"
#define _MARK__HEADER_PARAM_UNRESERVED_ "-_.!~*'()[]/?:+$\0"
#define sip_is_alphanum(in) ( \
(in >= 'a' && in <= 'z') || \
(in >= 'A' && in <= 'Z') || \
(in >= '0' && in <= '9'))
int sip_transport_encode_start_line(char *dest, SIP_API_STRUCT *sipApiMsg);
int sip_transport_encode_headers(char *dest, SIP_API_STRUCT *sipApiMsg);
int sip_transport_encode_body(char *dest, SIP_API_STRUCT *sipApiMsg);
int sip_transport_set_addr(struct sockaddr_in *dstAddr, SIP_API_STRUCT *sipApiMsg);
int sip_transport_set_sd_addr(struct sockaddr_in *dstAddr, SIP_TRANSPORT_ADDR *sipTransAddr);
#endif

View File

@@ -0,0 +1,12 @@
#ifndef _SIP_MSG_PARSE__H
#define _SIP_MSG_PARSE__H
void sip_util_replace_all_lws(char *msg);
int sip_set_next_token(char **dest, char *buf, int endSeparator, char **next);
int sip_msg_start_line_parse(SIP_API_STRUCT *dest, char *buf, char **nextHeader);
int sip_uri_parse(SIP_URI *sipUri, char *buf);
int sip_msg_headers_parse(SIP_API_STRUCT *sip, char *buf, char **body);
int sip_body_parse(SIP_API_STRUCT *sip, char *buf, WORD len);
int sip_parser_init(void);
#endif

View File

@@ -0,0 +1,55 @@
#ifndef _SIP_PUB__H
#define _SIP_PUB__H
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <memory.h>
#include <netdb.h>
#include <setjmp.h>
#include <unistd.h>
#include <signal.h>
//by simon at 23/9/22
//#include <stropts.h>
#include <time.h>
#include <syslog.h>
#include <termio.h>
#include <fcntl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <sys/poll.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/socket.h>
#include <sys/select.h>
#ifndef _T_BYTE
#define _T_BYTE
typedef unsigned char BYTE;
#endif
#ifndef _T_WORD
#define _T_WORD
typedef unsigned short WORD;
#endif
#ifndef _T_DWORD
#define _T_DWORD
typedef unsigned int DWORD;
#endif
#endif

View File

@@ -0,0 +1,62 @@
#ifndef _SIP_STRUCT__H
#define _SIP_STRUCT__H
#include "sip_pub.h"
#include "sip.h"
#include "sip_const.h"
// Internal type for parser's config
typedef struct _SIP_HDR_CONFIG
{
char *hname;
int (*setheader)(SIP_API_STRUCT *, char *);
}SIP_HDR_CONFIG;
typedef struct _SIP_USER_STRUCT
{
BYTE flag;
SIP_USER sipUser;
}SIP_USER_STRUCT;
typedef struct _SIP_USERS_STRUCT
{
BYTE proxyIndex;
SIP_USER_STRUCT sipUsers[SIP_MAX_NUM_OF_USERS];
}SIP_USERS_STRUCT;
typedef struct _SIP_TRANS_SD_MSG
{
SIP_TRANSPORT_ADDR sipSdAddr;
BYTE sdMsg[SIP_MAX_UDP_MSG_LEN];
}SIP_TRANS_SD_MSG;
typedef struct _SIP_TRANSACTION
{
BYTE flag;
BYTE userIndex;
BYTE tcpSockIndex;
BYTE client;
BYTE method;
BYTE mainState;
BYTE state;
WORD upPort;
WORD rvCmd;
WORD sdCmd;
DWORD timer;
DWORD timer2;
BYTE retransTimes;
SIP_CR_MSG crMsg;
// SIP_API_STRUCT sdMsg;
SIP_TRANS_SD_MSG transSdMsg;
}SIP_TRANSACTION;
typedef struct _SIP_TCP_SOCK
{
BYTE flag;
int sendRecvSock;
struct sockaddr_in remoteAddr;
}SIP_TCP_SOCK;
#endif

View File

@@ -0,0 +1,11 @@
#ifndef _SIP_TRANSACTION__H
#define _SIP_TRANSACTION_H
void sip_transaction_proc(WORD transid);
void sip_trans_init(WORD trans_id);
WORD sip_request_match_server_trans(SIP_API_STRUCT *recvMsg);
WORD sip_response_match_client_trans(SIP_API_STRUCT *recvMsg);
int sip_set_trans_send_cmd(SIP_TRANSACTION *trans, SIP_API_STRUCT *sipApiMsg);
int sip_msg_transport_to_transaction(SIP_API_STRUCT *recvMsg, WORD transId);
#endif

View File

@@ -0,0 +1,9 @@
#ifndef _SIP_TRANSPORT__H
#define _SIP_TRANSPORT_H
void sip_transport_proc();
int sip_transport_encode_trans_msg(SIP_TRANSACTION *trans, SIP_API_STRUCT *sipApiMsg);
int sip_transport_send_msg(SIP_API_STRUCT *sipApiMsg);
int sip_transport_send_trans_msg(SIP_TRANS_SD_MSG *transSdMsg);
#endif

View File

@@ -0,0 +1,39 @@
#ifndef _SIP_UA_H
#define _SIP_UA_H
#include "sip_ua_pub.h"
#include "sip.h"
#include "../../../pal/pal.h"
#define sip_response_match_ua_dialog(sipMsg) sip_ua_match_dialog_with_rsp(sipMsg)
typedef struct _SIP_UA_SAP
{
BYTE proxyType;
char userName[16];
char domain[SIP_MAX_DOMAIN_NAME_LEN];
int (*recv_req)(WORD sipUaPort, WORD usrPort, WORD dialogId, BYTE method, SIP_API_STRUCT *sipApiMsg, pal_cg_struct *cg);
int (*recv_resp)(WORD usrPort, WORD dialogId, WORD statusCode, SIP_API_STRUCT *sipApiMsg);
}SIP_UA_SAP;
typedef struct _SIP_EVENTHANDLE_STRUCT
{
int (*recv_req)(WORD sipUaPort, WORD usrPort, WORD dialogId, BYTE method, SIP_API_STRUCT *sipApiMsg, pal_cg_struct *cg);
int (*recv_resp)(WORD usrPort, WORD dialogId, WORD statusCode, SIP_API_STRUCT *sipApiMsg);
}SIP_EVENTHANDLE_STRUCT;
int sip_ua_init();
//int sip_ua_bind(SIP_UA_SAP *sap);
int sip_ua_init_port(WORD port);
int sip_ua_init_dialog(WORD dialogId);
int sip_ua_get_port();
WORD sip_ua_match_dialog_with_req(SIP_API_STRUCT *request);
WORD sip_ua_match_dialog_with_rsp(SIP_API_STRUCT *response);
int sip_query_sip_ua_users(SIP_URI *sipUri);
#endif

View File

@@ -0,0 +1,57 @@
#ifndef _SIP_UA_CONST_H
#define _SIP_UA_CONST_H
#define SIP_UA_MAX_NUM_OF_PORT 4096//8192
#define SIP_UA_MAX_NUM_OF_DIALOG 4096//8192
#define SIP_UA_MAX_NUM_OF_SAP 4
#define SIP_UA_NULL_DIALOG 0xFFFF
#define SIP_UA_NULL_PORT 0xFFFF
#define SIP_UA_NULL_UP_PORT 0xFFFF
#define SIP_UA_SEND_COM_NULL 0
#define SIP_UA_RECV_COM_NULL 0
#define SIP_UA_FSM_STATE_INDICATE 1
#define SIP_UA_FSM_STATE_REQUEST 2
#define SIP_UA_MAIN_STATE_IDLE 0
#define SIP_UA_MAIN_STATE_INVITE_REQ 1
#define SIP_UA_MAIN_STATE_NON_INVITE_REQ 2
#define SIP_UA_MAIN_STATE_INVITE_RSP 3
#define SIP_UA_MAIN_STATE_NON_INVITE_RSP 4
#define SIP_UA_MAIN_STATE_INIT 5
#define SIP_UA_SEND_REQUEST 1
#define SIP_UA_REQ_WAIT_FOR_RSP 2
#define SIP_UA_INV_REQ_TERMINATED 3
#define SIP_UA_SEND_RESPONSE 4
#define SIP_UA_INV_200_RSP_WAIT_FOR_ACK 5
#define SIP_UA_INV_RSP_TERMINATED 6
#define WAIT_200_ACK_TIME_OUT 97
#define WAIT_RSP_TIME_OUT 98
#define SIP_UA_TIMER_RETRANSMIT_200 50
#define SIP_UA_TIMER_WAIT_INV_RSP 3300
#define SIP_UA_TIMER_WAIT_INV_200_RSP 5000
#define SIP_UA_TIMER_WAIT_NON_INV_RSP 1000
#define SIP_UA_TIMER_WAIT_ACK 1000
#define SIP_UA_TIMER_T1 300//3200
#define SIP_UA_TIMER_TIME_OUT 18000
#define SIP_UA_TIMER_T2 5
#define SIP_UA_TIMER_T3 20
#define SIP_UA_FSM_TIMER 3300//SIP_UA_TIMER_T1;
#define SIP_UA_MAX_TAG_LEN 64//128
#define SIP_UA_MAX_BRANCH_LEN 64
#endif

View File

@@ -0,0 +1,28 @@
#ifndef _SIP_UA_DEF_H
#define _SIP_UA_DEF_H
#include "sip_ua_pub.h"
#include "sip.h"
#include "sip_ua_struct.h"
#include "sip_ua_const.h"
#include "sip_ua_dialog.h"
char sipUaHostName[50];
char sipUaDottedHostIp[20];
DWORD sipUaHostIp;
int sipUaSipIndex;
SIP_USER sipUaSipUser;
SIP_UA_SAPS sipUaSaps[SIP_UA_MAX_NUM_OF_SAP];
SIP_DIALOG sipUaDialog[SIP_UA_MAX_NUM_OF_DIALOG];
SIP_UA_PORT sipUaPort[SIP_UA_MAX_NUM_OF_PORT];
SIP_API_STRUCT sipUaRecvMsg;
WORD sipUaPortSelect;
WORD sipUaDialogSelect;
#endif

View File

@@ -0,0 +1,72 @@
#ifndef _SIP_UA_DIALOG_H
#define _SIP_UA_DIALOG_H
#include "sip_ua_pub.h"
#include "sip.h"
#include "sip_ua_const.h"
#define SIP_CALLEE 1
#define SIP_CALLER 2
#define SIP_UA_DIALOG_IDLE 0
#define SIP_UA_DIALOG_EARLY 1
#define SIP_UA_DIALOG_WAIT_ACK_FOR_200 2
#define SIP_UA_DIALOG_CONFIRMED 3
#define SIP_UA_DIALOG_DESTROY 4
#define SIP_UA_DIALOG_REMOTE_TARGET_FLAG 0x0001
#define SIP_UA_DIALOG_RECORD_ROUTE_SEND_FLAG 0x0002
typedef struct _SIP_UA_URI
{
BYTE uriType;
char userName[SIP_MAX_USER_NAME_LEN];
char password[SIP_MAX_PASSWORD_LEN];
char domain[SIP_MAX_DOMAIN_NAME_LEN];
}SIP_UA_URI;
typedef struct _SIP_DIALOG
{
BYTE flag;
BYTE cgId;//BYTE userIndex;
WORD usrPort;
BYTE type;
BYTE state;
union
{
WORD rvInvUaPort;
WORD sdInvUaPort;
}invUaPort;
WORD sipUaPort;
WORD uaPort;//only used to store the ua port of sending invite rsp
WORD uaAckPort;//only used to store the ua port of sending ACK for invite 200
DWORD invCSeq;
DWORD remoteInvCseq;
char invBranch[SIP_UA_MAX_BRANCH_LEN];
WORD paramFlag;
SIP_HDR_CALL_ID callId;
char localTag[SIP_UA_MAX_TAG_LEN];
char remoteTag[SIP_UA_MAX_TAG_LEN];
SIP_HDR_CSEQ localCseq;
SIP_HDR_CSEQ remoteCseq;
SIP_UA_URI localURI;
SIP_UA_URI remoteURI;
SIP_UA_URI remoteTarget;
SIP_HDR_RECORD_ROUTES routeSets;
int secure;
}SIP_DIALOG;
int sip_ua_update_dialog_with_req(WORD dialogId, SIP_API_STRUCT *sipApiMsg);
int sip_ua_init_dialog_as_client_with_inv(BYTE cgId, WORD usrPort, SIP_MSG *sipMsg);//BYTE sapIndex
int sip_ua_init_dialog_as_server_with_inv(BYTE cgId, WORD hdlPort, WORD usrPort, SIP_MSG *sipMsg);//BYTE cgId
int sip_ua_free_dialog(DWORD usrPort, WORD dialogId);
#endif

View File

@@ -0,0 +1,29 @@
#ifndef _SIP_UA_EXT_H
#define _SIP_UA_EXT_H
#include "sip_ua_pub.h"
#include "sip.h"
#include "sip_ua_struct.h"
#include "sip_ua_const.h"
#include "sip_ua_dialog.h"
extern char sipUaHostName[50];
extern char sipUaDottedHostIp[20];
extern DWORD sipUaHostIp;
extern int sipUaSipIndex;
extern SIP_USER sipUaSipUser;
extern SIP_UA_SAPS sipUaSaps[SIP_UA_MAX_NUM_OF_SAP];
extern SIP_DIALOG sipUaDialog[SIP_UA_MAX_NUM_OF_DIALOG];
extern SIP_UA_PORT sipUaPort[SIP_UA_MAX_NUM_OF_PORT];
extern SIP_API_STRUCT sipUaRecvMsg;
extern WORD sipUaPortSelect;
extern WORD sipUaDialogSelect;
#endif

View File

@@ -0,0 +1,31 @@
#ifndef _SIP_UA_MSG_H
#define _SIP_UA_MSG_H
#include "sip_ua_pub.h"
#define sip_ua_send_update(cgId, dialogId, usrPort, method, sdMsg) sip_ua_send_non_inv(cgId, dialogId, usrPort, method, sdMsg)
#define sip_ua_send_cancel(cgId, dialogId, usrPort, method, sdMsg) sip_ua_send_non_inv(cgId, dialogId, usrPort, method, sdMsg)
#define sip_ua_send_bye(cgId, dialogId, usrPort, method, sdMsg) sip_ua_send_non_inv(cgId, dialogId, usrPort, method, sdMsg)
#define sip_ua_send_200_ack(cgId, dialogId, usrPort, method, sdMsg) sip_ua_send_non_inv(cgId, dialogId, usrPort, method, sdMsg)
#define sip_ua_send_info(cgId, dialogId, usrPort, method, sdMsg) sip_ua_send_non_inv(cgId, dialogId, usrPort, method, sdMsg)
#define sip_ua_send_bye_inv_rsp(cgId, dialogId, usrPort, sdMsg) sip_ua_send_cancel_inv_rsp(cgId, dialogId, usrPort, sdMsg)
int sip_ua_send_invite(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg);
int sip_ua_send_re_invite(BYTE cgId, WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg);
int sip_ua_send_non_inv(BYTE cgId,WORD dialogId, WORD usrPort, BYTE method, SIP_API_STRUCT *sdMsg);
int sip_ua_send_cancel(BYTE cgId,WORD dialogId, WORD usrPort, BYTE method, SIP_API_STRUCT *sdMsg);
int sip_ua_send_bye(BYTE sapIncgIddex,WORD dialogId, WORD usrPort, BYTE method, SIP_API_STRUCT *sdMsg);
int sip_ua_send_200_ack(BYTE cgId,WORD dialogId, WORD usrPort, BYTE method, SIP_API_STRUCT *sdMsg);
int sip_ua_send_info(BYTE cgId,WORD dialogId, WORD usrPort, BYTE method, SIP_API_STRUCT *sdMsg);
int sip_ua_send_options(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg);
int sip_ua_send_refer(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg);
int sip_ua_set_inv_temp_rsp(WORD uaPort,SIP_API_STRUCT *sdMsg);
int sip_ua_send_inv_rsp(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg);
int sip_ua_send_cancel_inv_rsp(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg);
int sip_ua_send_re_inv_rsp(BYTE cgId,WORD dialogId, WORD usrPort, SIP_API_STRUCT *sdMsg);
int sip_ua_send_non_inv_rsp(BYTE cgId, WORD dialogId, WORD usrPort, BYTE method, SIP_API_STRUCT *sdMsg);
#endif

View File

@@ -0,0 +1,56 @@
#ifndef _SIP_UA_PUB__H
#define _SIP_UA_PUB__H
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <memory.h>
#include <netdb.h>
#include <setjmp.h>
#include <unistd.h>
#include <signal.h>
// by simon at 23/9/22
//#include <stropts.h>
#include <time.h>
#include <syslog.h>
#include <termio.h>
#include <fcntl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <sys/poll.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/socket.h>
#include <sys/select.h>
#ifndef _T_BYTE
#define _T_BYTE
typedef unsigned char BYTE;
#endif
#ifndef _T_WORD
#define _T_WORD
typedef unsigned short WORD;
#endif
#ifndef _T_DWORD
#define _T_DWORD
typedef unsigned int DWORD;
#endif
#endif

View File

@@ -0,0 +1,47 @@
#ifndef _SIP_UA_STRUCT_H
#define _SIP_UA_STRUCT_H
#include "sip_ua_pub.h"
#include "sip_ua.h"
#include "sip.h"
typedef struct _SIP_UA_CALL_STRUCT
{
SIP_HDR_CALL_ID callId;
char fromTag[128];
}SIP_UA_CALL_STRUCT;
typedef struct _SIP_UA_PORT
{
BYTE flag;
BYTE cgId;//BYTE sapIndex;
WORD dialogId;
WORD usrPort;
WORD llPort;
SIP_UA_CALL_STRUCT callStruct;
BYTE sipuafState;
DWORD sipuafTimer;
BYTE mainState;
BYTE state;
WORD rcvCmd;
WORD sdCmd;
DWORD timer;
DWORD timer2;
DWORD waitAckTimer;
BYTE retrans200Times;
SIP_API_STRUCT sdSipMsg;
}SIP_UA_PORT;
typedef struct _SIP_UA_SAPS
{
BYTE flag;
SIP_UA_SAP sipUaSap;
}SIP_UA_SAPS;
#endif