mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-05 22:29:49 +00:00
bridgeif: better separation between bridgeif and fdb (todo: move fdb to contrib?), tried to fix the build for LWIP_NUM_NETIF_CLIENT_DATA==0
This commit is contained in:
parent
946b231516
commit
2dcf31d6b1
@ -63,6 +63,8 @@
|
|||||||
#include "lwip/timeouts.h"
|
#include "lwip/timeouts.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#if LWIP_NUM_NETIF_CLIENT_DATA
|
||||||
|
|
||||||
#define BRIDGEIF_AGE_TIMER_MS 1000
|
#define BRIDGEIF_AGE_TIMER_MS 1000
|
||||||
|
|
||||||
#if BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
|
#if BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT
|
||||||
@ -91,17 +93,17 @@
|
|||||||
#define BR_FDB_TIMEOUT_SEC (60*5) /* 5 minutes FDB timeout */
|
#define BR_FDB_TIMEOUT_SEC (60*5) /* 5 minutes FDB timeout */
|
||||||
|
|
||||||
#if !BRIDGEIF_EXTERNAL_FDB
|
#if !BRIDGEIF_EXTERNAL_FDB
|
||||||
typedef struct bridgeif_sfdb_entry_s {
|
typedef struct bridgeif_dfdb_entry_s {
|
||||||
u8_t used;
|
u8_t used;
|
||||||
u8_t port;
|
u8_t port;
|
||||||
u32_t ts;
|
u32_t ts;
|
||||||
struct eth_addr addr;
|
struct eth_addr addr;
|
||||||
} bridgeif_sfdb_entry_t;
|
} bridgeif_dfdb_entry_t;
|
||||||
|
|
||||||
typedef struct bridgeif_sfdb_s {
|
typedef struct bridgeif_dfdb_s {
|
||||||
u16_t max_fdb_entries;
|
u16_t max_fdb_entries;
|
||||||
bridgeif_sfdb_entry_t *fdb;
|
bridgeif_dfdb_entry_t *fdb;
|
||||||
} bridgeif_sfdb_t;
|
} bridgeif_dfdb_t;
|
||||||
#endif /* BRIDGEIF_EXTERNAL_FDB */
|
#endif /* BRIDGEIF_EXTERNAL_FDB */
|
||||||
|
|
||||||
struct bridgeif_private_s;
|
struct bridgeif_private_s;
|
||||||
@ -141,14 +143,14 @@ u8_t bridgeif_netif_client_id = 0xff;
|
|||||||
* by setting BRIDGEIF_EXTERNAL_FDB==1 and providing a better implementation :-)
|
* by setting BRIDGEIF_EXTERNAL_FDB==1 and providing a better implementation :-)
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
bridgeif_fdb_update_src(bridgeif_private_t *br, struct eth_addr *src_addr, u8_t port_idx)
|
bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
bridgeif_sfdb_t *fdb = (bridgeif_sfdb_t*)br->fdbd;
|
bridgeif_dfdb_t *fdb = (bridgeif_dfdb_t*)fdb_ptr;
|
||||||
BRIDGEIF_DECL_PROTECT(lev);
|
BRIDGEIF_DECL_PROTECT(lev);
|
||||||
BRIDGEIF_READ_PROTECT(lev);
|
BRIDGEIF_READ_PROTECT(lev);
|
||||||
for (i = 0; i < br->max_fdbd_entries; i++) {
|
for (i = 0; i < fdb->max_fdb_entries; i++) {
|
||||||
bridgeif_sfdb_entry_t *e = &fdb->fdb[i];
|
bridgeif_dfdb_entry_t *e = &fdb->fdb[i];
|
||||||
if (e->used && e->ts) {
|
if (e->used && e->ts) {
|
||||||
if (!memcmp(&e->addr, src_addr, sizeof(struct eth_addr))) {
|
if (!memcmp(&e->addr, src_addr, sizeof(struct eth_addr))) {
|
||||||
LWIP_DEBUGF(BRIDGEIF_FDB_DEBUG, ("br: update src %02x:%02x:%02x:%02x:%02x:%02x (from %d) @ idx %d\n",
|
LWIP_DEBUGF(BRIDGEIF_FDB_DEBUG, ("br: update src %02x:%02x:%02x:%02x:%02x:%02x (from %d) @ idx %d\n",
|
||||||
@ -164,8 +166,8 @@ bridgeif_fdb_update_src(bridgeif_private_t *br, struct eth_addr *src_addr, u8_t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* not found, allocate new entry from free */
|
/* not found, allocate new entry from free */
|
||||||
for (i = 0; i < br->max_fdbd_entries; i++) {
|
for (i = 0; i < fdb->max_fdb_entries; i++) {
|
||||||
bridgeif_sfdb_entry_t *e = &fdb->fdb[i];
|
bridgeif_dfdb_entry_t *e = &fdb->fdb[i];
|
||||||
if (!e->used || !e->ts) {
|
if (!e->used || !e->ts) {
|
||||||
BRIDGEIF_WRITE_PROTECT(lev);
|
BRIDGEIF_WRITE_PROTECT(lev);
|
||||||
/* check again when protected */
|
/* check again when protected */
|
||||||
@ -190,14 +192,14 @@ bridgeif_fdb_update_src(bridgeif_private_t *br, struct eth_addr *src_addr, u8_t
|
|||||||
|
|
||||||
/** Walk our list of auto-learnt fdb entries and return a port to forward or BR_FLOOD if unknown */
|
/** Walk our list of auto-learnt fdb entries and return a port to forward or BR_FLOOD if unknown */
|
||||||
static bridgeif_portmask_t
|
static bridgeif_portmask_t
|
||||||
bridgeif_fdb_get_dst_ports(bridgeif_private_t *br, struct eth_addr *dst_addr)
|
bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
bridgeif_sfdb_t *fdb = (bridgeif_sfdb_t*)br->fdbd;
|
bridgeif_dfdb_t *fdb = (bridgeif_dfdb_t*)fdb_ptr;
|
||||||
BRIDGEIF_DECL_PROTECT(lev);
|
BRIDGEIF_DECL_PROTECT(lev);
|
||||||
BRIDGEIF_READ_PROTECT(lev);
|
BRIDGEIF_READ_PROTECT(lev);
|
||||||
for (i = 0; i < br->max_fdbd_entries; i++) {
|
for (i = 0; i < fdb->max_fdb_entries; i++) {
|
||||||
bridgeif_sfdb_entry_t *e = &fdb->fdb[i];
|
bridgeif_dfdb_entry_t *e = &fdb->fdb[i];
|
||||||
if (e->used && e->ts) {
|
if (e->used && e->ts) {
|
||||||
if (!memcmp(&e->addr, dst_addr, sizeof(struct eth_addr))) {
|
if (!memcmp(&e->addr, dst_addr, sizeof(struct eth_addr))) {
|
||||||
bridgeif_portmask_t ret = 1 << e->port;
|
bridgeif_portmask_t ret = 1 << e->port;
|
||||||
@ -211,36 +213,32 @@ bridgeif_fdb_get_dst_ports(bridgeif_private_t *br, struct eth_addr *dst_addr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Init our simple fdb list */
|
/** Init our simple fdb list */
|
||||||
static void
|
static void*
|
||||||
bridgeif_fdb_init(bridgeif_private_t *br, u16_t max_fdb_entries)
|
bridgeif_fdb_init(u16_t max_fdb_entries)
|
||||||
{
|
{
|
||||||
bridgeif_sfdb_t *fdb;
|
bridgeif_dfdb_t *fdb;
|
||||||
mem_size_t alloc_len = sizeof(bridgeif_sfdb_t) + (max_fdb_entries*sizeof(bridgeif_sfdb_entry_t));
|
mem_size_t alloc_len = sizeof(bridgeif_dfdb_t) + (max_fdb_entries*sizeof(bridgeif_dfdb_entry_t));
|
||||||
LWIP_DEBUGF(BRIDGEIF_DEBUG, ("bridgeif_init: allocating %d bytes for private data\n", (int)alloc_len));
|
LWIP_DEBUGF(BRIDGEIF_DEBUG, ("bridgeif_init: allocating %d bytes for private data\n", (int)alloc_len));
|
||||||
fdb = (bridgeif_sfdb_t*)mem_malloc(alloc_len);
|
fdb = (bridgeif_dfdb_t*)mem_malloc(alloc_len);
|
||||||
memset(fdb, 0, alloc_len);
|
memset(fdb, 0, alloc_len);
|
||||||
fdb->fdb = (bridgeif_sfdb_entry_t *)(fdb + 1);
|
fdb->max_fdb_entries = max_fdb_entries;
|
||||||
br->fdbd = fdb;
|
fdb->fdb = (bridgeif_dfdb_entry_t *)(fdb + 1);
|
||||||
|
return fdb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Aging implementation of our simple fdb */
|
/** Aging implementation of our simple fdb */
|
||||||
static void
|
static void
|
||||||
bridgeif_fdb_age_one_second(struct netif *bridgeif)
|
bridgeif_fdb_age_one_second(void *fdb_ptr)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
bridgeif_private_t *br;
|
bridgeif_dfdb_t *fdb;
|
||||||
bridgeif_sfdb_t *fdb;
|
|
||||||
BRIDGEIF_DECL_PROTECT(lev);
|
BRIDGEIF_DECL_PROTECT(lev);
|
||||||
|
|
||||||
LWIP_ASSERT("", bridgeif != NULL);
|
fdb = (bridgeif_dfdb_t *)fdb_ptr;
|
||||||
LWIP_ASSERT("", bridgeif->state != NULL);
|
|
||||||
|
|
||||||
br = (bridgeif_private_t *)bridgeif->state;
|
|
||||||
fdb = (bridgeif_sfdb_t *)br->fdbd;
|
|
||||||
BRIDGEIF_READ_PROTECT(lev);
|
BRIDGEIF_READ_PROTECT(lev);
|
||||||
|
|
||||||
for (i = 0; i < br->max_fdbd_entries; i++) {
|
for (i = 0; i < fdb->max_fdb_entries; i++) {
|
||||||
bridgeif_sfdb_entry_t *e = &fdb->fdb[i];
|
bridgeif_dfdb_entry_t *e = &fdb->fdb[i];
|
||||||
if (e->used && e->ts) {
|
if (e->used && e->ts) {
|
||||||
BRIDGEIF_WRITE_PROTECT(lev);
|
BRIDGEIF_WRITE_PROTECT(lev);
|
||||||
/* check again when protected */
|
/* check again when protected */
|
||||||
@ -261,7 +259,14 @@ bridgeif_fdb_age_one_second(struct netif *bridgeif)
|
|||||||
static void
|
static void
|
||||||
bridgeif_age_tmr(void *arg)
|
bridgeif_age_tmr(void *arg)
|
||||||
{
|
{
|
||||||
bridgeif_fdb_age_one_second((struct netif*)arg);
|
struct netif *bridgeif;
|
||||||
|
bridgeif_private_t *br;
|
||||||
|
LWIP_ASSERT("invalid arg", arg != NULL);
|
||||||
|
bridgeif = (struct netif *)arg;
|
||||||
|
LWIP_ASSERT("invalid netif state", bridgeif->state != NULL);
|
||||||
|
|
||||||
|
br = (bridgeif_private_t *)bridgeif->state;
|
||||||
|
bridgeif_fdb_age_one_second(br->fdbd);
|
||||||
sys_timeout(BRIDGEIF_AGE_TIMER_MS, bridgeif_age_tmr, arg);
|
sys_timeout(BRIDGEIF_AGE_TIMER_MS, bridgeif_age_tmr, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +358,7 @@ bridgeif_find_dst_ports(bridgeif_private_t *br, struct eth_addr *dst_addr)
|
|||||||
}
|
}
|
||||||
BRIDGEIF_READ_UNPROTECT(lev);
|
BRIDGEIF_READ_UNPROTECT(lev);
|
||||||
/* no match found: check dynamic fdb for port or fall back to flooding */
|
/* no match found: check dynamic fdb for port or fall back to flooding */
|
||||||
return bridgeif_fdb_get_dst_ports(br, dst_addr);
|
return bridgeif_fdb_get_dst_ports(br->fdbd, dst_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Helper function to see if a destination mac belongs to the bridge
|
/** Helper function to see if a destination mac belongs to the bridge
|
||||||
@ -484,7 +489,7 @@ bridgeif_input(struct pbuf *p, struct netif *netif)
|
|||||||
|
|
||||||
if ((src->addr[0] & 1) == 0) {
|
if ((src->addr[0] & 1) == 0) {
|
||||||
/* update src for all non-group addresses */
|
/* update src for all non-group addresses */
|
||||||
bridgeif_fdb_update_src(br, src, port->port_num);
|
bridgeif_fdb_update_src(br->fdbd, src, port->port_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dst->addr[0] & 1) {
|
if (dst->addr[0] & 1) {
|
||||||
@ -577,7 +582,7 @@ bridgeif_init(struct netif *netif)
|
|||||||
br->fdbs = (bridgeif_fdb_static_entry_t*)(((u8_t*)(br + 1)) + (init_data->max_ports*sizeof(bridgeif_port_t)));
|
br->fdbs = (bridgeif_fdb_static_entry_t*)(((u8_t*)(br + 1)) + (init_data->max_ports*sizeof(bridgeif_port_t)));
|
||||||
|
|
||||||
br->max_fdbd_entries = init_data->max_fdb_dynamic_entries;
|
br->max_fdbd_entries = init_data->max_fdb_dynamic_entries;
|
||||||
bridgeif_fdb_init(br, init_data->max_fdb_static_entries);
|
br->fdbd = bridgeif_fdb_init(init_data->max_fdb_static_entries);
|
||||||
|
|
||||||
#if LWIP_NETIF_HOSTNAME
|
#if LWIP_NETIF_HOSTNAME
|
||||||
/* Initialize interface hostname */
|
/* Initialize interface hostname */
|
||||||
@ -675,3 +680,5 @@ bridgeif_add_port(struct netif *bridgeif, struct netif *portif)
|
|||||||
|
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* LWIP_NUM_NETIF_CLIENT_DATA */
|
||||||
|
Loading…
Reference in New Issue
Block a user