diff --git a/channels/chan_sip.c b/channels/chan_sip.c index b3d745ff67..271c244535 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1491,7 +1491,7 @@ static int get_refer_info(struct sip_pvt *transferer, struct sip_request *outgoi static int get_also_info(struct sip_pvt *p, struct sip_request *oreq); static int parse_ok_contact(struct sip_pvt *pvt, struct sip_request *req); static int set_address_from_contact(struct sip_pvt *pvt); -static void check_via(struct sip_pvt *p, struct sip_request *req); +static void check_via(struct sip_pvt *p, const struct sip_request *req); static int get_rpid(struct sip_pvt *p, struct sip_request *oreq); static int get_rdnis(struct sip_pvt *p, struct sip_request *oreq, char **name, char **number, int *reason); static enum sip_get_dest_result get_destination(struct sip_pvt *p, struct sip_request *oreq, int *cc_recall_core_id); @@ -16448,7 +16448,7 @@ static attribute_unused void check_via_response(struct sip_pvt *p, struct sip_re } /*! \brief check Via: header for hostname, port and rport request/answer */ -static void check_via(struct sip_pvt *p, struct sip_request *req) +static void check_via(struct sip_pvt *p, const struct sip_request *req) { char via[512]; char *c, *maddr; @@ -26077,7 +26077,10 @@ static int handle_request_do(struct sip_request *req, struct ast_sockaddr *addr) owner_chan_ref = sip_pvt_lock_full(p); copy_socket_data(&p->socket, &req->socket); - ast_sockaddr_copy(&p->recv, addr); + + if (ast_sockaddr_isnull(&p->recv)) { /* This may already be set before getting here */ + ast_sockaddr_copy(&p->recv, addr); + } /* if we have an owner, then this request has been authenticated */ if (p->owner) { @@ -28147,7 +28150,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str } else if (!strcasecmp(v->name, "host")) { if (!strcasecmp(v->value, "dynamic")) { /* They'll register with us */ - if ((!found && !realtime) || !peer->host_dynamic) { + if ((!found && !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS)) || !peer->host_dynamic) { /* Initialize stuff if this is a new peer, or if it used to * not be dynamic before the reload. */ ast_sockaddr_setnull(&peer->addr); @@ -28467,6 +28470,10 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str set_socket_transport(&peer->socket, peer->default_outbound_transport); } + ast_copy_flags(&peer->flags[0], &peerflags[0], mask[0].flags); + ast_copy_flags(&peer->flags[1], &peerflags[1], mask[1].flags); + ast_copy_flags(&peer->flags[2], &peerflags[2], mask[2].flags); + if (ast_str_strlen(fullcontact)) { ast_string_field_set(peer, fullcontact, ast_str_buffer(fullcontact)); peer->rt_fromcontact = TRUE; @@ -28560,9 +28567,6 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str sip_poke_peer(peer, 0); } - ast_copy_flags(&peer->flags[0], &peerflags[0], mask[0].flags); - ast_copy_flags(&peer->flags[1], &peerflags[1], mask[1].flags); - ast_copy_flags(&peer->flags[2], &peerflags[2], mask[2].flags); if (ast_test_flag(&peer->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE)) { sip_cfg.allowsubscribe = TRUE; /* No global ban any more */ } diff --git a/contrib/realtime/mysql/sippeers.sql b/contrib/realtime/mysql/sippeers.sql index 35b5ae2c99..c8504a2da6 100644 --- a/contrib/realtime/mysql/sippeers.sql +++ b/contrib/realtime/mysql/sippeers.sql @@ -24,7 +24,7 @@ CREATE TABLE IF NOT EXISTS `sippeers` ( `transport` enum('udp','tcp','udp,tcp','tcp,udp') DEFAULT NULL, `dtmfmode` enum('rfc2833','info','shortinfo','inband','auto') DEFAULT NULL, `directmedia` enum('yes','no','nonat','update') DEFAULT NULL, - `nat` enum('yes','no','never','route') DEFAULT NULL, + `nat` varchar(29) DEFAULT NULL, `callgroup` varchar(40) DEFAULT NULL, `pickupgroup` varchar(40) DEFAULT NULL, `language` varchar(40) DEFAULT NULL, diff --git a/contrib/realtime/postgresql/realtime.sql b/contrib/realtime/postgresql/realtime.sql index 347ec39460..90f766068d 100644 --- a/contrib/realtime/postgresql/realtime.sql +++ b/contrib/realtime/postgresql/realtime.sql @@ -48,7 +48,7 @@ insecure character varying(4), "language" character varying(2), mailbox character varying(50), md5secret character varying(80), -nat character varying(5) DEFAULT 'no' NOT NULL, +nat character varying(29) DEFAULT '' NOT NULL, permit character varying(95), deny character varying(95), mask character varying(95),