diff --git a/net/asterisk/patches/999-contact_fqdn.patch b/net/asterisk/patches/999-contact_fqdn.patch new file mode 100644 index 0000000..26693c1 --- /dev/null +++ b/net/asterisk/patches/999-contact_fqdn.patch @@ -0,0 +1,73 @@ +--- a/include/asterisk/res_pjsip.h ++++ b/include/asterisk/res_pjsip.h +@@ -238,6 +238,8 @@ struct ast_sip_transport { + AST_STRING_FIELD(external_media_address); + /*! Optional domain to use for messages if provided could not be found */ + AST_STRING_FIELD(domain); ++ /*! Contact FQDN */ ++ AST_STRING_FIELD(contact_fqdn); + ); + /*! Type of transport */ + enum ast_transport type; +--- a/res/res_pjsip/config_transport.c ++++ b/res/res_pjsip/config_transport.c +@@ -1830,6 +1830,7 @@ int ast_sip_initialize_sorcery_transport + ast_sorcery_object_field_register(sorcery, "transport", "external_signaling_port", "0", OPT_UINT_T, PARSE_IN_RANGE, FLDSET(struct ast_sip_transport, external_signaling_port), 0, 65535); + ast_sorcery_object_field_register(sorcery, "transport", "external_media_address", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_transport, external_media_address)); + ast_sorcery_object_field_register(sorcery, "transport", "domain", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_transport, domain)); ++ ast_sorcery_object_field_register(sorcery, "transport", "contact_fqdn", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_transport, contact_fqdn)); + ast_sorcery_object_field_register_custom(sorcery, "transport", "verify_server", "", transport_tls_bool_handler, verify_server_to_str, NULL, 0, 0); + ast_sorcery_object_field_register_custom(sorcery, "transport", "verify_client", "", transport_tls_bool_handler, verify_client_to_str, NULL, 0, 0); + ast_sorcery_object_field_register_custom(sorcery, "transport", "require_client_cert", "", transport_tls_bool_handler, require_client_cert_to_str, NULL, 0, 0); +--- a/res/res_pjsip/pjsip_config.xml ++++ b/res/res_pjsip/pjsip_config.xml +@@ -1738,6 +1738,9 @@ + + Domain the transport comes from + ++ ++ FQDN to have in contact header ++ + + External IP address to use in RTP handling + +--- a/res/res_pjsip/pjsip_manager.xml ++++ b/res/res_pjsip/pjsip_manager.xml +@@ -179,6 +179,9 @@ + + + ++ ++ ++ + + + +--- a/res/res_pjsip_nat.c ++++ b/res/res_pjsip_nat.c +@@ -365,7 +365,11 @@ static pj_status_t process_nat(pjsip_tx_ + pjsip_method_cmp(&cseq->method, &pjsip_register_method)) { + /* We can only rewrite the URI when one is present */ + if (uri || (uri = ast_sip_get_contact_sip_uri(tdata))) { +- pj_strdup2(tdata->pool, &uri->host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address)); ++ if (!ast_strlen_zero(transport->contact_fqdn)) { ++ pj_strdup2(tdata->pool, &uri->host, transport->contact_fqdn); ++ } else { ++ pj_strdup2(tdata->pool, &uri->host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address)); ++ } + if (transport->external_signaling_port) { + uri->port = transport->external_signaling_port; + ast_debug(4, "Re-wrote Contact URI port to %d\n", uri->port); +@@ -375,7 +379,11 @@ static pj_status_t process_nat(pjsip_tx_ + + /* Update the via header if relevant */ + if ((tdata->msg->type == PJSIP_REQUEST_MSG) && (via || (via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL)))) { +- pj_strdup2(tdata->pool, &via->sent_by.host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address)); ++ if (!ast_strlen_zero(transport->contact_fqdn)) { ++ pj_strdup2(tdata->pool, &via->sent_by.host, transport->contact_fqdn); ++ } else { ++ pj_strdup2(tdata->pool, &via->sent_by.host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address)); ++ } + if (transport->external_signaling_port) { + via->sent_by.port = transport->external_signaling_port; + }