--- 1.4.19.1/channels/chan_sip.c 2008-06-11 14:37:44.000000000 +0000 +++ asterisk-1.4.19.1/channels/chan_sip.c 2008-03-26 19:04:35.000000000 +0000 @@ -115,7 +115,6 @@ #include #include -#include "../defaults.h" #include "asterisk/lock.h" #include "asterisk/channel.h" #include "asterisk/config.h" @@ -676,30 +675,6 @@ char hop[0]; }; -/*! \brief */ -enum failover_state { - NOT_CONFIGURED = 0, /*!< This is not a failover server */ - STANDBY, /*!< This is a failover server in standby mode */ - ACTIVE, /*!< The primary server fails, so this server is active */ -}; - -/*! \brief definition of a sip proxy server - * - * For outbound proxies, this is allocated in the SIP peer dynamically or - * statically as the global_outboundproxy. The pointer in a SIP message is just - * a pointer and should *not* be de-allocated. - */ -struct sip_proxy { - char name[MAXHOSTNAMELEN]; /*!< DNS name of domain/host or IP */ - struct sockaddr_in ip; /*!< Currently used IP address and port */ - time_t last_dnsupdate; /*!< When this was resolved */ - int force; /*!< If it's an outbound proxy, Force use of this outbound proxy for all outbound requests */ - enum failover_state failoverstate; /*!< If this is a failover proxy, what's the state ? */ - - /* Room for a SRV record chain based on the name */ -}; - - /*! \brief Modes for SIP domain handling in the PBX */ enum domain_mode { SIP_DOMAIN_AUTO, /*!< This domain is auto-configured */ @@ -951,7 +926,6 @@ AST_STRING_FIELD(fromuser); /*!< User to show in the user field */ AST_STRING_FIELD(fromname); /*!< Name to show in the user field */ AST_STRING_FIELD(tohost); /*!< Host we should put in the "to" field */ - AST_STRING_FIELD(failoverhostname); /*!< Name of the failover peer */ AST_STRING_FIELD(language); /*!< Default language for this call */ AST_STRING_FIELD(mohinterpret); /*!< MOH class to use when put on hold */ AST_STRING_FIELD(mohsuggest); /*!< MOH class to suggest when putting a peer on hold */ @@ -1001,8 +975,6 @@ int sessionid; /*!< SDP Session ID */ int sessionversion; /*!< SDP Session Version */ struct sockaddr_in sa; /*!< Our peer */ - struct sockaddr_in failoveraddr; /*!< Our failover IP address */ - enum failover_state failoverstate; /*!< Failover state for this peer */ struct sockaddr_in redirip; /*!< Where our RTP should be going if not to us */ struct sockaddr_in vredirip; /*!< Where our Video RTP should be going if not to us */ time_t lastrtprx; /*!< Last RTP received */ @@ -1020,6 +992,7 @@ int pendinginvite; /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */ struct sip_request initreq; /*!< Request that opened the latest transaction within this SIP dialog */ + int maxtime; /*!< Max time for first response */ int initid; /*!< Auto-congest ID if appropriate (scheduler) */ int waitid; /*!< Wait ID for scheduler after 491 or other delays */ @@ -1091,8 +1064,7 @@ int amaflags; /*!< AMA flags for billing */ int callingpres; /*!< Calling id presentation */ int capability; /*!< Codec capability */ - int inUse; /*!< Number of inbound calls in use */ - int outUse; /*!< Number of outbound calls in use */ + int inUse; /*!< Number of calls in use */ int call_limit; /*!< Limit of concurrent calls */ enum transfermodes allowtransfer; /*! SIP Refer restriction scheme */ struct ast_ha *ha; /*!< ACL setting */ @@ -1115,7 +1087,6 @@ char accountcode[AST_MAX_ACCOUNT_CODE]; /*!< Account code */ int amaflags; /*!< AMA Flags (for billing) */ char tohost[MAXHOSTNAMELEN]; /*!< If not dynamic, IP address */ - char failoverhostname[MAXHOSTNAMELEN]; /*!< failover host name */ char regexten[AST_MAX_EXTENSION]; /*!< Extension to register (if regcontext is used) */ char fromuser[80]; /*!< From: user when calling this peer */ char fromdomain[MAXHOSTNAMELEN]; /*!< From: domain when calling this peer */ @@ -1123,8 +1094,7 @@ char cid_num[80]; /*!< Caller ID num */ char cid_name[80]; /*!< Caller ID name */ int callingpres; /*!< Calling id presentation */ - int inUse; /*!< Number of inbound calls in use */ - int outUse; /*!< Number of outbound calls in use */ + int inUse; /*!< Number of calls in use */ int inRinging; /*!< Number of calls ringing */ int onHold; /*!< Peer has someone on hold */ int call_limit; /*!< Limit of concurrent calls */ @@ -1148,7 +1118,6 @@ ast_group_t callgroup; /*!< Call group */ ast_group_t pickupgroup; /*!< Pickup group */ struct sockaddr_in addr; /*!< IP address of peer */ - struct sockaddr_in failoveraddr; /*!< IP address of failover peer */ int maxcallbitrate; /*!< Maximum Bitrate for a video call */ /* Qualification */ @@ -1258,7 +1227,6 @@ static int sip_write(struct ast_channel *ast, struct ast_frame *frame); static int sip_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen); static int sip_transfer(struct ast_channel *ast, const char *dest); -static int sip_routeresponse(struct ast_channel *ast, const char *dest, const char *routelist); static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static int sip_senddigit_begin(struct ast_channel *ast, char digit); static int sip_senddigit_end(struct ast_channel *ast, char digit, unsigned int duration); @@ -1324,7 +1292,6 @@ static void *sip_park_thread(void *stuff); static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct sip_request *req, int seqno); static int sip_sipredirect(struct sip_pvt *p, const char *dest); -static int sip_redirect_multiplechoices(struct sip_pvt *p, const char *dest, const char *content); /*--- Codec handling / SDP */ static void try_suggested_sip_codec(struct sip_pvt *p); @@ -1526,7 +1493,7 @@ static const struct sockaddr_in *sip_real_dst(const struct sip_pvt *p); static void build_via(struct sip_pvt *p); static int create_addr_from_peer(struct sip_pvt *r, struct sip_peer *peer); -static int create_addr(struct sip_pvt *dialog, const char *opeer, int failover); +static int create_addr(struct sip_pvt *dialog, const char *opeer); static char *generate_random_string(char *buf, size_t size); static void build_callid_pvt(struct sip_pvt *pvt); static void build_callid_registry(struct sip_registry *reg, struct in_addr ourip, const char *fromdomain); @@ -1597,7 +1564,6 @@ .write_video = sip_write, .indicate = sip_indicate, .transfer = sip_transfer, - .routeresponse = sip_routeresponse, .fixup = sip_fixup, .send_digit_begin = sip_senddigit_begin, .send_digit_end = sip_senddigit_end, @@ -1624,7 +1590,6 @@ .write_video = sip_write, .indicate = sip_indicate, .transfer = sip_transfer, - .routeresponse = sip_routeresponse, .fixup = sip_fixup, .send_digit_end = sip_senddigit_end, .bridge = ast_rtp_bridge, @@ -1800,28 +1765,11 @@ return sip_debug_test_addr(sip_real_dst(p)); } -/*! \brief Append to SIP dialog history - \return Always returns 0 */ -#define append_history(p, event, fmt , args... ) append_history_full(p, "%-15s " fmt, event, ## args) - - -/*! \brief Transmit SIP message - - Sends message on socket. If transmit fails, reports an error. If there's a failover peer - defined in dialog, switches to failover peer. -*/ +/*! \brief Transmit SIP message */ static int __sip_xmit(struct sip_pvt *p, char *data, int len) { int res; - const struct sockaddr_in *dst = p->failoverstate == ACTIVE ? &p->failoveraddr : sip_real_dst(p); - - /* If we haven't resolved the failover hostname, we need to do that now */ - if (p->failoverstate == ACTIVE && !p->failoveraddr.sin_addr.s_addr) { - create_addr(p, p->failoverhostname, TRUE); /* Resolve to IP address */ - } - if (option_debug > 2 && p->failoverstate == ACTIVE) - ast_log(LOG_DEBUG, "FAILOVER :: Using failover IP %s\n", ast_inet_ntoa(p->failoveraddr.sin_addr)); - + const struct sockaddr_in *dst = sip_real_dst(p); res = sendto(sipsock, data, len, 0, (const struct sockaddr *)dst, sizeof(struct sockaddr_in)); if (res == -1) { @@ -1832,16 +1780,6 @@ case ENETUNREACH: /* Network failure */ res = XMIT_ERROR; /* Don't bother with trying to transmit again */ } - if (p->failoverstate == STANDBY) { /* Time to switch to failover mode for this dialog */ - p->failoverstate = ACTIVE; - if (!p->failoveraddr.sin_addr.s_addr) - create_addr(p, p->failoverhostname, TRUE); /* Resolve to IP address */ - if (option_debug > 2) - ast_log(LOG_DEBUG, "FAILOVER:: Switching to failover peer for this dialog :: %s\n", p->callid); - append_history(p, "FailOver", "Activated failover peer for non-responsive peer %s", p->tohost); - return __sip_xmit(p, data, len); - } - } if (res != len) ast_log(LOG_WARNING, "sip_xmit of %p (len %d) to %s:%d returned %d: %s\n", data, len, ast_inet_ntoa(dst->sin_addr), ntohs(dst->sin_port), res, strerror(errno)); @@ -1898,6 +1836,10 @@ return AST_SUCCESS; } +/*! \brief Append to SIP dialog history + \return Always returns 0 */ +#define append_history(p, event, fmt , args... ) append_history_full(p, "%-15s " fmt, event, ## args) + static void append_history_full(struct sip_pvt *p, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); @@ -1986,12 +1928,10 @@ if (sip_debug_test_pvt(pkt->owner)) { const struct sockaddr_in *dst = sip_real_dst(pkt->owner); - ast_verbose("Retransmitting #%d (%s) to %s%s:%d:\n%s\n---\n", + ast_verbose("Retransmitting #%d (%s) to %s:%d:\n%s\n---\n", pkt->retrans, sip_nat_mode(pkt->owner), - pkt->owner->failoverstate == ACTIVE ? "failover peer " : "", - pkt->owner->failoverstate == ACTIVE ? ast_inet_ntoa(pkt->owner->failoveraddr.sin_addr) : ast_inet_ntoa(dst->sin_addr), - pkt->owner->failoverstate == ACTIVE ? ntohs(pkt->owner->failoveraddr.sin_port) : ntohs(dst->sin_port), - pkt->data); + ast_inet_ntoa(dst->sin_addr), + ntohs(dst->sin_port), pkt->data); } append_history(pkt->owner, "ReTx", "%d %s", reschedule, pkt->data); @@ -2015,18 +1955,6 @@ } else append_history(pkt->owner, "MaxRetries", "%s", (ast_test_flag(pkt, FLAG_FATAL)) ? "(Critical)" : "(Non-critical)"); - - if (pkt->method != SIP_OPTIONS && pkt->owner->failoverstate == STANDBY) { - pkt->owner->failoverstate = ACTIVE; /* Switching dialog to failover active mode */ - append_history(pkt->owner, "FailOver", "Failover SIP host activated."); - pkt->retrans = 0; - pkt->timer_a = 2 ; - ast_mutex_unlock(&pkt->owner->lock); - if (option_debug > 2) - ast_log(LOG_DEBUG, "FAILOVER :: Switching to failover peer due to retransmits\n"); - return 100; /* Restart with failover peer after 100 ms */ - } - pkt->retransid = -1; if (ast_test_flag(pkt, FLAG_FATAL)) { @@ -2036,7 +1964,6 @@ ast_mutex_lock(&pkt->owner->lock); } - if (pkt->owner->owner && !pkt->owner->owner->hangupcause) pkt->owner->owner->hangupcause = AST_CAUSE_NO_USER_RESPONSE; @@ -2169,7 +2096,7 @@ ast_log(LOG_DEBUG, "Auto destroying SIP dialog '%s'\n", p->callid); append_history(p, "AutoDestroy", "%s", p->callid); if (p->owner) { - /* ast_log(LOG_WARNING, "Autodestruct on dialog '%s' with owner in place (Method: %s)\n", p->callid, sip_methods[p->method].text); */ + ast_log(LOG_WARNING, "Autodestruct on dialog '%s' with owner in place (Method: %s)\n", p->callid, sip_methods[p->method].text); ast_queue_hangup(p->owner); } else if (p->refer) { if (option_debug > 2) @@ -2339,13 +2266,10 @@ if (sip_debug_test_pvt(p)) { const struct sockaddr_in *dst = sip_real_dst(p); - ast_verbose("\n<--- %sTransmitting (%s) to %s%s:%d --->\n%s\n<------------>\n", + ast_verbose("\n<--- %sTransmitting (%s) to %s:%d --->\n%s\n<------------>\n", reliable ? "Reliably " : "", sip_nat_mode(p), - p->failoverstate == ACTIVE ? "failover peer " : "", - p->failoverstate == ACTIVE ? ast_inet_ntoa(p->failoveraddr.sin_addr) : ast_inet_ntoa(dst->sin_addr), - p->failoverstate == ACTIVE ? ntohs(p->failoveraddr.sin_port) : ntohs(dst->sin_port), - req->data); - + ast_inet_ntoa(dst->sin_addr), + ntohs(dst->sin_port), req->data); } if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) { struct sip_request tmp; @@ -2368,16 +2292,10 @@ add_blank(req); if (sip_debug_test_pvt(p)) { - struct sockaddr_in *toaddr = ast_test_flag(&p->flags[0], SIP_NAT_ROUTE) ? &p->recv : &p->sa; - char *natstate = ""; - if (p->failoverstate == ACTIVE) - toaddr = &p->failoveraddr; - if (ast_test_flag(&p->flags[0], SIP_NAT_ROUTE)) - natstate = "(NAT)"; - ast_verbose("\n---> %sTransmitting %s to %s%s:%d:\n%s\n---\n", reliable ? "Reliably " : "", natstate, - p->failoverstate == ACTIVE ? "failover peer " : "", - ast_inet_ntoa(toaddr->sin_addr), ntohs(toaddr->sin_port), req->data); + ast_verbose("%sTransmitting (NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(p->recv.sin_addr), ntohs(p->recv.sin_port), req->data); + else + ast_verbose("%sTransmitting (no NAT) to %s:%d:\n%s\n---\n", reliable ? "Reliably " : "", ast_inet_ntoa(p->sa.sin_addr), ntohs(p->sa.sin_port), req->data); } if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) { struct sip_request tmp; @@ -2863,18 +2781,8 @@ (!peer->maxms || ((peer->lastms >= 0) && (peer->lastms <= peer->maxms)))) { dialog->sa = (peer->addr.sin_addr.s_addr) ? peer->addr : peer->defaddr; dialog->recv = dialog->sa; - } else if (peer->failoveraddr.sin_addr.s_addr || !ast_strlen_zero(peer->failoverhostname)) { - /* There's a problem with the primary peer (unreachable) and we do have a failver - peer definition. Activate that at the start of the dialog */ - if (!peer->failoveraddr.sin_addr.s_addr) { - create_addr(dialog, peer->failoverhostname, TRUE); - } - dialog->failoverstate = ACTIVE; - } else { + } else return -1; - } - - dialog->failoveraddr = peer->failoveraddr; ast_copy_flags(&dialog->flags[0], &peer->flags[0], SIP_FLAGS_TO_COPY); ast_copy_flags(&dialog->flags[1], &peer->flags[1], SIP_PAGE2_FLAGS_TO_COPY); @@ -2930,7 +2838,6 @@ ast_string_field_set(dialog, mohsuggest, peer->mohsuggest); ast_string_field_set(dialog, mohinterpret, peer->mohinterpret); ast_string_field_set(dialog, tohost, peer->tohost); - ast_string_field_set(dialog, failoverhostname, peer->failoverhostname); ast_string_field_set(dialog, fullcontact, peer->fullcontact); if (!dialog->initreq.headers && !ast_strlen_zero(peer->fromdomain)) { char *tmpcall; @@ -2942,8 +2849,8 @@ ast_string_field_build(dialog, callid, "%s@%s", tmpcall, peer->fromdomain); } } - if (ast_strlen_zero(dialog->failoverhostname)) - ast_string_field_set(dialog, failoverhostname, ast_inet_ntoa(dialog->failoveraddr.sin_addr)); + if (ast_strlen_zero(dialog->tohost)) + ast_string_field_set(dialog, tohost, ast_inet_ntoa(dialog->sa.sin_addr)); if (!ast_strlen_zero(peer->fromdomain)) ast_string_field_set(dialog, fromdomain, peer->fromdomain); if (!ast_strlen_zero(peer->fromuser)) @@ -2969,17 +2876,14 @@ if (peer->call_limit) ast_set_flag(&dialog->flags[0], SIP_CALL_LIMIT); dialog->maxcallbitrate = peer->maxcallbitrate; - if (!ast_strlen_zero(dialog->failoverhostname)) - dialog->failoverstate = STANDBY; return 0; } /*! \brief create address structure from peer name * Or, if peer not found, find it in the global DNS - * if failover is TRUE, the failover peer is configured, not the default peer * returns TRUE (-1) on failure, FALSE on success */ -static int create_addr(struct sip_pvt *dialog, const char *opeer, int failover) +static int create_addr(struct sip_pvt *dialog, const char *opeer) { struct hostent *hp; struct ast_hostent ahp; @@ -2988,36 +2892,17 @@ int portno; char host[MAXHOSTNAMELEN], *hostn; char peer[256]; - struct sockaddr_in *peersock = failover ? &dialog->failoveraddr : &dialog->sa; - - if (failover) { - append_history(dialog, "FailOver", "Looking up failover peer %s for used peer %s", opeer, dialog->tohost); - if (option_debug > 2) - ast_log(LOG_DEBUG, "FAILOVER :: Looking up failover peer %s\n", opeer); - } ast_copy_string(peer, opeer, sizeof(peer)); port = strchr(peer, ':'); if (port) *port++ = '\0'; - peersock->sin_family = AF_INET; - if (!failover) { - dialog->timer_t1 = 500; /* Default SIP retransmission timer T1 (RFC 3261) */ - } - + dialog->sa.sin_family = AF_INET; + dialog->timer_t1 = 500; /* Default SIP retransmission timer T1 (RFC 3261) */ p = find_peer(peer, NULL, 1); if (p) { - int res; - - if (failover) { - /* Avoid recursion if we're looking for a failover peer, so just take the address */ - dialog->failoveraddr = (p->addr.sin_addr.s_addr) ? p->addr : p->defaddr; - p->failoveraddr = dialog->failoveraddr; /* save it for next time */ - return 0; - } - - res = create_addr_from_peer(dialog, p); + int res = create_addr_from_peer(dialog, p); ASTOBJ_UNREF(p, sip_destroy_peer); return res; } @@ -3037,23 +2922,13 @@ } hp = ast_gethostbyname(hostn, &ahp); if (!hp) { - ast_log(LOG_WARNING, "No such %s host: %s\n", failover? "failover" : "", peer); + ast_log(LOG_WARNING, "No such host: %s\n", peer); return -1; } - //peersock->sin_addr = hp->h_addr; - memcpy(&peersock->sin_addr, hp->h_addr, sizeof(peersock->sin_addr)); - peersock->sin_port = htons(portno); - - if (!failover) { - /* This is potentially a bug, replacing the original hostname with the result of the DNS lookup - We should separate these. - */ - ast_string_field_set(dialog, tohost, peer); - dialog->recv = dialog->sa; - } else { - if (option_debug > 2) - ast_log(LOG_DEBUG, "FAILOVER :: Found IP address %s\n", ast_inet_ntoa(peersock->sin_addr)); - } + ast_string_field_set(dialog, tohost, peer); + memcpy(&dialog->sa.sin_addr, hp->h_addr, sizeof(dialog->sa.sin_addr)); + dialog->sa.sin_port = htons(portno); + dialog->recv = dialog->sa; return 0; } @@ -3142,13 +3017,6 @@ if (option_debug) ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username); - - /* tell the A-leg the call id */ - if(ast->bridge_channel) { - ast_log(LOG_DEBUG, "Setting DIALEDCALLID variable to %s\n", p->callid); - pbx_builtin_setvar_helper(ast->bridge_channel, "DIALEDCALLID", p->callid); - } - res = update_call_counter(p, INC_CALL_RINGING); if ( res != -1 ) { p->callingpres = ast->cid.cid_pres; @@ -3328,7 +3196,7 @@ static int update_call_counter(struct sip_pvt *fup, int event) { char name[256]; - int *inuse = NULL, *call_limit = NULL, *inringing = NULL, *outuse = NULL; + int *inuse = NULL, *call_limit = NULL, *inringing = NULL; int outgoing = ast_test_flag(&fup->flags[1], SIP_PAGE2_OUTGOING_CALL); struct sip_user *u = NULL; struct sip_peer *p = NULL; @@ -3346,12 +3214,10 @@ /* Check the list of users only for incoming calls */ if (global_limitonpeers == FALSE && !outgoing && (u = find_user(name, 1))) { inuse = &u->inUse; - outuse = &u->outUse; call_limit = &u->call_limit; inringing = NULL; } else if ( (p = find_peer(ast_strlen_zero(fup->peername) ? name : fup->peername, NULL, 1) ) ) { /* Try to find peer */ inuse = &p->inUse; - outuse = &p->outUse; call_limit = &p->call_limit; inringing = &p->inRinging; ast_copy_string(name, fup->peername, sizeof(name)); @@ -3364,8 +3230,6 @@ switch(event) { /* incoming and outgoing affects the inUse counter */ - /* REPLACING WITH MY CALL COUNTER INSTEAD OF THE DEFAULT ONE */ - /* case DEC_CALL_LIMIT: if ( *inuse > 0 ) { if (ast_test_flag(&fup->flags[0], SIP_INC_COUNT)) { @@ -3392,65 +3256,8 @@ ast_log(LOG_DEBUG, "Call %s %s '%s' removed from call limit %d\n", outgoing ? "to" : "from", u ? "user":"peer", name, *call_limit); } break; - case INC_CALL_RINGING: - */ - case DEC_CALL_LIMIT: - if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) { - if ( *outuse > 0 ) { - if (ast_test_flag(&fup->flags[0], SIP_INC_COUNT)) { - (*outuse)--; - ast_clear_flag(&fup->flags[0], SIP_INC_COUNT); - } - } else { - *outuse = 0; - } - if (option_debug > 1 || sipdebug) { - ast_log(LOG_DEBUG, "Call %s %s '%s' removed from outbound call counter %d\n", outgoing ? "to" : "from", u ? "user":"peer", name, *outuse); - } - } - else { - if ( *inuse > 0 ) { - if (ast_test_flag(&fup->flags[0], SIP_INC_COUNT)) { - (*inuse)--; - ast_clear_flag(&fup->flags[0], SIP_INC_COUNT); - } - } else { - *inuse = 0; - } - if (inringing) { - if (ast_test_flag(&fup->flags[1], SIP_PAGE2_INC_RINGING)) { - if (*inringing > 0) - (*inringing)--; - else if (!ast_test_flag(&fup->flags[0], SIP_REALTIME) || ast_test_flag(&fup->flags[1], SIP_PAGE2_RTCACHEFRIENDS)) - ast_log(LOG_WARNING, "Inringing for peer '%s' < 0?\n", fup->peername); - ast_clear_flag(&fup->flags[1], SIP_PAGE2_INC_RINGING); - } - } - if (ast_test_flag(&fup->flags[1], SIP_PAGE2_CALL_ONHOLD) && global_notifyhold) { - ast_clear_flag(&fup->flags[1], SIP_PAGE2_CALL_ONHOLD); - sip_peer_hold(fup, 0); - } - if (option_debug > 1 || sipdebug) { - ast_log(LOG_DEBUG, "Call %s %s '%s' removed from inbound call limit %d\n", outgoing ? "to" : "from", u ? "user":"peer", name, *call_limit); - } - } - break; - - case INC_CALL_RINGING: - if (inringing && (event == INC_CALL_RINGING)) { - if (!ast_test_flag(&fup->flags[1], SIP_PAGE2_INC_RINGING)) { - (*inringing)++; - ast_set_flag(&fup->flags[1], SIP_PAGE2_INC_RINGING); - } - } - /* Continue */ - (*outuse)++; - ast_set_flag(&fup->flags[0], SIP_INC_COUNT); - if (option_debug > 1 || sipdebug) { - ast_log(LOG_DEBUG, "Call %s %s '%s' is %d out of %d\n", outgoing ? "to" : "from", u ? "user":"peer", name, *outuse, *call_limit); - } - break; + case INC_CALL_RINGING: case INC_CALL_LIMIT: if (*call_limit > 0 ) { if (*inuse >= *call_limit) { @@ -3646,7 +3453,6 @@ return "484 Address incomplete"; case AST_CAUSE_USER_BUSY: return "486 Busy here"; - case AST_CAUSE_NORMAL_TEMPORARY_FAILURE: /* 41 */ case AST_CAUSE_FAILURE: return "500 Server internal failure"; case AST_CAUSE_FACILITY_REJECTED: /* 29 */ @@ -4049,23 +3855,6 @@ return res; } -/*! \brief Respond to a Route Request SIP INVITE */ -static int sip_routeresponse(struct ast_channel *ast, const char *dest, const char *routelist) -{ - struct sip_pvt *p = ast->tech_pvt; - int res; - - if(!routelist) /* functions below do not take a NULL */ - routelist = ""; - - if (!dest) /* functions below do not take a NULL */ - dest = ""; - ast_mutex_lock(&p->lock); - res = sip_redirect_multiplechoices(p, dest, routelist); - ast_mutex_unlock(&p->lock); - return res; -} - /*! \brief Transfer SIP call */ static int sip_transfer(struct ast_channel *ast, const char *dest) { @@ -4462,7 +4251,7 @@ */ for (pass = 0; name && pass < 2;pass++) { int x, len = strlen(name); - for (x=*start; xheaders && req->header[x]; x++) { + for (x=*start; xheaders; x++) { if (!strncasecmp(req->header[x], name, len)) { char *r = req->header[x] + len; /* skip name */ if (pedanticsipchecking) @@ -6222,19 +6011,13 @@ { struct sip_request resp; int seqno = 0; - const char *clheader; if (reliable && (sscanf(get_header(req, "CSeq"), "%d ", &seqno) != 1)) { ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq")); return -1; } respprep(&resp, p, msg, req); - - // if this - clheader = get_header(req, "Content-Length"); - if (!clheader[0]) { - add_header_contentLength(&resp, 0); - } + add_header_contentLength(&resp, 0); /* If we are cancelling an incoming invite for some reason, add information about the reason why we are doing this in clear text */ if (p->method == SIP_INVITE && msg[0] != '1' && p->owner && p->owner->hangupcause) { @@ -6313,18 +6096,6 @@ return __transmit_response(p, msg, req, XMIT_UNRELIABLE); } -/*! \brief Transmit response, with routedata */ -static int transmit_response_with_routedata(struct sip_pvt *p, const char *msg, const struct sip_request *req, const char *routedata) -{ - struct sip_request resp; - respprep(&resp, p, msg, req); - append_date(&resp); - add_header(&resp, "Content-Type", "text/plain"); - add_header_contentLength(&resp, strlen(routedata)); - add_line(&resp, routedata); - return send_response(p, &resp, XMIT_CRITICAL, 1); -} - /*! \brief Transmit response, no retransmits */ static int transmit_response_with_unsupported(struct sip_pvt *p, const char *msg, const struct sip_request *req, const char *unsupported) { @@ -7788,7 +7559,7 @@ if (!ast_test_flag(&p->flags[0], SIP_NO_HISTORY)) append_history(p, "RegistryInit", "Account: %s@%s", r->username, r->hostname); /* Find address to hostname */ - if (create_addr(p, r->hostname, FALSE)) { + if (create_addr(p, r->hostname)) { /* we have what we hope is a temporary network error, * probably DNS. We need to reschedule a registration try */ sip_destroy(p); @@ -9771,12 +9542,6 @@ ast_string_field_set(p, subscribecontext, peer->subscribecontext); ast_string_field_set(p, mohinterpret, peer->mohinterpret); ast_string_field_set(p, mohsuggest, peer->mohsuggest); - - /* If we have a failover peer, activate it */ - if (!ast_strlen_zero(peer->failoverhostname)) { - ast_string_field_set(p, failoverhostname, peer->failoverhostname); - p->failoverstate = STANDBY; - } if (peer->callingpres) /* Peer calling pres setting will override RPID */ p->callingpres = peer->callingpres; if (peer->maxms && peer->lastms) @@ -10672,14 +10437,8 @@ /* - is enumerated */ ast_cli(fd, " DTMFmode : %s\n", dtmfmode2str(ast_test_flag(&peer->flags[0], SIP_DTMF))); ast_cli(fd, " LastMsg : %d\n", peer->lastmsg); - ast_cli(fd, " Remote Host : %s\n", peer->tohost); - ast_cli(fd, " Remote IP : %s Port %d\n", peer->addr.sin_addr.s_addr ? ast_inet_ntoa(peer->addr.sin_addr) : "(Unspecified)", ntohs(peer->addr.sin_port)); - if (!ast_strlen_zero(peer->failoverhostname)) { - ast_cli(fd, " Failover Host: %s\n", peer->failoverhostname); - ast_cli(fd, " Failover IP : %s Port %d\n", peer->failoveraddr.sin_addr.s_addr ? ast_inet_ntoa(peer->failoveraddr.sin_addr) : "(Unspecified)", ntohs(peer->failoveraddr.sin_port)); - } else { - ast_cli(fd, " Failover Host: Disabled\n"); - } + ast_cli(fd, " ToHost : %s\n", peer->tohost); + ast_cli(fd, " Addr->IP : %s Port %d\n", peer->addr.sin_addr.s_addr ? ast_inet_ntoa(peer->addr.sin_addr) : "(Unspecified)", ntohs(peer->addr.sin_port)); ast_cli(fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port)); if (!ast_strlen_zero(global_regcontext)) ast_cli(fd, " Reg. exten : %s\n", peer->regexten); @@ -10760,8 +10519,6 @@ astman_append(s, "SIPLastMsg: %d\r\n", peer->lastmsg); astman_append(s, "ToHost: %s\r\n", peer->tohost); astman_append(s, "Address-IP: %s\r\nAddress-Port: %d\r\n", peer->addr.sin_addr.s_addr ? ast_inet_ntoa(peer->addr.sin_addr) : "", ntohs(peer->addr.sin_port)); - astman_append(s, "FailoverHostName: %s\r\n", peer->failoverhostname); - astman_append(s, "FailoverAddress-IP: %s\r\nAddress-Port: %d\r\n", peer->failoveraddr.sin_addr.s_addr ? ast_inet_ntoa(peer->failoveraddr.sin_addr) : "", ntohs(peer->failoveraddr.sin_port)); astman_append(s, "Default-addr-IP: %s\r\nDefault-addr-port: %d\r\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port)); astman_append(s, "Default-Username: %s\r\n", peer->username); if (!ast_strlen_zero(global_regcontext)) @@ -11593,7 +11350,7 @@ return RESULT_FAILURE; } - if (create_addr(p, argv[i], FALSE)) { + if (create_addr(p, argv[i])) { /* Maybe they're not registered, etc. */ sip_destroy(p); ast_cli(fd, "Could not create address for '%s'\n", argv[i]); @@ -14171,7 +13928,7 @@ if ((res = update_call_counter(p, INC_CALL_LIMIT))) { if (res < 0) { ast_log(LOG_NOTICE, "Failed to place call for user %s, too many calls\n", p->username); - transmit_response_reliable(p, "503 Service Unavailable (Call limit) ", req); + transmit_response_reliable(p, "480 Temporarily Unavailable (Call limit) ", req); sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); p->invitestate = INV_COMPLETED; } @@ -14268,9 +14025,9 @@ ast_log(LOG_WARNING, "Failed to start PBX (call limit reached) \n"); p->invitestate = INV_COMPLETED; if (ast_test_flag(req, SIP_PKT_IGNORE)) - transmit_response(p, "503 Service Unavailable", req); + transmit_response(p, "480 Temporarily Unavailable", req); else - transmit_response_reliable(p, "503 Service Unavailable", req); + transmit_response_reliable(p, "480 Temporarily Unavailable", req); break; case AST_PBX_SUCCESS: /* nothing to do */ @@ -15936,8 +15693,8 @@ ast_mutex_lock(&monlock); if (res >= 0) { res = ast_sched_runq(sched); - /* if (option_debug && res >= 20) */ - /* ast_log(LOG_DEBUG, "chan_sip: ast_sched_runq ran %d all at once\n", res); */ + if (option_debug && res >= 20) + ast_log(LOG_DEBUG, "chan_sip: ast_sched_runq ran %d all at once\n", res); } /* Send MWI notifications to peers - static and cached realtime peers */ @@ -15998,49 +15755,18 @@ ast_mutex_unlock(&monlock); return 0; } - -/*! \brief Activate failover state for all calls - when peer becomes unreachable - - This is advisory only, so if we can't lock a dialog, let's - just skip it and move on. The dialog will failover when xmit fails. -*/ -static void device_failover_calls(struct sip_peer *device) -{ - struct sip_pvt *dialog; - int dialogs = 0; - - ast_mutex_lock(&iflock); - for (dialog = iflist; dialog; dialog = dialog->next) { - if (strcmp(device->tohost, dialog->tohost)) - continue; - /* If dialog is locked for some reason, don't deadlock, just continue */ - if (ast_mutex_trylock(&dialog->lock)) - continue; - dialogs++; - dialog->failoverstate = ACTIVE; - append_history(dialog, "FailOver", "Activated failover peer for unreachable peer %s :: %s", device->name, device->tohost); - ast_mutex_unlock(&dialog->lock); - if (dialogs == device->inUse) - break; /* We've found all, let's release the iflock quickly */ - } - if (option_debug > 2) - ast_log(LOG_DEBUG, "FAILOVER :: Activated failover for %d dialogs. Unreachable peer has %d active calls\n", dialogs, device->inUse); - ast_mutex_unlock(&iflock); -} /*! \brief React to lack of answer to Qualify poke */ static int sip_poke_noanswer(const void *data) { struct sip_peer *peer = (struct sip_peer *)data; - AST_SCHED_DEL(sched, peer->pokeexpire); peer->pokeexpire = -1; if (peer->lastms > -1) { ast_log(LOG_NOTICE, "Peer '%s' is now UNREACHABLE! Last qualify: %d\n", peer->name, peer->lastms); manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "Peer: SIP/%s\r\nPeerStatus: Unreachable\r\nTime: %d\r\n", peer->name, -1); } - if (peer->call) /* Delete the NOTIFY operation */ + if (peer->call) sip_destroy(peer->call); peer->call = NULL; peer->lastms = -1; @@ -16048,9 +15774,6 @@ /* Try again quickly */ AST_SCHED_DEL(sched, peer->pokeexpire); peer->pokeexpire = ast_sched_add(sched, DEFAULT_FREQ_NOTOK, sip_poke_peer_s, peer); - if (!ast_strlen_zero(peer->failoverhostname) && peer->inUse) - /* We have a failover solution and active calls for this peer */ - device_failover_calls(peer); return 0; } @@ -16266,7 +15989,7 @@ host = tmp; } - if (create_addr(p, host, FALSE)) { + if (create_addr(p, host)) { *cause = AST_CAUSE_UNREGISTERED; if (option_debug > 2) ast_log(LOG_DEBUG, "Cant create SIP call - target device not registred\n"); @@ -16894,12 +16617,6 @@ ast_set2_flag(&peer->flags[0], ast_true(v->value), SIP_USEREQPHONE); } else if (!strcasecmp(v->name, "fromuser")) { ast_copy_string(peer->fromuser, v->value, sizeof(peer->fromuser)); - } else if (!strcasecmp(v->name, "failoverhostport")) { - peer->failoveraddr.sin_port = htons(atoi(v->value)); - } else if (!strcasecmp(v->name, "failoverhost")) { - ast_copy_string(peer->failoverhostname, v->value, sizeof(peer->failoverhostname)); - if (!peer->failoveraddr.sin_port) - peer->failoveraddr.sin_port = htons(STANDARD_SIP_PORT); } else if (!strcasecmp(v->name, "host") || !strcasecmp(v->name, "outboundproxy")) { if (!strcasecmp(v->value, "dynamic")) { if (!strcasecmp(v->name, "outboundproxy") || obproxyfound) { @@ -17081,9 +16798,6 @@ cfg = ast_config_load(config); - pbx_builtin_setvar_helper(NULL, "ast_config_dir", AST_CONFIG_DIR); - // setenv("ast_config_dir", AST_CONFIG_DIR,1); - /* We *must* have a config file otherwise stop immediately */ if (!cfg) { ast_log(LOG_NOTICE, "Unable to load config %s\n", config); @@ -18080,29 +17794,6 @@ return 0; } - -/*! \brief Redirect call connect with a 300 multiple choices redirect -\note Called by the routeresponse() dialplan application through the sip_routeresponse() - pbx interface function - */ -static int sip_redirect_multiplechoices(struct sip_pvt *p, const char *dest, const char *content) -{ - /* we'll issue the redirect message here */ - /* Got to check for "verazcompatibility" and create contact headers here */ - - if (!p->uri) { - ast_log(LOG_ERROR, "Cannot retrieve the Request URI from the original SIP request!\n"); - return 0; - } else { - ast_log(LOG_DEBUG, "The SIP Request URI [%s]\n", p->uri); - } - - transmit_response_with_routedata(p, "300 Multiple choices", &p->initreq, content); - sip_scheddestroy(p, 10); /* Make sure we stop send this reply. */ - sip_alreadygone(p); - return 0; -} - /*! \brief Return SIP UA's codec (part of the RTP interface) */ static int sip_get_codec(struct ast_channel *chan) {