mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
Merge pull request #18359 from maribu/lwip/evloop
pkg/lwip: use sys/event for handling ISR and bhp
This commit is contained in:
commit
5ad435477d
@ -3,6 +3,7 @@
|
||||
FEATURES_REQUIRED_ANY += arch_32bit|arch_64bit
|
||||
|
||||
DEFAULT_MODULE += auto_init_lwip
|
||||
USEMODULE += event
|
||||
|
||||
ifneq (,$(filter sock_async,$(USEMODULE)))
|
||||
USEMODULE += lwip_sock_async
|
||||
@ -90,7 +91,7 @@ ifneq (,$(filter lwip_contrib,$(USEMODULE)))
|
||||
USEMODULE += sema
|
||||
USEMODULE += ztimer_msec
|
||||
ifneq (,$(filter bhp,$(USEMODULE)))
|
||||
USEMODULE += bhp_msg
|
||||
USEMODULE += bhp_event
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -14,26 +14,27 @@
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <sys/uio.h>
|
||||
#include <inttypes.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include "architecture.h"
|
||||
#include "event.h"
|
||||
#include "lwip.h"
|
||||
#include "lwip/err.h"
|
||||
#include "lwip/ethip6.h"
|
||||
#include "lwip/netif.h"
|
||||
#include "lwip/netifapi.h"
|
||||
#include "lwip/netif/compat.h"
|
||||
#include "lwip/netif/netdev.h"
|
||||
#include "lwip/netifapi.h"
|
||||
#include "lwip/opt.h"
|
||||
#include "lwip/pbuf.h"
|
||||
#include "netif/etharp.h"
|
||||
#include "netif/lowpan6.h"
|
||||
|
||||
#include "net/eui64.h"
|
||||
#include "net/ieee802154.h"
|
||||
#include "net/ipv6/addr.h"
|
||||
#include "net/netdev.h"
|
||||
#include "net/netopt.h"
|
||||
#include "utlist.h"
|
||||
#include "netif/etharp.h"
|
||||
#include "netif/lowpan6.h"
|
||||
#include "thread.h"
|
||||
|
||||
#define ENABLE_DEBUG 0
|
||||
@ -42,7 +43,6 @@
|
||||
#define LWIP_NETDEV_NAME "lwip_netdev_mux"
|
||||
#define LWIP_NETDEV_PRIO (THREAD_PRIORITY_MAIN - 4)
|
||||
#define LWIP_NETDEV_STACKSIZE (THREAD_STACKSIZE_DEFAULT)
|
||||
#define LWIP_NETDEV_QUEUE_LEN (8)
|
||||
#define LWIP_NETDEV_MSG_TYPE_EVENT 0x1235
|
||||
|
||||
#define ETHERNET_IFNAME1 'E'
|
||||
@ -51,9 +51,10 @@
|
||||
#define WPAN_IFNAME1 'W'
|
||||
#define WPAN_IFNAME2 'P'
|
||||
|
||||
event_queue_t lwip_event_queue = { 0 };
|
||||
|
||||
static kernel_pid_t _pid = KERNEL_PID_UNDEF;
|
||||
static char _stack[LWIP_NETDEV_STACKSIZE];
|
||||
static msg_t _queue[LWIP_NETDEV_QUEUE_LEN];
|
||||
static WORD_ALIGNED char _stack[LWIP_NETDEV_STACKSIZE];
|
||||
static char _tmp_buf[LWIP_NETDEV_BUFLEN];
|
||||
|
||||
#ifdef MODULE_NETDEV_ETH
|
||||
@ -73,11 +74,14 @@ static err_t slip_output6(struct netif *netif, struct pbuf *q, const ip6_addr_t
|
||||
#endif
|
||||
static void _event_cb(netdev_t *dev, netdev_event_t event);
|
||||
static void *_event_loop(void *arg);
|
||||
static void _isr(event_t *ev);
|
||||
|
||||
err_t lwip_netdev_init(struct netif *netif)
|
||||
{
|
||||
LWIP_ASSERT("netif != NULL", (netif != NULL));
|
||||
LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
|
||||
lwip_netif_t *compat_netif = container_of(netif, lwip_netif_t, lwip_netif);
|
||||
compat_netif->ev_isr.handler = _isr;
|
||||
netdev_t *netdev;
|
||||
netopt_enable_t enabled = 0;
|
||||
uint16_t dev_type;
|
||||
@ -96,11 +100,6 @@ err_t lwip_netdev_init(struct netif *netif)
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize Bottom Half Processor, netdev and netif */
|
||||
if (IS_USED(MODULE_BHP_MSG)) {
|
||||
bhp_msg_claim_thread(lwip_netif_get_bhp(netif), _pid);
|
||||
}
|
||||
|
||||
netdev = netif->state;
|
||||
lwip_netif_dev_acquire(netif);
|
||||
netdev->event_callback = _event_cb;
|
||||
@ -364,22 +363,16 @@ static struct pbuf *_get_recv_pkt(netdev_t *dev)
|
||||
|
||||
static void _event_cb(netdev_t *dev, netdev_event_t event)
|
||||
{
|
||||
if (event == NETDEV_EVENT_ISR) {
|
||||
assert(_pid != KERNEL_PID_UNDEF);
|
||||
msg_t msg;
|
||||
lwip_netif_t *compat_netif = dev->context;
|
||||
assert(compat_netif != NULL);
|
||||
struct netif *netif = &compat_netif->lwip_netif;
|
||||
|
||||
msg.type = LWIP_NETDEV_MSG_TYPE_EVENT;
|
||||
msg.content.ptr = dev;
|
||||
|
||||
if (msg_send(&msg, _pid) <= 0) {
|
||||
DEBUG("lwip_netdev: possibly lost interrupt.\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
lwip_netif_t *compat_netif = dev->context;
|
||||
struct netif *netif = &compat_netif->lwip_netif;
|
||||
switch (event) {
|
||||
case NETDEV_EVENT_RX_COMPLETE: {
|
||||
switch (event) {
|
||||
case NETDEV_EVENT_ISR:
|
||||
event_post(&lwip_event_queue, &compat_netif->ev_isr);
|
||||
break;
|
||||
case NETDEV_EVENT_RX_COMPLETE:
|
||||
{
|
||||
struct pbuf *p = _get_recv_pkt(dev);
|
||||
if (p == NULL) {
|
||||
DEBUG("lwip_netdev: error receiving packet\n");
|
||||
@ -389,40 +382,35 @@ static void _event_cb(netdev_t *dev, netdev_event_t event)
|
||||
DEBUG("lwip_netdev: error inputing packet\n");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NETDEV_EVENT_LINK_UP: {
|
||||
/* Will wake up DHCP state machine */
|
||||
netifapi_netif_set_link_up(netif);
|
||||
break;
|
||||
}
|
||||
case NETDEV_EVENT_LINK_DOWN: {
|
||||
netifapi_netif_set_link_down(netif);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case NETDEV_EVENT_LINK_UP:
|
||||
/* Will wake up DHCP state machine */
|
||||
netifapi_netif_set_link_up(netif);
|
||||
break;
|
||||
case NETDEV_EVENT_LINK_DOWN:
|
||||
netifapi_netif_set_link_down(netif);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void _isr(event_t *ev)
|
||||
{
|
||||
lwip_netif_t *compat_netif = container_of(ev, lwip_netif_t, ev_isr);
|
||||
netdev_t *dev = compat_netif->lwip_netif.state;
|
||||
dev->driver->isr(dev);
|
||||
}
|
||||
|
||||
static void *_event_loop(void *arg)
|
||||
{
|
||||
struct netif *netif = arg;
|
||||
msg_init_queue(_queue, LWIP_NETDEV_QUEUE_LEN);
|
||||
while (1) {
|
||||
msg_t msg;
|
||||
msg_receive(&msg);
|
||||
if (msg.type == LWIP_NETDEV_MSG_TYPE_EVENT) {
|
||||
netdev_t *dev = msg.content.ptr;
|
||||
lwip_netif_dev_acquire(netif);
|
||||
dev->driver->isr(dev);
|
||||
lwip_netif_dev_release(netif);
|
||||
}
|
||||
else if (IS_USED(MODULE_BHP_MSG) && msg.type == BHP_MSG_BH_REQUEST) {
|
||||
bhp_msg_handler(&msg);
|
||||
}
|
||||
}
|
||||
(void)arg;
|
||||
event_queue_claim(&lwip_event_queue);
|
||||
event_loop(&lwip_event_queue);
|
||||
|
||||
/* this should never be reached */
|
||||
assert(0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -19,10 +19,17 @@
|
||||
#ifndef LWIP_H
|
||||
#define LWIP_H
|
||||
|
||||
#include "event.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief event queue for netdev events
|
||||
*/
|
||||
extern event_queue_t lwip_event_queue;
|
||||
|
||||
/**
|
||||
* @brief Initializes lwIP stack.
|
||||
*
|
||||
|
@ -20,9 +20,10 @@
|
||||
#ifndef LWIP_NETIF_COMPAT_H
|
||||
#define LWIP_NETIF_COMPAT_H
|
||||
|
||||
#include "bhp/event.h"
|
||||
#include "event.h"
|
||||
#include "lwip/netif.h"
|
||||
#include "net/netif.h"
|
||||
#include "bhp/msg.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -32,11 +33,12 @@ extern "C" {
|
||||
* @brief Representation of a network interface
|
||||
*/
|
||||
typedef struct {
|
||||
netif_t common_netif; /**< network interface descriptor */
|
||||
struct netif lwip_netif; /**< lwIP interface data */
|
||||
rmutex_t lock; /**< lock for the interface */
|
||||
#if IS_USED(MODULE_BHP_MSG)
|
||||
bhp_msg_t bhp; /**< IPC Bottom Half Processor */
|
||||
netif_t common_netif; /**< network interface descriptor */
|
||||
struct netif lwip_netif; /**< lwIP interface data */
|
||||
rmutex_t lock; /**< lock for the interface */
|
||||
event_t ev_isr; /**< ISR event */
|
||||
#ifdef MODULE_BHP_EVENT
|
||||
bhp_event_t bhp; /**< IPC Bottom Half Processor */
|
||||
#endif
|
||||
} lwip_netif_t;
|
||||
|
||||
@ -73,26 +75,6 @@ static inline void lwip_netif_dev_release(struct netif *netif)
|
||||
rmutex_unlock(&compat_netif->lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the IPC based Bottom Half Processor for LWIP
|
||||
*
|
||||
* @param[in] netif pointer to the LWIP network interface
|
||||
*
|
||||
* @return pointer to the IPC based Bottom Half Processor descriptor, if
|
||||
* @ref sys_bhp_msg is present.
|
||||
* @return NULL otherwise
|
||||
*/
|
||||
static inline bhp_msg_t *lwip_netif_get_bhp(struct netif *netif)
|
||||
{
|
||||
#if IS_USED(MODULE_BHP_MSG)
|
||||
lwip_netif_t *compat_netif = container_of(netif, lwip_netif_t, lwip_netif);
|
||||
return &compat_netif->bhp;
|
||||
#else
|
||||
(void) netif;
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -1,11 +1,11 @@
|
||||
/*
|
||||
* Copyright (C) 2022 HAW Hamburg
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*
|
||||
*/
|
||||
* Copyright (C) 2022 HAW Hamburg
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup sys_auto_init_lwip_netif
|
||||
@ -20,9 +20,10 @@
|
||||
#include "kw2xrf.h"
|
||||
#include "kw2xrf_params.h"
|
||||
|
||||
#include "lwip.h"
|
||||
#include "lwip_init_devs.h"
|
||||
|
||||
#include "bhp/msg.h"
|
||||
#include "bhp/event.h"
|
||||
#include "net/netdev/ieee802154_submac.h"
|
||||
|
||||
#define ENABLE_DEBUG 0
|
||||
@ -37,9 +38,10 @@ static netdev_ieee802154_submac_t kw2xrf_netdev[NETIF_KW2XRF_NUMOF];
|
||||
static void auto_init_kw2xrf(void)
|
||||
{
|
||||
for (unsigned i = 0; i < NETIF_KW2XRF_NUMOF; i++) {
|
||||
bhp_msg_init(&netif[i].bhp, &kw2xrf_radio_hal_irq_handler, &kw2xrf_netdev[i].submac.dev);
|
||||
bhp_event_init(&netif[i].bhp, &lwip_event_queue,
|
||||
&kw2xrf_radio_hal_irq_handler, &kw2xrf_netdev[i].submac.dev);
|
||||
kw2xrf_init(&kw2xrf_devs[i], &kw2xrf_params[i], &kw2xrf_netdev[i].submac.dev,
|
||||
bhp_msg_isr_cb, &netif[i].bhp);
|
||||
bhp_event_isr_cb, &netif[i].bhp);
|
||||
|
||||
netdev_register(&kw2xrf_netdev[i].dev.netdev, NETDEV_KW2XRF, i);
|
||||
netdev_ieee802154_submac_init(&kw2xrf_netdev[i]);
|
||||
|
@ -1,11 +1,11 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Neo Nenaco <neo@nenaco.de>
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*
|
||||
*/
|
||||
* Copyright (C) 2017 Neo Nenaco <neo@nenaco.de>
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup sys_auto_init_lwip_netif
|
||||
@ -21,8 +21,9 @@
|
||||
#include "mrf24j40.h"
|
||||
#include "mrf24j40_params.h"
|
||||
|
||||
#include "bhp/event.h"
|
||||
#include "lwip.h"
|
||||
#include "lwip_init_devs.h"
|
||||
#include "bhp/msg.h"
|
||||
#include "net/netdev/ieee802154_submac.h"
|
||||
|
||||
#define ENABLE_DEBUG 0
|
||||
@ -37,9 +38,10 @@ static netdev_ieee802154_submac_t mrf24j40_netdev[NETIF_MRF24J40_NUMOF];
|
||||
static void auto_init_mrf24j40(void)
|
||||
{
|
||||
for (unsigned i = 0; i < NETIF_MRF24J40_NUMOF; i++) {
|
||||
bhp_msg_init(&netif[i].bhp, &mrf24j40_radio_irq_handler, &mrf24j40_netdev[i].submac.dev);
|
||||
bhp_event_init(&netif[i].bhp, &lwip_event_queue, &mrf24j40_radio_irq_handler,
|
||||
&mrf24j40_netdev[i].submac.dev);
|
||||
mrf24j40_init(&mrf24j40_devs[i], &mrf24j40_params[i], &mrf24j40_netdev[i].submac.dev,
|
||||
bhp_msg_isr_cb, &netif[i].bhp);
|
||||
bhp_event_isr_cb, &netif[i].bhp);
|
||||
|
||||
|
||||
netdev_register(&mrf24j40_netdev[i].dev.netdev, NETDEV_MRF24J40, i);
|
||||
|
Loading…
Reference in New Issue
Block a user