[Xenomai-git] Gilles Chanteperdrix : demo/posix: add RTnet eth_p_all demo
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
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
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
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
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; +} _