diff options
Diffstat (limited to 'res/res_pjsip.c')
-rw-r--r-- | res/res_pjsip.c | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/res/res_pjsip.c b/res/res_pjsip.c index 4d5c5cb83..9e436ae3c 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -1411,6 +1411,18 @@ It only limits contacts added through external interaction, such as registration. </para> + <note><para>The <replaceable>rewrite_contact</replaceable> option + registers the source address as the contact address to help with + NAT and reusing connection oriented transports such as TCP and + TLS. Unfortunately, refreshing a registration may register a + different contact address and exceed + <replaceable>max_contacts</replaceable>. The + <replaceable>remove_existing</replaceable> option can help by + removing the soonest to expire contact(s) over + <replaceable>max_contacts</replaceable> which is likely the + old <replaceable>rewrite_contact</replaceable> contact source + address being refreshed. + </para></note> <note><para>This should be set to <literal>1</literal> and <replaceable>remove_existing</replaceable> set to <literal>yes</literal> if you wish to stick with the older <literal>chan_sip</literal> behaviour. @@ -1420,15 +1432,29 @@ <configOption name="minimum_expiration" default="60"> <synopsis>Minimum keep alive time for an AoR</synopsis> <description><para> - Minimum time to keep a peer with an explict expiration. Time in seconds. + Minimum time to keep a peer with an explicit expiration. Time in seconds. </para></description> </configOption> <configOption name="remove_existing" default="no"> <synopsis>Determines whether new contacts replace existing ones.</synopsis> <description><para> - On receiving a new registration to the AoR should it remove - the existing contact that was registered against it? + On receiving a new registration to the AoR should it remove enough + existing contacts not added or updated by the registration to + satisfy <replaceable>max_contacts</replaceable>? Any removed + contacts will expire the soonest. </para> + <note><para>The <replaceable>rewrite_contact</replaceable> option + registers the source address as the contact address to help with + NAT and reusing connection oriented transports such as TCP and + TLS. Unfortunately, refreshing a registration may register a + different contact address and exceed + <replaceable>max_contacts</replaceable>. The + <replaceable>remove_existing</replaceable> option can help by + removing the soonest to expire contact(s) over + <replaceable>max_contacts</replaceable> which is likely the + old <replaceable>rewrite_contact</replaceable> contact source + address being refreshed. + </para></note> <note><para>This should be set to <literal>yes</literal> and <replaceable>max_contacts</replaceable> set to <literal>1</literal> if you wish to stick with the older <literal>chan_sip</literal> behaviour. @@ -3476,7 +3502,7 @@ int ast_sip_create_request(const char *method, struct pjsip_dialog *dlg, AST_RWLIST_HEAD_STATIC(supplements, ast_sip_supplement); -int ast_sip_register_supplement(struct ast_sip_supplement *supplement) +void internal_sip_register_supplement(struct ast_sip_supplement *supplement) { struct ast_sip_supplement *iter; int inserted = 0; @@ -3494,22 +3520,39 @@ int ast_sip_register_supplement(struct ast_sip_supplement *supplement) if (!inserted) { AST_RWLIST_INSERT_TAIL(&supplements, supplement, next); } +} + +int ast_sip_register_supplement(struct ast_sip_supplement *supplement) +{ + internal_sip_register_supplement(supplement); ast_module_ref(ast_module_info->self); + return 0; } -void ast_sip_unregister_supplement(struct ast_sip_supplement *supplement) +int internal_sip_unregister_supplement(struct ast_sip_supplement *supplement) { struct ast_sip_supplement *iter; SCOPED_LOCK(lock, &supplements, AST_RWLIST_WRLOCK, AST_RWLIST_UNLOCK); + int res = -1; + AST_RWLIST_TRAVERSE_SAFE_BEGIN(&supplements, iter, next) { if (supplement == iter) { AST_RWLIST_REMOVE_CURRENT(next); - ast_module_unref(ast_module_info->self); + res = 0; break; } } AST_RWLIST_TRAVERSE_SAFE_END; + + return res; +} + +void ast_sip_unregister_supplement(struct ast_sip_supplement *supplement) +{ + if (!internal_sip_unregister_supplement(supplement)) { + ast_module_unref(ast_module_info->self); + } } static int send_in_dialog_request(pjsip_tx_data *tdata, struct pjsip_dialog *dlg) |