Module: xenomai-3 Branch: next Commit: 00ab5613729904ed7456fd9d8831ac33ff648c1f URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=00ab5613729904ed7456fd9d8831ac33ff648c1f
Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> Date: Tue Sep 29 23:07:17 2015 +0200 demo/posix/cobalt: add RTnet eth_p_all demo --- demo/posix/cobalt/Makefile.am | 20 +++++--- demo/posix/cobalt/eth_p_all.c | 108 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 7 deletions(-) diff --git a/demo/posix/cobalt/Makefile.am b/demo/posix/cobalt/Makefile.am index cb854f3..eedc346 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) @@ -57,8 +68,3 @@ xddp_stream_SOURCES = xddp-stream.c 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 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, ¶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; +} _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://xenomai.org/mailman/listinfo/xenomai-git