Wolfgang Grandegger wrote: > Hi Jan, > > Jan Kiszka wrote: >> [Somehow, my TB hates your mails - it just presents empty bodies to me >> when I hit reply. Strange.] >> >> Wolfgang Grandegger wrote: >>> This patch enables ARP support for the RT-Proxy Linux device. >>> Incoming ARP replys are delivered to both, the RTnet and the >>> Linux network stack. The RT-Proxy then gets attached to the >>> corresponding RTnet device, rteth0 by default. You can enable >>> this feature with the configure option "--enable-proxy-arp". >> Maybe the same question here: Do we need an extra knob for this, or are >> all proxy scenarios fine this enabled? >> >>> Note: this patch requires running "scripts/autogen.sh" >>> >>> Signed-off-by: Wolfang Grandegger <[EMAIL PROTECTED]> >>> Index: rtnet/stack/ipv4/arp.c >>> =================================================================== >>> --- rtnet.orig/stack/ipv4/arp.c >>> +++ rtnet/stack/ipv4/arp.c >>> @@ -25,6 +25,9 @@ >>> #include <stack_mgr.h> >>> #include <ipv4/arp.h> >>> >>> +#ifdef CONFIG_RTNET_ADDON_PROXY_ARP >>> +#include <ipv4/ip_input.h> >>> +#endif /* CONFIG_RTNET_ADDON_PROXY_ARP */ >>> >>> /*** >>> * arp_send: Create and send an arp packet. If (dest_hw == NULL), >>> @@ -174,6 +177,12 @@ int rt_arp_rcv(struct rtskb *skb, struct >>> } >>> >>> out: >>> +#ifdef CONFIG_RTNET_ADDON_PROXY_ARP >>> + if (rt_ip_fallback_handler) { >>> + rt_ip_fallback_handler(skb); >>> + return 0; >>> + } >>> +#endif >> Hmm, I wonder what prevents ARP requests being answered twice: first by >> RTnet (a few lines above this hunk), and then potentially also by Linux. > > I'm especially concerned about the way out-going packets are routed: > > #ifdef CONFIG_RTNET_ADDON_PROXY_ARP > rtdev_reference(rtnetproxy_rtdev); > > rtskb->rtdev = rtnetproxy_rtdev; > > /* Call the actual transmit function */ > rtdev_xmit_proxy(rtskb); > > rtdev_dereference(rtnetproxy_rtdev); > > #else /* !CONFIG_RTNET_ADDON_PROXY_ARP */ > /* Determine the device to use: Only ip routing is used here. > * Non-ip protocols are not supported... */ > rc = rt_ip_route_output(&rt, pData->ip_dst, INADDR_ANY); > if (rc == 0) > { > struct rtnet_device *rtdev = rt.rtdev; > ... > } > ... > #endif /* CONFIG_RTNET_ADDON_PROXY_ARP */ > > For ARP handled by Linux, I forward all out-going packets directly from > rtproxy to rteth0, or a device specified with the module parameter > rtdev_attach. Side note: as Gilles already mentioned, I would make sense > to have an rtproxy* for every rteth*. In the other case the out-going > packets are routed according to the RTnet routing table, which is a > different use-case. Therefore I tend to make this feature configurable.
Yes, CONFIG_RTNET_ADDON_PROXY_ARP is in fact required to switch between two different modes - and also between two different rtproxy mapping. I would even say that it is mandatory to have one proxy device per rteth device if CONFIG_RTNET_ADDON_PROXY_ARP is on. That avoids the module parameters right from the start. > >>> kfree_rtskb(skb); >>> return 0; >>> } >>> Index: rtnet/addons/rtnetproxy.c >>> =================================================================== >>> --- rtnet.orig/addons/rtnetproxy.c >>> +++ rtnet/addons/rtnetproxy.c >>> @@ -105,6 +105,14 @@ static rtdm_task_t rtnetproxy_thread; >>> >>> static rtdm_sem_t rtnetproxy_sem; >>> >>> +#ifdef CONFIG_RTNET_ADDON_PROXY_ARP >>> +static char* rtdev_attach = "rteth0"; >>> +module_param(rtdev_attach, charp, 0444); >>> +MODULE_PARM_DESC(rtdev_attach, "Attach to the specified RTnet device"); >>> + >>> +struct rtnet_device *rtnetproxy_rtdev; >>> +#endif >>> + >>> /* *********************************************************************** >>> * Returns the next pointer from the ringbuffer or zero if nothing is >>> * available >>> @@ -181,7 +189,10 @@ static inline void send_data_out(struct >>> { >>> >>> struct rtskb *rtskb; >>> +#ifndef CONFIG_RTNET_ADDON_PROXY_ARP >>> struct dest_route rt; >>> + int rc; >>> +#endif >>> >>> struct skb_data_format >>> { >>> @@ -194,7 +205,6 @@ static inline void send_data_out(struct >>> * thus no spaces are allowed! */ >>> >>> struct skb_data_format *pData; >>> - int rc; >>> >>> /* Copy the data from the standard sk_buff to the realtime sk_buff: >>> * Both have the same length. */ >>> @@ -208,6 +218,18 @@ static inline void send_data_out(struct >>> >>> pData = (struct skb_data_format*) rtskb->data; >>> >>> +#ifdef CONFIG_RTNET_ADDON_PROXY_ARP >>> + rtskb->rtdev = rtnetproxy_rtdev; >>> + >>> + /* Call the actual transmit function */ >>> + rtdev_xmit_proxy(rtskb); >>> + >>> + /* The rtskb is freed somewhere deep in the driver... >>> + * No need to do it here. */ >>> + >>> + rtdev_dereference(rtskb->rtdev); >> I know this pattern is not new, but looking at it I wonder if this isn't >> generation a potential use-after-release (if xmitting causes an >> immediate rtskb release)... > > First, there was a bug: rtdev_reference() was missing. The correct code > is shown above. What do you mean with "if xmitting causes an immediate > rtskb release"? OK, meanwhile I understood my own bad feelings about the hunk above: You must not access rtskb after handing it over to rtdev_xmit_proxy. But you also need not, just use rtnetproxy_rtdev. Jan
signature.asc
Description: OpenPGP digital signature
------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________ RTnet-users mailing list RTnet-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rtnet-users