1.5 steps forward... Think I've fixed the crash, roaming between the external ports works but still roaming to the Ath11 interface takes a long time. Need to double check but I'm sure previously roaming between the 703n & Ath11 worked fine, but now it also has a delay. 703n to Asus and back is fine.
A diff of br_fdb.c from vanilla 4.4.60 and 4.4.60 QSDK 11.3 has amongst other things
@@ -308,10 +337,16 @@ void br_fdb_cleanup(unsigned long _data)
if (f->added_by_external_learn)
continue;
this_timer = f->updated + delay;
- if (time_before_eq(this_timer, jiffies))
+ if (time_before_eq(this_timer, jiffies)) {
+ memset(&fdb_event, 0, sizeof(fdb_event));
+ ether_addr_copy(fdb_event.addr, f->addr.addr);
fdb_delete(br, f);
- else if (time_before(this_timer, next_timer))
+ atomic_notifier_call_chain(
+ &br_fdb_update_notifier_list, 0,
+ (void *)&fdb_event);
+ } else if (time_before(this_timer, next_timer)) {
next_timer = this_timer;
+ }
}
}
spin_unlock(&br->hash_lock);
so the final parameter of atomic_notifier_call_chain() is an empty struct br_fdb_event with just fdb_event.addr populated, and this is what the callback function nss_bridge_mgr_fdb_update_callback() in nss_bridge_mgr is expecting.
Whilst in robimarko's build, it's subtly different
ether_addr_copy(mac_addr, f->key.addr.addr);
fdb_delete(br, f, true);
/* QCA NSS ECM support - Start */
atomic_notifier_call_chain(
&br_fdb_update_notifier_list, 0,
(void *)mac_addr);
/* QCA NSS ECM support - End */
Here atomic_notifier_call_chain() is supplied with the address directly, not within an otherwise empty struct br_fdb_event. Is there a reason for this change? I've modified nss_bridge_mgr_fdb_update_callback() to work with the address and put that back in a struct for the rest of the function.
static int nss_bridge_mgr_fdb_update_callback(struct notifier_block *notifier,
unsigned long val, void *ctx)
{
struct br_fdb_event _event;
struct br_fdb_event *event = &_event;
struct nss_bridge_pvt *b_pvt = NULL;
struct net_device *br_dev = NULL;
fal_fdb_entry_t entry;
memset(&_event, 0, sizeof(_event));
ether_addr_copy(_event.addr, ctx);
Uptime 45 minutes and no crashes connecting to the Ath11 so I think this is a small improvement at least now.