Index: channels/chan_sip.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v retrieving revision 1.284 diff -u -r1.284 chan_sip.c --- channels/chan_sip.c 26 Jan 2004 19:12:23 -0000 1.284 +++ channels/chan_sip.c 31 Jan 2004 23:19:28 -0000 @@ -793,58 +793,70 @@ if (!p) p = mysql_peer(peer, NULL); #endif - if (p) { - found++; - r->capability = p->capability; - r->nat = p->nat; - if (r->rtp) { - ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat); - ast_rtp_setnat(r->rtp, r->nat); - } - if (r->vrtp) { - ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat); - ast_rtp_setnat(r->vrtp, r->nat); - } - strncpy(r->peername, p->username, sizeof(r->peername)-1); - strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1); - strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1); - strncpy(r->username, p->username, sizeof(r->username)-1); - strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1); - if (!strlen(r->tohost)) { - if (p->addr.sin_addr.s_addr) - snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr)); - else - snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr)); - } - if (strlen(p->fromdomain)) - strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1); - if (strlen(p->fromuser)) - strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1); - r->insecure = p->insecure; - r->canreinvite = p->canreinvite; - r->maxtime = p->maxms; - r->callgroup = p->callgroup; - r->pickupgroup = p->pickupgroup; - if (p->dtmfmode) { - r->dtmfmode = p->dtmfmode; - if (r->dtmfmode & SIP_DTMF_RFC2833) - r->noncodeccapability |= AST_RTP_DTMF; - else - r->noncodeccapability &= ~AST_RTP_DTMF; - } - strncpy(r->context, p->context,sizeof(r->context)-1); - if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) && - (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) { - if (p->addr.sin_addr.s_addr) { - r->sa.sin_addr = p->addr.sin_addr; - r->sa.sin_port = p->addr.sin_port; - } else { - r->sa.sin_addr = p->defaddr.sin_addr; - r->sa.sin_port = p->defaddr.sin_port; - } - memcpy(&r->recv, &r->sa, sizeof(r->recv)); + /* Check address */ + if (!p->addr.sin_addr.s_addr || !p->addr.sin_port) { + ast_log(LOG_DEBUG, "Peer %s unavailable, cancelling SIP call. \n", p->name); + return -1; + } + if (p->maxms) { /* We monitor this host */ + if (p->lastms < 0) { /* Unreachable host */ + ast_log(LOG_DEBUG, "Peer %s unreachable, cancelling SIP call. \n", p->name); + return -1; + } + } + + + found++; + r->capability = p->capability; + r->nat = p->nat; + if (r->rtp) { + ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", r->nat); + ast_rtp_setnat(r->rtp, r->nat); + } + if (r->vrtp) { + ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", r->nat); + ast_rtp_setnat(r->vrtp, r->nat); + } + strncpy(r->peername, p->username, sizeof(r->peername)-1); + strncpy(r->peersecret, p->secret, sizeof(r->peersecret)-1); + strncpy(r->peermd5secret, p->md5secret, sizeof(r->peermd5secret)-1); + strncpy(r->username, p->username, sizeof(r->username)-1); + strncpy(r->tohost, p->tohost, sizeof(r->tohost)-1); + if (!strlen(r->tohost)) { + if (p->addr.sin_addr.s_addr) + snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->addr.sin_addr)); + else + snprintf(r->tohost, sizeof(r->tohost), inet_ntoa(p->defaddr.sin_addr)); + } + if (strlen(p->fromdomain)) + strncpy(r->fromdomain, p->fromdomain, sizeof(r->fromdomain)-1); + if (strlen(p->fromuser)) + strncpy(r->fromuser, p->fromuser, sizeof(r->fromuser)-1); + r->insecure = p->insecure; + r->canreinvite = p->canreinvite; + r->maxtime = p->maxms; + r->callgroup = p->callgroup; + r->pickupgroup = p->pickupgroup; + if (p->dtmfmode) { + r->dtmfmode = p->dtmfmode; + if (r->dtmfmode & SIP_DTMF_RFC2833) + r->noncodeccapability |= AST_RTP_DTMF; + else + r->noncodeccapability &= ~AST_RTP_DTMF; + } + strncpy(r->context, p->context,sizeof(r->context)-1); + if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) && + (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) { + if (p->addr.sin_addr.s_addr) { + r->sa.sin_addr = p->addr.sin_addr; + r->sa.sin_port = p->addr.sin_port; + } else { + r->sa.sin_addr = p->defaddr.sin_addr; + r->sa.sin_port = p->defaddr.sin_port; } + memcpy(&r->recv, &r->sa, sizeof(r->recv)); + } } ast_mutex_unlock(&peerl.lock); if (!p && !found) { @@ -5663,7 +5675,7 @@ strncpy(name, peer->name, sizeof(name) - 1); peer->lastmsgssent = ((newmsgs << 8) | (oldmsgs)); ast_mutex_unlock(&peerl.lock); - if (create_addr(p, name) || !p->sa.sin_addr.s_addr || !p->sa.sin_port) { + if (create_addr(p, name)) { /* Maybe they're not registered, etc. */ sip_destroy(p); return 0; @@ -5889,10 +5901,11 @@ res = AST_DEVICE_UNAVAILABLE; if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) && (!p->maxms || ((p->lastms > -1) && (p->lastms <= p->maxms)))) { + /* peer found and valid */ res = AST_DEVICE_UNKNOWN; - break; } + break; } p = p->next; } @@ -5905,7 +5918,7 @@ return res; } -static struct ast_channel *sip_request(char *type, int format, void *data) +static struct ast_channel *sip_request_call(char *type, int format, void *data) { int oldformat; struct sip_pvt *p; @@ -5953,9 +5966,11 @@ } if (!strlen(p->peername) && ext) strncpy(p->peername, ext, sizeof(p->peername) - 1); + /* Recalculate our side, and recalculate Call ID */ if (ast_sip_ouraddrfor(&p->sa.sin_addr,&p->ourip)) memcpy(&p->ourip, &__ourip, sizeof(p->ourip)); + /* z9hG4bK is a magic cookie. See RFC 3261 section 8.1.1.7 */ snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=z9hG4bK%08x", inet_ntoa(p->ourip), ourport, p->branch); build_callid(p->callid, sizeof(p->callid), p->ourip); @@ -6729,7 +6744,7 @@ res = reload_config(); if (!res) { /* Make sure we can register our sip channel type */ - if (ast_channel_register_ex(type, tdesc, capability, sip_request, sip_devicestate)) { + if (ast_channel_register_ex(type, tdesc, capability, sip_request_call, sip_devicestate)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); return -1; }