Index: channels/chan_iax2.c =================================================================== --- channels/chan_iax2.c (revision 160296) +++ channels/chan_iax2.c (working copy) @@ -2139,6 +2139,7 @@ return res; } +__attribute__((warn_unused_result)) static int send_packet(struct iax_frame *f) { int res; @@ -2259,16 +2260,22 @@ /* Update it if it needs it */ update_packet(f); /* Attempt transmission */ - send_packet(f); - f->retries++; - /* Try again later after 10 times as long */ - f->retrytime *= 10; - if (f->retrytime > MAX_RETRY_TIME) - f->retrytime = MAX_RETRY_TIME; - /* Transfer messages max out at one second */ - if (f->transfer && (f->retrytime > 1000)) - f->retrytime = 1000; - f->retrans = iax2_sched_add(sched, f->retrytime, attempt_transmit, f); + if (send_packet(f) < 0) { + ast_log(LOG_ERROR, "Could not send packet (frametype %d, subclass %d) for call %d because '%s'.\n", f->af.frametype, f->af.subclass, f->callno, strerror(iaxs[f->callno]->error)); + ast_log(LOG_WARNING, "Cancelling packet\n"); + f->retries = -1; + freeme++; + } else { + f->retries++; + /* Try again later after 10 times as long */ + f->retrytime *= 10; + if (f->retrytime > MAX_RETRY_TIME) + f->retrytime = MAX_RETRY_TIME; + /* Transfer messages max out at one second */ + if (f->transfer && (f->retrytime > 1000)) + f->retrytime = 1000; + f->retrans = iax2_sched_add(sched, f->retrytime, attempt_transmit, f); + } } } else { /* Make sure it gets freed */ @@ -6562,7 +6569,9 @@ if ((f->callno == callno) && iaxs[f->callno] && ((unsigned char ) (f->oseqno - last) < 128) && (f->retries >= 0)) { - send_packet(f); + if (send_packet(f)) { + ast_log(LOG_ERROR, "Could not send packet (frametype %d/subclass %d) for call %d because '%s'.\n", f->af.frametype, f->af.subclass, callno, callno && iaxs[callno] ? strerror(iaxs[callno]->error) : "call does not exist"); + } } } AST_LIST_UNLOCK(&iaxq.queue); @@ -9202,7 +9211,11 @@ f->sentyet++; if (iaxs[f->callno]) { - send_packet(f); + if (send_packet(f)) { + ast_log(LOG_ERROR, "Could not send packet (frametype %d, subclass %d) for call %d because '%s'.\n", f->af.frametype, f->af.subclass, f->callno, strerror(iaxs[f->callno]->error)); + ast_log(LOG_WARNING, "Cancelling retransmit\n"); + f->retries = -1; + } count++; }