batman-adv: tt: extract code handling a roam on add

The code for handling the roaming of clients is mostly self contained but
embedded in the already too large batadv_tt_local_add function. The
maintainability can be improved by keeping it in an separate function.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
This commit is contained in:
Sven Eckelmann 2026-08-30 17:21:39 +02:00
parent bbfb0d2cf0
commit fd8d892c68
No known key found for this signature in database
GPG Key ID: 4D0F772BD314F5CB

View File

@ -614,6 +614,50 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv,
batadv_tt_global_entry_put(tt_global);
}
/**
* batadv_tt_local_add_roam() - handle roamed clients during batadv_tt_local_add()
* @bat_priv: the bat priv with all the mesh interface information
* @tt_global: the global TT entry
* @roamed_back: whether @tt_global roamed back
*/
static void batadv_tt_local_add_roam(struct batadv_priv *bat_priv,
struct batadv_tt_global_entry *tt_global,
bool roamed_back)
{
struct batadv_tt_orig_list_entry *orig_entry;
struct hlist_head *head;
if (!tt_global)
return;
/* Check whether it is a roaming, but don't do anything if the roaming
* process has already been handled
*/
if (tt_global->common.flags & BATADV_TT_CLIENT_ROAM)
return;
/* These node are probably going to update their tt table */
head = &tt_global->orig_list;
rcu_read_lock();
hlist_for_each_entry_rcu(orig_entry, head, list) {
batadv_send_roam_adv(bat_priv, tt_global->common.addr,
tt_global->common.vid,
orig_entry->orig_node);
}
rcu_read_unlock();
if (roamed_back) {
batadv_tt_global_free(bat_priv, tt_global,
"Roaming canceled");
} else {
/* The global entry has to be marked as ROAMING and
* has to be kept for consistency purpose
*/
tt_global->common.flags |= BATADV_TT_CLIENT_ROAM;
tt_global->roam_at = jiffies;
}
}
/**
* batadv_tt_local_add() - add a new client to the local table or update an
* existing client
@ -632,14 +676,12 @@ bool batadv_tt_local_add(struct net_device *mesh_iface, const u8 *addr,
{
struct batadv_priv *bat_priv = netdev_priv(mesh_iface);
struct batadv_tt_global_entry *tt_global = NULL;
struct batadv_tt_orig_list_entry *orig_entry;
struct batadv_tt_local_entry *tt_local;
struct net *net = dev_net(mesh_iface);
struct net_device *in_dev = NULL;
struct batadv_meshif_vlan *vlan;
bool roamed_back = false;
bool iif_is_wifi = false;
struct hlist_head *head;
int packet_size_max;
bool ret = false;
u8 remote_flags;
@ -758,30 +800,7 @@ bool batadv_tt_local_add(struct net_device *mesh_iface, const u8 *addr,
batadv_tt_local_event(bat_priv, tt_local, BATADV_NO_FLAGS);
check_roaming:
/* Check whether it is a roaming, but don't do anything if the roaming
* process has already been handled
*/
if (tt_global && !(tt_global->common.flags & BATADV_TT_CLIENT_ROAM)) {
/* These node are probably going to update their tt table */
head = &tt_global->orig_list;
rcu_read_lock();
hlist_for_each_entry_rcu(orig_entry, head, list) {
batadv_send_roam_adv(bat_priv, tt_global->common.addr,
tt_global->common.vid,
orig_entry->orig_node);
}
rcu_read_unlock();
if (roamed_back) {
batadv_tt_global_free(bat_priv, tt_global,
"Roaming canceled");
} else {
/* The global entry has to be marked as ROAMING and
* has to be kept for consistency purpose
*/
tt_global->common.flags |= BATADV_TT_CLIENT_ROAM;
tt_global->roam_at = jiffies;
}
}
batadv_tt_local_add_roam(bat_priv, tt_global, roamed_back);
/* store the current remote flags before altering them. This helps
* understanding is flags are changing or not