From e846288593f42b90aa4b726badafc747a5ecdbf4 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 21 Jun 2017 14:35:19 +0200 Subject: Add rtems_bsd_set_if_input() --- freebsd/sys/net/if.c | 16 ++++++++ freebsd/sys/net/if_var.h | 14 +++++++ libbsd.py | 1 + libbsd_waf.py | 1 + rtemsbsd/include/rtems/bsd/zerocopy.h | 25 +++++++++++- rtemsbsd/rtems/rtems-bsd-set-if-input.c | 71 +++++++++++++++++++++++++++++++++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 rtemsbsd/rtems/rtems-bsd-set-if-input.c diff --git a/freebsd/sys/net/if.c b/freebsd/sys/net/if.c index 9e765480..b4a29257 100644 --- a/freebsd/sys/net/if.c +++ b/freebsd/sys/net/if.c @@ -2698,6 +2698,22 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) break; } +#ifdef __rtems__ + case RTEMS_SIOSIFINPUT: + if (ifp->if_input_arg == NULL) { + struct rtems_ifinputreq *ifipfr; + + ifipfr = (struct rtems_ifinputreq *)data; + ifipfr->old_if_input = ifp->if_input; + ifp->if_input_arg = ifipfr->arg; + (*ifipfr->init)(ifp, ifipfr->arg); + ifp->if_input = ifipfr->new_if_input; + error = 0; + } else { + return (EEXIST); + } + break; +#endif /* __rtems__ */ default: error = ENOIOCTL; break; diff --git a/freebsd/sys/net/if_var.h b/freebsd/sys/net/if_var.h index e5d5c760..c4601694 100644 --- a/freebsd/sys/net/if_var.h +++ b/freebsd/sys/net/if_var.h @@ -354,13 +354,27 @@ struct ifnet { if_snd_tag_query_t *if_snd_tag_query; if_snd_tag_free_t *if_snd_tag_free; +#ifndef __rtems__ /* * Spare fields to be added before branching a stable branch, so * that structure can be enhanced without changing the kernel * binary interface. */ int if_ispare[4]; /* general use */ +#else /* __rtems__ */ + void *if_input_arg; +#endif /* __rtems__ */ }; +#ifdef __rtems__ +struct rtems_ifinputreq { + char ifr_name[IFNAMSIZ]; + void *arg; + void (*init)(struct ifnet *, void *); + void (*new_if_input)(struct ifnet *, struct mbuf *); + void (*old_if_input)(struct ifnet *, struct mbuf *); +}; +#define RTEMS_SIOSIFINPUT _IOWR('i', 255, struct rtems_ifinputreq) +#endif /* __rtems__ */ /* for compatibility with other BSDs */ #define if_name(ifp) ((ifp)->if_xname) diff --git a/libbsd.py b/libbsd.py index 62a9cb8a..abc405a3 100644 --- a/libbsd.py +++ b/libbsd.py @@ -72,6 +72,7 @@ def rtems(mm): 'rtems/rtems-bsd-rc-conf-net.c', 'rtems/rtems-bsd-rc-conf-pf.c', 'rtems/rtems-bsd-rc-conf.c', + 'rtems/rtems-bsd-set-if-input.c', 'rtems/rtems-bsd-shell-arp.c', 'rtems/rtems-bsd-shell-ifconfig.c', 'rtems/rtems-bsd-shell-netstat.c', diff --git a/libbsd_waf.py b/libbsd_waf.py index 030c2687..65ad934f 100644 --- a/libbsd_waf.py +++ b/libbsd_waf.py @@ -2197,6 +2197,7 @@ def build(bld): 'rtemsbsd/rtems/rtems-bsd-rc-conf-pf.c', 'rtemsbsd/rtems/rtems-bsd-rc-conf.c', 'rtemsbsd/rtems/rtems-bsd-regdomain.c', + 'rtemsbsd/rtems/rtems-bsd-set-if-input.c', 'rtemsbsd/rtems/rtems-bsd-shell-arp.c', 'rtemsbsd/rtems/rtems-bsd-shell-dhcpcd.c', 'rtemsbsd/rtems/rtems-bsd-shell-ifconfig.c', diff --git a/rtemsbsd/include/rtems/bsd/zerocopy.h b/rtemsbsd/include/rtems/bsd/zerocopy.h index 2916c5ba..b15333c4 100644 --- a/rtemsbsd/include/rtems/bsd/zerocopy.h +++ b/rtemsbsd/include/rtems/bsd/zerocopy.h @@ -7,7 +7,7 @@ */ /* - * Copyright (c) 2015 embedded brains GmbH. All rights reserved. + * Copyright (c) 2015, 2017 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -61,6 +61,29 @@ void rtems_bsd_m_free(struct mbuf *m); int rtems_bsd_sendto(int socket, struct mbuf *m, int flags, const struct sockaddr *dest_addr); +struct ifnet; + +typedef void (*rtems_bsd_if_input_init)(struct ifnet *, void *); + +typedef void (*rtems_bsd_if_input)(struct ifnet *, struct mbuf *); + +/** + * @brief Sets the interface input handler of the specified network interface. + * + * @param ifname The network interface name. + * @param init Initialization routine called right before the new interface + * input handler is registered in the context of the executing thread. + * @param if_input The new interface input handler. + * @param arg The interface input handler argument available via struct + * ifnet::if_input_arg. + * + * @retval NULL An error occurred. + * @retval other The old interface input handler. + */ +rtems_bsd_if_input rtems_bsd_set_if_input(const char *ifname, + rtems_bsd_if_input_init init, rtems_bsd_if_input if_input, + void *arg); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/rtemsbsd/rtems/rtems-bsd-set-if-input.c b/rtemsbsd/rtems/rtems-bsd-set-if-input.c new file mode 100644 index 00000000..f864ae99 --- /dev/null +++ b/rtemsbsd/rtems/rtems-bsd-set-if-input.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2017 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 +#include + +#include +#include + +#include +#include + +#include + +rtems_bsd_if_input +rtems_bsd_set_if_input(const char *ifname, + rtems_bsd_if_input_init init, rtems_bsd_if_input if_input, void *arg) +{ + struct rtems_ifinputreq ifr; + int s; + int rv; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) { + return (NULL); + } + + memset(&ifr, 0, sizeof(ifr)); + strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + ifr.arg = arg; + ifr.init = init; + ifr.new_if_input = if_input; + + rv = ioctl(s, RTEMS_SIOSIFINPUT, (caddr_t)&ifr); + close(s); + + if (rv != 0) { + return (NULL); + } + + return (ifr.old_if_input); +} -- cgit v1.2.3