|
@@ -358,6 +358,13 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv,
|
|
|
goto del;
|
|
|
if (del_op_requested && !del_op_entry)
|
|
|
goto del;
|
|
|
+
|
|
|
+ /* this is a second add in the same originator interval. It
|
|
|
+ * means that flags have been changed: update them!
|
|
|
+ */
|
|
|
+ if (!del_op_requested && !del_op_entry)
|
|
|
+ entry->change.flags = flags;
|
|
|
+
|
|
|
continue;
|
|
|
del:
|
|
|
list_del(&entry->list);
|
|
@@ -482,6 +489,7 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
|
|
|
struct batadv_tt_orig_list_entry *orig_entry;
|
|
|
int hash_added, table_size, packet_size_max;
|
|
|
bool ret = false, roamed_back = false;
|
|
|
+ uint8_t remote_flags;
|
|
|
|
|
|
if (ifindex != BATADV_NULL_IFINDEX)
|
|
|
in_dev = dev_get_by_index(&init_net, ifindex);
|
|
@@ -596,8 +604,23 @@ check_roaming:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ret = true;
|
|
|
+ /* store the current remote flags before altering them. This helps
|
|
|
+ * understanding is flags are changing or not
|
|
|
+ */
|
|
|
+ remote_flags = tt_local->common.flags & BATADV_TT_REMOTE_MASK;
|
|
|
+
|
|
|
+ if (batadv_is_wifi_netdev(in_dev))
|
|
|
+ tt_local->common.flags |= BATADV_TT_CLIENT_WIFI;
|
|
|
+ else
|
|
|
+ tt_local->common.flags &= ~BATADV_TT_CLIENT_WIFI;
|
|
|
|
|
|
+ /* if any "dynamic" flag has been modified, resend an ADD event for this
|
|
|
+ * entry so that all the nodes can get the new flags
|
|
|
+ */
|
|
|
+ if (remote_flags ^ (tt_local->common.flags & BATADV_TT_REMOTE_MASK))
|
|
|
+ batadv_tt_local_event(bat_priv, tt_local, BATADV_NO_FLAGS);
|
|
|
+
|
|
|
+ ret = true;
|
|
|
out:
|
|
|
if (in_dev)
|
|
|
dev_put(in_dev);
|