All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
To: Mariusz Janiak <mariuszjaniak@wp.pl>
Cc: Xenomai <xenomai@xenomai.org>
Subject: Re: [Xenomai] Odp: Re: RTnet -- receive broadcast frame at the local machine
Date: Tue, 1 Mar 2016 07:57:19 +0100	[thread overview]
Message-ID: <20160301065719.GE26312@hermes.click-hack.org> (raw)
In-Reply-To: <56d4bee1354dd4.44496383@wp.pl>

On Mon, Feb 29, 2016 at 10:57:53PM +0100, Mariusz Janiak wrote:
> Dnia Poniedzia³ek, 29 Lutego 2016 22:08 Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org> napisa³(a) 
> > On Mon, Feb 29, 2016 at 09:58:25PM +0100, Mariusz Janiak wrote:
> > > Dnia Poniedzia³ek, 29 Lutego 2016 21:29 Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org> napisa³(a) 
> > > > On Mon, Feb 29, 2016 at 09:24:11PM +0100, Mariusz Janiak wrote:
> > > > > Dear Xenomai users,
> > > > > 
> > > > > Since RTnet has been integrated with Xenomai I address this question to you. The question is, how to receive a broadcast frame at the local machine without using the localhost? The issue is following, we have two process with separate rtsockets at the single machine (of course we have different machines in the network but this is not a case). One process send a broadcast UDP frame to the specified UDP port -- we have one rteth device on the machine. The second process listen on that 
> port 
> > > > > (receivefrom) and does not receive the broadcast frame sent by first process. I have found the following thread on the RTnet mailing list 
> > > > > 
> > > > > https://sourceforge.net/p/rtnet/mailman/message/6787561/
> > > > > 
> > > > > Could you please point me the place which should be hacked to duplicate outgoing packets if there are multiple
> > > > > matching routes?
> > > > 
> > > > I ma not sure I understand what you are looking for, but to receive
> > > > on a host the frames sent by that host, you need to enable and load
> > > > the loopback module. When you do that, no hack should be needed.
> > > > 
> > > > -- 
> > > > 					    Gilles.
> > > > https://click-hack.org
> > > 
> > > Hi Gilles,
> > > 
> > > I am pretty sure that loopback module has been loaded, this is standard RTnet configuration that has not been changed by me. Beside that, there is rtlo (127.0.0.1) device which is created when RT_LOOPBACK="yes" in rtnet.conf. 
> > > 
> > > Below you will find simple testcase. Compile this using Xenomai posix skin. 
> > > 
> > > 1) receiver.c
> > > #include <stdio.h>
> > > #include <unistd.h>
> > > #include <stdlib.h>
> > > #include <sys/mman.h>
> > > #include <sys/socket.h>
> > > #include <netinet/in.h>
> > > #include <arpa/inet.h>
> > > #include <rtnet.h>
> > > #define DEF_REC_PORT 1883
> > > 
> > > int sock;
> > > struct sockaddr_in rec_addr;
> > > 
> > > int main()
> > > {
> > >   int enable = 1;
> > >   int buffer[100];
> > >   socklen_t len = sizeof(rec_addr);
> > > 
> > >   mlockall(MCL_CURRENT|MCL_FUTURE);
> > 
> > 1->
> > 
> > > 
> > >   sock = socket(AF_INET, SOCK_DGRAM, 0);
> > 
> > 2->
> > 
> > >   setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &enable, sizeof(enable));
> > 
> > 3->
> > 
> > > 
> > >   memset(&rec_addr, 0, sizeof(struct sockaddr_in));
> > >   rec_addr.sin_family      = AF_INET;
> > >   rec_addr.sin_port        = htons(DEF_REC_PORT);
> > >   rec_addr.sin_addr.s_addr = INADDR_ANY;
> > >   bind(sock, (struct sockaddr *) &rec_addr, sizeof(struct
> > >   sockaddr_in));
> > 
> > 4->
> > 
> > > 
> > >   while (1) {
> > >     memset(buffer, 0, 100);
> > >     recvfrom(sock, buffer, 100, 0, &rec_addr, &len);
> > 
> > 5->
> > 
> > >     printf("%s\n", buffer);
> > >   }
> > >   close(sock);
> > >   return 0;
> > > }
> > > 
> > > 
> > > 2. sender.c
> > > #include <unistd.h>
> > > #include <stdlib.h>
> > > #include <sys/mman.h>
> > > #include <sys/socket.h>
> > > #include <netinet/in.h>
> > > #include <arpa/inet.h>
> > > #include <rtnet.h>
> > > #include <rtnet_config.h>
> > > #define DEF_SND_PORT 1883
> > > #define DEF_SND_IP   "10.0.0.255"
> > > 
> > > int sock;
> > > struct sockaddr_in snd_addr;
> > > int ret, size;
> > > 
> > > int main()
> > > {
> > >   int enable = 1;
> > >   struct in_addr  snd_ip;
> > >   char buffer[] = "Hello";
> > >   socklen_t len = sizeof(snd_addr);
> > > 
> > >   mlockall(MCL_CURRENT|MCL_FUTURE);
> > 
> > 6->
> > 
> > > 
> > >   inet_aton(DEF_SND_IP, &snd_ip);
> > 
> > 7->
> > 
> > >   sock = socket(AF_INET, SOCK_DGRAM, 0);
> > 
> > 8->
> > 
> > >   setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &enable,
> > >   sizeof(enable));
> > 
> > 9->
> > 
> > > 
> > >   memset(&snd_addr, 0, sizeof(struct sockaddr_in));
> > >   snd_addr.sin_family = AF_INET;
> > >   snd_addr.sin_port = htons(DEF_SND_PORT);
> > >   snd_addr.sin_addr = snd_ip;
> > > 
> > >   while (1) {
> > >     ret = sendto(sock, buffer, 6, 0 , &snd_addr, len);
> > 
> > 10->
> > 
> > So, that is 10 function calls without checking the return value.
> > Please check the function return values.
> > 
> > -- 
> > 					    Gilles.
> > https://click-hack.org
> 
> You are right the test case has not been perfect. The answer to the first question, sending to unicast cause that receiver get frames. Regarding the return values of the syscalls when broadcast
> 
> 1 -> 0
> 2 -> 896
> 3 -> -1
> 4 -> 0
> 
> Five is not printed because of waiting on recvfrom
> 
> 6 -> 0
> 7 -> 1
> 8 -> 897
> 9 -> -1
> 10 -> -1
> 10 -> -1
> 10 -> -1
> 10 -> -1
> 10 -> -1

So, finally, the problem is that SO_BROADCAST is not implemented for
RTnet sockets, and that RTnet sendto does not work for a broadcast
address?

-- 
					    Gilles.
https://click-hack.org


  reply	other threads:[~2016-03-01  6:57 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-29 21:57 [Xenomai] Odp: Re: RTnet -- receive broadcast frame at the local machine Mariusz Janiak
2016-03-01  6:57 ` Gilles Chanteperdrix [this message]
  -- strict thread matches above, loose matches on Subject: below --
2016-03-01 21:59 Mariusz Janiak
2016-03-01 22:05 ` Gilles Chanteperdrix
2016-03-01 22:24 Mariusz Janiak
2016-03-02 13:07 ` Gilles Chanteperdrix
2016-03-02 13:25   ` Gilles Chanteperdrix
2016-03-03  9:08 Mariusz Janiak
2016-03-03  9:15 Mariusz Janiak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160301065719.GE26312@hermes.click-hack.org \
    --to=gilles.chanteperdrix@xenomai.org \
    --cc=mariuszjaniak@wp.pl \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.