res_pjsip_session: Add ability to accept multiple sdp answers
[asterisk/asterisk.git] / res / res_pjsip / config_system.c
index 473eca8..65e4e2c 100644 (file)
@@ -52,6 +52,13 @@ struct system_config {
        } threadpool;
        /*! Nonzero to disable switching from UDP to TCP transport */
        unsigned int disable_tcp_switch;
+       /*!
+        * Although early media is enabled in pjproject by default, it's only
+        * enabled when the To tags are different. These options allow turning
+        * on or off the feature for different tags and same tags.
+        */
+       unsigned int follow_early_media_fork;
+       unsigned int accept_multiple_sdp_answers;
 };
 
 static struct ast_threadpool_options sip_threadpool_options = {
@@ -96,6 +103,16 @@ static int system_apply(const struct ast_sorcery *system_sorcery, void *obj)
        pjsip_cfg()->tsx.t1 = system->timert1;
        pjsip_cfg()->tsx.td = system->timerb;
 
+       pjsip_cfg()->endpt.follow_early_media_fork = system->follow_early_media_fork;
+#ifdef HAVE_PJSIP_INV_ACCEPT_MULTIPLE_SDP_ANSWERS
+       pjsip_cfg()->endpt.accept_multiple_sdp_answers = system->accept_multiple_sdp_answers;
+#else
+       if (system->accept_multiple_sdp_answers) {
+               ast_log(LOG_WARNING,
+                       "The accept_multiple_sdp_answers flag is not supported in this version of pjproject. Ignoring\n");
+       }
+#endif
+
        if (system->compactheaders) {
                extern pj_bool_t pjsip_use_compact_form;
 
@@ -180,10 +197,14 @@ int ast_sip_initialize_system(void)
                        OPT_UINT_T, 0, FLDSET(struct system_config, threadpool.auto_increment));
        ast_sorcery_object_field_register(system_sorcery, "system", "threadpool_idle_timeout", "60",
                        OPT_UINT_T, 0, FLDSET(struct system_config, threadpool.idle_timeout));
-       ast_sorcery_object_field_register(system_sorcery, "system", "threadpool_max_size", "0",
+       ast_sorcery_object_field_register(system_sorcery, "system", "threadpool_max_size", "50",
                        OPT_UINT_T, 0, FLDSET(struct system_config, threadpool.max_size));
        ast_sorcery_object_field_register(system_sorcery, "system", "disable_tcp_switch", "yes",
                        OPT_BOOL_T, 1, FLDSET(struct system_config, disable_tcp_switch));
+       ast_sorcery_object_field_register(system_sorcery, "system", "follow_early_media_fork", "yes",
+                       OPT_BOOL_T, 1, FLDSET(struct system_config, follow_early_media_fork));
+       ast_sorcery_object_field_register(system_sorcery, "system", "accept_multiple_sdp_answers", "no",
+                       OPT_BOOL_T, 1, FLDSET(struct system_config, accept_multiple_sdp_answers));
 
        ast_sorcery_load(system_sorcery);
 
@@ -282,5 +303,5 @@ static int system_create_resolver_and_set_nameservers(void *data)
 
 void ast_sip_initialize_dns(void)
 {
-       ast_sip_push_task_synchronous(NULL, system_create_resolver_and_set_nameservers, NULL);
+       ast_sip_push_task_wait_servant(NULL, system_create_resolver_and_set_nameservers, NULL);
 }