Skip to content

Commit 8ff603f

Browse files
committed
b2b_logic: provite delay for terminated bridge entity
When a message is bridged in another call, a flag (`late_bye`) may be used to the `b2b_bridge_request` command to delay the BYE message until the new entity establishes the call. Worked sponsored by NG-Voice/Carsten Bock
1 parent ce9fccc commit 8ff603f

File tree

8 files changed

+344
-72
lines changed

8 files changed

+344
-72
lines changed

modules/b2b_logic/b2b_load.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ int b2bl_set_state(str* key, int state);
8484
int b2bl_bridge_2calls(str* key1, str* key2);
8585
typedef int (*b2bl_bridge_2calls_t)(str* key1, str* key2);
8686

87-
int b2bl_bridge_msg(struct sip_msg* msg, str* key, int entity_no, str *adv_ct);
87+
int b2bl_bridge_msg(struct sip_msg* msg, str* key, int entity_no,
88+
unsigned int flags, str *adv_ct);
8889
int b2bl_get_tuple_key(str *key, unsigned int *hash_index,
8990
unsigned int *local_index);
9091
typedef int (*b2bl_bridge_msg_t)(struct sip_msg* msg, str* key, int entity_no);

modules/b2b_logic/b2b_logic.c

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ static int child_init(int rank);
6060
static int fixup_init_flags(void** param);
6161
static int fixup_free_init_flags(void** param);
6262
static int fixup_bridge_flags(void** param);
63+
static int fixup_bridge_request_flags(void** param);
6364
static int fixup_init_id(void** param);
6465
static int fixup_check_avp(void** param);
6566
static int fixup_route(void** param);
@@ -79,7 +80,9 @@ static mi_response_t *mi_b2b_list(const mi_params_t *params,
7980
static mi_response_t *mi_b2b_terminate_call(const mi_params_t *params,
8081
struct mi_handler *async_hdl);
8182
static void b2bl_clean(unsigned int ticks, void* param);
83+
void b2bl_term_entities_timer(unsigned int ticks, void* param);
8284
static void b2bl_db_timer_update(unsigned int ticks, void* param);
85+
static int init_entities_term_timer(void);
8386

8487
int b2bl_script_init_request(struct sip_msg *msg, str *id, struct b2b_params *init_params,
8588
void *req_routeid, void *reply_routeid);
@@ -93,7 +96,7 @@ int b2b_delete_entity(struct sip_msg *msg);
9396
int b2b_end_dlg_leg(struct sip_msg *msg);
9497
int b2b_send_reply(struct sip_msg *msg, int *code, str *reason, str *headers, str *body);
9598
int b2bl_script_bridge_msg(struct sip_msg* msg, str *key, int *entity_no,
96-
str *adv_contact);
99+
str *adv_contact, void *flags);
97100
int script_trigger_scenario(struct sip_msg* msg, str *id, str * params,
98101
str *ent1, pv_spec_t *ent1_hnames, pv_spec_t *ent1_hvals,
99102
str *ent2, pv_spec_t *ent2_hnames, pv_spec_t *ent2_hvals);
@@ -191,6 +194,9 @@ b2bl_tuple_t *local_ctx_tuple;
191194
* MI cmd, when the tuple is not created yet */
192195
struct b2b_ctx_val *local_ctx_vals;
193196

197+
unsigned int ent_term_interval;
198+
struct b2b_term_timer *ent_term_timer;
199+
194200
static const cmd_export_t cmds[]=
195201
{
196202
{"b2b_init_request", (cmd_function)b2bl_script_init_request, {
@@ -257,7 +263,9 @@ static const cmd_export_t cmds[]=
257263
{"b2b_bridge_request", (cmd_function)b2bl_script_bridge_msg, {
258264
{CMD_PARAM_STR,0,0},
259265
{CMD_PARAM_INT,0,0},
260-
{CMD_PARAM_STR|CMD_PARAM_OPT,0,0}, {0,0,0}},
266+
{CMD_PARAM_STR|CMD_PARAM_OPT,0,0},
267+
{CMD_PARAM_STR|CMD_PARAM_OPT, fixup_bridge_request_flags, 0},
268+
{0,0,0}},
261269
REQUEST_ROUTE},
262270
{"b2b_logic_bind", (cmd_function)b2b_logic_bind, {{0,0,0}}, 0},
263271
{0,0,{{0,0,0}},0}
@@ -288,6 +296,7 @@ static const param_export_t params[]=
288296
{"db_mode", INT_PARAM, &b2bl_db_mode },
289297
{"b2bl_th_init_timeout",INT_PARAM, &b2bl_th_init_timeout },
290298
{"b2bl_early_update",INT_PARAM, &b2b_early_update },
299+
{"old_entity_term_delay",INT_PARAM, &ent_term_interval },
291300
{0, 0, 0 }
292301
};
293302

@@ -667,6 +676,16 @@ static int mod_init(void)
667676
register_timer("b2bl-bridge-retry", b2bl_timer_bridge_retry, 0, 1,
668677
TIMER_FLAG_SKIP_ON_DELAY);
669678

679+
if (ent_term_interval) {
680+
register_timer("b2bl-term-entities", b2bl_term_entities_timer, 0, 1,
681+
TIMER_FLAG_DELAY_ON_DELAY);
682+
683+
if (init_entities_term_timer() < 0) {
684+
LM_ERR("Failed to init entities termination timer\n");
685+
return -1;
686+
}
687+
}
688+
670689
if (b2b_api.register_cb(entity_event_trigger,
671690
B2BCB_TRIGGER_EVENT, &b2bl_mod_name) < 0) {
672691
LM_ERR("could not register entity event trigger callback!\n");
@@ -684,6 +703,29 @@ static int mod_init(void)
684703
return 0;
685704
}
686705

706+
static int init_entities_term_timer(void)
707+
{
708+
ent_term_timer = shm_malloc(sizeof *ent_term_timer);
709+
if (!ent_term_timer) {
710+
LM_ERR("no more shm memory\n");
711+
return -1;
712+
}
713+
memset(ent_term_timer, 0, sizeof *ent_term_timer);
714+
715+
ent_term_timer->lock = lock_alloc();
716+
if (ent_term_timer->lock==0) {
717+
LM_ERR("failed to alloc lock\n");
718+
return -1;
719+
}
720+
721+
if (lock_init(ent_term_timer->lock)==0) {
722+
LM_ERR("failed to init lock\n");
723+
return -1;
724+
}
725+
726+
return 0;
727+
}
728+
687729
void b2bl_db_timer_update(unsigned int ticks, void* param)
688730
{
689731
b2b_logic_dump(0);
@@ -768,6 +810,18 @@ void b2bl_clean(unsigned int ticks, void* param)
768810
}
769811
}
770812

813+
void destroy_entities_term_timer(void)
814+
{
815+
if (ent_term_timer==0)
816+
return;
817+
818+
lock_destroy(ent_term_timer->lock);
819+
lock_dealloc(ent_term_timer->lock);
820+
821+
shm_free(ent_term_timer);
822+
ent_term_timer = 0;
823+
}
824+
771825
static void mod_destroy(void)
772826
{
773827
if (b2bl_db_mode==WRITE_BACK) {
@@ -795,6 +849,9 @@ static void mod_destroy(void)
795849
if (server_address_pve)
796850
pv_elem_free_all(server_address_pve);
797851

852+
if (ent_term_interval)
853+
destroy_entities_term_timer();
854+
798855
destroy_b2bl_htable();
799856
b2bl_free_bridge_retry();
800857
}
@@ -945,6 +1002,29 @@ static int fixup_bridge_flags(void** param)
9451002
return 0;
9461003
}
9471004

1005+
1006+
static str bridge_req_kv_flags[] =
1007+
{
1008+
str_init("late_bye"),
1009+
STR_NULL
1010+
};
1011+
1012+
static int fixup_bridge_request_flags(void** param)
1013+
{
1014+
if (fixup_named_flags(param, bridge_req_kv_flags, NULL, NULL)<0) {
1015+
LM_ERR("Failed to parse flags\n");
1016+
return -1;
1017+
}
1018+
1019+
/* ugly hack to move the flag on its right position (as the
1020+
fixup_named_flags() will set it with index 0 (as in the def array))
1021+
WARNING: this works only because we have a single flag!!!! */
1022+
if (param)
1023+
*param = (void*)(unsigned long)B2BL_BR_FLAG_BR_MSG_LATE_BYE;
1024+
1025+
return 0;
1026+
}
1027+
9481028
static int fixup_init_id(void** param)
9491029
{
9501030
str *s = (str*)*param;
@@ -1180,20 +1260,25 @@ mi_response_t *mi_trigger_scenario(const mi_params_t *params,
11801260
}
11811261

11821262
int b2bl_script_bridge_msg(struct sip_msg* msg, str *key, int *entity_no,
1183-
str *adv_contact)
1263+
str *adv_contact, void *flags_p)
11841264
{
1265+
unsigned int flags = 0;
1266+
11851267
if (cur_route_ctx.flags & (B2BL_RT_REQ_CTX|B2BL_RT_RPL_CTX)) {
11861268
LM_ERR("The 'b2b_bridge_request' function cannot be used from the "
11871269
"b2b_logic dedicated routes\n");
11881270
return -1;
11891271
}
11901272

1191-
return b2bl_bridge_msg(msg, key, *entity_no, adv_contact);
1273+
if (flags_p)
1274+
flags = (unsigned int)(unsigned long)flags_p;
1275+
1276+
return b2bl_bridge_msg(msg, key, *entity_no, flags, adv_contact);
11921277
}
11931278

11941279
static int b2bl_api_bridge_msg(struct sip_msg* msg, str* key, int entity_no)
11951280
{
1196-
return b2bl_bridge_msg(msg, key, entity_no, NULL);
1281+
return b2bl_bridge_msg(msg, key, entity_no, 0, NULL);
11971282
}
11981283

11991284
static mi_response_t *mi_b2b_terminate_call(const mi_params_t *params,

modules/b2b_logic/b2b_logic.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ enum b2b_tuple_state {
7878
#define B2BL_BR_FLAG_PROV_MEDIA (1<<5)
7979
#define B2BL_BR_FLAG_NO_OLD_ENT (1<<6)
8080
#define B2BL_BR_FLAG_PENDING_SDP (1<<7)
81+
#define B2BL_BR_FLAG_BR_MSG_LATE_BYE (1<<8)
8182

8283
/* modes to write in db */
8384
#define NO_DB 0
@@ -147,6 +148,9 @@ extern unsigned int b2bl_th_init_timeout;
147148
extern struct script_route_ref *global_req_rt_ref;
148149
extern struct script_route_ref *global_reply_rt_ref;
149150
extern int b2b_early_update;
151+
extern unsigned int ent_term_interval;
152+
153+
extern struct b2b_term_timer *ent_term_timer;
150154

151155
extern str top_hiding_scen_s;
152156
extern str internal_scen_s;

0 commit comments

Comments
 (0)