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

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
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 0000000..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 <jan.kis...@web.de>
+ *
+ *  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 <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#include <signal.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <netpacket/packet.h>
+#include <net/ethernet.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+#include <netinet/ether.h>
+
+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, &param);
+
+       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;
+}


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to