Begin documenting IMS/LTE stack.
This commit is contained in:
parent
2e99f0c158
commit
b65a34cf0f
Binary file not shown.
|
@ -134,7 +134,7 @@ thttp_session_set(session,
|
|||
* @def THTTP_SESSION_SET_NULL
|
||||
* Ends session parameters. Must always be the last one.
|
||||
*/
|
||||
#define THTTP_SESSION_SET_OPTION(ID_INT, VALUE_STR) httpp_option, (thttp_session_option_t)ID_INT, (const char*)VALUE_STR
|
||||
#define THTTP_SESSION_SET_OPTION(ID_ENUM, VALUE_STR) httpp_option, (thttp_session_option_t)ID_ENUM, (const char*)VALUE_STR
|
||||
#define THTTP_SESSION_SET_CRED(USERNAME_STR, PASSWORD_STR) httpp_cred, (const char*)USERNAME_STR, (const char*)PASSWORD_STR
|
||||
#define THTTP_SESSION_SET_HEADER(NAME_STR, VALUE_STR) httpp_header, (const char*)NAME_STR, (const char*)VALUE_STR
|
||||
#define THTTP_SESSION_SET_CONTEXT(CTX_PTR) httpp_context, (const void*)CTX_PTR
|
||||
|
@ -170,7 +170,7 @@ typedef tsk_list_t thttp_sessions_L_t; /**< List of @ref thttp_session_handle_t
|
|||
*/
|
||||
typedef void thttp_session_handle_t;
|
||||
|
||||
TINYHTTP_API thttp_session_handle_t* thttp_session_create(const struct thttp_stack_s* stack, ...);
|
||||
TINYHTTP_API thttp_session_handle_t* thttp_session_create(const thttp_stack_handle_t* stack, ...);
|
||||
TINYHTTP_API int thttp_session_set(thttp_session_handle_t *self, ...);
|
||||
TINYHTTP_API thttp_session_id_t thttp_session_get_id(const thttp_session_handle_t *self);
|
||||
TINYHTTP_API const void* thttp_session_get_context(const thttp_session_handle_t *self);
|
||||
|
|
|
@ -112,7 +112,7 @@ if((ret = thttp_stack_start(stack))){
|
|||
*
|
||||
*<h2>15.2 Sessions</h2>
|
||||
* <p>
|
||||
* A session can be seen as a peer2peer persistent connection and will be maintained by the stack as long as you wish to keep the network connection opened (not explicitly destroyed). <br>
|
||||
* A session could be seen as a peer2peer persistent connection and will be maintained by the stack as long as you wish to keep the network connection opened (not explicitly destroyed). <br>
|
||||
* If the connection is closed by the remote peer, then the stack will automatically reopen it when you try to send a new HTTP/HTTP request. <br>
|
||||
* The network connection will be definitely closed when the session is destroyed.
|
||||
* </p>
|
||||
|
|
|
@ -53,7 +53,7 @@ int __thttp_session_set(thttp_session_t *self, va_list* app)
|
|||
while((curr=va_arg(*app, thttp_session_param_type_t)) != httpp_null){
|
||||
switch(curr){
|
||||
case httpp_option:
|
||||
{
|
||||
{ /* (thttp_session_option_t)ID_ENUM, (const char*)VALUE_STR */
|
||||
thttp_session_option_t id = va_arg(*app, thttp_session_option_t);
|
||||
const char* value = va_arg(*app, const char *);
|
||||
tsk_options_add_option(&self->options, id, value);
|
||||
|
@ -61,7 +61,7 @@ int __thttp_session_set(thttp_session_t *self, va_list* app)
|
|||
}
|
||||
|
||||
case httpp_header:
|
||||
{
|
||||
{ /* (const char*)NAME_STR, (const char*)VALUE_STR */
|
||||
const char* name = va_arg(*app, const char *);
|
||||
const char* value = va_arg(*app, const char *);
|
||||
tsk_params_add_param(&self->headers, name, value);
|
||||
|
@ -69,20 +69,20 @@ int __thttp_session_set(thttp_session_t *self, va_list* app)
|
|||
}
|
||||
|
||||
case httpp_cred:
|
||||
{
|
||||
{ /* (const char*)USERNAME_STR, (const char*)PASSWORD_STR */
|
||||
tsk_strupdate(&self->cred.usename, va_arg(*app, const char *));
|
||||
tsk_strupdate(&self->cred.password, va_arg(*app, const char *));
|
||||
break;
|
||||
}
|
||||
|
||||
case httpp_context:
|
||||
{
|
||||
{ /* (const void*)CTX_PTR */
|
||||
self->context = va_arg(*app, const void *);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
{ /* va_list will be unsafe => exit */
|
||||
TSK_DEBUG_ERROR("NOT SUPPORTED.");
|
||||
goto bail;
|
||||
}
|
||||
|
@ -116,7 +116,7 @@ thttp_session_handle_t * session = thttp_session_create(stack,
|
|||
*
|
||||
* @sa @ref thttp_session_set
|
||||
*/
|
||||
thttp_session_handle_t* thttp_session_create(const struct thttp_stack_s* stack, ...)
|
||||
thttp_session_handle_t* thttp_session_create(const thttp_stack_handle_t* stack, ...)
|
||||
{
|
||||
thttp_session_handle_t* ret = tsk_null;
|
||||
|
||||
|
|
|
@ -209,7 +209,8 @@ static tsk_object_t* tnet_socket_ctor(tsk_object_t * self, va_list * app)
|
|||
|
||||
/* Performs getaddrinfo */
|
||||
if((status = tnet_getaddrinfo(local_hostname, port, &hints, &result))){
|
||||
TNET_PRINT_LAST_ERROR("getaddrinfo have failed.");
|
||||
TSK_DEBUG_ERROR("tnet_getaddrinfo(family=%d, hostname=%s and port=%s) failed: [%s]",
|
||||
hints.ai_family, local_hostname, port, tnet_gai_strerror(status));
|
||||
goto bail;
|
||||
}
|
||||
|
||||
|
|
|
@ -521,9 +521,9 @@ bail:
|
|||
**/
|
||||
int tnet_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)
|
||||
{
|
||||
int ret;
|
||||
if((ret = getaddrinfo(node, service, hints, res))){
|
||||
TSK_DEBUG_ERROR("getaddrinfo failed: [%s]", tnet_gai_strerror(ret));
|
||||
int ret = -1;
|
||||
if(hints && (ret = getaddrinfo(node, service, hints, res))){
|
||||
TSK_DEBUG_ERROR("getaddrinfo(family=%d, node=%s and service=%s) failed: [%s]", hints->ai_family, node, service, tnet_gai_strerror(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -60,7 +60,6 @@ TSIP_BEGIN_DECLS
|
|||
#define TSIP_DIALOG_TIMER_SCHEDULE(name, TX) \
|
||||
self->timer##TX.id = tsk_timer_manager_schedule(TSIP_DIALOG_GET_STACK(self)->timer_mgr, self->timer##TX.timeout, TSK_TIMER_CALLBACK_F(tsip_dialog_##name##_timer_callback), self)
|
||||
|
||||
#define TSIP_DIALOG_EXPIRES_DEFAULT 3600000 /* miliseconds. */
|
||||
#define TSIP_DIALOG_SHUTDOWN_TIMEOUT 4000 /* miliseconds. */
|
||||
|
||||
typedef enum tsip_dialog_state_e
|
||||
|
|
|
@ -41,23 +41,35 @@ TSIP_BEGIN_DECLS
|
|||
//FD
|
||||
struct tsip_message_s;
|
||||
|
||||
#define TSIP_SSESSION_CREATE(stack, ...) tsk_object_new(tsip_ssession_def_t, stack, __VA_ARGS__)
|
||||
|
||||
typedef uint64_t tsip_ssession_id_t;
|
||||
#define TSIP_SSESSION_INVALID_ID 0
|
||||
#define TSIP_SSESSION_INVALID_HANDLE tsk_null
|
||||
|
||||
#define TSIP_SSESSION_EXPIRES_DEFAULT 3600000 /* miliseconds. */
|
||||
|
||||
typedef enum tsip_ssession_option_e
|
||||
{
|
||||
TSIP_SSESSION_OPTION_TIMEOUT,
|
||||
|
||||
//! Destination URI. Will be used to set "To" header.
|
||||
TSIP_SSESSION_OPTION_DESTINATION,
|
||||
//! Source URI. Will be used to set "From" header.
|
||||
TSIP_SSESSION_OPTION_SOURCE,
|
||||
}
|
||||
tsip_ssession_option_t;
|
||||
|
||||
typedef enum tsip_ssession_param_type_e
|
||||
{
|
||||
sstype_param,
|
||||
sstype_null = tsk_null,
|
||||
|
||||
sstype_option,
|
||||
sstype_header,
|
||||
sstype_caps,
|
||||
sstype_context,
|
||||
sstype_null = 0
|
||||
}
|
||||
tsip_ssession_param_type_t;
|
||||
|
||||
#define TSIP_SSESSION_SET_PARAM(NAME_STR, VALUE_STR) sstype_param, (const char*)NAME_STR, (const char*)VALUE_STR
|
||||
#define TSIP_SSESSION_SET_OPTION(ID_ENUM, VALUE_STR) sstype_option, (tsip_ssession_option_t)ID_ENUM, (const char*)VALUE_STR
|
||||
#define TSIP_SSESSION_SET_HEADER(NAME_STR, VALUE_STR) sstype_header, (const char*)NAME_STR, (const char*)VALUE_STR
|
||||
#define TSIP_SSESSION_SET_CAPS(NAME_STR, VALUE_STR) sstype_caps, (const char*)NAME_STR, (const char*)VALUE_STR /* RFC 3840 */
|
||||
#define TSIP_SSESSION_SET_CONTEXT(CTX_PTR) sstype_context, (const void*)CTX_PTR
|
||||
|
@ -68,19 +80,24 @@ typedef struct tsip_ssession_s
|
|||
TSK_DECLARE_OBJECT;
|
||||
|
||||
tsip_ssession_id_t id;
|
||||
tsk_bool_t owner;
|
||||
|
||||
const struct tsip_stack_s* stack;
|
||||
const void* context; // usr context
|
||||
tsk_params_L_t *params;
|
||||
tsk_options_L_t *options;
|
||||
tsk_params_L_t *caps;
|
||||
tsk_params_L_t *headers;
|
||||
|
||||
tsk_bool_t owner;
|
||||
struct tsip_uri_s* from;
|
||||
struct tsip_uri_s* to;
|
||||
int32_t expires;
|
||||
}
|
||||
tsip_ssession_t;
|
||||
|
||||
typedef void tsip_ssession_handle_t;
|
||||
|
||||
|
||||
TINYSIP_API tsip_ssession_handle_t* tsip_ssession_create(tsip_stack_handle_t *stack, ...);
|
||||
TINYSIP_API int tsip_ssession_set(tsip_ssession_handle_t *self, ...);
|
||||
TINYSIP_API tsip_ssession_id_t tsip_ssession_get_id(const tsip_ssession_handle_t *self);
|
||||
TINYSIP_API int tsip_ssession_take_ownership(tsip_ssession_handle_t *self);
|
||||
|
@ -88,12 +105,8 @@ TINYSIP_API tsk_bool_t tsip_ssession_have_ownership(const tsip_ssession_handle_t
|
|||
TINYSIP_API int tsip_ssession_respond(const tsip_ssession_handle_t *self, short status, const char* phrase, const void* payload, size_t size, const struct tsip_message_s* request, ...);
|
||||
TINYSIP_API const void* tsip_ssession_get_context(const tsip_ssession_handle_t *self);
|
||||
|
||||
tsip_ssession_handle_t *tsip_ssession_create_2(const struct tsip_stack_s* stack, const struct tsip_message_s* message);
|
||||
//const tsk_param_t* tsip_ssession_get_param(const tsip_ssession_handle_t *self, const char* pname);
|
||||
//const tsk_param_t* tsip_ssession_get_header(const tsip_ssession_handle_t *self, const char* pname);
|
||||
//const tsk_params_L_t* tsip_ssession_get_headers(const tsip_ssession_handle_t *self);
|
||||
//const tsk_params_L_t* tsip_ssession_get_params(const tsip_ssession_handle_t *self);
|
||||
//const tsk_params_L_t* tsip_ssession_get_caps(const tsip_ssession_handle_t *self);
|
||||
//tsip_ssession_handle_t *tsip_ssession_create_2(const struct tsip_stack_s* stack, const struct tsip_message_s* message);
|
||||
|
||||
int tsip_ssession_hangup(const tsip_ssession_t *self, const struct tsip_action_s* action);
|
||||
|
||||
typedef tsk_list_t tsip_ssessions_L_t; /**< List of @ref tsip_ssession_handle_t elements. */
|
||||
|
|
|
@ -56,50 +56,24 @@ typedef uint8_t amf_t[2];
|
|||
typedef uint8_t operator_id_t[16];
|
||||
typedef void tsip_stack_handle_t;
|
||||
|
||||
|
||||
typedef enum tsip_stack_param_type_e
|
||||
{
|
||||
pname_null = tsk_null,
|
||||
#define TSIP_STACK_SET_NULL() pname_null
|
||||
|
||||
pname_option,
|
||||
|
||||
/* Identity */
|
||||
pname_display_name,
|
||||
pname_public_identity,
|
||||
pname_preferred_identity,
|
||||
pname_private_identity,
|
||||
pname_password,
|
||||
#define TSIP_STACK_SET_DISPLAY_NAME(NAME_STR) pname_display_name, (const char*)NAME_STR
|
||||
#define TSIP_STACK_SET_PUBLIC_IDENTITY(URI_STR) pname_public_identity, (const char*)URI_STR
|
||||
#define TSIP_STACK_SET_PREFERRED_IDENTITY(URI_STR) pname_preferred_identity, (const char*)URI_STR
|
||||
#define TSIP_STACK_SET_PRIVATE_IDENTITY(STR) pname_private_identity, (const char*)STR
|
||||
#define TSIP_STACK_SET_PASSWORD(STR) pname_password, (const char*)STR
|
||||
|
||||
/* Network */
|
||||
pname_local_ip,
|
||||
pname_local_port,
|
||||
pname_privacy,
|
||||
pname_operator_id,
|
||||
pname_amf,
|
||||
pname_netinfo,
|
||||
pname_realm,
|
||||
pname_discovery_naptr,
|
||||
pname_discovery_dhcp,
|
||||
pname_proxy_cscf,
|
||||
pname_proxy_cscf_port,
|
||||
pname_device_id,
|
||||
pname_mobility,
|
||||
#define TSIP_STACK_SET_LOCAL_IP(STR) pname_local_ip, (const char*)STR
|
||||
#define TSIP_STACK_SET_LOCAL_PORT(INT) pname_local_port, (int)INT
|
||||
#define TSIP_STACK_SET_PRIVACY(STR) pname_privacy, (const char*)STR
|
||||
#define TSIP_STACK_SET_POPERATOR_ID(OPERATOR_ID) pname_privacy, (operator_id_t)OPERATOR_ID
|
||||
#define TSIP_STACK_SET_AMF(AMF) pname_amf, (amf_t)AMF
|
||||
#define TSIP_STACK_SET_NETINFO(STR) pname_netinfo, (const char*)STR
|
||||
#define TSIP_STACK_SET_REALM(FQDN_STR) pname_realm, (const char*)FQDN_STR
|
||||
#define TSIP_STACK_SET_DISCOVERY_NAPTR(USE_NAPTR_UINT) pname_discovery_naptr, (unsigned)USE_NAPTR_UINT
|
||||
#define TSIP_STACK_SET_DISCOVERY_DHCP(USE_DHCP_UINT) pname_discovery_dhcp, (unsigned)USE_DHCP_UINT
|
||||
#define TSIP_STACK_SET_PROXY_CSCF(FQDN_STR, TRANSPORT_STR, USE_IPV6_INT) pname_proxy_cscf, (const char*)FQDN_STR, (const char*)TRANSPORT_STR, (int)USE_IPV6_INT
|
||||
#define TSIP_STACK_SET_PROXY_CSCF_PORT(UINT16) pname_proxy_cscf_port, (uint16_t)UINT16
|
||||
#define TSIP_STACK_SET_DEVICE_ID(UUID_STR) pname_device_id, (const char*)UUID_STR
|
||||
#define TSIP_STACK_SET_MOBILITY(MOB_STR) pname_mobility, (const char*)MOB_STR
|
||||
|
||||
|
||||
/* Security */
|
||||
pname_secagree_ipsec,
|
||||
|
@ -126,7 +100,58 @@ typedef enum tsip_stack_param_type_e
|
|||
}
|
||||
tsip_stack_param_type_t;
|
||||
|
||||
typedef enum tsip_stack_option_e
|
||||
{
|
||||
/* Identity */
|
||||
TSIP_STACK_OPTION_DISPLAY_NAME,
|
||||
TSIP_STACK_OPTION_IMPU,
|
||||
TSIP_STACK_OPTION_PREFERRED_IDENTITY,
|
||||
TSIP_STACK_OPTION_IMPI,
|
||||
TSIP_STACK_OPTION_PASSWORD,
|
||||
|
||||
/* Network */
|
||||
TSIP_STACK_OPTION_REALM,
|
||||
TSIP_STACK_OPTION_LOCAL_IP,
|
||||
TSIP_STACK_OPTION_LOCAL_PORT,
|
||||
TSIP_STACK_OPTION_DISCOVERY_NAPTR,
|
||||
TSIP_STACK_OPTION_DISCOVERY_DHCP,
|
||||
TSIP_STACK_OPTION_AMF,
|
||||
TSIP_STACK_OPTION_OPERATOR_ID,
|
||||
|
||||
/* Security */
|
||||
TSIP_STACK_OPTION_EARLY_IMS,
|
||||
TSIP_STACK_OPTION_SECAGREE_IPSEC,
|
||||
TSIP_STACK_OPTION_SECAGREE_TLS,
|
||||
|
||||
/* Features */
|
||||
|
||||
|
||||
}
|
||||
tsip_stack_option_t;
|
||||
|
||||
/* === Options === */
|
||||
#define TSIP_STACK_SET_OPTION(ID_ENUM, VALUE_STR) pname_option, (tsip_stack_option_t)ID_ENUM, (const char*)VALUE_STR
|
||||
|
||||
/* === Identity === */
|
||||
#define TSIP_STACK_SET_DISPLAY_NAME(NAME_STR) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_DISPLAY_NAME, NAME_STR)
|
||||
#define TSIP_STACK_SET_IMPU(URI_STR) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_IMPU, URI_STR)
|
||||
#define TSIP_STACK_SET_PREFERRED_IDENTITY(URI_STR) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_PREFERRED_IDENTITY, URI_STR)
|
||||
#define TSIP_STACK_SET_IMPI(IMPI_STR) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_IMPI, IMPI_STR)
|
||||
#define TSIP_STACK_SET_PASSWORD(PASSORD_STR) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_PASSWORD, PASSORD_STR)
|
||||
|
||||
/* === Network === */
|
||||
#define TSIP_STACK_SET_REALM(URI_STR) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_REALM, URI_STR)
|
||||
#define TSIP_STACK_SET_LOCAL_IP(IP_STR) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_LOCAL_IP, IP_STR)
|
||||
#define TSIP_STACK_SET_LOCAL_PORT(PORT_UINT) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_LOCAL_PORT, #PORT_UINT)
|
||||
#define TSIP_STACK_SET_DISCOVERY_NAPTR(ENABLED_BOOL) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_DISCOVERY_NAPTR, #ENABLED_BOOL)
|
||||
#define TSIP_STACK_SET_DISCOVERY_DHCP(ENABLED_BOOL) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_DISCOVERY_DHCP, #ENABLED_BOOL)
|
||||
|
||||
#define TSIP_STACK_SET_PROXY_CSCF(FQDN_STR, PORT_UINT, TRANSPORT_STR, IP_VERSION_STR) pname_proxy_cscf, (const char*)FQDN_STR, (unsigned)PORT_UINT, (const char*)TRANSPORT_STR, (const char*)IP_VERSION_STR
|
||||
|
||||
/* === Security === */
|
||||
#define TSIP_STACK_SET_EARLY_IMS(ENABLED_BOOL) TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_EARLY_IMS, #ENABLED_BOOL)
|
||||
|
||||
/* IMS/LTE stack (for internal use). only tsip_stack_handle_t should be visible. */
|
||||
typedef struct tsip_stack_s
|
||||
{
|
||||
TSK_DECLARE_RUNNABLE;
|
||||
|
@ -134,28 +159,42 @@ typedef struct tsip_stack_s
|
|||
tsip_stack_callback_f callback;
|
||||
|
||||
/* Identity */
|
||||
char* display_name;
|
||||
tsip_uri_t *public_identity;
|
||||
tsip_uri_t *preferred_identity;
|
||||
//struct tsip_uri_s *associated_identity;
|
||||
char *private_identity;
|
||||
char *password;
|
||||
struct{
|
||||
char* display_name;
|
||||
tsip_uri_t *impu;
|
||||
tsip_uri_t *preferred;
|
||||
char *impi;
|
||||
char *password;
|
||||
} identity;
|
||||
|
||||
/* Network */
|
||||
char *local_ip;
|
||||
uint16_t local_port;
|
||||
char *privacy;
|
||||
struct{
|
||||
char *local_ip;
|
||||
tnet_port_t local_port;
|
||||
|
||||
char *proxy_cscf;
|
||||
tnet_port_t proxy_cscf_port;
|
||||
tnet_socket_type_t proxy_cscf_type;
|
||||
|
||||
tsip_uri_t *realm;
|
||||
|
||||
tsk_bool_t discovery_naptr;
|
||||
tsk_bool_t discovery_dhcp;
|
||||
} network;
|
||||
|
||||
/* Security */
|
||||
struct{
|
||||
tsk_bool_t earlyIMS;
|
||||
} security;
|
||||
|
||||
|
||||
operator_id_t operator_id;
|
||||
amf_t amf;
|
||||
char *netinfo;
|
||||
struct tsip_uri_s *realm;
|
||||
char *proxy_cscf;
|
||||
int proxy_cscf_port;
|
||||
tnet_socket_type_t proxy_cscf_type;
|
||||
unsigned use_dns_naptr:1;
|
||||
unsigned use_dhcp:1;
|
||||
char* device_id;
|
||||
char* mobility;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
tsip_uris_L_t* paths;
|
||||
tsip_uris_L_t* service_routes;
|
||||
tsip_uris_L_t* associated_uris;
|
||||
|
@ -176,22 +215,12 @@ typedef struct tsip_stack_s
|
|||
char* pvk;
|
||||
}tls;
|
||||
|
||||
/* DNS */
|
||||
/* DNS context */
|
||||
tnet_dns_ctx_t *dns_ctx;
|
||||
|
||||
/* DHCP */
|
||||
/* DHCP context */
|
||||
|
||||
/* features */
|
||||
unsigned enable_100rel:1;
|
||||
unsigned enable_gsmais:1;
|
||||
unsigned enable_precond:1;
|
||||
unsigned enable_3gppsms:1;
|
||||
unsigned enable_gsmarcs:1;
|
||||
unsigned enable_earlyIMS:1;
|
||||
unsigned enable_ofdr:1;
|
||||
unsigned enable_aa:1;
|
||||
unsigned enable_dnd:1;
|
||||
unsigned enable_option:1;
|
||||
|
||||
|
||||
/* QoS */
|
||||
|
||||
|
@ -210,7 +239,7 @@ tsip_stack_t;
|
|||
|
||||
|
||||
|
||||
TINYSIP_API tsip_stack_handle_t *tsip_stack_create(tsip_stack_callback_f callback, ...);
|
||||
TINYSIP_API tsip_stack_handle_t *tsip_stack_create(tsip_stack_callback_f callback, const char* realm_uri, const char* impi_uri, const char* impu_uri, ...);
|
||||
TINYSIP_API int tsip_stack_start(tsip_stack_handle_t *self);
|
||||
TINYSIP_API int tsip_stack_set(tsip_stack_handle_t *self, ...);
|
||||
TINYSIP_API int tsip_stack_stop(tsip_stack_handle_t *self);
|
||||
|
|
|
@ -45,8 +45,8 @@
|
|||
#define TSIP_CHALLENGE_IS_AKAv2(self) ((self) ? tsk_striequals((self)->algorithm, "AKAv2-MD5") : 0)
|
||||
|
||||
#define TSIP_CHALLENGE_STACK(self) (TSIP_STACK((self)->stack))
|
||||
#define TSIP_CHALLENGE_USERNAME(self) TSIP_CHALLENGE_STACK(self)->private_identity
|
||||
#define TSIP_CHALLENGE_PASSWORD(self) TSIP_CHALLENGE_STACK(self)->password
|
||||
#define TSIP_CHALLENGE_USERNAME(self) TSIP_CHALLENGE_STACK(self)->identity.impi
|
||||
#define TSIP_CHALLENGE_PASSWORD(self) TSIP_CHALLENGE_STACK(self)->identity.password
|
||||
|
||||
|
||||
tsip_challenge_t* tsip_challenge_create(tsip_stack_t* stack, tsk_bool_t isproxy, const char* scheme, const char* realm, const char* nonce, const char* opaque, const char* algorithm, const char* qop)
|
||||
|
@ -247,14 +247,14 @@ int tsip_challenge_get_response(tsip_challenge_t *self, const char* method, cons
|
|||
*/
|
||||
if(TSIP_CHALLENGE_IS_AKAv1(self) || TSIP_CHALLENGE_IS_AKAv2(self)){
|
||||
char* akaresult = 0;
|
||||
tsip_challenge_get_akares(self, TSIP_CHALLENGE_STACK(self)->password, &akaresult);
|
||||
tsip_challenge_get_akares(self, TSIP_CHALLENGE_STACK(self)->identity.password, &akaresult);
|
||||
if(thttp_auth_digest_HA1(TSIP_CHALLENGE_USERNAME(self), self->realm, akaresult, &ha1)){
|
||||
// return -1;
|
||||
}
|
||||
TSK_FREE(akaresult);
|
||||
}
|
||||
else{
|
||||
thttp_auth_digest_HA1(TSIP_CHALLENGE_USERNAME(self), self->realm, TSIP_CHALLENGE_STACK(self)->password, &ha1);
|
||||
thttp_auth_digest_HA1(TSIP_CHALLENGE_USERNAME(self), self->realm, TSIP_CHALLENGE_STACK(self)->identity.password, &ha1);
|
||||
}
|
||||
|
||||
/* ===
|
||||
|
|
|
@ -206,14 +206,12 @@ tsip_request_t *tsip_dialog_request_new(const tsip_dialog_t *self, const char* m
|
|||
}
|
||||
|
||||
/* Update authorizations */
|
||||
if(self->state == tsip_initial && TSK_LIST_IS_EMPTY(self->challenges))
|
||||
{
|
||||
if(self->state == tsip_initial && TSK_LIST_IS_EMPTY(self->challenges)){
|
||||
/* 3GPP TS 33.978 6.2.3.1 Procedures at the UE
|
||||
On sending a REGISTER request in order to indicate support for early IMS security procedures, the UE shall not
|
||||
include an Authorization header field and not include header fields or header field values as required by RFC3329.
|
||||
*/
|
||||
if(TSIP_REQUEST_IS_REGISTER(request) && !TSIP_DIALOG_GET_STACK(self)->enable_earlyIMS)
|
||||
{
|
||||
if(TSIP_REQUEST_IS_REGISTER(request) && !TSIP_DIALOG_GET_STACK(self)->security.earlyIMS){
|
||||
/* 3GPP TS 24.229 - 5.1.1.2.2 Initial registration using IMS AKA
|
||||
On sending a REGISTER request, the UE shall populate the header fields as follows:
|
||||
a) an Authorization header field, with:
|
||||
|
@ -223,20 +221,18 @@ tsip_request_t *tsip_dialog_request_new(const tsip_dialog_t *self, const char* m
|
|||
- the "nonce" header field parameter, set to an empty value; and
|
||||
- the "response" header field parameter, set to an empty value;
|
||||
*/
|
||||
const char* realm = TSIP_DIALOG_GET_STACK(self)->realm ? TSIP_DIALOG_GET_STACK(self)->realm->host : "(null)";
|
||||
const char* realm = TSIP_DIALOG_GET_STACK(self)->network.realm ? TSIP_DIALOG_GET_STACK(self)->network.realm->host : "(null)";
|
||||
char* request_uri = tsip_uri_tostring(request->uri, tsk_false, tsk_false);
|
||||
tsip_header_t* auth_hdr = tsip_challenge_create_empty_header_authorization(TSIP_DIALOG_GET_STACK(self)->private_identity, realm, request_uri);
|
||||
tsip_header_t* auth_hdr = tsip_challenge_create_empty_header_authorization(TSIP_DIALOG_GET_STACK(self)->identity.impi, realm, request_uri);
|
||||
tsip_message_add_header(request, auth_hdr);
|
||||
tsk_object_unref(auth_hdr), auth_hdr = tsk_null;
|
||||
TSK_FREE(request_uri);
|
||||
}
|
||||
}
|
||||
else if(!TSK_LIST_IS_EMPTY(self->challenges))
|
||||
{
|
||||
else if(!TSK_LIST_IS_EMPTY(self->challenges)){
|
||||
tsip_challenge_t *challenge;
|
||||
tsip_header_t* auth_hdr;
|
||||
tsk_list_foreach(item, self->challenges)
|
||||
{
|
||||
tsk_list_foreach(item, self->challenges){
|
||||
challenge = item->data;
|
||||
auth_hdr = tsip_challenge_create_header_authorization(challenge, request);
|
||||
if(auth_hdr){
|
||||
|
@ -745,14 +741,13 @@ int tsip_dialog_add_common_headers(const tsip_dialog_t *self, tsip_request_t* re
|
|||
return -1;
|
||||
}
|
||||
|
||||
earlyIMS = TSIP_DIALOG_GET_STACK(self)->enable_earlyIMS;
|
||||
preferred_identity = TSIP_DIALOG_GET_STACK(self)->preferred_identity;
|
||||
netinfo = TSIP_DIALOG_GET_STACK(self)->netinfo;
|
||||
earlyIMS = TSIP_DIALOG_GET_STACK(self)->security.earlyIMS;
|
||||
preferred_identity = TSIP_DIALOG_GET_STACK(self)->identity.preferred;
|
||||
|
||||
//
|
||||
// P-Preferred-Identity
|
||||
//
|
||||
if(preferred_identity)
|
||||
{
|
||||
if(preferred_identity){
|
||||
/* 3GPP TS 33.978 6.2.3.1 Procedures at the UE
|
||||
The UE shall use the temporary public user identity (IMSI-derived IMPU, cf. section 6.1.2) only in registration
|
||||
messages (i.e. initial registration, re-registration or de-registration), but not in any other type of SIP requests.
|
||||
|
@ -847,9 +842,8 @@ int tsip_dialog_init(tsip_dialog_t *self, tsip_dialog_type_t type, const char* c
|
|||
/* FSM */
|
||||
self->fsm = tsk_fsm_create(curr, term);
|
||||
|
||||
/*== SSESSION */
|
||||
if(self->ss != TSIP_SSESSION_INVALID_HANDLE)
|
||||
{
|
||||
/*== SIP Session */
|
||||
if(self->ss != TSIP_SSESSION_INVALID_HANDLE){
|
||||
const tsk_param_t* param;
|
||||
tsip_uri_t* uri;
|
||||
|
||||
|
@ -865,7 +859,7 @@ int tsip_dialog_init(tsip_dialog_t *self, tsip_dialog_type_t type, const char* c
|
|||
((tsk_param_t*)param)->tag = tsk_true;
|
||||
}
|
||||
else{
|
||||
self->uri_local = tsk_object_ref((void*)TSIP_DIALOG_GET_STACK(self)->public_identity);
|
||||
self->uri_local = tsk_object_ref((void*)TSIP_DIALOG_GET_STACK(self)->identity.impu);
|
||||
}
|
||||
|
||||
/* To */
|
||||
|
@ -876,8 +870,8 @@ int tsip_dialog_init(tsip_dialog_t *self, tsip_dialog_type_t type, const char* c
|
|||
((tsk_param_t*)param)->tag = tsk_true;
|
||||
}
|
||||
else{
|
||||
self->uri_remote = tsk_object_ref((void*)TSIP_DIALOG_GET_STACK(self)->public_identity);
|
||||
self->uri_remote_target = tsk_object_ref((void*)TSIP_DIALOG_GET_STACK(self)->realm);
|
||||
self->uri_remote = tsk_object_ref((void*)TSIP_DIALOG_GET_STACK(self)->identity.impu);
|
||||
self->uri_remote_target = tsk_object_ref((void*)TSIP_DIALOG_GET_STACK(self)->network.realm);
|
||||
}
|
||||
}
|
||||
else{
|
||||
|
|
|
@ -387,21 +387,20 @@ int tsip_dialog_register_Trying_2_Connected_X_2xx(va_list *app)
|
|||
c) treat the identity under registration as a barred public user identity, if it is not included in the P-Associated-URI
|
||||
header field;
|
||||
*/
|
||||
tsk_list_foreach(item, TSIP_DIALOG_GET_STACK(self)->associated_uris)
|
||||
{
|
||||
tsk_list_foreach(item, TSIP_DIALOG_GET_STACK(self)->associated_uris){
|
||||
uri = item->data;
|
||||
if(item == TSIP_DIALOG_GET_STACK(self)->associated_uris->head){
|
||||
uri_first = item->data;
|
||||
}
|
||||
if(!tsk_object_cmp(TSIP_DIALOG_GET_STACK(self)->preferred_identity, uri)){
|
||||
if(!tsk_object_cmp(TSIP_DIALOG_GET_STACK(self)->identity.preferred, uri)){
|
||||
barred = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(barred && uri_first){
|
||||
TSK_OBJECT_SAFE_FREE(TSIP_DIALOG_GET_STACK(self)->preferred_identity);
|
||||
TSIP_DIALOG_GET_STACK(self)->preferred_identity = tsk_object_ref((void*)uri_first);
|
||||
TSK_OBJECT_SAFE_FREE(TSIP_DIALOG_GET_STACK(self)->identity.preferred);
|
||||
TSIP_DIALOG_GET_STACK(self)->identity.preferred = tsk_object_ref((void*)uri_first);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -616,41 +615,39 @@ int send_REGISTER(tsip_dialog_register_t *self, tsk_bool_t initial)
|
|||
|
||||
request = tsip_dialog_request_new(TSIP_DIALOG(self), "REGISTER");
|
||||
|
||||
if(request)
|
||||
{
|
||||
if(request){
|
||||
/* == RCS phase 2
|
||||
*/
|
||||
if(TSIP_DIALOG_GET_STACK(self)->enable_gsmarcs){
|
||||
/*if(TSIP_DIALOG_GET_STACK(self)->enable_gsmarcs){
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "+g.oma.sip-im.large-message", 0);
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "audio", 0);
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "video", 0);
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "+g.3gpp.cs-voice", 0);
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "+g.3gpp.icsi-ref", TSIP_ICSI_QUOTED_MMTEL_PSVOICE);
|
||||
}
|
||||
}*/
|
||||
|
||||
/* mobility */
|
||||
if(TSIP_DIALOG_GET_STACK(self)->mobility){
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "mobility", TSIP_DIALOG_GET_STACK(self)->mobility);
|
||||
}
|
||||
///* mobility */
|
||||
//if(TSIP_DIALOG_GET_STACK(self)->mobility){
|
||||
// TSIP_HEADER_ADD_PARAM(request->Contact, "mobility", TSIP_DIALOG_GET_STACK(self)->mobility);
|
||||
//}
|
||||
|
||||
/* deviceID - FIXME: find reference. */
|
||||
if(TSIP_DIALOG_GET_STACK(self)->device_id){
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "+deviceID", TSIP_DIALOG_GET_STACK(self)->device_id);
|
||||
}
|
||||
///* deviceID - FIXME: find reference. */
|
||||
//if(TSIP_DIALOG_GET_STACK(self)->device_id){
|
||||
// TSIP_HEADER_ADD_PARAM(request->Contact, "+deviceID", TSIP_DIALOG_GET_STACK(self)->device_id);
|
||||
//}
|
||||
|
||||
/* GSMA Image Sharing */
|
||||
if(TSIP_DIALOG_GET_STACK(self)->enable_gsmais){
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "+g.3gpp.app_ref", TSIP_IARI_QUOTED_GSMAIS);
|
||||
}
|
||||
///* GSMA Image Sharing */
|
||||
//if(TSIP_DIALOG_GET_STACK(self)->enable_gsmais){
|
||||
// TSIP_HEADER_ADD_PARAM(request->Contact, "+g.3gpp.app_ref", TSIP_IARI_QUOTED_GSMAIS);
|
||||
//}
|
||||
|
||||
/* 3GPP TS 24.341 subclause 5.3.2.2 */
|
||||
if(TSIP_DIALOG_GET_STACK(self)->enable_3gppsms){
|
||||
TSIP_HEADER_ADD_PARAM(request->Contact, "+g.3gpp.smsip", 0);
|
||||
}
|
||||
///* 3GPP TS 24.341 subclause 5.3.2.2 */
|
||||
//if(TSIP_DIALOG_GET_STACK(self)->enable_3gppsms){
|
||||
// TSIP_HEADER_ADD_PARAM(request->Contact, "+g.3gpp.smsip", 0);
|
||||
//}
|
||||
|
||||
/* 3GPP TS 24.229 - 5.1.1.2 Initial registration */
|
||||
if(TSIP_DIALOG(self)->state ==tsip_initial)
|
||||
{
|
||||
if(TSIP_DIALOG(self)->state ==tsip_initial){
|
||||
/*
|
||||
g) the Supported header field containing the option-tag "path", and
|
||||
1) if GRUU is supported, the option-tag "gruu"; and
|
||||
|
|
|
@ -474,7 +474,7 @@ static tsk_object_t* tsip_ipsec_association_ctor(tsk_object_t * self, va_list *
|
|||
tipsec_set_local(association->ctx, ip_local, ip_remote, association->socket_uc->port, association->socket_us->port);
|
||||
}
|
||||
else{
|
||||
tipsec_set_local(association->ctx, ip_local, transport->stack->proxy_cscf, association->socket_uc->port, association->socket_us->port);
|
||||
tipsec_set_local(association->ctx, ip_local, transport->stack->network.proxy_cscf, association->socket_uc->port, association->socket_us->port);
|
||||
}
|
||||
}
|
||||
return self;
|
||||
|
|
|
@ -189,8 +189,8 @@ tsip_transport_t* tsip_transport_layer_find(const tsip_transport_layer_t* self,
|
|||
{
|
||||
tsip_transport_t* transport = 0;
|
||||
|
||||
destIP = self->stack->proxy_cscf;
|
||||
*destPort = self->stack->proxy_cscf_port;
|
||||
destIP = self->stack->network.proxy_cscf;
|
||||
*destPort = self->stack->network.proxy_cscf_port;
|
||||
|
||||
if(!self){
|
||||
return 0;
|
||||
|
@ -208,7 +208,7 @@ tsip_transport_t* tsip_transport_layer_find(const tsip_transport_layer_t* self,
|
|||
tsk_list_foreach(item, self->transports)
|
||||
{
|
||||
curr = item->data;
|
||||
if(curr->type == self->stack->proxy_cscf_type)
|
||||
if(curr->type == self->stack->network.proxy_cscf_type)
|
||||
{
|
||||
transport = curr;
|
||||
break;
|
||||
|
@ -473,17 +473,14 @@ bail:
|
|||
|
||||
int tsip_transport_layer_start(const tsip_transport_layer_t* self)
|
||||
{
|
||||
if(self)
|
||||
{
|
||||
if(!self->running)
|
||||
{
|
||||
if(self){
|
||||
if(!self->running){
|
||||
int ret = 0;
|
||||
tsk_list_item_t *item;
|
||||
tsip_transport_t* transport;
|
||||
|
||||
/* start() */
|
||||
tsk_list_foreach(item, self->transports)
|
||||
{
|
||||
tsk_list_foreach(item, self->transports){
|
||||
transport = item->data;
|
||||
if(ret = tsip_transport_start(transport)){
|
||||
return ret;
|
||||
|
@ -491,13 +488,12 @@ int tsip_transport_layer_start(const tsip_transport_layer_t* self)
|
|||
}
|
||||
|
||||
/* connect() */
|
||||
tsk_list_foreach(item, self->transports)
|
||||
{
|
||||
tsk_list_foreach(item, self->transports){
|
||||
tnet_fd_t fd;
|
||||
transport = item->data;
|
||||
|
||||
tsip_transport_set_callback(transport, TNET_SOCKET_TYPE_IS_DGRAM(transport->type) ? TNET_TRANSPORT_CB_F(tsip_transport_layer_dgram_cb) : TNET_TRANSPORT_CB_F(tsip_transport_layer_stream_cb), transport);
|
||||
if((fd = tsip_transport_connectto_2(transport, self->stack->proxy_cscf, self->stack->proxy_cscf_port)) == TNET_INVALID_FD){
|
||||
if((fd = tsip_transport_connectto_2(transport, self->stack->network.proxy_cscf, self->stack->network.proxy_cscf_port)) == TNET_INVALID_FD){
|
||||
return -3;
|
||||
}
|
||||
if((ret = tnet_sockfd_waitUntilWritable(fd, TNET_CONNECT_TIMEOUT))){
|
||||
|
@ -519,15 +515,12 @@ int tsip_transport_layer_start(const tsip_transport_layer_t* self)
|
|||
|
||||
int tsip_transport_layer_shutdown(const tsip_transport_layer_t* self)
|
||||
{
|
||||
if(self)
|
||||
{
|
||||
if(self->running)
|
||||
{
|
||||
if(self){
|
||||
if(self->running){
|
||||
int ret = 0;
|
||||
tsk_list_item_t *item;
|
||||
tsip_transport_t* transport;
|
||||
tsk_list_foreach(item, self->transports)
|
||||
{
|
||||
tsk_list_foreach(item, self->transports){
|
||||
transport = item->data;
|
||||
if(ret = tsip_transport_shutdown(transport)){
|
||||
return ret;
|
||||
|
@ -551,9 +544,8 @@ int tsip_transport_layer_shutdown(const tsip_transport_layer_t* self)
|
|||
static tsk_object_t* tsip_transport_layer_ctor(tsk_object_t * self, va_list * app)
|
||||
{
|
||||
tsip_transport_layer_t *layer = self;
|
||||
if(layer)
|
||||
{
|
||||
layer->stack = va_arg(*app, const tsip_stack_handle_t *);
|
||||
if(layer){
|
||||
layer->stack = va_arg(*app, const tsip_stack_t *);
|
||||
|
||||
layer->transports = tsk_list_create();
|
||||
}
|
||||
|
|
|
@ -56,78 +56,157 @@ void *run(void* self);
|
|||
* http://portal.etsi.org/docbox/EC_Files/EC_Files/ts_10202702v030101p.pdf
|
||||
*/
|
||||
|
||||
int __tsip_stack_set(tsip_stack_t *self, va_list values)
|
||||
int __tsip_stack_set_option(tsip_stack_t *self, tsip_stack_option_t option_id, const char* option_value)
|
||||
{
|
||||
switch(option_id){
|
||||
|
||||
/* === Identity === */
|
||||
case TSIP_STACK_OPTION_DISPLAY_NAME:
|
||||
{ /* Display name */
|
||||
tsk_strupdate(&self->identity.display_name, option_value);
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_IMPU:
|
||||
case TSIP_STACK_OPTION_PREFERRED_IDENTITY:
|
||||
{ /* IMS Public User Identity or P-Preferred-Identity - valid SIP/TEL URI*/
|
||||
if(option_value){
|
||||
tsip_uri_t *uri = tsip_uri_parse(option_value, strlen(option_value));
|
||||
if(uri){
|
||||
if(option_id == TSIP_STACK_OPTION_IMPU){
|
||||
TSK_OBJECT_SAFE_FREE(self->identity.impu);
|
||||
self->identity.impu = uri;
|
||||
}
|
||||
else{
|
||||
TSK_OBJECT_SAFE_FREE(self->identity.preferred);
|
||||
self->identity.preferred = uri;
|
||||
}
|
||||
}
|
||||
else{
|
||||
TSK_DEBUG_ERROR("'%s' is an invalid SIP/TEL URI", option_value);
|
||||
if(option_id == TSIP_STACK_OPTION_IMPU){
|
||||
return -1; /* IMPU is mandatory but P-Preferred-Identity isn't. */
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_IMPI:
|
||||
{ /* IMS Private User Identity */
|
||||
if(!option_value){
|
||||
TSK_DEBUG_ERROR("IMPI is mandatory.");
|
||||
return -1; /* mandatory */
|
||||
}
|
||||
tsk_strupdate(&self->identity.impi, option_value);
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_PASSWORD:
|
||||
{ /* User's password */
|
||||
tsk_strupdate(&self->identity.password, option_value);
|
||||
break;
|
||||
}
|
||||
|
||||
/* === Network === */
|
||||
case TSIP_STACK_OPTION_REALM:
|
||||
{ /* realm (a.k.a domain name) - valid SIP/TEL URI */
|
||||
if(option_value){
|
||||
tsip_uri_t *uri = tsip_uri_parse(option_value, strlen(option_value));
|
||||
if(uri){
|
||||
TSK_OBJECT_SAFE_FREE(self->network.realm);
|
||||
self->network.realm = uri;
|
||||
}
|
||||
else{
|
||||
TSK_DEBUG_ERROR("'%s' is an invalid SIP/TEL URI", option_value);
|
||||
return -1; /* mandatory */
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_LOCAL_IP:
|
||||
{ /* IP address to bind to */
|
||||
tsk_strupdate(&self->network.local_ip, option_value);
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_LOCAL_PORT:
|
||||
{ /* IP port to bind to */
|
||||
tnet_port_t port = atoi(option_value);
|
||||
if(port){
|
||||
self->network.local_port = port;
|
||||
}
|
||||
else{
|
||||
TSK_DEBUG_ERROR("%s is invalid as port number.", option_value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_DISCOVERY_NAPTR:
|
||||
{ /* Whether to use DNS NAPTR for Proxy-CSCF discovery */
|
||||
self->network.discovery_naptr = tsk_strcontains(option_value, strlen(option_value), "true");
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_DISCOVERY_DHCP:
|
||||
{ /* Whether to use DHCPv4/v6 for Proxy-CSCF discovery */
|
||||
self->network.discovery_dhcp = tsk_strcontains(option_value, strlen(option_value), "true");
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_AMF:
|
||||
{ /* Authentication management field (AMF) as 16 bits field */
|
||||
/* think about uint16_t */
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_OPERATOR_ID:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
/* === Security === */
|
||||
case TSIP_STACK_OPTION_EARLY_IMS:
|
||||
{ /* Whether to enable Early IMS Security as per 3GPP TS 33.978 */
|
||||
self->security.earlyIMS = tsk_strcontains(option_value, strlen(option_value), "true");
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_SECAGREE_IPSEC:
|
||||
{ /* Whether to enable IPSec security agreement as per IETF RFC 3329 */
|
||||
break;
|
||||
}
|
||||
case TSIP_STACK_OPTION_SECAGREE_TLS:
|
||||
{ /* Whether to enable IPSec security agreement as per IETF RFC 3329 */
|
||||
break;
|
||||
}
|
||||
|
||||
/* === Features === */
|
||||
|
||||
|
||||
default:
|
||||
{
|
||||
TSK_DEBUG_WARN("Unknown Option id %d", option_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __tsip_stack_set(tsip_stack_t *self, va_list* app)
|
||||
{
|
||||
tsip_stack_param_type_t curr;
|
||||
|
||||
while((curr=va_arg(values, tsip_stack_param_type_t)) != pname_null)
|
||||
{
|
||||
switch(curr)
|
||||
{
|
||||
/*
|
||||
* Identity
|
||||
*/
|
||||
case pname_display_name:
|
||||
{
|
||||
tsk_strupdate(&self->display_name, va_arg(values, const char*));
|
||||
break;
|
||||
}
|
||||
case pname_public_identity:
|
||||
case pname_preferred_identity:
|
||||
{
|
||||
const char *uristring = va_arg(values, const char*);
|
||||
if(uristring)
|
||||
{
|
||||
tsip_uri_t *uri = tsip_uri_parse(uristring, strlen(uristring));
|
||||
if(uri)
|
||||
{
|
||||
if(curr == pname_public_identity)
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(self->public_identity);
|
||||
self->public_identity = uri;
|
||||
}
|
||||
else
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(self->preferred_identity);
|
||||
self->preferred_identity = uri;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case pname_private_identity:
|
||||
{
|
||||
tsk_strupdate(&self->private_identity, va_arg(values, const char*));
|
||||
break;
|
||||
}
|
||||
case pname_password:
|
||||
{
|
||||
tsk_strupdate(&self->password, va_arg(values, const char*));
|
||||
while((curr = va_arg(*app, tsip_stack_param_type_t)) != pname_null){
|
||||
switch(curr){
|
||||
/* === Option === */
|
||||
case pname_option:
|
||||
{ /* (tsip_stack_option_t)ID_ENUM, (const char*)VALUE_STR */
|
||||
tsip_stack_option_t ID_ENUM = va_arg(*app, tsip_stack_option_t);
|
||||
const char* VALUE_STR = va_arg(*app, const char*);
|
||||
if(__tsip_stack_set_option(self, ID_ENUM, VALUE_STR)){
|
||||
/* Nothing to do --> va_list still safe */
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Network
|
||||
*/
|
||||
case pname_local_ip:
|
||||
{
|
||||
tsk_strupdate(&self->local_ip, va_arg(values, const char*));
|
||||
break;
|
||||
}
|
||||
case pname_local_port:
|
||||
{
|
||||
#if defined (__GNUC__)
|
||||
self->local_port = (uint16_t)va_arg(values, unsigned);
|
||||
#else
|
||||
self->local_port = va_arg(values, uint16_t);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case pname_privacy:
|
||||
{
|
||||
tsk_strupdate(&self->privacy, va_arg(values, const char*));
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
case pname_operator_id:
|
||||
{
|
||||
break;
|
||||
|
@ -136,74 +215,66 @@ int __tsip_stack_set(tsip_stack_t *self, va_list values)
|
|||
{
|
||||
break;
|
||||
}
|
||||
case pname_netinfo:
|
||||
|
||||
|
||||
/*case pname_discovery_naptr:
|
||||
{
|
||||
tsk_strupdate(&self->netinfo, va_arg(values, const char*));
|
||||
break;
|
||||
}
|
||||
case pname_realm:
|
||||
{
|
||||
const char *uristring = va_arg(values, const char*);
|
||||
if(uristring)
|
||||
{
|
||||
tsip_uri_t *uri = tsip_uri_parse(uristring, strlen(uristring));
|
||||
if(uri)
|
||||
{
|
||||
TSK_OBJECT_SAFE_FREE(self->realm);
|
||||
self->realm = uri;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case pname_discovery_naptr:
|
||||
{
|
||||
self->use_dns_naptr = va_arg(values, unsigned);
|
||||
self->network.discovery_naptr = va_arg(*app, tsk_bool_t);
|
||||
break;
|
||||
}
|
||||
case pname_discovery_dhcp:
|
||||
{
|
||||
self->use_dhcp = va_arg(values, unsigned);
|
||||
self->network.discovery_dhcp = va_arg(*app, unsigned);
|
||||
break;
|
||||
}
|
||||
}*/
|
||||
case pname_proxy_cscf:
|
||||
{
|
||||
const char* pcscf = va_arg(values, const char*);
|
||||
const char* transport = va_arg(values, const char*);
|
||||
int use_ipv6 = va_arg(values, int);
|
||||
{ /* (const char*)FQDN_STR, (unsigned)PORT_UINT, (const char*)TRANSPORT_STR, (const char*)IP_VERSION_STR */
|
||||
const char* FQDN_STR = va_arg(*app, const char*);
|
||||
tnet_port_t PORT_UINT = va_arg(*app, unsigned);
|
||||
const char* TRANSPORT_STR = va_arg(*app, const char*);
|
||||
const char* IP_VERSION_STR = va_arg(*app, const char*);
|
||||
|
||||
tsk_strupdate(&self->proxy_cscf, pcscf);
|
||||
/* IP Address */
|
||||
tsk_strupdate(&self->network.proxy_cscf, FQDN_STR);
|
||||
TSK_DEBUG_INFO("Proxy-CSCF ==>%s", self->network.proxy_cscf);
|
||||
|
||||
/* Port */
|
||||
self->network.proxy_cscf_port = PORT_UINT;
|
||||
|
||||
TSK_DEBUG_INFO("P-CSCF ==>%s", self->proxy_cscf);
|
||||
|
||||
if(tsk_striequals(transport, "UDP")) TNET_SOCKET_TYPE_SET_UDP(self->proxy_cscf_type);
|
||||
else if(tsk_striequals(transport, "TCP")) TNET_SOCKET_TYPE_SET_TCP(self->proxy_cscf_type);
|
||||
else if(tsk_striequals(transport, "TLS")) TNET_SOCKET_TYPE_SET_TLS(self->proxy_cscf_type);
|
||||
else if(tsk_striequals(transport, "SCTP")) TNET_SOCKET_TYPE_SET_SCTP(self->proxy_cscf_type);
|
||||
|
||||
if(use_ipv6) TNET_SOCKET_TYPE_SET_IPV6(self->proxy_cscf_type);
|
||||
else TNET_SOCKET_TYPE_SET_IPV4(self->proxy_cscf_type);
|
||||
/* Transport */
|
||||
if(tsk_striequals(TRANSPORT_STR, "UDP")){
|
||||
TNET_SOCKET_TYPE_SET_UDP(self->network.proxy_cscf_type);
|
||||
}
|
||||
else if(tsk_striequals(TRANSPORT_STR, "TCP")){
|
||||
TNET_SOCKET_TYPE_SET_TCP(self->network.proxy_cscf_type);
|
||||
}
|
||||
else if(tsk_striequals(TRANSPORT_STR, "TLS")){
|
||||
TNET_SOCKET_TYPE_SET_TLS(self->network.proxy_cscf_type);
|
||||
}
|
||||
else if(tsk_striequals(TRANSPORT_STR, "SCTP")){
|
||||
TNET_SOCKET_TYPE_SET_SCTP(self->network.proxy_cscf_type);
|
||||
}
|
||||
else{
|
||||
TSK_DEBUG_ERROR("%s not a valid transport", TRANSPORT_STR);
|
||||
/* not mandatoy */
|
||||
}
|
||||
/* whether to use ipv6 or not */
|
||||
if(IP_VERSION_STR){
|
||||
if(tsk_strcontains(IP_VERSION_STR, strlen(IP_VERSION_STR), "6")){
|
||||
TNET_SOCKET_TYPE_SET_IPV6Only(self->network.proxy_cscf_type);
|
||||
}
|
||||
if(tsk_strcontains(IP_VERSION_STR, strlen(IP_VERSION_STR), "4")){
|
||||
TNET_SOCKET_TYPE_SET_IPV4(self->network.proxy_cscf_type); /* Not IPV4only ==> '46'/'64' */
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case pname_proxy_cscf_port:
|
||||
{
|
||||
self->proxy_cscf_port = va_arg(values, int);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case pname_device_id:
|
||||
{
|
||||
if(self->device_id)
|
||||
TSK_FREE(self->device_id);
|
||||
tsk_sprintf(&self->device_id, "\"%s\"", va_arg(values, const char*));
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case pname_mobility:
|
||||
{
|
||||
tsk_strupdate(&self->mobility, va_arg(values, const char*));
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Security
|
||||
|
@ -211,23 +282,23 @@ int __tsip_stack_set(tsip_stack_t *self, va_list values)
|
|||
case pname_secagree_ipsec:
|
||||
{ /* ALG_STR, EALG_STR, MODE_STR, PROTOCOL_STR */
|
||||
tsk_strupdate(&self->secagree_mech, "ipsec-3gpp");
|
||||
tsk_strupdate(&self->secagree_ipsec.alg, va_arg(values, const char*));
|
||||
tsk_strupdate(&self->secagree_ipsec.ealg, va_arg(values, const char*));
|
||||
tsk_strupdate(&self->secagree_ipsec.mode, va_arg(values, const char*));
|
||||
tsk_strupdate(&self->secagree_ipsec.protocol, va_arg(values, const char*));
|
||||
tsk_strupdate(&self->secagree_ipsec.alg, va_arg(*app, const char*));
|
||||
tsk_strupdate(&self->secagree_ipsec.ealg, va_arg(*app, const char*));
|
||||
tsk_strupdate(&self->secagree_ipsec.mode, va_arg(*app, const char*));
|
||||
tsk_strupdate(&self->secagree_ipsec.protocol, va_arg(*app, const char*));
|
||||
self->enable_secagree_ipsec = 1;
|
||||
break;
|
||||
}
|
||||
case pname_secagree_tls:
|
||||
{ /* USE_TLS_SECAGREE_INT */
|
||||
self->enable_secagree_tls = va_arg(values, int) ? 1 : 0;
|
||||
self->enable_secagree_tls = va_arg(*app, int) ? 1 : 0;
|
||||
break;
|
||||
}
|
||||
case pname_tls_certs:
|
||||
{ /*CA_FILE_STR, PUB_FILE_STR, PRIV_FILE_STR*/
|
||||
tsk_strupdate(&self->tls.ca, va_arg(values, const char*));
|
||||
tsk_strupdate(&self->tls.pbk, va_arg(values, const char*));
|
||||
tsk_strupdate(&self->tls.pvk, va_arg(values, const char*));
|
||||
tsk_strupdate(&self->tls.ca, va_arg(*app, const char*));
|
||||
tsk_strupdate(&self->tls.pbk, va_arg(*app, const char*));
|
||||
tsk_strupdate(&self->tls.pvk, va_arg(*app, const char*));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -235,63 +306,14 @@ int __tsip_stack_set(tsip_stack_t *self, va_list values)
|
|||
/*
|
||||
* Features
|
||||
*/
|
||||
case pname_enable_100rel:
|
||||
{
|
||||
self->enable_100rel = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_gsmais:
|
||||
{
|
||||
self->enable_gsmais = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_precond:
|
||||
{
|
||||
self->enable_precond = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_3gppsms:
|
||||
{
|
||||
self->enable_3gppsms = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_gsmarcs:
|
||||
{
|
||||
self->enable_gsmarcs = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_earlyIMS:
|
||||
{
|
||||
self->enable_earlyIMS = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_ofdr:
|
||||
{
|
||||
self->enable_ofdr = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_aa:
|
||||
{
|
||||
self->enable_aa = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_dnd:
|
||||
{
|
||||
self->enable_dnd = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
case pname_enable_option:
|
||||
{
|
||||
self->enable_option = va_arg(values, unsigned);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* QoS
|
||||
*/
|
||||
|
||||
default:
|
||||
{
|
||||
{ /* va_list will be unsafe ==> must exit */
|
||||
TSK_DEBUG_WARN("Found unknown pname.");
|
||||
goto bail;
|
||||
}
|
||||
|
@ -302,60 +324,74 @@ bail:
|
|||
return 0;
|
||||
}
|
||||
|
||||
tsip_stack_handle_t* tsip_stack_create(tsip_stack_callback_f callback, ...)
|
||||
tsip_stack_handle_t* tsip_stack_create(tsip_stack_callback_f callback, const char* realm_uri, const char* impi_uri, const char* impu_uri, ...)
|
||||
{
|
||||
tsip_stack_t* stack = tsk_object_new(tsip_stack_def_t);
|
||||
va_list params;
|
||||
tsip_stack_t* stack = tsk_null;
|
||||
va_list ap;
|
||||
|
||||
if(!stack){
|
||||
return 0;
|
||||
/* === check values === */
|
||||
if(!realm_uri || !impi_uri || !impu_uri){
|
||||
TSK_DEBUG_ERROR("Invalid parameter.");
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/*
|
||||
* Default values
|
||||
*/
|
||||
stack->local_ip = TNET_SOCKET_HOST_ANY;
|
||||
stack->local_port = TNET_SOCKET_PORT_ANY;
|
||||
|
||||
stack->proxy_cscf_port = 5060;
|
||||
stack->proxy_cscf_type = tnet_socket_type_udp_ipv4;
|
||||
|
||||
va_start(params, callback);
|
||||
if(__tsip_stack_set(stack, params)){
|
||||
// Delete the stack?
|
||||
/* === create the stack === */
|
||||
if(!(stack = tsk_object_new(tsip_stack_def_t))){ /* should never happen */
|
||||
TSK_DEBUG_ERROR("Failed to create the stack.");
|
||||
goto bail;
|
||||
}
|
||||
va_end(params);
|
||||
|
||||
/* === Set mandatory values (realm, IMPI and IMPU) === */
|
||||
if(tsip_stack_set(stack,
|
||||
TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_REALM, realm_uri),
|
||||
TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_IMPI, impi_uri),
|
||||
TSIP_STACK_SET_OPTION(TSIP_STACK_OPTION_IMPU, impu_uri),
|
||||
|
||||
/*
|
||||
* Internals
|
||||
*/
|
||||
TSIP_STACK_SET_NULL())){
|
||||
TSK_DEBUG_ERROR("Invalid parameter.");
|
||||
TSK_OBJECT_SAFE_FREE(stack);
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* === Default values === */
|
||||
stack->network.local_ip = TNET_SOCKET_HOST_ANY;
|
||||
stack->network.local_port = TNET_SOCKET_PORT_ANY;
|
||||
|
||||
stack->network.proxy_cscf_port = 5060;
|
||||
stack->network.proxy_cscf_type = tnet_socket_type_udp_ipv4;
|
||||
|
||||
/* === Set user supplied parameters === */
|
||||
va_start(ap, impu_uri);
|
||||
if(__tsip_stack_set(stack, &ap)){
|
||||
TSK_DEBUG_ERROR("Invalid parameter.");
|
||||
TSK_OBJECT_SAFE_FREE(stack);
|
||||
va_end(ap);
|
||||
goto bail;
|
||||
}
|
||||
va_end(ap);
|
||||
|
||||
/* === Internals === */
|
||||
stack->callback = callback;
|
||||
stack->timer_mgr = tsk_timer_manager_create();
|
||||
stack->ssessions = tsk_list_create();
|
||||
|
||||
/*
|
||||
* Layers
|
||||
*/
|
||||
/* === Layers === */
|
||||
stack->layer_dialog = tsip_dialog_layer_create(stack);
|
||||
stack->layer_transac = tsip_transac_layer_create(stack);
|
||||
stack->layer_transport = tsip_transport_layer_create(stack);
|
||||
|
||||
/*
|
||||
* DNS context
|
||||
*/
|
||||
/* === DNS context === */
|
||||
stack->dns_ctx = tnet_dns_ctx_create();
|
||||
|
||||
/*
|
||||
* DHCP context
|
||||
*/
|
||||
/* === DHCP context === */
|
||||
|
||||
bail:
|
||||
return stack;
|
||||
}
|
||||
|
||||
int tsip_stack_start(tsip_stack_handle_t *self)
|
||||
{
|
||||
if(self)
|
||||
{
|
||||
if(self){
|
||||
int ret;
|
||||
tsip_stack_t *stack = self;
|
||||
|
||||
|
@ -364,64 +400,74 @@ int tsip_stack_start(tsip_stack_handle_t *self)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Timer manager */
|
||||
/* === Timer manager === */
|
||||
if((ret = tsk_timer_manager_start(stack->timer_mgr))){
|
||||
// What to do ?
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Set P-Preferred-Identity */
|
||||
if(!stack->preferred_identity && stack->public_identity){
|
||||
stack->preferred_identity = tsk_object_ref((void*)stack->public_identity);
|
||||
/* === Set P-Preferred-Identity === */
|
||||
if(!stack->identity.preferred && stack->identity.impu){
|
||||
stack->identity.preferred = tsk_object_ref((void*)stack->identity.impu);
|
||||
}
|
||||
/* Transport type */
|
||||
/* === Transport type === */
|
||||
if(stack->secagree_mech){
|
||||
if(tsk_striequals(stack->secagree_mech, "ipsec-3gpp")){
|
||||
TNET_SOCKET_TYPE_SET_IPSEC(stack->proxy_cscf_type);
|
||||
TNET_SOCKET_TYPE_SET_IPSEC(stack->network.proxy_cscf_type);
|
||||
}
|
||||
//else if if(tsk_striquals(stack->secagree_mech, "ipsec-ike"))
|
||||
}
|
||||
|
||||
/* Use DNS NAPTR+SRV for the P-CSCF discovery? */
|
||||
if(stack->use_dns_naptr || !stack->proxy_cscf)
|
||||
{
|
||||
char* hostname = 0;
|
||||
tnet_port_t port = 0;
|
||||
/* === Use DNS NAPTR+SRV for the P-CSCF discovery? === */
|
||||
if(!stack->network.proxy_cscf){
|
||||
if(stack->network.discovery_dhcp){ /* DHCP v4/v6 */
|
||||
/* FIXME: */
|
||||
} /* DHCP */
|
||||
else{ /* DNS NAPTR + SRV*/
|
||||
char* hostname = tsk_null;
|
||||
tnet_port_t port = 0;
|
||||
|
||||
if(!tnet_dns_query_naptr_srv(stack->dns_ctx, stack->realm->host, "SIP+D2U"/*FIXME*/, &hostname, &port)){
|
||||
tsk_strupdate(&stack->proxy_cscf, hostname);
|
||||
stack->proxy_cscf_port = port;
|
||||
}
|
||||
else{
|
||||
TSK_DEBUG_ERROR("P-CSCF discovery using DNS NAPTR failed. The stack will use the user supplied address and port.");
|
||||
}
|
||||
|
||||
TSK_FREE(hostname);
|
||||
if(!tnet_dns_query_naptr_srv(stack->dns_ctx, stack->network.realm->host,
|
||||
TNET_SOCKET_TYPE_IS_DGRAM(stack->network.proxy_cscf_type) ? "SIP+D2U" :
|
||||
(TNET_SOCKET_TYPE_IS_TLS(stack->network.proxy_cscf_type) ? "SIPS+D2T" : "SIP+D2T"),
|
||||
&hostname, &port)){
|
||||
tsk_strupdate(&stack->network.proxy_cscf, hostname);
|
||||
if(!stack->network.proxy_cscf_port || stack->network.proxy_cscf_port==5060){ /* Only if the Proxy-CSCF port is missing or default */
|
||||
stack->network.proxy_cscf_port = port;
|
||||
}
|
||||
}
|
||||
else{
|
||||
TSK_DEBUG_ERROR("P-CSCF discovery using DNS NAPTR failed. The stack will use the user supplied address and port.");
|
||||
}
|
||||
|
||||
TSK_FREE(hostname);
|
||||
} /* NAPTR */
|
||||
}
|
||||
|
||||
/* Get Best source address */
|
||||
if(stack->local_ip == TNET_SOCKET_HOST_ANY){
|
||||
|
||||
/* === Get Best source address === */
|
||||
if(!stack->network.local_ip){ /* loacal-ip is missing? */
|
||||
tnet_ip_t bestsource;
|
||||
if((ret = tnet_getbestsource(stack->proxy_cscf, stack->proxy_cscf_port, stack->proxy_cscf_type, &bestsource))){
|
||||
if((ret = tnet_getbestsource(stack->network.proxy_cscf, stack->network.proxy_cscf_port, stack->network.proxy_cscf_type, &bestsource))){ /* FIXME: what about linux version? */
|
||||
TSK_DEBUG_ERROR("Failed to get best source [%d].", ret);
|
||||
/* do not exit ==> will use default IP address */
|
||||
}
|
||||
else{
|
||||
tsk_strupdate(&stack->local_ip, bestsource);
|
||||
tsk_strupdate(&stack->network.local_ip, bestsource);
|
||||
}
|
||||
}
|
||||
|
||||
/* Transport Layer */
|
||||
if((ret = tsip_transport_layer_add(stack->layer_transport, stack->local_ip, stack->local_port, stack->proxy_cscf_type, "SIP transport"))){
|
||||
|
||||
/* === Transport Layer === */
|
||||
/* Adds the default transport to the transport Layer */
|
||||
if((ret = tsip_transport_layer_add(stack->layer_transport, stack->network.local_ip, stack->network.local_port, stack->network.proxy_cscf_type, "SIP transport"))){
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
/* Starts the transport Layer */
|
||||
if((ret = tsip_transport_layer_start(stack->layer_transport))){
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* ALL IS OK
|
||||
*
|
||||
*/
|
||||
if(stack->layer_transac){
|
||||
stack->layer_transac->reliable = TNET_SOCKET_TYPE_IS_STREAM(stack->proxy_cscf_type);
|
||||
|
||||
/* === ALL IS OK === */
|
||||
if(stack->layer_transac){ /* For transaction layer */
|
||||
stack->layer_transac->reliable = TNET_SOCKET_TYPE_IS_STREAM(stack->network.proxy_cscf_type);
|
||||
}
|
||||
|
||||
TSK_DEBUG_INFO("SIP STACK -- START");
|
||||
|
@ -433,15 +479,14 @@ int tsip_stack_start(tsip_stack_handle_t *self)
|
|||
|
||||
int tsip_stack_set(tsip_stack_handle_t *self, ...)
|
||||
{
|
||||
if(self)
|
||||
{
|
||||
if(self){
|
||||
int ret;
|
||||
tsip_stack_t *stack = self;
|
||||
|
||||
va_list params;
|
||||
va_start(params, self);
|
||||
ret = __tsip_stack_set(stack, params);
|
||||
va_end(params);
|
||||
va_list ap;
|
||||
va_start(ap, self);
|
||||
ret = __tsip_stack_set(stack, &ap);
|
||||
va_end(ap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -486,7 +531,7 @@ tsip_uri_t* tsip_stack_get_contacturi(const tsip_stack_t *stack, const char* pro
|
|||
if(tsk_strequals(transport->protocol, protocol)){
|
||||
tsip_uri_t* uri = tsk_null;
|
||||
if((uri = tsip_transport_get_uri(transport, 0))){
|
||||
tsk_strupdate(&uri->user_name, stack->public_identity->user_name);
|
||||
tsk_strupdate(&uri->user_name, stack->identity.impu->user_name);
|
||||
return uri;
|
||||
}
|
||||
}
|
||||
|
@ -504,15 +549,15 @@ tsip_uri_t* tsip_stack_get_pcscf_uri(const tsip_stack_t *stack, tsk_bool_t lr)
|
|||
if(transport){
|
||||
tsip_uri_t* uri = tsk_null;
|
||||
int ipv6 = TNET_SOCKET_TYPE_IS_IPV6(transport->type);
|
||||
int quote_ip = (ipv6 && tsk_strcontains(stack->proxy_cscf, strlen(stack->proxy_cscf), ":")) /* IPv6 IP string?*/;
|
||||
int quote_ip = (ipv6 && tsk_strcontains(stack->network.proxy_cscf, strlen(stack->network.proxy_cscf), ":")) /* IPv6 IP string?*/;
|
||||
|
||||
char* uristring = tsk_null;
|
||||
tsk_sprintf(&uristring, "%s:%s%s%s:%d;%s;transport=%s",
|
||||
transport->scheme,
|
||||
quote_ip ? "[" : "",
|
||||
stack->proxy_cscf,
|
||||
stack->network.proxy_cscf,
|
||||
quote_ip ? "]" : "",
|
||||
stack->proxy_cscf_port,
|
||||
stack->network.proxy_cscf_port,
|
||||
lr ? "lr" : "",
|
||||
transport->protocol);
|
||||
if(uristring){
|
||||
|
@ -589,21 +634,17 @@ static tsk_object_t* tsip_stack_dtor(tsk_object_t * self)
|
|||
tsip_stack_stop(stack);
|
||||
|
||||
/* Identity */
|
||||
TSK_FREE(stack->display_name);
|
||||
TSK_OBJECT_SAFE_FREE(stack->public_identity);
|
||||
TSK_OBJECT_SAFE_FREE(stack->preferred_identity);
|
||||
TSK_FREE(stack->identity.display_name);
|
||||
TSK_OBJECT_SAFE_FREE(stack->identity.impu);
|
||||
TSK_OBJECT_SAFE_FREE(stack->identity.preferred);
|
||||
//TSK_OBJECT_SAFE_FREE(stack->associated_identity);
|
||||
TSK_FREE(stack->private_identity);
|
||||
TSK_FREE(stack->password);
|
||||
TSK_FREE(stack->identity.impi);
|
||||
TSK_FREE(stack->identity.password);
|
||||
|
||||
/* Network */
|
||||
TSK_FREE(stack->local_ip);
|
||||
TSK_FREE(stack->privacy);
|
||||
TSK_FREE(stack->netinfo);
|
||||
TSK_OBJECT_SAFE_FREE(stack->realm);
|
||||
TSK_FREE(stack->proxy_cscf);
|
||||
TSK_FREE(stack->device_id);
|
||||
TSK_FREE(stack->mobility);
|
||||
TSK_FREE(stack->network.local_ip);
|
||||
TSK_OBJECT_SAFE_FREE(stack->network.realm);
|
||||
TSK_FREE(stack->network.proxy_cscf);
|
||||
TSK_OBJECT_SAFE_FREE(stack->paths);
|
||||
TSK_OBJECT_SAFE_FREE(stack->service_routes);
|
||||
TSK_OBJECT_SAFE_FREE(stack->associated_uris);
|
||||
|
|
|
@ -62,7 +62,7 @@ tsip_ssession_handle_t *tsip_ssession_create_2(const tsip_stack_t* stack, const
|
|||
return ss;
|
||||
}
|
||||
|
||||
int __tsip_ssession_set(tsip_ssession_t *self, va_list values)
|
||||
int __tsip_ssession_set(tsip_ssession_t *self, va_list *app)
|
||||
{
|
||||
tsip_ssession_param_type_t curr;
|
||||
|
||||
|
@ -70,20 +70,15 @@ int __tsip_ssession_set(tsip_ssession_t *self, va_list values)
|
|||
return -1;
|
||||
}
|
||||
|
||||
while((curr=va_arg(values, tsip_ssession_param_type_t)) != sstype_null)
|
||||
{
|
||||
switch(curr)
|
||||
{
|
||||
case sstype_param:
|
||||
while((curr = va_arg(values, tsip_ssession_param_type_t)) != sstype_null){
|
||||
switch(curr){
|
||||
case sstype_header:
|
||||
case sstype_caps:
|
||||
{
|
||||
const char* name = va_arg(values, const char *);
|
||||
const char* value = va_arg(values, const char *);
|
||||
{ /* (const char*)NAME_STR, (const char*)VALUE_STR */
|
||||
const char* name = va_arg(*app, const char *);
|
||||
const char* value = va_arg(*app, const char *);
|
||||
|
||||
if(curr == sstype_param){
|
||||
tsk_params_add_param(&self->params, name, value); // Add or Update a param
|
||||
} else if(curr == sstype_header){
|
||||
else if(curr == sstype_header){
|
||||
tsk_params_add_param(&self->headers, name, value);
|
||||
}else if(curr == sstype_caps){
|
||||
tsk_params_add_param(&self->caps, name, value);
|
||||
|
@ -92,24 +87,41 @@ int __tsip_ssession_set(tsip_ssession_t *self, va_list values)
|
|||
}
|
||||
|
||||
case sstype_context:
|
||||
{ /* (const void*)CTX_PTR */
|
||||
self->context = va_arg(*app, const void *);
|
||||
break;
|
||||
}
|
||||
|
||||
case sstype_option:
|
||||
{
|
||||
self->context = va_arg(values, const void *);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
TSK_DEBUG_ERROR("NOT SUPPORTED.");
|
||||
{ /* va_list will be unsafe => exit */
|
||||
TSK_DEBUG_ERROR("NOT SUPPORTED as valid pname %d.", curr);
|
||||
goto bail;
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* switch */
|
||||
} /* while */
|
||||
return 0;
|
||||
|
||||
bail:
|
||||
return -2;
|
||||
}
|
||||
|
||||
|
||||
if(__tsip_ssession_set(self, app)){
|
||||
ss->id = TSIP_SSESSION_INVALID_ID;
|
||||
}
|
||||
else{
|
||||
ss->id = ++unique_id;
|
||||
}
|
||||
// default: you are the owner
|
||||
ss->owner = tsk_true;
|
||||
// default expires value
|
||||
ss->expires = TSIP_SSESSION_EXPIRES_DEFAULT;
|
||||
|
||||
int tsip_ssession_set(tsip_ssession_handle_t *self, ...)
|
||||
{
|
||||
if(self){
|
||||
|
@ -204,48 +216,6 @@ const void* tsip_ssession_get_context(const tsip_ssession_handle_t *self)
|
|||
return tsk_null;
|
||||
}
|
||||
|
||||
//const tsk_param_t* tsip_ssession_get_param(const tsip_ssession_handle_t *self, const char* pname)
|
||||
//{
|
||||
// if(self){
|
||||
// const tsip_ssession_t *ss = self;
|
||||
// return tsk_params_get_param_by_name(ss->params, pname);
|
||||
// }
|
||||
// return tsk_null;
|
||||
//}
|
||||
//
|
||||
//const tsk_param_t* tsip_ssession_get_header(const tsip_ssession_handle_t *self, const char* hname)
|
||||
//{
|
||||
// if(self){
|
||||
// const tsip_ssession_t *ss = self;
|
||||
// return tsk_params_get_param_by_name(ss->headers, hname);
|
||||
// }
|
||||
// return tsk_null;
|
||||
//}
|
||||
//
|
||||
//const tsk_params_L_t* tsip_ssession_get_headers(const tsip_ssession_handle_t *self)
|
||||
//{
|
||||
// if(self){
|
||||
// return ((const tsip_ssession_t *)self)->headers;
|
||||
// }
|
||||
// return tsk_null;
|
||||
//}
|
||||
//
|
||||
//const tsk_params_L_t* tsip_ssession_get_params(const tsip_ssession_handle_t *self)
|
||||
//{
|
||||
// if(self){
|
||||
// return ((const tsip_ssession_t *)self)->params;
|
||||
// }
|
||||
// return tsk_null;
|
||||
//}
|
||||
//
|
||||
//const tsk_params_L_t* tsip_ssession_get_caps(const tsip_ssession_handle_t *self)
|
||||
//{
|
||||
// if(self){
|
||||
// return ((const tsip_ssession_t *)self)->caps;
|
||||
// }
|
||||
// return tsk_null;
|
||||
//}
|
||||
|
||||
int tsip_ssession_hangup(const tsip_ssession_t *self, const tsip_action_t* action)
|
||||
{
|
||||
int ret = -1;
|
||||
|
@ -271,26 +241,20 @@ int tsip_ssession_hangup(const tsip_ssession_t *self, const tsip_action_t* actio
|
|||
|
||||
|
||||
//========================================================
|
||||
// SIP SSESSION object definition
|
||||
// SIP Session object definition
|
||||
//
|
||||
static tsk_object_t* tsip_ssession_ctor(tsk_object_t * self, va_list * app)
|
||||
{
|
||||
tsip_ssession_t *ss = self;
|
||||
static tsip_ssession_id_t unique_id = 0;
|
||||
if(ss){
|
||||
ss->stack = va_arg(*app, const tsip_stack_handle_t*);
|
||||
ss->stack = va_arg(*app, const tsip_stack_t*);
|
||||
ss->params = tsk_list_create();
|
||||
ss->caps = tsk_list_create();
|
||||
ss->headers = tsk_list_create();
|
||||
|
||||
if(__tsip_ssession_set(self, *app)){
|
||||
ss->id = TSIP_SSESSION_INVALID_ID;
|
||||
}
|
||||
else{
|
||||
ss->id = ++unique_id;
|
||||
}
|
||||
// default: you are the owner
|
||||
ss->owner = tsk_true;
|
||||
/* unique identifier */
|
||||
ss->id = ++unique_id;
|
||||
}
|
||||
|
||||
return self;
|
||||
|
@ -300,9 +264,11 @@ static tsk_object_t* tsip_ssession_dtor(tsk_object_t * self)
|
|||
{
|
||||
tsip_ssession_t *ss = self;
|
||||
if(ss){
|
||||
TSK_OBJECT_SAFE_FREE(ss->params);
|
||||
TSK_OBJECT_SAFE_FREE(ss->caps);
|
||||
TSK_OBJECT_SAFE_FREE(ss->headers);
|
||||
|
||||
TSK_OBJECT_SAFE_FREE(ss->from);
|
||||
TSK_OBJECT_SAFE_FREE(ss->to);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
|
|
@ -235,11 +235,12 @@ void test_stack()
|
|||
{
|
||||
//#define DOMAIN "ericsson.com"
|
||||
//#define DOMAIN "micromethod.com"
|
||||
//#define DOMAIN "ims.inexbee.com"
|
||||
#define DOMAIN "sip2sip.info"
|
||||
#define DOMAIN "ims.inexbee.com"
|
||||
//#define DOMAIN "sip2sip.info"
|
||||
|
||||
const void* usr_context = tsk_null;
|
||||
|
||||
int ret;
|
||||
/*
|
||||
tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback,
|
||||
TSIP_STACK_SET_DISPLAY_NAME("2233392625"),
|
||||
TSIP_STACK_SET_PUBLIC_IDENTITY("sip:2233392625@"DOMAIN),
|
||||
|
@ -255,7 +256,7 @@ void test_stack()
|
|||
TSIP_STACK_SET_DEVICE_ID("dd1289fa-c3d7-47bd-a40d-f1f1b2cc5ffc"),
|
||||
TSIP_STACK_SET_NETINFO("ADSL;utran-cell-id-3gpp=00000000"),
|
||||
TSIP_STACK_SET_PRIVACY("header;id"),
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback,
|
||||
|
@ -275,25 +276,20 @@ void test_stack()
|
|||
TSIP_STACK_SET_NETINFO("ADSL;utran-cell-id-3gpp=00000000"),
|
||||
TSIP_STACK_SET_PRIVACY("header;id"),
|
||||
*/
|
||||
/*
|
||||
tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback,
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback, "sip:"DOMAIN, "mamadou@"DOMAIN, "sip:mamadou@"DOMAIN,
|
||||
TSIP_STACK_SET_DISPLAY_NAME("Mamadou"),
|
||||
TSIP_STACK_SET_PUBLIC_IDENTITY("sip:mamadou@"DOMAIN),
|
||||
TSIP_STACK_SET_PRIVATE_IDENTITY("mamadou@"DOMAIN),
|
||||
TSIP_STACK_SET_PASSWORD("mamadou"),
|
||||
TSIP_STACK_SET_REALM("sip:"DOMAIN), // FIXME: without sip:
|
||||
TSIP_STACK_SET_LOCAL_IP(LOCAL_IP),
|
||||
//TSIP_STACK_SET_DISCOVERY_NAPTR(1),
|
||||
TSIP_STACK_SET_PROXY_CSCF("pcscf.ims.inexbee.com", "tcp", 0),
|
||||
TSIP_STACK_SET_TLS_CERTS("C:\\tls\\ca.pki-crt.pem", "C:\\tls\\mamadou-crt.pem", "C:\\tls\\mamadou-key.pem"),
|
||||
//TSIP_STACK_SET_PROXY_CSCF("192.168.0.15", "udp", 0),
|
||||
TSIP_STACK_SET_PROXY_CSCF_PORT(4060),
|
||||
//TSIP_STACK_SET_SECAGREE_IPSEC("hmac-md5-96", "null", "trans", "esp"),
|
||||
TSIP_STACK_SET_MOBILITY("fixed"),
|
||||
TSIP_STACK_SET_DEVICE_ID("dd1289fa-c3d7-47bd-a40d-f1f1b2cc5ffc"),
|
||||
TSIP_STACK_SET_NETINFO("ADSL;utran-cell-id-3gpp=00000000"),
|
||||
TSIP_STACK_SET_PRIVACY("header;id"),
|
||||
*/
|
||||
|
||||
TSIP_STACK_SET_PROXY_CSCF("192.168.16.225", 4060, "udp", "ipv4"),
|
||||
|
||||
TSIP_STACK_SET_EARLY_IMS(tsk_true),
|
||||
|
||||
/*
|
||||
tsip_stack_handle_t *stack = tsip_stack_create(test_stack_callback,
|
||||
TSIP_STACK_SET_DISPLAY_NAME("Mamadou"),
|
||||
|
@ -328,7 +324,7 @@ void test_stack()
|
|||
|
||||
tsip_ssession_id_t opid = tsip_ssession_get_id(op);
|
||||
|
||||
if(tsip_stack_start(stack)){
|
||||
if((ret = tsip_stack_start(stack))){
|
||||
goto bail;
|
||||
}
|
||||
|
||||
|
@ -337,6 +333,7 @@ void test_stack()
|
|||
|
||||
tsk_null);
|
||||
|
||||
getchar();
|
||||
tsk_thread_sleep(2000);
|
||||
|
||||
//tsip_unregister(op,
|
||||
|
|
|
@ -197,7 +197,7 @@ int ret = txcap_action_create_element(stack,
|
|||
* @def TXCAP_ACTION_SET_NULL
|
||||
* Ends action parameters. Must always be the last one.
|
||||
*/
|
||||
#define TXCAP_ACTION_SET_OPTION(ID_INT, VALUE_STR) txcap_apt_option, (thhtp_action_option_t)ID_INT, (const char*)VALUE_STR
|
||||
#define TXCAP_ACTION_SET_OPTION(ID_INT, VALUE_STR) txcap_apt_option, (thttp_action_option_t)ID_INT, (const char*)VALUE_STR
|
||||
#define TXCAP_ACTION_SET_HEADER(NAME_STR, VALUE_STR) txcap_apt_header, (const char*)NAME_STR, (const char*)VALUE_STR
|
||||
#define TXCAP_ACTION_SET_PAYLOAD(PAY_PTR, PAY_SIZE) txcap_apt_payload, (const void*)PAY_PTR, (size_t)PAY_SIZE
|
||||
#define TXCAP_ACTION_SET_SELECTOR(AUID_STR, ...) txcap_apt_selector, (const char*)AUID_STR, __VA_ARGS__
|
||||
|
|
|
@ -165,7 +165,7 @@ txcap_stack_set(stack,
|
|||
* Ends the stack parameters. Mandatory and should be the last one.
|
||||
*/
|
||||
|
||||
#define TXCAP_STACK_SET_OPTION(ID_INT, VALUE_STR) xcapp_option, (txcap_stack_option_t)ID_INT, (const char*)VALUE_STR
|
||||
#define TXCAP_STACK_SET_OPTION(ID_ENUM, VALUE_STR) xcapp_option, (txcap_stack_option_t)ID_ENUM, (const char*)VALUE_STR
|
||||
#define TXCAP_STACK_SET_PASSWORD(PASSWORD_STR) TXCAP_STACK_SET_OPTION(TXCAP_STACK_OPTION_PASSWORD, PASSWORD_STR)
|
||||
#define TXCAP_STACK_SET_XUI(XUI_STR) TXCAP_STACK_SET_OPTION(TXCAP_STACK_OPTION_XUI, XUI_STR)
|
||||
#define TXCAP_STACK_SET_HEADER(NAME_STR, VALUE_STR) xcapp_header, (const char*)NAME_STR, (const char*)VALUE_STR
|
||||
|
@ -194,7 +194,7 @@ typedef struct txcap_stack_s
|
|||
txcap_stack_t;
|
||||
typedef void txcap_stack_handle_t;/**< Pointer to a XCAP stack. Should be created using @ref txcap_stack_create().*/
|
||||
|
||||
TINYXCAP_API txcap_stack_handle_t* txcap_stack_create(thttp_stack_callback callback, const char* xui, const char* password, const char* xcap_root, ...);
|
||||
TINYXCAP_API txcap_stack_handle_t* txcap_stack_create(thttp_stack_callback_f callback, const char* xui, const char* password, const char* xcap_root, ...);
|
||||
TINYXCAP_API int txcap_stack_start(txcap_stack_handle_t* self);
|
||||
TINYXCAP_API int txcap_stack_set(txcap_stack_handle_t* self, ...);
|
||||
TINYXCAP_API int txcap_stack_stop(txcap_stack_handle_t* self);
|
||||
|
|
|
@ -735,10 +735,10 @@ int __txcap_stack_set(txcap_stack_t* self, va_list *app)
|
|||
while((curr = va_arg(*app, txcap_stack_param_type_t)) != xcapp_null){
|
||||
switch(curr){
|
||||
case xcapp_option:
|
||||
{ /* (txcap_stack_option_t)ID_INT, (const char*)VALUE_STR */
|
||||
txcap_stack_option_t ID_IN = va_arg(*app, txcap_stack_option_t);
|
||||
{ /* (txcap_stack_option_t)ID_ENUM, (const char*)VALUE_STR */
|
||||
txcap_stack_option_t ID_ENUM = va_arg(*app, txcap_stack_option_t);
|
||||
const char* VALUE_STR = va_arg(*app, const char*);
|
||||
switch(ID_IN){
|
||||
switch(ID_ENUM){
|
||||
/* PASSWORD and XUI are not used as options in the HTTP/HTTPS stack */
|
||||
case TXCAP_STACK_OPTION_PASSWORD:
|
||||
{
|
||||
|
@ -857,7 +857,7 @@ txcap_stack_handle_t* stack = txcap_stack_create(test_stack_callback, "sip:bob@e
|
|||
*
|
||||
* @sa @ref txcap_stack_set
|
||||
*/
|
||||
txcap_stack_handle_t* txcap_stack_create(thttp_stack_callback callback, const char* xui, const char* password, const char* xcap_root, ...)
|
||||
txcap_stack_handle_t* txcap_stack_create(thttp_stack_callback_f callback, const char* xui, const char* password, const char* xcap_root, ...)
|
||||
{
|
||||
txcap_stack_t* ret = tsk_null;
|
||||
|
||||
|
@ -994,10 +994,10 @@ static tsk_object_t* _txcap_stack_create(tsk_object_t * self, va_list * app)
|
|||
{
|
||||
txcap_stack_t *stack = self;
|
||||
if(stack){
|
||||
thttp_stack_callback callback;
|
||||
thttp_stack_callback_f callback;
|
||||
tsk_safeobj_init(stack);
|
||||
|
||||
callback = va_arg(*app, thttp_stack_callback);
|
||||
callback = va_arg(*app, thttp_stack_callback_f);
|
||||
stack->xui = tsk_strdup( va_arg(*app, const char*) );
|
||||
stack->password = tsk_strdup( va_arg(*app, const char*) );
|
||||
stack->xcap_root = tsk_strdup( va_arg(*app, const char*) );
|
||||
|
|
|
@ -75,8 +75,8 @@ int txcap_action_perform(txcap_stack_handle_t* stack, txcap_action_type_t type,
|
|||
while((curr = va_arg(ap, txcap_action_param_type_t)) != txcap_apt_null){
|
||||
switch(curr){
|
||||
case txcap_apt_option:
|
||||
{ /*(thhtp_action_option_t)ID_INT, (const char*)VALUE_STR*/
|
||||
thhtp_action_option_t ID_INT = va_arg(ap, thhtp_action_option_t);
|
||||
{ /*(thttp_action_option_t)ID_INT, (const char*)VALUE_STR*/
|
||||
thttp_action_option_t ID_INT = va_arg(ap, thttp_action_option_t);
|
||||
const char* VALUE_STR = va_arg(ap, const char *);
|
||||
tsk_options_add_option(&options, ID_INT, VALUE_STR);
|
||||
break;
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\tinyHTTP\include";"$(DOUBANGO_HOME)\tinySAK\src";"$(DOUBANGO_HOME)\tinyNET\src""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinyHTTP\include;..\..\tinySAK\src;..\..\tinyNET\src"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;TINYHTTP_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -203,6 +203,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinyHTTP\include;..\..\tinySAK\src;..\..\tinyNET\src"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYHTTP_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\tinySAK\src""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinySAK\src"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_WINDOWS;_USRDLL;TINYIPSEC_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -119,6 +119,7 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinySAK\src"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYIPSEC_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\tinyMEDIA\include";"$(DOUBANGO_HOME)\tinySAK\src";"$(DOUBANGO_HOME)\tinyNET\src";"$(DOUBANGO_HOME)\tinySDP\include""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinyMEDIA\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinySDP\include"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_WINDOWS;_USRDLL;TINYMEDIA_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -120,6 +120,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinyMEDIA\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinySDP\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYMEDIA_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\tinyMSRP\include";"$(DOUBANGO_HOME)\tinyHTTP\include";"$(DOUBANGO_HOME)\tinyNET\src";"$(DOUBANGO_HOME)\tinySDP\include";"$(DOUBANGO_HOME)\tinyMEDIA\include";"$(DOUBANGO_HOME)\tinySAK\src";"$(DOUBANGO_HOME)\thirdparties\win32\include""
|
||||
AdditionalIncludeDirectories="..\..\tinyMSRP\include;..\..\tinyHTTP\include;..\..\tinyNET\src;..\..\tinySDP\include;..\..\tinyMEDIA\include;..\..\tinySAK\src;..\..\thirdparties\win32\include"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_WINDOWS;_USRDLL;TINYMSRP_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -120,6 +120,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\tinyMSRP\include;..\..\tinyHTTP\include;..\..\tinyNET\src;..\..\tinySDP\include;..\..\tinyMEDIA\include;..\..\tinySAK\src;..\..\thirdparties\win32\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYMSRP_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\tinyNET\src";"$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\tinySAK\src""
|
||||
AdditionalIncludeDirectories="..\..\tinyNET\src;..\..\thirdparties\win32\include;..\..\tinySAK\src"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_WIN32_WINNT=0x0501;_DEBUG;DEBUG;_WINDOWS;_USRDLL;TINYNET_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -204,7 +204,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\tinyNET\src";"$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\tinySAK\src""
|
||||
AdditionalIncludeDirectories="..\..\tinyNET\src;..\..\thirdparties\win32\include;..\..\tinySAK\src"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYNET_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_WINDOWS;_USRDLL;TINYSAK_EXPORTS;_WIN32_WINNT 0x0501"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -203,7 +203,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="1"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYSAK_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\tinySAK\src";"$(DOUBANGO_HOME)\tinySDP\include""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinySAK\src;..\..\tinySDP\include"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_WINDOWS;_USRDLL;TINYSDP_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -120,6 +120,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinySAK\src;..\..\tinySDP\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYSDP_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\thirdparties\win32\include\smc";"$(DOUBANGO_HOME)\tinySIP\include";"$(DOUBANGO_HOME)\tinySAK\src";"$(DOUBANGO_HOME)\tinyHTTP\include";"$(DOUBANGO_HOME)\tinyNET\src""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\thirdparties\win32\include\smc;..\..\tinySIP\include;..\..\tinySAK\src;..\..\tinyHTTP\include;..\..\tinyNET\src"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -202,6 +202,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\thirdparties\win32\include\smc;..\..\tinySIP\include;..\..\tinySAK\src;..\..\tinyHTTP\include;..\..\tinyNET\src"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
@ -344,11 +345,11 @@
|
|||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test\stdafx.c"
|
||||
RelativePath="..\..\tinySIP\test\stdafx.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test\test.c"
|
||||
RelativePath="..\..\tinySIP\test\test.c"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
|
@ -358,11 +359,11 @@
|
|||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test\stdafx.h"
|
||||
RelativePath="..\..\tinySIP\test\stdafx.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test\targetver.h"
|
||||
RelativePath="..\..\tinySIP\test\targetver.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
|
@ -372,19 +373,23 @@
|
|||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test\test_sipmessages.h"
|
||||
RelativePath="..\..\tinySIP\test\test_ip6_torture.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test\test_stack.h"
|
||||
RelativePath="..\..\tinySIP\test\test_sipmessages.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test\test_transac.h"
|
||||
RelativePath="..\..\tinySIP\test\test_stack.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test\test_uri.h"
|
||||
RelativePath="..\..\tinySIP\test\test_transac.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\tinySIP\test\test_uri.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\thirdparties\win32\include\smc";"$(DOUBANGO_HOME)\tinySIP\include";"$(DOUBANGO_HOME)\tinySAK\src";"$(DOUBANGO_HOME)\tinyNET\src";"$(DOUBANGO_HOME)\tinyHTTP\include";"$(DOUBANGO_HOME)\tinyIPSec\src""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\thirdparties\win32\include\smc;..\..\tinySIP\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinyIPSec\src"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_WINDOWS;_USRDLL;TINYSIP_EXPORTS;_WIN32_WINNT 0x0501"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -203,6 +203,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\thirdparties\win32\include\smc;..\..\tinySIP\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinyIPSec\src"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYSIP_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""$(DOUBANGO_HOME)\thirdparties\win32\include";"$(DOUBANGO_HOME)\tinyXCAP\include";"$(DOUBANGO_HOME)\tinyHTTP\include";"$(DOUBANGO_HOME)\tinyNET\src";"$(DOUBANGO_HOME)\tinySAK\src";"$(DOUBANGO_HOME)\thirdparties\win32\include\smc""
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinyXCAP\include;..\..\tinyHTTP\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\thirdparties\win32\include\smc"
|
||||
PreprocessorDefinitions="DEBUG_LEVEL=DEBUG_LEVEL_INFO;WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
|
@ -199,6 +199,7 @@
|
|||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\thirdparties\win32\include;..\..\tinyXCAP\include;..\..\tinyHTTP\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\thirdparties\win32\include\smc"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
|
|
Loading…
Reference in New Issue