[asterisk-commits] oej: branch oej/darjeeling-prack-1.8 r369790 - /team/oej/darjeeling-prack-1.8...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Jul 9 06:24:31 CDT 2012


Author: oej
Date: Mon Jul  9 06:24:29 2012
New Revision: 369790

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=369790
Log:
Update patch.

Modified:
    team/oej/darjeeling-prack-1.8/patches/darjeeling-prack-1.8.diff

Modified: team/oej/darjeeling-prack-1.8/patches/darjeeling-prack-1.8.diff
URL: http://svnview.digium.com/svn/asterisk/team/oej/darjeeling-prack-1.8/patches/darjeeling-prack-1.8.diff?view=diff&rev=369790&r1=369789&r2=369790
==============================================================================
--- team/oej/darjeeling-prack-1.8/patches/darjeeling-prack-1.8.diff (original)
+++ team/oej/darjeeling-prack-1.8/patches/darjeeling-prack-1.8.diff Mon Jul  9 06:24:29 2012
@@ -1,7 +1,7 @@
 Index: channels/chan_sip.c
 ===================================================================
---- channels/chan_sip.c	(.../branches/1.8)	(revision 369624)
-+++ channels/chan_sip.c	(.../team/oej/darjeeling-prack-1.8)	(revision 369624)
+--- channels/chan_sip.c	(.../branches/1.8)	(revision 369789)
++++ channels/chan_sip.c	(.../team/oej/darjeeling-prack-1.8)	(revision 369789)
 @@ -1242,10 +1242,10 @@
  static int __transmit_response(struct sip_pvt *p, const char *msg, const struct sip_request *req, enum xmittype reliable);
  static int retrans_pkt(const void *data);
@@ -66,7 +66,7 @@
  	}
 -	ast_debug(1, "Stopping retransmission on '%s' of %s %u: Match %s\n",
 -		p->callid, resp ? "Response" : "Request", seqno, msg);
-+	ast_debug(1, "Stopping retransmission on '%s' of %s %u: Match %s Rseq %d\n",
++	ast_debug(1, "Stopping retransmission on '%s' of %s %u: Match %s Rseq %u\n",
 +		p->callid, resp ? "Response" : "Request", seqno, msg, rseqno);
  	return res;
  }
@@ -144,6 +144,15 @@
  	finalize_content(req);
  	add_blank(req);
  	if (sip_debug_test_pvt(p)) {
+@@ -4187,7 +4248,7 @@
+ 	}
+ 
+ 	res = (reliable) ?
+-		 __sip_reliable_xmit(p, seqno, 1, req->data, (reliable == XMIT_CRITICAL), req->method) :
++		 __sip_reliable_xmit(p, seqno, 1, req->data, (reliable == XMIT_CRITICAL || reliable == XMIT_PRACK), req->method) :
+ 		__sip_xmit(p, req->data);
+ 	deinit_req(req);
+ 	if (res > 0) {
 @@ -6485,7 +6546,13 @@
  	struct sip_pvt *p = ast->tech_pvt;
  
@@ -159,7 +168,7 @@
  		try_suggested_sip_codec(p);	
  
  		ast_setstate(ast, AST_STATE_UP);
-@@ -9871,13 +9938,15 @@
+@@ -9873,13 +9940,15 @@
   *  is supported for this dialog. */
  static int add_supported_header(struct sip_pvt *pvt, struct sip_request *req)
  {
@@ -180,7 +189,7 @@
  }
  
  /*! \brief Add header to SIP message */
-@@ -10313,6 +10382,7 @@
+@@ -10315,6 +10384,7 @@
  		snprintf(se_hdr, sizeof(se_hdr), "%d;refresher=%s", p->stimer->st_interval,
  			strefresher2str(p->stimer->st_ref));
  		add_header(resp, "Session-Expires", se_hdr);
@@ -188,7 +197,7 @@
  	}
  
  	if (msg[0] == '2' && (p->method == SIP_SUBSCRIBE || p->method == SIP_REGISTER)) {
-@@ -10497,8 +10567,10 @@
+@@ -10499,8 +10569,10 @@
  {
  	struct sip_request resp;
  	uint32_t seqno = 0;
@@ -200,7 +209,7 @@
  		ast_log(LOG_WARNING, "Unable to determine sequence number from '%s'\n", get_header(req, "CSeq"));
  		return -1;
  	}
-@@ -10510,6 +10582,10 @@
+@@ -10512,6 +10584,10 @@
  		ast_clear_flag(&p->flags[1], SIP_PAGE2_CONNECTLINEUPDATE_PEND);
  		add_rpid(&resp, p);
  	}
@@ -211,7 +220,7 @@
  	if (ast_test_flag(&p->flags[0], SIP_OFFER_CC)) {
  		add_cc_call_info_to_response(p, &resp);
  	}
-@@ -10549,6 +10625,10 @@
+@@ -10551,6 +10627,10 @@
  			add_header(&resp, "X-Asterisk-HangupCauseCode", buf);
  		}
  	}
@@ -222,7 +231,7 @@
  	return send_response(p, &resp, reliable, seqno);
  }
  
-@@ -10561,6 +10641,7 @@
+@@ -10563,6 +10643,7 @@
  	}
  	respprep(&resp, p, msg, req);
  	add_header(&resp, "SIP-ETag", esc_entry->entity_tag);
@@ -230,7 +239,7 @@
  
  	return send_response(p, &resp, 0, 0);
  }
-@@ -10648,6 +10729,7 @@
+@@ -10650,6 +10731,7 @@
  	respprep(&resp, p, msg, req);
  	append_date(&resp);
  	add_header(&resp, "Unsupported", unsupported);
@@ -238,7 +247,7 @@
  	return send_response(p, &resp, XMIT_UNRELIABLE, 0);
  }
  
-@@ -10701,6 +10783,7 @@
+@@ -10703,6 +10785,7 @@
  	struct sip_request resp;
  	respprep(&resp, p, msg, req);
  	append_date(&resp);
@@ -246,7 +255,7 @@
  	return send_response(p, &resp, XMIT_UNRELIABLE, 0);
  }
  
-@@ -10710,6 +10793,7 @@
+@@ -10712,6 +10795,7 @@
  	struct sip_request resp;
  	respprep(&resp, p, msg, req);
  	add_header(&resp, "Accept", "application/sdp");
@@ -254,7 +263,7 @@
  	return send_response(p, &resp, reliable, 0);
  }
  
-@@ -10722,6 +10806,7 @@
+@@ -10724,6 +10808,7 @@
  	snprintf(tmp, sizeof(tmp), "%d", min_expiry);
  	respprep(&resp, p, msg, req);
  	add_header(&resp, "Min-Expires", tmp);
@@ -262,7 +271,7 @@
  	return send_response(p, &resp, XMIT_UNRELIABLE, 0);
  }
  
-@@ -11803,6 +11888,16 @@
+@@ -11805,6 +11890,18 @@
  	if (rpid == TRUE) {
  		add_rpid(&resp, p);
  	}
@@ -271,15 +280,17 @@
 +		reliable = XMIT_PRACK;
 +	}
 +	if (strncmp(msg, "100", 3)) {
-+		/* If we send a resposne WITH sdp we are not allowed to respond before the PRACK is received */
-+		ast_set_flag(&p->flags[2], SIP_PAGE3_INVITE_WAIT_FOR_PRACK);
++		/* If we send a response WITH sdp we are not allowed to respond before the PRACK is received */
++		if (ast_test_flag(&p->flags[2], SIP_PAGE3_100REL)) {
++			ast_set_flag(&p->flags[2], SIP_PAGE3_INVITE_WAIT_FOR_PRACK);
++		}
 +		add_prack_respheader(p, &resp, reliable);
 +		add_required_respheader(&resp);
 +	}
  	if (ast_test_flag(&p->flags[0], SIP_OFFER_CC)) {
  		add_cc_call_info_to_response(p, &resp);
  	}
-@@ -12212,7 +12307,34 @@
+@@ -12214,7 +12311,69 @@
  }
  
  /*! 
@@ -288,26 +299,61 @@
 + */
 +static int transmit_prack(struct sip_pvt *p, uint32_t their_rseq)
 +{
-+	if (their_rseq == p->irseq) {
-+		ast_debug(3, "!?!?!?!?!? This is a retransmit of the previous response. %u \n", their_rseq);
-+		/* RFC 3262: In particular, a UAC SHOULD NOT retransmit the PRACK request
-+   		   	when it receives a retransmission of the provisional response being
-+   		   	acknowledged, although doing so does not create a protocol error.*/
-+		return -2;	/* Not used by transmit_invite et al */
-+	}
-+	if (p->irseq > 0 && their_rseq != p->irseq + 1) {
-+		ast_debug(3, "!?!?!?!?!? This is a response out of sequence! ignored. %u \n", their_rseq);
-+		/* RFC 3262: if the UAC receives another reliable provisional
-+   			response to the same request, and its RSeq value is not one higher
-+   			than the value of the sequence number, that response MUST NOT be
-+   			acknowledged with a PRACK, and MUST NOT be processed further by the
-+   			UAC.  An implementation MAY discard the response, or MAY cache the
-+   			response in the hopes of receiving the missing responses.
++	int res;
++	int comparerseq = TRUE;
++	uint32_t focus_rseq = p->irseq;
++
++	/* During the early media phase, we could have a situation where we get provisional
++	   responses from multiple devices, in separate early dialogs. In this case, this 
++	   code focuses on the FIRST early media response as the one in focus where we 
++	   check the rseq sequence numbers for retransmits and act upon them.
++	*/
++
++	if (!ast_strlen_zero(p->theirtag_prack) && strcmp(p->theirtag, p->theirtag_prack)) {
++		/* We have already sent a PRACK in this dialog, but to a different device.
++		   In this code, we focus on the first response that requires PRACK and do not check
++		   the validity of rseq in responses in other early dialogs by controlling
++		   the PRACK sequence numbers ordering.
++
++		   To be 100% RFC correct, we should have a sip_pvt structure for each early dialog
++		   and terminate them if we get a 199 response in that early dialog. these should
++		   be organized in a tree-like structure based on the original
++		   INVITE callid, cseq and from-tag.
 +		*/
-+		return -3;
++		comparerseq = FALSE;
++	}
++	
++	if (comparerseq) {
++		if (their_rseq == p->irseq) {
++			ast_debug(3, "!?!?!?!?!? This is a retransmit of the previous response. %u \n", their_rseq);
++			/* RFC 3262: In particular, a UAC SHOULD NOT retransmit the PRACK request
++   		   		when it receives a retransmission of the provisional response being
++   		   		acknowledged, although doing so does not create a protocol error.*/
++			return -2;	/* Not used by transmit_invite et al */
++		}
++		if (p->irseq > 0 && their_rseq != p->irseq + 1) {
++			ast_debug(3, "!?!?!?!?!? This is a response out of sequence! ignored. %u \n", their_rseq);
++			/* RFC 3262: if the UAC receives another reliable provisional
++   				response to the same request, and its RSeq value is not one higher
++   				than the value of the sequence number, that response MUST NOT be
++   				acknowledged with a PRACK, and MUST NOT be processed further by the
++   				UAC.  An implementation MAY discard the response, or MAY cache the
++   				response in the hopes of receiving the missing responses.
++			*/
++			return -3;
++		}
 +	}
 +	p->irseq = their_rseq;
-+	return transmit_invite(p, SIP_PRACK, 0, 1, NULL);
++	res = transmit_invite(p, SIP_PRACK, 0, 1, NULL);
++
++	if (ast_strlen_zero(p->theirtag_prack)) {
++		p->irseq = their_rseq;
++		ast_string_field_set(p, theirtag_prack, p->tag);		/* Save this tag as a PRACK focus for this dialog */
++	} else {
++		p->irseq = focus_rseq;
++	}
++
++	return res;
 +}
 +
 +/*! 
@@ -315,7 +361,7 @@
   * \param p sip_pvt structure
   * \param sipmethod
   * \param sdp unknown
-@@ -12228,7 +12350,9 @@
+@@ -12230,7 +12389,9 @@
  	req.method = sipmethod;
  	if (init) {/* Bump branch even on initial requests */
  		p->branch ^= ast_random();
@@ -326,7 +372,7 @@
  		build_via(p);
  	}
  	if (init > 1) {
-@@ -12264,17 +12388,24 @@
+@@ -12266,17 +12427,24 @@
  		}
  		snprintf(buf, sizeof(buf), "%d", p->expiry);
  		add_header(&req, "Expires", buf);
@@ -352,7 +398,7 @@
  		char i2astr[10];
  
  		if (!p->stimer->st_interval) {
-@@ -17602,6 +17733,7 @@
+@@ -17604,6 +17772,7 @@
  		ast_cli(fd, "  DirectMedia  : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[0], SIP_DIRECT_MEDIA)));
  		ast_cli(fd, "  PromiscRedir : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[0], SIP_PROMISCREDIR)));
  		ast_cli(fd, "  User=Phone   : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[0], SIP_USEREQPHONE)));
@@ -360,7 +406,7 @@
  		ast_cli(fd, "  Video Support: %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[1], SIP_PAGE2_VIDEOSUPPORT) || ast_test_flag(&peer->flags[1], SIP_PAGE2_VIDEOSUPPORT_ALWAYS)));
  		ast_cli(fd, "  Text Support : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[1], SIP_PAGE2_TEXTSUPPORT)));
  		ast_cli(fd, "  Ign SDP ver  : %s\n", AST_CLI_YESNO(ast_test_flag(&peer->flags[1], SIP_PAGE2_IGNORESDPVERSION)));
-@@ -17725,6 +17857,7 @@
+@@ -17727,6 +17896,7 @@
  
  		/* - is enumerated */
  		astman_append(s, "SIP-DTMFmode: %s\r\n", dtmfmode2str(ast_test_flag(&peer->flags[0], SIP_DTMF)));
@@ -368,15 +414,17 @@
  		astman_append(s, "ToHost: %s\r\n", peer->tohost);
  		astman_append(s, "Address-IP: %s\r\nAddress-Port: %d\r\n", ast_sockaddr_stringify_addr(&peer->addr), ast_sockaddr_port(&peer->addr));
  		astman_append(s, "Default-addr-IP: %s\r\nDefault-addr-port: %d\r\n", ast_sockaddr_stringify_addr(&peer->defaddr), ast_sockaddr_port(&peer->defaddr));
-@@ -18308,6 +18441,7 @@
+@@ -18309,7 +18479,9 @@
+ 	ast_cli(a->fd, "  Timer T1 minimum:       %d\n", global_t1min);
   	ast_cli(a->fd, "  Timer B:                %d\n", global_timer_b);
  	ast_cli(a->fd, "  No premature media:     %s\n", AST_CLI_YESNO(global_prematuremediafilter));
++	ast_cli(a->fd, "  Early media focus:      %s\n", AST_CLI_YESNO(sip_cfg.early_media_focus));
  	ast_cli(a->fd, "  Max forwards:           %d\n", sip_cfg.default_max_forwards);
 +	ast_cli(a->fd, "  PRACK support:          %s\n", AST_CLI_YESNO(ast_test_flag(&global_flags[2], SIP_PAGE3_PRACK)));
  
  	ast_cli(a->fd, "\nDefault Settings:\n");
  	ast_cli(a->fd, "-----------------\n");
-@@ -18679,10 +18813,14 @@
+@@ -18681,10 +18853,14 @@
  			ast_cli(a->fd, "  Format:                 %s\n", ast_getformatname_multiple(formatbuf, sizeof(formatbuf), cur->owner ? cur->owner->nativeformats : 0) );
  			ast_cli(a->fd, "  T.38 support            %s\n", AST_CLI_YESNO(cur->udptl != NULL));
  			ast_cli(a->fd, "  Video support           %s\n", AST_CLI_YESNO(cur->vrtp != NULL));
@@ -391,7 +439,7 @@
  			ast_cli(a->fd, "  Force rport:            %s\n", AST_CLI_YESNO(ast_test_flag(&cur->flags[0], SIP_NAT_FORCE_RPORT)));
  			if (ast_sockaddr_isnull(&cur->redirip)) {
  				ast_cli(a->fd,
-@@ -19928,6 +20066,48 @@
+@@ -19933,6 +20109,48 @@
  	return 0;
  }
  
@@ -440,7 +488,45 @@
  /*!
   * \brief Handle authentication challenge for SIP UPDATE
   *
-@@ -20366,6 +20546,10 @@
+@@ -20188,7 +20406,7 @@
+ 				ast_setstate(p->owner, AST_STATE_RINGING);
+ 			}
+ 		}
+-		if (find_sdp(req)) {
++		if (!req->ignoresdp && find_sdp(req)) {
+ 			if (p->invitestate != INV_CANCELLED)
+ 				p->invitestate = INV_EARLY_MEDIA;
+ 			res = process_sdp(p, req, SDP_T38_NONE);
+@@ -20197,6 +20415,9 @@
+ 				ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
+ 			}
+ 			ast_rtp_instance_activate(p->rtp);
++			if (sip_cfg.early_media_focus && ast_strlen_zero(p->theirtag_early)) {
++				ast_string_field_set(p, theirtag_early, p->tag);
++			}
+ 		}
+ 		check_pendings(p);
+ 		break;
+@@ -20260,7 +20481,7 @@
+ 			}
+ 			sip_handle_cc(p, req, AST_CC_CCNR);
+ 		}
+-		if (find_sdp(req)) {
++		if (!req->ignoresdp && find_sdp(req)) {
+ 			if (p->invitestate != INV_CANCELLED)
+ 				p->invitestate = INV_EARLY_MEDIA;
+ 			res = process_sdp(p, req, SDP_T38_NONE);
+@@ -20268,6 +20489,9 @@
+ 				/* Queue a progress frame */
+ 				ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
+ 			}
++			if (sip_cfg.early_media_focus && ast_strlen_zero(p->theirtag_early)) {
++				ast_string_field_set(p, theirtag_early, p->tag);
++			}
+ 			ast_rtp_instance_activate(p->rtp);
+ 		} else {
+ 			/* Alcatel PBXs are known to send 183s with no SDP after sending
+@@ -20371,6 +20595,10 @@
  
  		/* Check for Session-Timers related headers */
  		if (st_get_mode(p, 0) != SESSION_TIMER_MODE_REFUSE && p->outgoing_call == TRUE && !reinvite) {
@@ -451,16 +537,17 @@
  			p_hdrval = (char*)get_header(req, "Session-Expires");
  			if (!ast_strlen_zero(p_hdrval)) {
  				/* UAS supports Session-Timers */
-@@ -21068,6 +21252,8 @@
+@@ -21073,6 +21301,9 @@
  	struct ast_channel *owner;
  	int sipmethod;
  	const char *c = get_header(req, "Cseq");
 +	const char *required = get_header(req, "Require");
++	char tag[128];
 +
  	/* GCC 4.2 complains if I try to cast c as a char * when passing it to ast_skip_nonblanks, so make a copy of it */
  	char *c_copy = ast_strdupa(c);
  	/* Skip the Cseq and its subsequent spaces */
-@@ -21109,7 +21295,7 @@
+@@ -21114,7 +21345,7 @@
  				ack_res = __sip_semi_ack(p, seqno, 0, sipmethod);
  			}
  		} else {
@@ -469,15 +556,28 @@
  		}
  
  		if (ack_res == FALSE) {
-@@ -21135,6 +21321,7 @@
- 		gettag(req, "To", tag, sizeof(tag));
- 		ast_string_field_set(p, theirtag, tag);
- 	}
-+
+@@ -21133,13 +21364,14 @@
+ 		p->pendinginvite = 0;
+ 	}
+ 
+-	/* Get their tag if we haven't already */
+-	if (ast_strlen_zero(p->theirtag) || (resp >= 200)) {
+-		char tag[128];
++	
++	/* Always get the tag. Find_call will filter out after we have an established dialog,
++	   so that we don't update the tag after a 200 or other final response. 
++	   Provided that SIP pedantic checking is turned on of course.
++	*/
++	gettag(req, "To", tag, sizeof(tag));
++	ast_string_field_set(p, theirtag, tag);
+ 
+-		gettag(req, "To", tag, sizeof(tag));
+-		ast_string_field_set(p, theirtag, tag);
+-	}
  	/* This needs to be configurable on a channel/peer level,
  	   not mandatory for all communication. Sadly enough, NAT implementations
  	   are not so stable so we can always rely on these headers.
-@@ -21154,7 +21341,44 @@
+@@ -21159,7 +21391,50 @@
  		pvt_set_needdestroy(p, "received 4XX response to a BYE");
  		return;
  	}
@@ -519,10 +619,16 @@
 +		}
 +	}
 +
++	if (sip_cfg.early_media_focus && !ast_strlen_zero(p->theirtag_early) && strcmp(p->theirtag_early, p->theirtag)) {
++		/* If we already are in early media phase, and have a response from a new device in this call we should
++	   	ignore the SDP. */
++		req->ignoresdp = TRUE;
++	}
++
  	if (p->relatedpeer && sipmethod == SIP_OPTIONS) {
  		/* We don't really care what the response is, just that it replied back.
  		   Well, as long as it's not a 100 response...  since we might
-@@ -21171,6 +21395,9 @@
+@@ -21176,6 +21451,9 @@
  	} else if (sipmethod == SIP_INFO) {
  		/* More good gravy! */
  		handle_response_info(p, resp, rest, req, seqno);
@@ -532,7 +638,7 @@
  	} else if (sipmethod == SIP_MESSAGE) {
  		/* More good gravy! */
  		handle_response_message(p, resp, rest, req, seqno);
-@@ -22318,6 +22545,37 @@
+@@ -22323,6 +22601,37 @@
  	return 0;
  }
  
@@ -570,7 +676,7 @@
  /*!
   * \brief Handle incoming INVITE request
   * \note If the INVITE has a Replaces header, it is part of an
-@@ -22379,7 +22637,7 @@
+@@ -22384,7 +22693,7 @@
  			p->invitestate = INV_COMPLETED;
  			if (!p->lastinvite)
  				sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
@@ -579,7 +685,7 @@
  			goto request_invite_cleanup;
  		}
  	}
-@@ -22389,6 +22647,22 @@
+@@ -22394,6 +22703,23 @@
  	p->sipoptions |= required_profile;
  	p->reqsipoptions = required_profile;
  
@@ -587,6 +693,7 @@
 +	if (p->reqsipoptions & SIP_OPT_100REL || p->sipoptions & SIP_OPT_100REL) {
 +		if (ast_test_flag(&p->flags[2], SIP_PAGE3_PRACK)) {	/* Is PRACK enabled for this dialog? */
 +			ast_set_flag(&p->flags[2], SIP_PAGE3_100REL);	/* Mark PRACK as active for this dialog */
++			ast_debug(2, "--#-#-#-#- Adding PRACK support for this dialog \n");
 +		} else if (p->reqsipoptions & SIP_OPT_100REL) {
 +			/* If PRACK was required but is disabled in configuration, don't play */
 +			transmit_response(p, "420 Bad extension (unsupported)", req);
@@ -602,7 +709,7 @@
  	/* Check if this is a loop */
  	if (ast_test_flag(&p->flags[0], SIP_OUTGOING) && p->owner && (p->invitestate != INV_TERMINATED && p->invitestate != INV_CONFIRMED) && p->owner->_state != AST_STATE_UP) {
  		/* This is a call to ourself.  Send ourselves an error code and stop
-@@ -22451,7 +22725,7 @@
+@@ -22456,7 +22782,7 @@
  			 * transaction. Calling __sip_ack will take care of this by clearing the p->pendinginvite and removing the response
  			 * from the previous transaction from the list of outstanding packets.
  			 */
@@ -611,7 +718,7 @@
  		} else {
  			/* We already have a pending invite. Sorry. You are on hold. */
  			p->glareinvite = seqno;
-@@ -24547,7 +24821,7 @@
+@@ -24552,7 +24878,7 @@
  		return 0;
  	} else if (auth_result == AUTH_SUCCESSFUL && p->lastinvite) {
  		/* We need to stop retransmitting the 401 */
@@ -620,7 +727,7 @@
  	}
  
  	publish_type = determine_sip_publish_type(req, event, etag, expires_str, &expires_int);
-@@ -25374,12 +25648,15 @@
+@@ -25379,12 +25705,15 @@
  	case SIP_UPDATE:
  		res = handle_request_update(p, req);
  		break;
@@ -637,7 +744,7 @@
  			if (find_sdp(req)) {
  				if (process_sdp(p, req, SDP_T38_NONE))
  					return -1;
-@@ -25388,7 +25665,7 @@
+@@ -25393,7 +25722,7 @@
  		} else if (p->glareinvite == seqno) {
  			/* handle ack for the 491 pending sent for glareinvite */
  			p->glareinvite = 0;
@@ -646,7 +753,7 @@
  		}
  		if (!acked) {
  			/* Got an ACK that did not match anything. Ignore
-@@ -27032,6 +27309,9 @@
+@@ -27037,6 +27366,9 @@
  	} else if (!strcasecmp(v->name, "buggymwi")) {
  		ast_set_flag(&mask[1], SIP_PAGE2_BUGGY_MWI);
  		ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_BUGGY_MWI);
@@ -656,10 +763,27 @@
  	} else
  		res = 0;
  
+@@ -28244,6 +28576,7 @@
+ 	externtcpport = STANDARD_SIP_PORT;
+ 	externtlsport = STANDARD_TLS_PORT;
+ 	sip_cfg.srvlookup = DEFAULT_SRVLOOKUP;
++	sip_cfg.early_media_focus = DEFAULT_EARLY_MEDIA_FOCUS;
+ 	global_tos_sip = DEFAULT_TOS_SIP;
+ 	global_tos_audio = DEFAULT_TOS_AUDIO;
+ 	global_tos_video = DEFAULT_TOS_VIDEO;
+@@ -28597,6 +28930,8 @@
+ 			global_match_auth_username = ast_true(v->value);
+ 		} else if (!strcasecmp(v->name, "srvlookup")) {
+ 			sip_cfg.srvlookup = ast_true(v->value);
++		} else if (!strcasecmp(v->name, "earlymediafocus")) {
++			sip_cfg.early_media_focus = ast_true(v->value);
+ 		} else if (!strcasecmp(v->name, "pedantic")) {
+ 			sip_cfg.pedanticsipchecking = ast_true(v->value);
+ 		} else if (!strcasecmp(v->name, "maxexpirey") || !strcasecmp(v->name, "maxexpiry")) {
 Index: channels/sip/include/sip.h
 ===================================================================
---- channels/sip/include/sip.h	(.../branches/1.8)	(revision 369624)
-+++ channels/sip/include/sip.h	(.../team/oej/darjeeling-prack-1.8)	(revision 369624)
+--- channels/sip/include/sip.h	(.../branches/1.8)	(revision 369789)
++++ channels/sip/include/sip.h	(.../team/oej/darjeeling-prack-1.8)	(revision 369789)
 @@ -155,7 +155,7 @@
   *  \todo This string should be set dynamically. We only support REFER and SUBSCRIBE if we have
   *  allowsubscribe and allowrefer on in sip.conf.
@@ -669,7 +793,15 @@
  
  /*! \brief Standard SIP unsecure port for UDP and TCP from RFC 3261. DO NOT CHANGE THIS */
  #define STANDARD_SIP_PORT	5060
-@@ -223,6 +223,7 @@
+@@ -187,6 +187,7 @@
+ #define DEFAULT_MWI_FROM       ""
+ #define DEFAULT_NOTIFYMIME     "application/simple-message-summary"
+ #define DEFAULT_ALLOWGUEST     TRUE
++#define DEFAULT_EARLY_MEDIA_FOCUS	FALSE;	/*!< Focus on a single early media stream */
+ #define DEFAULT_RTPKEEPALIVE   0      /*!< Default RTPkeepalive setting */
+ #define DEFAULT_CALLCOUNTER    FALSE   /*!< Do not enable call counters by default */
+ #define DEFAULT_SRVLOOKUP      TRUE    /*!< Recommended setting is ON */
+@@ -223,6 +224,7 @@
  #define DEFAULT_CAPABILITY (AST_FORMAT_ULAW | AST_FORMAT_TESTLAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263);
  #define DEFAULT_STORE_SIP_CAUSE FALSE      /*!< Don't store HASH(SIP_CAUSE,<channel name>) for channels by default */
  #endif
@@ -677,7 +809,7 @@
  /*@}*/
  
  /*! \name SIPflags
-@@ -356,10 +357,14 @@
+@@ -356,10 +358,14 @@
  	SIP_PAGE2_Q850_REASON | SIP_PAGE2_HAVEPEERCONTEXT | SIP_PAGE2_USE_SRTP)
  
  
@@ -694,7 +826,7 @@
  
  /*@}*/
  
-@@ -403,6 +408,7 @@
+@@ -403,6 +409,7 @@
   * where the original response would be sent RELIABLE in an INVITE transaction
   */
  enum xmittype {
@@ -702,7 +834,7 @@
  	XMIT_CRITICAL = 2,    /*!< Transmit critical SIP message reliably, with re-transmits.
  	                       *   If it fails, it's critical and will cause a teardown of the session */
  	XMIT_RELIABLE = 1,    /*!< Transmit SIP message reliably, with re-transmits */
-@@ -560,7 +566,7 @@
+@@ -560,7 +567,7 @@
  	SIP_NOTIFY,     /*!< Status update, Part of the event package standard, result of a SUBSCRIBE or a REFER */
  	SIP_INVITE,     /*!< Set up a session */
  	SIP_ACK,        /*!< End of a three-way handshake started with INVITE. */
@@ -711,7 +843,15 @@
  	SIP_BYE,        /*!< End of a session */
  	SIP_REFER,      /*!< Refer to another URI (transfer) */
  	SIP_SUBSCRIBE,  /*!< Subscribe for updates (voicemail, session status, device status, presence) */
-@@ -749,6 +755,8 @@
+@@ -675,6 +682,7 @@
+ 	      be applied to devices (trunks, services, phones)
+ */
+ struct sip_settings {
++	int early_media_focus;		/*!< G: Focus on the first early media stream received, ignore the rest */
+ 	int peer_rtupdate;          /*!< G: Update database with registration data for peer? */
+ 	int rtsave_sysname;         /*!< G: Save system name at registration? */
+ 	int ignore_regexpire;       /*!< G: Ignore expiration of peer  */
+@@ -749,12 +757,15 @@
  	int headers;            /*!< # of SIP Headers */
  	int method;             /*!< Method of this request */
  	int lines;              /*!< Body Content */
@@ -720,7 +860,23 @@
  	unsigned int sdp_start; /*!< the line number where the SDP begins */
  	unsigned int sdp_count; /*!< the number of lines of SDP */
  	char debug;             /*!< print extra debugging if non zero */
-@@ -985,6 +993,8 @@
+ 	char has_to_tag;        /*!< non-zero if packet has To: tag */
+ 	char ignore;            /*!< if non-zero This is a re-transmit, ignore it */
+ 	char authenticated;     /*!< non-zero if this request was authenticated */
++	char ignoresdp;		/*!< In some cases, we have to ignore the SDP in responses */
+ 	ptrdiff_t header[SIP_MAX_HEADERS]; /*!< Array of offsets into the request string of each SIP header*/
+ 	ptrdiff_t line[SIP_MAX_LINES];     /*!< Array of offsets into the request string of each SDP line*/
+ 	struct ast_str *data;	
+@@ -959,6 +970,8 @@
+ 		AST_STRING_FIELD(rdnis);        /*!< Referring DNIS */
+ 		AST_STRING_FIELD(redircause);   /*!< Referring cause */
+ 		AST_STRING_FIELD(theirtag);     /*!< Their tag */
++		AST_STRING_FIELD(theirtag_prack);  /*!< Current tag focus for PRACK handling */
++		AST_STRING_FIELD(theirtag_early);  /*!< Current tag focus for early media handling */
+ 		AST_STRING_FIELD(tag);          /*!< Our tag for this session */
+ 		AST_STRING_FIELD(username);     /*!< [user] name */
+ 		AST_STRING_FIELD(peername);     /*!< [peer] name, not set if [user] */
+@@ -985,6 +998,8 @@
  	uint32_t ocseq;                         /*!< Current outgoing seqno */
  	uint32_t icseq;                         /*!< Current incoming seqno */
  	uint32_t init_icseq;                    /*!< Initial incoming seqno from first request */
@@ -729,7 +885,7 @@
  	ast_group_t callgroup;                  /*!< Call group */
  	ast_group_t pickupgroup;                /*!< Pickup group */
  	uint32_t lastinvite;                    /*!< Last seqno of invite */
-@@ -1142,6 +1152,7 @@
+@@ -1142,6 +1157,7 @@
  	int retrans;              /*!< Retransmission number */
  	int method;               /*!< SIP method for this packet */
  	uint32_t seqno;           /*!< Sequence number */
@@ -737,7 +893,7 @@
  	char is_resp;             /*!< 1 if this is a response packet (e.g. 200 OK), 0 if it is a request */
  	char is_fatal;            /*!< non-zero if there is a fatal error */
  	int response_code;        /*!< If this is a response, the response code */
-@@ -1751,7 +1762,7 @@
+@@ -1751,7 +1767,7 @@
  	char * const text;  /*!< Text id, as in standard */
  } sip_options[] = {	/* XXX used in 3 places */
  	/* RFC3262: PRACK 100% reliability */
@@ -748,8 +904,8 @@
  	/* SIMPLE events:  RFC4662 */
 Index: channels/sip/include/reqresp_parser.h
 ===================================================================
---- channels/sip/include/reqresp_parser.h	(.../branches/1.8)	(revision 369624)
-+++ channels/sip/include/reqresp_parser.h	(.../team/oej/darjeeling-prack-1.8)	(revision 369624)
+--- channels/sip/include/reqresp_parser.h	(.../branches/1.8)	(revision 369789)
++++ channels/sip/include/reqresp_parser.h	(.../team/oej/darjeeling-prack-1.8)	(revision 369789)
 @@ -145,6 +145,14 @@
  unsigned int parse_sip_options(const char *options, char *unsupported, size_t unsupported_len);
  
@@ -767,8 +923,8 @@
   * \param input1 First URI
 Index: channels/sip/include/dialog.h
 ===================================================================
---- channels/sip/include/dialog.h	(.../branches/1.8)	(revision 369624)
-+++ channels/sip/include/dialog.h	(.../team/oej/darjeeling-prack-1.8)	(revision 369624)
+--- channels/sip/include/dialog.h	(.../branches/1.8)	(revision 369789)
++++ channels/sip/include/dialog.h	(.../team/oej/darjeeling-prack-1.8)	(revision 369789)
 @@ -67,7 +67,7 @@
  
  /*! \brief Acknowledges receipt of a packet and stops retransmission
@@ -780,8 +936,8 @@
   * called with p locked */
 Index: channels/sip/reqresp_parser.c
 ===================================================================
---- channels/sip/reqresp_parser.c	(.../branches/1.8)	(revision 369624)
-+++ channels/sip/reqresp_parser.c	(.../team/oej/darjeeling-prack-1.8)	(revision 369624)
+--- channels/sip/reqresp_parser.c	(.../branches/1.8)	(revision 369789)
++++ channels/sip/reqresp_parser.c	(.../team/oej/darjeeling-prack-1.8)	(revision 369789)
 @@ -1516,18 +1516,13 @@
  }
  
@@ -852,7 +1008,7 @@
 Index: README.darjeeling
 ===================================================================
 --- README.darjeeling	(.../branches/1.8)	(revision 0)
-+++ README.darjeeling	(.../team/oej/darjeeling-prack-1.8)	(revision 369624)
++++ README.darjeeling	(.../team/oej/darjeeling-prack-1.8)	(revision 369789)
 @@ -0,0 +1,130 @@
 +Edvina AB
 +Olle E. Johansson
@@ -996,25 +1152,40 @@
 
 Index: configs/sip.conf.sample
 ===================================================================
---- configs/sip.conf.sample	(.../branches/1.8)	(revision 369624)
-+++ configs/sip.conf.sample	(.../team/oej/darjeeling-prack-1.8)	(revision 369624)
+--- configs/sip.conf.sample	(.../branches/1.8)	(revision 369789)
++++ configs/sip.conf.sample	(.../team/oej/darjeeling-prack-1.8)	(revision 369789)
 @@ -241,6 +241,9 @@
                                  ; and multiline formatted headers for strict
                                  ; SIP compatibility (defaults to "yes")
  
-+;prack=yes			; Enable PRACK support. (defaults to "no")
++;prack=yes			; Enable PRACK (SIP option 100rel)  support. (defaults to "no")
 +				; Can also be set on a per device basis.
 +
  ; See https://wiki.asterisk.org/wiki/display/AST/IP+Quality+of+Service for a description of these parameters.
  ;tos_sip=cs3                    ; Sets TOS for SIP packets.
  ;tos_audio=ef                   ; Sets TOS for RTP audio packets.
+@@ -346,6 +349,14 @@
+                                 ;
+                                 ; In order for "noanswer" applications to work, you need to run
+                                 ; the progress() application in the priority before the app.
++;earlymediafocus=yes		; If you have a forking SIP proxy in the call, Asterisk may get multiple
++				; 183/180 responses with SDP from *different* devices. The default is that 
++				; Asterisk jumps on to each one. There's no *correct* solution to this
++				; problem. Turning this on means that Asterisk focuses on the *first*
++				; early media response and ignores the rest. This might mean that the
++				; user gets a ring tone and stays with that even if the service provider
++				; from a different media server plays a very important message.
++				; Default is "no" - jump to the latest one.
+ 
+ ;progressinband=never           ; If we should generate in-band ringing always
+                                 ; use 'never' to never use in-band signalling, even in cases
 
 Egenskapsändringar för: .
 ___________________________________________________________________
 Added: automerge
    + *
 Added: svnmerge-integrated
-   + /branches/1.8:1-369590
+   + /branches/1.8:1-369757
 Added: automerge-email
    + oej at edvina.net
 




More information about the asterisk-commits mailing list