[asterisk-dev] [Code Review] 3882: Replace sip_tls_read() and resolve the large SDP poll issue

Alexander Traud reviewboard at asterisk.org
Wed Aug 6 13:58:14 CDT 2014



> On Aug. 6, 2014, 6:58 a.m., Alexander Traud wrote:
> > trunk/channels/chan_sip.c, line 3042
> > <https://reviewboard.asterisk.org/r/3882/diff/2/?file=66262#file66262line3042>
> >
> >     Because the rest of the Asterisk code does it this way:
> >     instead of bitwiseOr |
> >     please, a logicalOr ||
> >     see http://stackoverflow.com/questions/3154132/what-is-the-difference-between-logical-and-conditional-and-or-in-c
> >     
> >     One reason, I would use an "else if" for the EINTR case. However, I am not sure if the coding-style guides have a rule for this.
> >     
> >     @Richard
> >     I am just curious after reading the code: When is EINTR possible? Or is that just a coding convention?
> 
> wdoekes wrote:
>     If the call is interrupted by a signal handler, it may return EINTR. Example:
>     
>       #include <errno.h>
>       #include <signal.h>
>       #include <stdio.h>
>       #include <unistd.h>
>       void handler(int signum) {
>             fprintf(stderr, "got sigalarm\n");
>       }
>       int main() {
>             char buf[1];
>             struct sigaction act = {0,}; // ignore https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119
>     
>             act.sa_handler = handler;
>             act.sa_flags = 0; //SA_RESTART;
>             sigaction(SIGALRM, &act, NULL);
>             //signal(SIGALRM, handler);
>     
>             alarm(1);
>             read(0, buf, 1);
>     
>             if (errno == EINTR) {
>                     fprintf(stderr, "got EINTR\n");
>             }
>             return 0;
>       }
>     
>     I'm not sure SA_RESTART is used consistently in asterisk, seeing that both
>     signal(2) and sigaction(2) are used. So EINTR might happen on systems that
>     do not default to SA_RESTART. In any case, it's convention and smart to
>     check for both.
>     
>     
>     As for the code, I'd prefer this, without the extra else block.
>     The continue already makes sure that we don't get to the next statements.
>     
>       if (errno == EAGAIN || errno == EINTR) {
>           continue;
>       }
>       ast_debug(2, "SIP TCP/TLS server error when receiving data\n");
>       return -1;
>     
>
> 
> Alexander Traud wrote:
>     Walter, I am about ast_tcptls_server_read() which handles EINTR already. There, I did not find the condition which returns EINTR to us here in this code.
> 
> rmudgett wrote:
>     The ast_tcptls_server_read() call will not handle the EINTR in this case because the previous call to ast_tcptls_stream_set_exclusive_input() in _sip_tcp_helper_thread() tells it not to wait.
>     
>     Also please change the if statement as walter mentioned.  Use of the bitwise or in that manner is unusual.  Where did you see this done elsewhere?
> 
> ebroad wrote:
>     All - 
>     The bitwise comparison was a typo, not intentional. I have made the changes, new diff incoming shortly.

Sorry, I am just curious to double-check I understand the code in main/tcptls.c.
Because of exclusive_input, tcptls_stream_read() might return EAGAIN in chan_sip, yes.
However, I do not find the conditions to be met for EINTR to be returned.


- Alexander


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/3882/#review13016
-----------------------------------------------------------


On Aug. 6, 2014, 6:04 p.m., ebroad wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/3882/
> -----------------------------------------------------------
> 
> (Updated Aug. 6, 2014, 6:04 p.m.)
> 
> 
> Review request for Asterisk Developers and Alexander Traud.
> 
> 
> Bugs: ASTERISK-18345
>     https://issues.asterisk.org/jira/browse/ASTERISK-18345
> 
> 
> Repository: Asterisk
> 
> 
> Description
> -------
> 
> Replace sip_tls_read() and sip_tcp_read() with a single function and resolve the poll/wait issue with large SDP payloads. See https://reviewboard.asterisk.org/r/3653/ for the discussion on this.
> 
> 
> Diffs
> -----
> 
>   trunk/channels/chan_sip.c 419821 
> 
> Diff: https://reviewboard.asterisk.org/r/3882/diff/
> 
> 
> Testing
> -------
> 
> Made and received calls successfully with CSipSimple with full SIP headers over TLS, SRTP and multiple codecs enabled ensuring a large SDP payload.
> 
> 
> Thanks,
> 
> ebroad
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20140806/26517b37/attachment-0001.html>


More information about the asterisk-dev mailing list