From mboxrd@z Thu Jan 1 00:00:00 1970 Date: Mon, 29 Feb 2016 22:57:53 +0100 From: "Mariusz Janiak" Message-ID: <56d4bee1354dd4.44496383@wp.pl> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-2" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Subject: [Xenomai] Odp: Re: RTnet -- receive broadcast frame at the local machine List-Id: Discussions about the Xenomai project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gilles Chanteperdrix Cc: Xenomai Dnia Poniedzia=B3ek, 29 Lutego 2016 22:08 Gilles Chanteperdrix napisa=B3(a)=20 > On Mon, Feb 29, 2016 at 09:58:25PM +0100, Mariusz Janiak wrote: > > Dnia Poniedzia=B3ek, 29 Lutego 2016 21:29 Gilles Chanteperdrix napisa=B3(a)=20 > > > On Mon, Feb 29, 2016 at 09:24:11PM +0100, Mariusz Janiak wrote: > > > > Dear Xenomai users, > > > >=20 > > > > Since RTnet has been integrated with Xenomai I address this questio= n to you. The question is, how to receive a broadcast frame at the local ma= chine without using the localhost? The issue is following, we have two proc= ess with separate rtsockets at the single machine (of course we have differ= ent machines in the network but this is not a case). One process send a bro= adcast UDP frame to the specified UDP port -- we have one rteth device on t= he machine. The second process listen on that=20 port=20 > > > > (receivefrom) and does not receive the broadcast frame sent by firs= t process. I have found the following thread on the RTnet mailing list=20 > > > >=20 > > > > https://sourceforge.net/p/rtnet/mailman/message/6787561/ > > > >=20 > > > > Could you please point me the place which should be hacked to dupli= cate outgoing packets if there are multiple > > > > matching routes? > > >=20 > > > 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. > > >=20 > > > --=20 > > > Gilles. > > > https://click-hack.org > >=20 > > Hi Gilles, > >=20 > > 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=3D"yes" in rtnet= .conf.=20 > >=20 > > Below you will find simple testcase. Compile this using Xenomai posix s= kin.=20 > >=20 > > 1) receiver.c > > #include > > #include > > #include > > #include > > #include > > #include > > #include > > #include > > #define DEF_REC_PORT 1883 > >=20 > > int sock; > > struct sockaddr_in rec_addr; > >=20 > > int main() > > { > > int enable =3D 1; > > int buffer[100]; > > socklen_t len =3D sizeof(rec_addr); > >=20 > > mlockall(MCL_CURRENT|MCL_FUTURE); >=20 > 1-> >=20 > >=20 > > sock =3D socket(AF_INET, SOCK_DGRAM, 0); >=20 > 2-> >=20 > > setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &enable, sizeof(enable)); >=20 > 3-> >=20 > >=20 > > memset(&rec_addr, 0, sizeof(struct sockaddr_in)); > > rec_addr.sin_family =3D AF_INET; > > rec_addr.sin_port =3D htons(DEF_REC_PORT); > > rec_addr.sin_addr.s_addr =3D INADDR_ANY; > > bind(sock, (struct sockaddr *) &rec_addr, sizeof(struct > > sockaddr_in)); >=20 > 4-> >=20 > >=20 > > while (1) { > > memset(buffer, 0, 100); > > recvfrom(sock, buffer, 100, 0, &rec_addr, &len); >=20 > 5-> >=20 > > printf("%s\n", buffer); > > } > > close(sock); > > return 0; > > } > >=20 > >=20 > > 2. sender.c > > #include > > #include > > #include > > #include > > #include > > #include > > #include > > #include > > #define DEF_SND_PORT 1883 > > #define DEF_SND_IP "10.0.0.255" > >=20 > > int sock; > > struct sockaddr_in snd_addr; > > int ret, size; > >=20 > > int main() > > { > > int enable =3D 1; > > struct in_addr snd_ip; > > char buffer[] =3D "Hello"; > > socklen_t len =3D sizeof(snd_addr); > >=20 > > mlockall(MCL_CURRENT|MCL_FUTURE); >=20 > 6-> >=20 > >=20 > > inet_aton(DEF_SND_IP, &snd_ip); >=20 > 7-> >=20 > > sock =3D socket(AF_INET, SOCK_DGRAM, 0); >=20 > 8-> >=20 > > setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &enable, > > sizeof(enable)); >=20 > 9-> >=20 > >=20 > > memset(&snd_addr, 0, sizeof(struct sockaddr_in)); > > snd_addr.sin_family =3D AF_INET; > > snd_addr.sin_port =3D htons(DEF_SND_PORT); > > snd_addr.sin_addr =3D snd_ip; > >=20 > > while (1) { > > ret =3D sendto(sock, buffer, 6, 0 , &snd_addr, len); >=20 > 10-> >=20 > So, that is 10 function calls without checking the return value. > Please check the function return values. >=20 > --=20 > Gilles. > https://click-hack.org You are right the test case has not been perfect. The answer to the first q= uestion, sending to unicast cause that receiver get frames. Regarding the r= eturn 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 Regards, Mariusz