introduce new 'tcap_prim_buf' as union for dialg and component primitives
This commit is contained in:
parent
19f4897e34
commit
8acf717566
|
@ -111,7 +111,7 @@ static int send_begin(uint32_t dialg_id, struct tcap_obj_ident *app_ctx)
|
||||||
return tcap_user_req_dialg(TCAP_PR_TC_BEGIN, &tcdi);
|
return tcap_user_req_dialg(TCAP_PR_TC_BEGIN, &tcdi);
|
||||||
}
|
}
|
||||||
|
|
||||||
int tcap_user_ind_dialg(enum tcap_primitive prim, struct tcap_dialg_ind *tcdi)
|
static int tcap_user_ind_dialg(enum tcap_primitive prim, struct tcap_dialg_ind *tcdi)
|
||||||
{
|
{
|
||||||
printf("-> USER_IND_DIALG(%s): ", tcap_prim_name(prim));
|
printf("-> USER_IND_DIALG(%s): ", tcap_prim_name(prim));
|
||||||
|
|
||||||
|
@ -127,19 +127,15 @@ int tcap_user_ind_dialg(enum tcap_primitive prim, struct tcap_dialg_ind *tcdi)
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
talloc_free(tcdi);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tcap_user_ind_comp(enum tcap_primitive prim, struct tcap_component_ind *tcci)
|
static int tcap_user_ind_comp(enum tcap_primitive prim, struct tcap_component_ind *tcci)
|
||||||
{
|
{
|
||||||
printf("-> USER_IND_COMP(%s)\n", tcap_prim_name(prim));
|
printf("-> USER_IND_COMP(%s)\n", tcap_prim_name(prim));
|
||||||
|
|
||||||
if (!test_state.begin_rcvd) {
|
if (!test_state.begin_rcvd)
|
||||||
talloc_free(tcci);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
switch (prim) {
|
switch (prim) {
|
||||||
case TCAP_PR_TC_INVOKE:
|
case TCAP_PR_TC_INVOKE:
|
||||||
|
@ -152,11 +148,21 @@ int tcap_user_ind_comp(enum tcap_primitive prim, struct tcap_component_ind *tcci
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
talloc_free(tcci);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tcap_user_ind_cb(struct tcap_prim_buf *tcpb)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (tcpb->prim > _TCAP_PR_COMP_BASE)
|
||||||
|
rc = tcap_user_ind_comp(tcpb->prim, &tcpb->comp);
|
||||||
|
else
|
||||||
|
rc = tcap_user_ind_dialg(tcpb->prim, &tcpb->dialg);
|
||||||
|
|
||||||
|
talloc_free(tcpb);
|
||||||
|
}
|
||||||
|
|
||||||
static void signal_handler(int signal)
|
static void signal_handler(int signal)
|
||||||
{
|
{
|
||||||
switch (signal) {
|
switch (signal) {
|
||||||
|
|
|
@ -74,9 +74,6 @@ extern struct tcap_transport_entity *tcap_transp_udp_create(struct sockaddr_stor
|
||||||
|
|
||||||
/* metadata associated with a dialogue indication primitive */
|
/* metadata associated with a dialogue indication primitive */
|
||||||
struct tcap_dialg_ind {
|
struct tcap_dialg_ind {
|
||||||
/* Dummy list head structure for the user. libosmo-tcap doesn't use it */
|
|
||||||
struct llist_head list;
|
|
||||||
|
|
||||||
/* Dialogue ID to which this primitive relates */
|
/* Dialogue ID to which this primitive relates */
|
||||||
uint32_t dialg_id;
|
uint32_t dialg_id;
|
||||||
/* Reference to the user-provided TCAP transport entity */
|
/* Reference to the user-provided TCAP transport entity */
|
||||||
|
@ -95,8 +92,6 @@ struct tcap_dialg_ind {
|
||||||
|
|
||||||
/* metadata associated with a component indication primitive */
|
/* metadata associated with a component indication primitive */
|
||||||
struct tcap_component_ind {
|
struct tcap_component_ind {
|
||||||
/* Dummy list head structure for the user. libosmo-tcap doesn't use it */
|
|
||||||
struct llist_head list;
|
|
||||||
/* public */
|
/* public */
|
||||||
uint32_t dialg_id; /* Dialogue ID */
|
uint32_t dialg_id; /* Dialogue ID */
|
||||||
int8_t invoke_id; /* Invoke ID */
|
int8_t invoke_id; /* Invoke ID */
|
||||||
|
@ -127,10 +122,9 @@ struct tcap_component_ind {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct scxp_entity;
|
|
||||||
|
|
||||||
enum tcap_primitive {
|
enum tcap_primitive {
|
||||||
/* dialogue handling primitives */
|
/* dialogue handling primitives */
|
||||||
|
_TCAP_PR_DIALG_BASE = 0,
|
||||||
TCAP_PR_TC_UNI,
|
TCAP_PR_TC_UNI,
|
||||||
TCAP_PR_TC_BEGIN,
|
TCAP_PR_TC_BEGIN,
|
||||||
TCAP_PR_TC_CONTINUE,
|
TCAP_PR_TC_CONTINUE,
|
||||||
|
@ -138,6 +132,7 @@ enum tcap_primitive {
|
||||||
TCAP_PR_TC_U_ABORT,
|
TCAP_PR_TC_U_ABORT,
|
||||||
TCAP_PR_TC_NOTICE,
|
TCAP_PR_TC_NOTICE,
|
||||||
/* component handling primitives */
|
/* component handling primitives */
|
||||||
|
_TCAP_PR_COMP_BASE = 10,
|
||||||
TCAP_PR_TC_INVOKE,
|
TCAP_PR_TC_INVOKE,
|
||||||
TCAP_PR_TC_RESULT_L,
|
TCAP_PR_TC_RESULT_L,
|
||||||
TCAP_PR_TC_RESULT_NL,
|
TCAP_PR_TC_RESULT_NL,
|
||||||
|
@ -150,13 +145,28 @@ enum tcap_primitive {
|
||||||
TCAP_PR_TC_P_ABORT,
|
TCAP_PR_TC_P_ABORT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* primitive structure to pass primitives between TCAP-User and TCAP Layer */
|
||||||
|
struct tcap_prim_buf {
|
||||||
|
/* Dummy list head structure for the user. libosmo-tcap doesn't use it */
|
||||||
|
struct llist_head list;
|
||||||
|
|
||||||
|
/* The actual primitive number */
|
||||||
|
enum tcap_primitive prim;
|
||||||
|
union {
|
||||||
|
struct tcap_dialg_ind dialg;
|
||||||
|
struct tcap_component_ind comp;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scxp_entity;
|
||||||
|
|
||||||
const char *tcap_prim_name(enum tcap_primitive prim);
|
const char *tcap_prim_name(enum tcap_primitive prim);
|
||||||
|
|
||||||
|
|
||||||
/* callbacks to application code regarding various INDICATIONs */
|
/* callbacks to application code regarding various INDICATIONs */
|
||||||
extern int tcap_user_ind_comp(enum tcap_primitive prim, struct tcap_component_ind *tcci);
|
extern int tcap_user_ind_cb(struct tcap_prim_buf *tcpb);
|
||||||
extern int tcap_user_ind_dialg(enum tcap_primitive prim, struct tcap_dialg_ind *tcdi);
|
/* application wants to issue a REQUEST type primitive */
|
||||||
|
extern int tcap_user_req(struct tcap_prim_buf *tcpb);
|
||||||
extern int tcap_user_req_comp(enum tcap_primitive prim, struct tcap_component_ind *tcci);
|
extern int tcap_user_req_comp(enum tcap_primitive prim, struct tcap_component_ind *tcci);
|
||||||
extern int tcap_user_req_dialg(enum tcap_primitive prim, struct tcap_dialg_ind *tcdi);
|
extern int tcap_user_req_dialg(enum tcap_primitive prim, struct tcap_dialg_ind *tcdi);
|
||||||
|
|
||||||
|
|
47
src/tcu.c
47
src/tcu.c
|
@ -60,17 +60,22 @@ LIB_EXPORTED const char *tcap_prim_name(enum tcap_primitive prim)
|
||||||
return get_value_string(tcap_prim_names, prim);
|
return get_value_string(tcap_prim_names, prim);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct tcap_prim_buf *tcap_prim_buf_alloc(enum tcap_primitive prim)
|
||||||
|
{
|
||||||
|
struct tcap_prim_buf *tcpb = talloc_zero(tcap_ind_ctx,
|
||||||
|
struct tcap_prim_buf);
|
||||||
|
if (!tcpb)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
tcpb->prim = prim;
|
||||||
|
|
||||||
|
return tcpb;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* Dialogue Primitives */
|
/* Dialogue Primitives */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
static struct tcap_dialg_ind *tcap_dialg_ind_alloc(void)
|
|
||||||
{
|
|
||||||
struct tcap_dialg_ind *tcdi = talloc_zero(tcap_ind_ctx,
|
|
||||||
struct tcap_dialg_ind);
|
|
||||||
return tcdi;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fill the application context and user information part of 'tcap_dialg_ind' */
|
/* fill the application context and user information part of 'tcap_dialg_ind' */
|
||||||
static int fill_tcap_dialg_ind(struct tcap_dialg_ind *tcdi,
|
static int fill_tcap_dialg_ind(struct tcap_dialg_ind *tcdi,
|
||||||
OBJECT_IDENTIFIER_t *app_ctx_name,
|
OBJECT_IDENTIFIER_t *app_ctx_name,
|
||||||
|
@ -109,7 +114,8 @@ static int _tcap_tcu_dialg_ind(enum tcap_primitive prim, struct tcap_dialogue *t
|
||||||
OBJECT_IDENTIFIER_t *app_ctx_name,
|
OBJECT_IDENTIFIER_t *app_ctx_name,
|
||||||
struct user_information *user_info, int comp_present)
|
struct user_information *user_info, int comp_present)
|
||||||
{
|
{
|
||||||
struct tcap_dialg_ind *tcdi = tcap_dialg_ind_alloc();
|
struct tcap_prim_buf *tcpb = tcap_prim_buf_alloc(prim);
|
||||||
|
struct tcap_dialg_ind *tcdi = &tcpb->dialg;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (!tcdi)
|
if (!tcdi)
|
||||||
|
@ -125,7 +131,7 @@ static int _tcap_tcu_dialg_ind(enum tcap_primitive prim, struct tcap_dialogue *t
|
||||||
if (comp_present)
|
if (comp_present)
|
||||||
tcdi->components_present = 1;
|
tcdi->components_present = 1;
|
||||||
|
|
||||||
return tcap_user_ind_dialg(prim, tcdi);
|
return tcap_user_ind_cb(tcpb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TC-BEGIN.ind from DHA */
|
/* TC-BEGIN.ind from DHA */
|
||||||
|
@ -234,17 +240,11 @@ LIB_EXPORTED int tcap_user_req_dialg(enum tcap_primitive prim, struct tcap_dialg
|
||||||
/* Component Primitives */
|
/* Component Primitives */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
static struct tcap_component_ind *tcap_comp_ind_alloc(void)
|
|
||||||
{
|
|
||||||
struct tcap_component_ind *tcci = talloc_zero(tcap_ind_ctx,
|
|
||||||
struct tcap_component_ind);
|
|
||||||
return tcci;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _tcu_comp_ind(enum tcap_primitive prim, struct tcap_invocation *ti, struct OPERATION *oper,
|
static int _tcu_comp_ind(enum tcap_primitive prim, struct tcap_invocation *ti, struct OPERATION *oper,
|
||||||
Parameter_t *param, int last)
|
Parameter_t *param, int last)
|
||||||
{
|
{
|
||||||
struct tcap_component_ind *tcci = tcap_comp_ind_alloc();
|
struct tcap_prim_buf *tcpb = tcap_prim_buf_alloc(prim);
|
||||||
|
struct tcap_component_ind *tcci = &tcpb->comp;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
tcci->dialg_id = ti->dialogue->dialogue_id;
|
tcci->dialg_id = ti->dialogue->dialogue_id;
|
||||||
|
@ -281,10 +281,10 @@ static int _tcu_comp_ind(enum tcap_primitive prim, struct tcap_invocation *ti, s
|
||||||
}
|
}
|
||||||
tcci->last_component = last;
|
tcci->last_component = last;
|
||||||
|
|
||||||
return tcap_user_ind_comp(prim, tcci);
|
return tcap_user_ind_cb(tcpb);
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
talloc_free(tcci);
|
talloc_free(tcpb);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,3 +422,12 @@ LIB_EXPORTED int tcap_user_req_comp(enum tcap_primitive prim, struct tcap_compon
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* primitive received from TC-User */
|
||||||
|
LIB_EXPORTED int tcap_user_req(struct tcap_prim_buf *tcpb)
|
||||||
|
{
|
||||||
|
if (tcpb->prim > _TCAP_PR_COMP_BASE)
|
||||||
|
return tcap_user_req_comp(tcpb->prim, &tcpb->comp);
|
||||||
|
else
|
||||||
|
return tcap_user_req_dialg(tcpb->prim, &tcpb->dialg);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue