Begin documenting IMS/LTE stack.

This commit is contained in:
bossiel 2010-04-22 16:47:02 +00:00
parent 2e99f0c158
commit b65a34cf0f
31 changed files with 593 additions and 552 deletions

View File

@ -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);

View File

@ -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>

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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. */

View File

@ -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);

View File

@ -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);
}
/* ===

View File

@ -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{

View File

@ -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

View File

@ -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;

View File

@ -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();
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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,

View File

@ -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__

View File

@ -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);

View File

@ -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*) );

View File

@ -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;

View File

@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\tinyHTTP\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;;&quot;$(DOUBANGO_HOME)\tinyNET\src&quot;"
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"

View File

@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;"
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"

View File

@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\tinyMEDIA\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;;&quot;$(DOUBANGO_HOME)\tinyNET\src&quot;;&quot;$(DOUBANGO_HOME)\tinySDP\include&quot;"
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"

View File

@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\tinyMSRP\include&quot;;&quot;$(DOUBANGO_HOME)\tinyHTTP\include&quot;;&quot;$(DOUBANGO_HOME)\tinyNET\src&quot;;&quot;$(DOUBANGO_HOME)\tinySDP\include&quot;;&quot;$(DOUBANGO_HOME)\tinyMEDIA\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;;&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;"
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"

View File

@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\tinyNET\src&quot;;&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;"
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="&quot;$(DOUBANGO_HOME)\tinyNET\src&quot;;&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;"
AdditionalIncludeDirectories="..\..\tinyNET\src;..\..\thirdparties\win32\include;..\..\tinySAK\src"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYNET_EXPORTS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"

View File

@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;"
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="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;"
AdditionalIncludeDirectories="..\..\thirdparties\win32\include"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;TINYSAK_EXPORTS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"

View File

@ -40,7 +40,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;;&quot;$(DOUBANGO_HOME)\tinySDP\include&quot;"
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"

View File

@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\thirdparties\win32\include\smc&quot;;&quot;$(DOUBANGO_HOME)\tinySIP\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;;&quot;$(DOUBANGO_HOME)\tinyHTTP\include&quot;;&quot;$(DOUBANGO_HOME)\tinyNET\src&quot;"
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>

View File

@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\thirdparties\win32\include\smc&quot;;&quot;$(DOUBANGO_HOME)\tinySIP\include&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;;&quot;$(DOUBANGO_HOME)\tinyNET\src&quot;;&quot;$(DOUBANGO_HOME)\tinyHTTP\include&quot;;&quot;$(DOUBANGO_HOME)\tinyIPSec\src&quot;"
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"

View File

@ -43,7 +43,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(DOUBANGO_HOME)\thirdparties\win32\include&quot;;&quot;$(DOUBANGO_HOME)\tinyXCAP\include&quot;;&quot;$(DOUBANGO_HOME)\tinyHTTP\include&quot;;&quot;$(DOUBANGO_HOME)\tinyNET\src&quot;;&quot;$(DOUBANGO_HOME)\tinySAK\src&quot;;&quot;$(DOUBANGO_HOME)\thirdparties\win32\include\smc&quot;"
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"