From ecda18104e1ac2a5c0a5d146f78b2ef0cebada6e Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Fri, 9 Dec 2016 11:51:50 +0100 Subject: [PATCH] freebsd/wlanstats: Port to FreeBSD. --- builder.py | 1 + freebsd/tools/tools/net80211/wlanstats/main.c | 63 +++++++++++++++++++ .../wlanstats/rtems-bsd-wlanstats-data.h | 4 ++ .../wlanstats/rtems-bsd-wlanstats-main-data.h | 5 ++ .../wlanstats/rtems-bsd-wlanstats-namespace.h | 8 +++ .../rtems-bsd-wlanstats-wlanstats-data.h | 4 ++ .../tools/net80211/wlanstats/wlanstats.c | 10 +++ libbsd.py | 23 +++++++ libbsd_waf.py | 5 ++ rtemsbsd/include/machine/rtems-bsd-commands.h | 2 + rtemsbsd/include/rtems/netcmds-config.h | 2 + rtemsbsd/rtems/rtems-bsd-shell-wlanstats.c | 42 +++++++++++++ .../rtems/bsd/test/default-network-init.h | 3 +- 13 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-data.h create mode 100644 freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-main-data.h create mode 100644 freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-namespace.h create mode 100644 freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-wlanstats-data.h create mode 100644 rtemsbsd/rtems/rtems-bsd-shell-wlanstats.c diff --git a/builder.py b/builder.py index 736d129c..a9e991c3 100755 --- a/builder.py +++ b/builder.py @@ -177,6 +177,7 @@ def includes(): '-Ifreebsd/sys/net', '-Ifreebsd/include', '-Ifreebsd/lib', + '-Ifreebsd/lib/libbsdstat', '-Ifreebsd/lib/libc/include', '-Ifreebsd/lib/libc/isc/include', '-Ifreebsd/lib/libc/resolv', diff --git a/freebsd/tools/tools/net80211/wlanstats/main.c b/freebsd/tools/tools/net80211/wlanstats/main.c index 5d8755a4..5f1956ed 100644 --- a/freebsd/tools/tools/net80211/wlanstats/main.c +++ b/freebsd/tools/tools/net80211/wlanstats/main.c @@ -1,5 +1,9 @@ #include +#ifdef __rtems__ +#include "rtems-bsd-wlanstats-namespace.h" +#endif /* __rtems__ */ + /*- * Copyright (c) 2002-2007 Sam Leffler, Errno Consulting * All rights reserved. @@ -36,6 +40,12 @@ * (default interface is wlan0). */ +#ifdef __rtems__ +#define __need_getopt_newlib +#include +#include +#include +#endif /* __rtems__ */ #include #include @@ -50,8 +60,15 @@ #include #include "wlanstats.h" +#ifdef __rtems__ +#include "rtems-bsd-wlanstats-main-data.h" +#endif /* __rtems__ */ +#ifndef __rtems__ static struct { +#else /* __rtems__ */ +static const struct { +#endif /* __rtems__ */ const char *tag; const char *fmt; } tags[] = { @@ -163,6 +180,29 @@ usage(void) { printf("wlanstats: [-ah] [-i ifname] [-l] [-o fmt] [interval]\n"); } +#ifdef __rtems__ +static int main(int argc, char *argv[]); + +RTEMS_LINKER_RWSET(bsd_prog_wlanstats, char); + +int +rtems_bsd_command_wlanstats(int argc, char *argv[]) +{ + int exit_code; + void *data_begin; + size_t data_size; + + data_begin = RTEMS_LINKER_SET_BEGIN(bsd_prog_wlanstats); + data_size = RTEMS_LINKER_SET_SIZE(bsd_prog_wlanstats); + + rtems_bsd_program_lock(); + exit_code = rtems_bsd_program_call_main_with_data_restore("wlanstats", + main, argc, argv, data_begin, data_size); + rtems_bsd_program_unlock(); + + return exit_code; +} +#endif /* __rtems__ */ int main(int argc, char *argv[]) { @@ -172,6 +212,15 @@ main(int argc, char *argv[]) const char *ifname; int allnodes = 0; int c, mode; +#ifdef __rtems__ + struct getopt_data getopt_data; + memset(&getopt_data, 0, sizeof(getopt_data)); +#define optind getopt_data.optind +#define optarg getopt_data.optarg +#define opterr getopt_data.opterr +#define optopt getopt_data.optopt +#define getopt(argc, argv, opt) getopt_r(argc, argv, "+" opt, &getopt_data) +#endif /* __rtems__ */ ifname = getenv("WLAN"); if (ifname == NULL) @@ -234,10 +283,24 @@ main(int argc, char *argv[]) wf->print_total(wf, stdout); } fflush(stdout); +#ifndef __rtems__ omask = sigblock(sigmask(SIGALRM)); if (!signalled) sigpause(0); sigsetmask(omask); +#else /* __rtems__ */ + { + sigset_t oldmask, desired, empty; + + sigemptyset(&empty); + sigemptyset(&desired); + sigaddset(&desired, SIGALRM); + sigprocmask(SIG_BLOCK, &desired, &oldmask); + while (!signalled) + sigsuspend(&desired); + sigprocmask(SIG_SETMASK, &oldmask, NULL); + } +#endif /* __rtems__ */ signalled = 0; alarm(interval); line++; diff --git a/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-data.h b/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-data.h new file mode 100644 index 00000000..65e7a694 --- /dev/null +++ b/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-data.h @@ -0,0 +1,4 @@ +/* generated by userspace-header-gen.py */ +#include +/* main.c */ +/* wlanstats.c */ diff --git a/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-main-data.h b/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-main-data.h new file mode 100644 index 00000000..f88c5834 --- /dev/null +++ b/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-main-data.h @@ -0,0 +1,5 @@ +/* generated by userspace-header-gen.py */ +#include +#include "rtems-bsd-wlanstats-data.h" +/* main.c */ +RTEMS_LINKER_RWSET_CONTENT(bsd_prog_wlanstats, static int signalled); diff --git a/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-namespace.h b/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-namespace.h new file mode 100644 index 00000000..f7a991f7 --- /dev/null +++ b/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-namespace.h @@ -0,0 +1,8 @@ +/* generated by userspace-header-gen.py */ +/* main.c */ +#define main _bsd_wlanstats_main +#define usage _bsd_wlanstats_usage +/* wlanstats.c */ +#define wlanstats_new _bsd_wlanstats_wlanstats_new +#define setstatus _bsd_wlanstats_setstatus +#define setreason _bsd_wlanstats_setreason diff --git a/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-wlanstats-data.h b/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-wlanstats-data.h new file mode 100644 index 00000000..a37f7cb6 --- /dev/null +++ b/freebsd/tools/tools/net80211/wlanstats/rtems-bsd-wlanstats-wlanstats-data.h @@ -0,0 +1,4 @@ +/* generated by userspace-header-gen.py */ +#include +#include "rtems-bsd-wlanstats-data.h" +/* wlanstats.c */ diff --git a/freebsd/tools/tools/net80211/wlanstats/wlanstats.c b/freebsd/tools/tools/net80211/wlanstats/wlanstats.c index b33a03aa..8211029a 100644 --- a/freebsd/tools/tools/net80211/wlanstats/wlanstats.c +++ b/freebsd/tools/tools/net80211/wlanstats/wlanstats.c @@ -1,5 +1,9 @@ #include +#ifdef __rtems__ +#include "rtems-bsd-wlanstats-namespace.h" +#endif /* __rtems__ */ + /*- * Copyright (c) 2002-2007 Sam Leffler, Errno Consulting * All rights reserved. @@ -35,6 +39,9 @@ * net80211 statistics class. */ +#ifdef __rtems__ +#include +#endif /* __rtems__ */ #include #include #include @@ -57,6 +64,9 @@ #include "../../../../sys/net80211/ieee80211_ioctl.h" #include "wlanstats.h" +#ifdef __rtems__ +#include "rtems-bsd-wlanstats-wlanstats-data.h" +#endif /* __rtems__ */ #ifndef IEEE80211_ADDR_COPY #define IEEE80211_ADDR_COPY(dst, src) memcpy(dst, src, IEEE80211_ADDR_LEN) diff --git a/libbsd.py b/libbsd.py index 392b5fb6..7264ac4a 100755 --- a/libbsd.py +++ b/libbsd.py @@ -78,6 +78,7 @@ def rtems(mm): 'rtems/rtems-bsd-shell-sysctl.c', 'rtems/rtems-bsd-shell-tcpdump.c', 'rtems/rtems-bsd-shell-vmstat.c', + 'rtems/rtems-bsd-shell-wlanstats.c', 'rtems/rtems-bsd-syscall-api.c', 'rtems/rtems-kernel-assert.c', 'rtems/rtems-kernel-autoconf.c', @@ -2454,6 +2455,27 @@ def user_space(mm): ) return mod +# +# User space: wlanstats utility +# +def user_space_wlanstats(mm): + mod = builder.Module('user_space_wlanstats') + mod.addUserSpaceHeaderFiles( + [ + 'tools/tools/net80211/wlanstats/wlanstats.h', + 'lib/libbsdstat/bsdstat.h', + ] + ) + mod.addUserSpaceSourceFiles( + [ + 'tools/tools/net80211/wlanstats/main.c', + 'tools/tools/net80211/wlanstats/wlanstats.c', + 'lib/libbsdstat/bsdstat.c', + ], + mm.generator['source'](['-DINET6', '-DINET']) + ) + return mod + # # Contrib expat # @@ -3063,6 +3085,7 @@ def sources(mm): mm.addModule(in_cksum(mm)) mm.addModule(user_space(mm)) + mm.addModule(user_space_wlanstats(mm)) mm.addModule(contrib_expat(mm)) mm.addModule(contrib_libpcap(mm)) mm.addModule(usr_sbin_tcpdump(mm)) diff --git a/libbsd_waf.py b/libbsd_waf.py index 6a040329..ecd87af7 100644 --- a/libbsd_waf.py +++ b/libbsd_waf.py @@ -67,6 +67,7 @@ def build(bld): includes += ["freebsd/sys/net"] includes += ["freebsd/include"] includes += ["freebsd/lib"] + includes += ["freebsd/lib/libbsdstat"] includes += ["freebsd/lib/libc/include"] includes += ["freebsd/lib/libc/isc/include"] includes += ["freebsd/lib/libc/resolv"] @@ -250,6 +251,7 @@ def build(bld): 'freebsd/contrib/libxo/libxo/xo_encoder.c', 'freebsd/lib/lib80211/lib80211_ioctl.c', 'freebsd/lib/lib80211/lib80211_regdomain.c', + 'freebsd/lib/libbsdstat/bsdstat.c', 'freebsd/lib/libc/gen/err.c', 'freebsd/lib/libc/gen/feature_present.c', 'freebsd/lib/libc/gen/getdomainname.c', @@ -450,6 +452,8 @@ def build(bld): 'freebsd/sbin/ping6/ping6.c', 'freebsd/sbin/route/route.c', 'freebsd/sbin/sysctl/sysctl.c', + 'freebsd/tools/tools/net80211/wlanstats/main.c', + 'freebsd/tools/tools/net80211/wlanstats/wlanstats.c', 'freebsd/usr.bin/netstat/bpf.c', 'freebsd/usr.bin/netstat/flowtable.c', 'freebsd/usr.bin/netstat/if.c', @@ -1272,6 +1276,7 @@ def build(bld): 'rtemsbsd/rtems/rtems-bsd-shell-sysctl.c', 'rtemsbsd/rtems/rtems-bsd-shell-tcpdump.c', 'rtemsbsd/rtems/rtems-bsd-shell-vmstat.c', + 'rtemsbsd/rtems/rtems-bsd-shell-wlanstats.c', 'rtemsbsd/rtems/rtems-bsd-syscall-api.c', 'rtemsbsd/rtems/rtems-kernel-assert.c', 'rtemsbsd/rtems/rtems-kernel-autoconf.c', diff --git a/rtemsbsd/include/machine/rtems-bsd-commands.h b/rtemsbsd/include/machine/rtems-bsd-commands.h index 52137b02..c0524c8a 100644 --- a/rtemsbsd/include/machine/rtems-bsd-commands.h +++ b/rtemsbsd/include/machine/rtems-bsd-commands.h @@ -68,6 +68,8 @@ int rtems_bsd_command_sysctl(int argc, char **argv); int rtems_bsd_command_vmstat(int argc, char **argv); +int rtems_bsd_command_wlanstats(int argc, char **argv); + __END_DECLS #endif /* _RTEMS_BSD_MACHINE_RTEMS_BSD_COMMANDS_H_ */ diff --git a/rtemsbsd/include/rtems/netcmds-config.h b/rtemsbsd/include/rtems/netcmds-config.h index 9a2a2861..b3bc66f2 100644 --- a/rtemsbsd/include/rtems/netcmds-config.h +++ b/rtemsbsd/include/rtems/netcmds-config.h @@ -43,6 +43,8 @@ extern rtems_shell_cmd_t rtems_shell_SYSCTL_Command; extern rtems_shell_cmd_t rtems_shell_VMSTAT_Command; +extern rtems_shell_cmd_t rtems_shell_WLANSTATS_Command; + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/rtemsbsd/rtems/rtems-bsd-shell-wlanstats.c b/rtemsbsd/rtems/rtems-bsd-shell-wlanstats.c new file mode 100644 index 00000000..7befb966 --- /dev/null +++ b/rtemsbsd/rtems/rtems-bsd-shell-wlanstats.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +rtems_shell_cmd_t rtems_shell_WLANSTATS_Command = { + "wlanstats", /* name */ + "wlanstats [args]", /* usage */ + "net", /* topic */ + rtems_bsd_command_wlanstats, /* command */ + NULL, /* alias */ + NULL /* next */ +}; diff --git a/testsuite/include/rtems/bsd/test/default-network-init.h b/testsuite/include/rtems/bsd/test/default-network-init.h index 9cdbff5a..867bd2b7 100644 --- a/testsuite/include/rtems/bsd/test/default-network-init.h +++ b/testsuite/include/rtems/bsd/test/default-network-init.h @@ -365,7 +365,8 @@ Init(rtems_task_argument arg) &rtems_shell_IFCONFIG_Command, \ &rtems_shell_TCPDUMP_Command, \ &rtems_shell_SYSCTL_Command, \ - &rtems_shell_VMSTAT_Command + &rtems_shell_VMSTAT_Command, \ + &rtems_shell_WLANSTATS_Command #define CONFIGURE_SHELL_COMMAND_CPUUSE #define CONFIGURE_SHELL_COMMAND_PERIODUSE