Gilles Chanteperdrix wrote:
> Jan Kiszka wrote:
>> Gilles Chanteperdrix wrote:
>>> Gilles Chanteperdrix wrote:
>>>> Hi,
>>>>
>>>> here is another patch to RTnet, which replaces the list of UDP sockets
>>>> with a hash, so makes the searching for an RTnet registered socket a
>>>> bit
>>>> faster.
>>> Ok. Should have read the patch better before sending it. There are two
>>> more features poured into this patch:
>>> - we add a "receiving" member to the UDP socket structure, which is only
>>> sets either if the program using the socket has called recv, or if the
>>> program has bound the socket to a particular port, this is to prevent a
>>> problem which happens when putting an RTnet box on an heterogenous
>>> network, with an application which only uses a socket to send packets:
>>> if the network sends some packets to the automatically assigned port,
>>> they use rtskbs from the socket pool, until the socket pool becomes
>>> empty, and no more packet can be sent using the socket.
>>> - when a socket is bound to a particular IP address, we use this IP as
>>> the source IP of the packets sent by this socket, even if they end-up
>>> being sent through another interface, this is Linux behaviour, and was
>>> required for one of our applications to work correctly with
>>> off-the-shelf IP phones (they do filtering based on the source IP).
>>
>> Could you break those two changes out and post them separately? Such
>> changes are too critical to have them all-in-one.
> 
> Ok. Here it comes, extracted from revision control history.
> Apply in order:
> - rtnet-fix-src-ip.diff

> --- stack/ipv4/udp.c  (révision 3250)
> +++ stack/ipv4/udp.c  (révision 5093)
> @@ -576,14 +576,8 @@ ssize_t rt_udp_sendmsg(struct rtdm_dev_c
>      if (err)
>          return err;
>  
> -    /* check if specified source address fits */
> -    if ((saddr != INADDR_ANY) && (saddr != rt.rtdev->local_ip)) {
> -        rtdev_dereference(rt.rtdev);
> -        return -EHOSTUNREACH;
> -    }
> -
>      /* we found a route, remember the routing dest-addr could be the netmask 
> */
> -    ufh.saddr     = rt.rtdev->local_ip;
> +    ufh.saddr     = saddr ?: rt.rtdev->local_ip;

One minor remark: I would prefer "saddr != INADDR_ANY ? saddr : ..."
here (the compiler should produce the same output).

I guess you tested this with CONFIG_RTNET_RTIPV4_ROUTE_SRC enabled,
right? I wonder if we shouldn't turn this unconditionally on now, it
won't cost us much in the hot path, but it would make the code more
readable.

> - 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.

> - rtnet-hash-port.diff

This needs more thoughts than I've left for tonight (no fundamental
problems, I just want to exclude that I'm overseeing some pitfalls of it).

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