[Xenomai-git] Gilles Chanteperdrix : demo/posix: add RTnet eth_p_all demo

2015-10-01 Thread git repository hosting
Module: xenomai-gch
Branch: for-forge
Commit: cb2054107c035cc326dc2021628db834ed1580db
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=cb2054107c035cc326dc2021628db834ed1580db

Author: Gilles Chanteperdrix 
Date:   Tue Sep 29 23:07:17 2015 +0200

demo/posix: add RTnet eth_p_all demo

---

 demo/posix/cobalt/Makefile.am |   23 ++---
 demo/posix/cobalt/eth_p_all.c |  108 +
 2 files changed, 123 insertions(+), 8 deletions(-)

diff --git a/demo/posix/cobalt/Makefile.am b/demo/posix/cobalt/Makefile.am
index 1af5d01..457f085 100644
--- a/demo/posix/cobalt/Makefile.am
+++ b/demo/posix/cobalt/Makefile.am
@@ -2,15 +2,18 @@ demodir = @XENO_DEMO_DIR@
 
 CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 
+SUBDIRS = cyclictest
+
 demo_PROGRAMS =\
bufp-label  \
bufp-readwrite  \
+   can_rtt \
+   eth_p_all   \
iddp-label  \
iddp-sendrecv   \
xddp-echo   \
xddp-label  \
-   xddp-stream \
-   can_rtt
+   xddp-stream
 
 cppflags = \
$(XENO_USER_CFLAGS) \
@@ -33,6 +36,16 @@ bufp_readwrite_CPPFLAGS = $(cppflags)
 bufp_readwrite_LDFLAGS = $(ldflags)
 bufp_readwrite_LDADD = $(ldadd)
 
+can_rtt_SOURCES = can-rtt.c
+can_rtt_CPPFLAGS = $(cppflags)
+can_rtt_LDFLAGS = $(ldflags)
+can_rtt_LDADD = $(ldadd)
+
+eth_p_all_SOURCES = eth_p_all.c
+eth_p_all_CPPFLAGS = $(cppflags)
+eth_p_all_LDFLAGS = $(ldflags)
+eth_p_all_LDADD = $(ldadd)
+
 iddp_label_SOURCES = iddp-label.c
 iddp_label_CPPFLAGS = $(cppflags)
 iddp_label_LDFLAGS = $(ldflags)
@@ -58,9 +71,3 @@ xddp_stream_CPPFLAGS = $(cppflags)
 xddp_stream_LDFLAGS = $(ldflags)
 xddp_stream_LDADD = $(ldadd)
 
-can_rtt_SOURCES = can-rtt.c
-can_rtt_CPPFLAGS = $(cppflags)
-can_rtt_LDFLAGS = $(ldflags)
-can_rtt_LDADD = $(ldadd)
-
-SUBDIRS = cyclictest
diff --git a/demo/posix/cobalt/eth_p_all.c b/demo/posix/cobalt/eth_p_all.c
new file mode 100644
index 000..6ac12ab
--- /dev/null
+++ b/demo/posix/cobalt/eth_p_all.c
@@ -0,0 +1,108 @@
+/***
+ *
+ *  demo/posix/cobalt/rtnet-eth_p_all.c
+ *
+ *  ETH_P_ALL receiver - listens for all incoming packets and dumps them
+ *
+ *  Copyright (C) 2006 Jan Kiszka 
+ *
+ *  RTnet - real-time networking example
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+char buffer[10*1024];
+int sock;
+
+
+static void catch_signal(int sig)
+{
+   close(sock);
+}
+
+
+int main(int argc, char *argv[])
+{
+   struct sched_param param = { .sched_priority = 1 };
+   ssize_t len;
+   struct sockaddr_ll addr;
+   struct ether_header *eth = (struct ether_header *)buffer;
+
+
+   signal(SIGTERM, catch_signal);
+   signal(SIGINT, catch_signal);
+   signal(SIGHUP, catch_signal);
+   mlockall(MCL_CURRENT|MCL_FUTURE);
+
+   if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
+   perror("socket cannot be created");
+   return EXIT_FAILURE;
+   }
+
+   if (argc > 1) {
+   struct ifreq ifr;
+
+   strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
+   if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
+   perror("cannot get interface index");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+
+   addr.sll_family   = AF_PACKET;
+   addr.sll_protocol = ETH_P_ALL;
+   addr.sll_ifindex  = ifr.ifr_ifindex;
+
+   if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+   perror("cannot bind to local ip/port");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+   }
+
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
+
+   while (1) {
+   len = recv(sock, buffer, sizeof(buffer), 0);
+   if (len < 0)
+   break;
+
+   printf("from: %s type: %04x length=%zd\n",
+   ether_ntoa((struct ether_addr *)eth->ether_shost),
+   ntohs(eth->ether_type), len);
+   

[Xenomai-git] Gilles Chanteperdrix : demo/posix: add RTnet eth_p_all demo

2015-10-01 Thread git repository hosting
Module: xenomai-gch
Branch: for-forge
Commit: 9ac4fb558cce352508fb1a129892cdcd75d7feb9
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=9ac4fb558cce352508fb1a129892cdcd75d7feb9

Author: Gilles Chanteperdrix 
Date:   Tue Sep 29 23:07:17 2015 +0200

demo/posix: add RTnet eth_p_all demo

---

 demo/posix/cobalt/Makefile.am |   23 ++---
 demo/posix/cobalt/eth_p_all.c |  108 +
 2 files changed, 123 insertions(+), 8 deletions(-)

diff --git a/demo/posix/cobalt/Makefile.am b/demo/posix/cobalt/Makefile.am
index 1af5d01..457f085 100644
--- a/demo/posix/cobalt/Makefile.am
+++ b/demo/posix/cobalt/Makefile.am
@@ -2,15 +2,18 @@ demodir = @XENO_DEMO_DIR@
 
 CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 
+SUBDIRS = cyclictest
+
 demo_PROGRAMS =\
bufp-label  \
bufp-readwrite  \
+   can_rtt \
+   eth_p_all   \
iddp-label  \
iddp-sendrecv   \
xddp-echo   \
xddp-label  \
-   xddp-stream \
-   can_rtt
+   xddp-stream
 
 cppflags = \
$(XENO_USER_CFLAGS) \
@@ -33,6 +36,16 @@ bufp_readwrite_CPPFLAGS = $(cppflags)
 bufp_readwrite_LDFLAGS = $(ldflags)
 bufp_readwrite_LDADD = $(ldadd)
 
+can_rtt_SOURCES = can-rtt.c
+can_rtt_CPPFLAGS = $(cppflags)
+can_rtt_LDFLAGS = $(ldflags)
+can_rtt_LDADD = $(ldadd)
+
+eth_p_all_SOURCES = eth_p_all.c
+eth_p_all_CPPFLAGS = $(cppflags)
+eth_p_all_LDFLAGS = $(ldflags)
+eth_p_all_LDADD = $(ldadd)
+
 iddp_label_SOURCES = iddp-label.c
 iddp_label_CPPFLAGS = $(cppflags)
 iddp_label_LDFLAGS = $(ldflags)
@@ -58,9 +71,3 @@ xddp_stream_CPPFLAGS = $(cppflags)
 xddp_stream_LDFLAGS = $(ldflags)
 xddp_stream_LDADD = $(ldadd)
 
-can_rtt_SOURCES = can-rtt.c
-can_rtt_CPPFLAGS = $(cppflags)
-can_rtt_LDFLAGS = $(ldflags)
-can_rtt_LDADD = $(ldadd)
-
-SUBDIRS = cyclictest
diff --git a/demo/posix/cobalt/eth_p_all.c b/demo/posix/cobalt/eth_p_all.c
new file mode 100644
index 000..6ac12ab
--- /dev/null
+++ b/demo/posix/cobalt/eth_p_all.c
@@ -0,0 +1,108 @@
+/***
+ *
+ *  demo/posix/cobalt/rtnet-eth_p_all.c
+ *
+ *  ETH_P_ALL receiver - listens for all incoming packets and dumps them
+ *
+ *  Copyright (C) 2006 Jan Kiszka 
+ *
+ *  RTnet - real-time networking example
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+char buffer[10*1024];
+int sock;
+
+
+static void catch_signal(int sig)
+{
+   close(sock);
+}
+
+
+int main(int argc, char *argv[])
+{
+   struct sched_param param = { .sched_priority = 1 };
+   ssize_t len;
+   struct sockaddr_ll addr;
+   struct ether_header *eth = (struct ether_header *)buffer;
+
+
+   signal(SIGTERM, catch_signal);
+   signal(SIGINT, catch_signal);
+   signal(SIGHUP, catch_signal);
+   mlockall(MCL_CURRENT|MCL_FUTURE);
+
+   if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
+   perror("socket cannot be created");
+   return EXIT_FAILURE;
+   }
+
+   if (argc > 1) {
+   struct ifreq ifr;
+
+   strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
+   if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
+   perror("cannot get interface index");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+
+   addr.sll_family   = AF_PACKET;
+   addr.sll_protocol = ETH_P_ALL;
+   addr.sll_ifindex  = ifr.ifr_ifindex;
+
+   if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+   perror("cannot bind to local ip/port");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+   }
+
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
+
+   while (1) {
+   len = recv(sock, buffer, sizeof(buffer), 0);
+   if (len < 0)
+   break;
+
+   printf("from: %s type: %04x length=%zd\n",
+   ether_ntoa((struct ether_addr *)eth->ether_shost),
+   ntohs(eth->ether_type), len);
+   

[Xenomai-git] Gilles Chanteperdrix : demo/posix: add RTnet eth_p_all demo

2015-09-30 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: 74f68010afe726422bc8a2af264af3fc4d968959
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=74f68010afe726422bc8a2af264af3fc4d968959

Author: Gilles Chanteperdrix 
Date:   Tue Sep 29 23:07:17 2015 +0200

demo/posix: add RTnet eth_p_all demo

---

 demo/posix/cobalt/Makefile.am |   23 ++---
 demo/posix/cobalt/eth_p_all.c |  108 +
 2 files changed, 123 insertions(+), 8 deletions(-)

diff --git a/demo/posix/cobalt/Makefile.am b/demo/posix/cobalt/Makefile.am
index 1af5d01..457f085 100644
--- a/demo/posix/cobalt/Makefile.am
+++ b/demo/posix/cobalt/Makefile.am
@@ -2,15 +2,18 @@ demodir = @XENO_DEMO_DIR@
 
 CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 
+SUBDIRS = cyclictest
+
 demo_PROGRAMS =\
bufp-label  \
bufp-readwrite  \
+   can_rtt \
+   eth_p_all   \
iddp-label  \
iddp-sendrecv   \
xddp-echo   \
xddp-label  \
-   xddp-stream \
-   can_rtt
+   xddp-stream
 
 cppflags = \
$(XENO_USER_CFLAGS) \
@@ -33,6 +36,16 @@ bufp_readwrite_CPPFLAGS = $(cppflags)
 bufp_readwrite_LDFLAGS = $(ldflags)
 bufp_readwrite_LDADD = $(ldadd)
 
+can_rtt_SOURCES = can-rtt.c
+can_rtt_CPPFLAGS = $(cppflags)
+can_rtt_LDFLAGS = $(ldflags)
+can_rtt_LDADD = $(ldadd)
+
+eth_p_all_SOURCES = eth_p_all.c
+eth_p_all_CPPFLAGS = $(cppflags)
+eth_p_all_LDFLAGS = $(ldflags)
+eth_p_all_LDADD = $(ldadd)
+
 iddp_label_SOURCES = iddp-label.c
 iddp_label_CPPFLAGS = $(cppflags)
 iddp_label_LDFLAGS = $(ldflags)
@@ -58,9 +71,3 @@ xddp_stream_CPPFLAGS = $(cppflags)
 xddp_stream_LDFLAGS = $(ldflags)
 xddp_stream_LDADD = $(ldadd)
 
-can_rtt_SOURCES = can-rtt.c
-can_rtt_CPPFLAGS = $(cppflags)
-can_rtt_LDFLAGS = $(ldflags)
-can_rtt_LDADD = $(ldadd)
-
-SUBDIRS = cyclictest
diff --git a/demo/posix/cobalt/eth_p_all.c b/demo/posix/cobalt/eth_p_all.c
new file mode 100644
index 000..6ac12ab
--- /dev/null
+++ b/demo/posix/cobalt/eth_p_all.c
@@ -0,0 +1,108 @@
+/***
+ *
+ *  demo/posix/cobalt/rtnet-eth_p_all.c
+ *
+ *  ETH_P_ALL receiver - listens for all incoming packets and dumps them
+ *
+ *  Copyright (C) 2006 Jan Kiszka 
+ *
+ *  RTnet - real-time networking example
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+char buffer[10*1024];
+int sock;
+
+
+static void catch_signal(int sig)
+{
+   close(sock);
+}
+
+
+int main(int argc, char *argv[])
+{
+   struct sched_param param = { .sched_priority = 1 };
+   ssize_t len;
+   struct sockaddr_ll addr;
+   struct ether_header *eth = (struct ether_header *)buffer;
+
+
+   signal(SIGTERM, catch_signal);
+   signal(SIGINT, catch_signal);
+   signal(SIGHUP, catch_signal);
+   mlockall(MCL_CURRENT|MCL_FUTURE);
+
+   if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
+   perror("socket cannot be created");
+   return EXIT_FAILURE;
+   }
+
+   if (argc > 1) {
+   struct ifreq ifr;
+
+   strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
+   if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
+   perror("cannot get interface index");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+
+   addr.sll_family   = AF_PACKET;
+   addr.sll_protocol = ETH_P_ALL;
+   addr.sll_ifindex  = ifr.ifr_ifindex;
+
+   if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+   perror("cannot bind to local ip/port");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+   }
+
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
+
+   while (1) {
+   len = recv(sock, buffer, sizeof(buffer), 0);
+   if (len < 0)
+   break;
+
+   printf("from: %s type: %04x length=%zd\n",
+   ether_ntoa((struct ether_addr *)eth->ether_shost),
+   ntohs(eth->ether_type), len);
+   }
+
+

[Xenomai-git] Gilles Chanteperdrix : demo/posix: add RTnet eth_p_all demo

2015-09-30 Thread git repository hosting
Module: xenomai-gch
Branch: for-forge
Commit: 74f68010afe726422bc8a2af264af3fc4d968959
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=74f68010afe726422bc8a2af264af3fc4d968959

Author: Gilles Chanteperdrix 
Date:   Tue Sep 29 23:07:17 2015 +0200

demo/posix: add RTnet eth_p_all demo

---

 demo/posix/cobalt/Makefile.am |   23 ++---
 demo/posix/cobalt/eth_p_all.c |  108 +
 2 files changed, 123 insertions(+), 8 deletions(-)

diff --git a/demo/posix/cobalt/Makefile.am b/demo/posix/cobalt/Makefile.am
index 1af5d01..457f085 100644
--- a/demo/posix/cobalt/Makefile.am
+++ b/demo/posix/cobalt/Makefile.am
@@ -2,15 +2,18 @@ demodir = @XENO_DEMO_DIR@
 
 CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 
+SUBDIRS = cyclictest
+
 demo_PROGRAMS =\
bufp-label  \
bufp-readwrite  \
+   can_rtt \
+   eth_p_all   \
iddp-label  \
iddp-sendrecv   \
xddp-echo   \
xddp-label  \
-   xddp-stream \
-   can_rtt
+   xddp-stream
 
 cppflags = \
$(XENO_USER_CFLAGS) \
@@ -33,6 +36,16 @@ bufp_readwrite_CPPFLAGS = $(cppflags)
 bufp_readwrite_LDFLAGS = $(ldflags)
 bufp_readwrite_LDADD = $(ldadd)
 
+can_rtt_SOURCES = can-rtt.c
+can_rtt_CPPFLAGS = $(cppflags)
+can_rtt_LDFLAGS = $(ldflags)
+can_rtt_LDADD = $(ldadd)
+
+eth_p_all_SOURCES = eth_p_all.c
+eth_p_all_CPPFLAGS = $(cppflags)
+eth_p_all_LDFLAGS = $(ldflags)
+eth_p_all_LDADD = $(ldadd)
+
 iddp_label_SOURCES = iddp-label.c
 iddp_label_CPPFLAGS = $(cppflags)
 iddp_label_LDFLAGS = $(ldflags)
@@ -58,9 +71,3 @@ xddp_stream_CPPFLAGS = $(cppflags)
 xddp_stream_LDFLAGS = $(ldflags)
 xddp_stream_LDADD = $(ldadd)
 
-can_rtt_SOURCES = can-rtt.c
-can_rtt_CPPFLAGS = $(cppflags)
-can_rtt_LDFLAGS = $(ldflags)
-can_rtt_LDADD = $(ldadd)
-
-SUBDIRS = cyclictest
diff --git a/demo/posix/cobalt/eth_p_all.c b/demo/posix/cobalt/eth_p_all.c
new file mode 100644
index 000..6ac12ab
--- /dev/null
+++ b/demo/posix/cobalt/eth_p_all.c
@@ -0,0 +1,108 @@
+/***
+ *
+ *  demo/posix/cobalt/rtnet-eth_p_all.c
+ *
+ *  ETH_P_ALL receiver - listens for all incoming packets and dumps them
+ *
+ *  Copyright (C) 2006 Jan Kiszka 
+ *
+ *  RTnet - real-time networking example
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+char buffer[10*1024];
+int sock;
+
+
+static void catch_signal(int sig)
+{
+   close(sock);
+}
+
+
+int main(int argc, char *argv[])
+{
+   struct sched_param param = { .sched_priority = 1 };
+   ssize_t len;
+   struct sockaddr_ll addr;
+   struct ether_header *eth = (struct ether_header *)buffer;
+
+
+   signal(SIGTERM, catch_signal);
+   signal(SIGINT, catch_signal);
+   signal(SIGHUP, catch_signal);
+   mlockall(MCL_CURRENT|MCL_FUTURE);
+
+   if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
+   perror("socket cannot be created");
+   return EXIT_FAILURE;
+   }
+
+   if (argc > 1) {
+   struct ifreq ifr;
+
+   strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
+   if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
+   perror("cannot get interface index");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+
+   addr.sll_family   = AF_PACKET;
+   addr.sll_protocol = ETH_P_ALL;
+   addr.sll_ifindex  = ifr.ifr_ifindex;
+
+   if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+   perror("cannot bind to local ip/port");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+   }
+
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
+
+   while (1) {
+   len = recv(sock, buffer, sizeof(buffer), 0);
+   if (len < 0)
+   break;
+
+   printf("from: %s type: %04x length=%zd\n",
+   ether_ntoa((struct ether_addr *)eth->ether_shost),
+   ntohs(eth->ether_type), len);
+   

[Xenomai-git] Gilles Chanteperdrix : demo/posix: add RTnet eth_p_all demo

2015-09-29 Thread git repository hosting
Module: xenomai-gch
Branch: for-forge
Commit: 5997b7d6e21f47bf158ba6857fbb01d7834f724a
URL:
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=5997b7d6e21f47bf158ba6857fbb01d7834f724a

Author: Gilles Chanteperdrix 
Date:   Tue Sep 29 23:07:17 2015 +0200

demo/posix: add RTnet eth_p_all demo

---

 demo/posix/cobalt/Makefile.am |   19 +---
 demo/posix/cobalt/eth_p_all.c |  108 +
 2 files changed, 121 insertions(+), 6 deletions(-)

diff --git a/demo/posix/cobalt/Makefile.am b/demo/posix/cobalt/Makefile.am
index cb854f3..9726057 100644
--- a/demo/posix/cobalt/Makefile.am
+++ b/demo/posix/cobalt/Makefile.am
@@ -5,12 +5,13 @@ CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 demo_PROGRAMS =\
bufp-label  \
bufp-readwrite  \
+   can_rtt \
+   eth_p_all   \
iddp-label  \
iddp-sendrecv   \
xddp-echo   \
xddp-label  \
-   xddp-stream \
-   can_rtt
+   xddp-stream
 
 cppflags = \
$(XENO_USER_CFLAGS) \
@@ -33,6 +34,16 @@ bufp_readwrite_CPPFLAGS = $(cppflags)
 bufp_readwrite_LDFLAGS = $(ldflags)
 bufp_readwrite_LDADD = $(ldadd)
 
+can_rtt_SOURCES = can-rtt.c
+can_rtt_CPPFLAGS = $(cppflags)
+can_rtt_LDFLAGS = $(ldflags)
+can_rtt_LDADD = $(ldadd)
+
+eth_p_all_SOURCES = eth_p_all.c
+eth_p_all_CPPFLAGS = $(cppflags)
+eth_p_all_LDFLAGS = $(ldflags)
+eth_p_all_LDADD = $(ldadd)
+
 iddp_label_SOURCES = iddp-label.c
 iddp_label_CPPFLAGS = $(cppflags)
 iddp_label_LDFLAGS = $(ldflags)
@@ -58,7 +69,3 @@ xddp_stream_CPPFLAGS = $(cppflags)
 xddp_stream_LDFLAGS = $(ldflags)
 xddp_stream_LDADD = $(ldadd)
 
-can_rtt_SOURCES = can-rtt.c
-can_rtt_CPPFLAGS = $(cppflags)
-can_rtt_LDFLAGS = $(ldflags)
-can_rtt_LDADD = $(ldadd)
diff --git a/demo/posix/cobalt/eth_p_all.c b/demo/posix/cobalt/eth_p_all.c
new file mode 100644
index 000..6ac12ab
--- /dev/null
+++ b/demo/posix/cobalt/eth_p_all.c
@@ -0,0 +1,108 @@
+/***
+ *
+ *  demo/posix/cobalt/rtnet-eth_p_all.c
+ *
+ *  ETH_P_ALL receiver - listens for all incoming packets and dumps them
+ *
+ *  Copyright (C) 2006 Jan Kiszka 
+ *
+ *  RTnet - real-time networking example
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+char buffer[10*1024];
+int sock;
+
+
+static void catch_signal(int sig)
+{
+   close(sock);
+}
+
+
+int main(int argc, char *argv[])
+{
+   struct sched_param param = { .sched_priority = 1 };
+   ssize_t len;
+   struct sockaddr_ll addr;
+   struct ether_header *eth = (struct ether_header *)buffer;
+
+
+   signal(SIGTERM, catch_signal);
+   signal(SIGINT, catch_signal);
+   signal(SIGHUP, catch_signal);
+   mlockall(MCL_CURRENT|MCL_FUTURE);
+
+   if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {
+   perror("socket cannot be created");
+   return EXIT_FAILURE;
+   }
+
+   if (argc > 1) {
+   struct ifreq ifr;
+
+   strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
+   if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
+   perror("cannot get interface index");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+
+   addr.sll_family   = AF_PACKET;
+   addr.sll_protocol = ETH_P_ALL;
+   addr.sll_ifindex  = ifr.ifr_ifindex;
+
+   if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+   perror("cannot bind to local ip/port");
+   close(sock);
+   return EXIT_FAILURE;
+   }
+   }
+
+   pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
+
+   while (1) {
+   len = recv(sock, buffer, sizeof(buffer), 0);
+   if (len < 0)
+   break;
+
+   printf("from: %s type: %04x length=%zd\n",
+   ether_ntoa((struct ether_addr *)eth->ether_shost),
+   ntohs(eth->ether_type), len);
+   }
+
+   printf("shutting down\n");
+
+   return EXIT_SUCCESS;
+}


_