Gilles Chanteperdrix wrote:
> Jan Kiszka wrote:
>> Gilles Chanteperdrix wrote:
>>> Jan Kiszka wrote:
>>>> Jan Kiszka wrote:
>>>>> Gilles Chanteperdrix wrote:
>>>>>> - rtnet-check-receiving.diff
>>>>>> @@ -375,13 +379,23 @@ ssize_t rt_udp_recvmsg(struct rtdm_dev_c
>>>>>>      struct udphdr       *uh;
>>>>>>      struct sockaddr_in  *sin;
>>>>>>      nanosecs_rel_t      timeout = sock->timeout;
>>>>>> -    int                 ret;
>>>>>> +    int                 ret, index;
>>>>>> +    rtdm_lockctx_t  context;
>>>>>>  
>>>>>>  
>>>>>>      /* non-blocking receive? */
>>>>>>      if (testbits(msg_flags, MSG_DONTWAIT))
>>>>>>          timeout = -1;
>>>>>>  
>>>>>> +    rtdm_lock_get_irqsave(&udp_socket_base_lock, context);
>>>>>> +    if ((index = sock->prot.inet.reg_index) < 0) {
>>>>>> +            rtdm_lock_put_irqrestore(&udp_socket_base_lock, context);
>>>>>> +        /* socket is being closed */
>>>>>> +            return -EBADF;
>>>>>> +    }
>>>>>> +    port_registry[index].receiving = 1;
>>>>>> +    rtdm_lock_put_irqrestore(&udp_socket_base_lock, context);
>>>>>> +            
>>>>> This is the only part of the patch I don't like. I don't want to add
>>>>> another lock site to the RX path. I see the problem, but I think we need
>>>>> some other solution. Maybe something that disables reception, and thus
>>>>> unwanted buffer consumption.
>>>> Well, I was too quick. There is another thing I don't like about this
>>>> patch: It breaks valid use cases.
>>>>
>>>> Consider some application creating a socket first, then sending some
>>>> message, next doing something else (or being preempted for a while), and
>>>> finally calling into the recvmsg functions. With your change a potential
>>>> reply to that sent-out message could have been dropped in the meantime
>>>> because the socket was not yet marked as 'receiving'. Not good.
>>> It seems I was too quick to admit your use case: would such an
>>> application do this without binding the socket to another port than the
>>> automacically assigned port ? Because once a socket is bound to a port
>>> no received packet is lost.
>> Well, not binding to a specific port is the standard pattern for client
>> applications. And clients start their work with sending some packet to a
>> server. So this use case is surely not unusual.
> 
> I would expect client applications to try to bind their socket to a
> given port range, not to rely on the UDP stack to choose one in an
> unknown range. This way, you get things working behind a firewall...

First, there are /typically/ no firewalls to cross for RTnet
applications. And second even if there are, hacking applications to work
around some firewall shortcomings might be required from time to time
but that must not be considered as a common application pattern.

My point remains: We cannot block reception until the application calls
recvmsg, we must allow it from the beginning. Blocking it on request is
acceptable, though.

Jan

Attachment: signature.asc
Description: OpenPGP digital signature

-------------------------------------------------------------------------
Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW!
Studies have shown that voting for your favorite open source project,
along with a healthy diet, reduces your potential for chronic lameness
and boredom. Vote Now at http://www.sourceforge.net/community/cca08
_______________________________________________
RTnet-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rtnet-developers

Reply via email to