Commit bc279080 authored by Antonio Quartulli's avatar Antonio Quartulli Committed by Marek Lindner

batman-adv: detect clients connected through a 802.11 device

Clients connected through a 802.11 device are now marked with the
TT_CLIENT_WIFI flag. This flag is also advertised with the tt
announcement.
Signed-off-by: default avatarAntonio Quartulli <ordex@autistici.org>
Signed-off-by: default avatarMarek Lindner <lindner_marek@yahoo.de>
parent 015758d0
...@@ -681,6 +681,36 @@ static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -681,6 +681,36 @@ static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
return NET_RX_DROP; return NET_RX_DROP;
} }
/* This function returns true if the interface represented by ifindex is a
* 802.11 wireless device */
bool is_wifi_iface(int ifindex)
{
struct net_device *net_device = NULL;
bool ret = false;
if (ifindex == NULL_IFINDEX)
goto out;
net_device = dev_get_by_index(&init_net, ifindex);
if (!net_device)
goto out;
#ifdef CONFIG_WIRELESS_EXT
/* pre-cfg80211 drivers have to implement WEXT, so it is possible to
* check for wireless_handlers != NULL */
if (net_device->wireless_handlers)
ret = true;
else
#endif
/* cfg80211 drivers have to set ieee80211_ptr */
if (net_device->ieee80211_ptr)
ret = true;
out:
if (net_device)
dev_put(net_device);
return ret;
}
struct notifier_block hard_if_notifier = { struct notifier_block hard_if_notifier = {
.notifier_call = hard_if_event, .notifier_call = hard_if_event,
}; };
...@@ -42,6 +42,7 @@ void hardif_remove_interfaces(void); ...@@ -42,6 +42,7 @@ void hardif_remove_interfaces(void);
int hardif_min_mtu(struct net_device *soft_iface); int hardif_min_mtu(struct net_device *soft_iface);
void update_min_mtu(struct net_device *soft_iface); void update_min_mtu(struct net_device *soft_iface);
void hardif_free_rcu(struct rcu_head *rcu); void hardif_free_rcu(struct rcu_head *rcu);
bool is_wifi_iface(int ifindex);
static inline void hardif_free_ref(struct hard_iface *hard_iface) static inline void hardif_free_ref(struct hard_iface *hard_iface)
{ {
......
...@@ -107,7 +107,7 @@ int mesh_init(struct net_device *soft_iface) ...@@ -107,7 +107,7 @@ int mesh_init(struct net_device *soft_iface)
if (tt_init(bat_priv) < 1) if (tt_init(bat_priv) < 1)
goto err; goto err;
tt_local_add(soft_iface, soft_iface->dev_addr); tt_local_add(soft_iface, soft_iface->dev_addr, NULL_IFINDEX);
if (vis_init(bat_priv) < 1) if (vis_init(bat_priv) < 1)
goto err; goto err;
......
...@@ -62,6 +62,8 @@ ...@@ -62,6 +62,8 @@
#define NO_FLAGS 0 #define NO_FLAGS 0
#define NULL_IFINDEX 0 /* dummy ifindex used to avoid iface checks */
#define NUM_WORDS (TQ_LOCAL_WINDOW_SIZE / WORD_BIT_SIZE) #define NUM_WORDS (TQ_LOCAL_WINDOW_SIZE / WORD_BIT_SIZE)
#define LOG_BUF_LEN 8192 /* has to be a power of 2 */ #define LOG_BUF_LEN 8192 /* has to be a power of 2 */
......
...@@ -84,6 +84,7 @@ enum tt_query_flags { ...@@ -84,6 +84,7 @@ enum tt_query_flags {
enum tt_client_flags { enum tt_client_flags {
TT_CLIENT_DEL = 1 << 0, TT_CLIENT_DEL = 1 << 0,
TT_CLIENT_ROAM = 1 << 1, TT_CLIENT_ROAM = 1 << 1,
TT_CLIENT_WIFI = 1 << 2,
TT_CLIENT_NOPURGE = 1 << 8, TT_CLIENT_NOPURGE = 1 << 8,
TT_CLIENT_NEW = 1 << 9, TT_CLIENT_NEW = 1 << 9,
TT_CLIENT_PENDING = 1 << 10 TT_CLIENT_PENDING = 1 << 10
......
...@@ -1299,7 +1299,7 @@ int recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if) ...@@ -1299,7 +1299,7 @@ int recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if)
roam_adv_packet->client); roam_adv_packet->client);
tt_global_add(bat_priv, orig_node, roam_adv_packet->client, tt_global_add(bat_priv, orig_node, roam_adv_packet->client,
atomic_read(&orig_node->last_ttvn) + 1, true); atomic_read(&orig_node->last_ttvn) + 1, true, false);
/* Roaming phase starts: I have new information but the ttvn has not /* Roaming phase starts: I have new information but the ttvn has not
* been incremented yet. This flag will make me check all the incoming * been incremented yet. This flag will make me check all the incoming
......
...@@ -536,7 +536,7 @@ static int interface_set_mac_addr(struct net_device *dev, void *p) ...@@ -536,7 +536,7 @@ static int interface_set_mac_addr(struct net_device *dev, void *p)
if (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE) { if (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE) {
tt_local_remove(bat_priv, dev->dev_addr, tt_local_remove(bat_priv, dev->dev_addr,
"mac address changed", false); "mac address changed", false);
tt_local_add(dev, addr->sa_data); tt_local_add(dev, addr->sa_data, NULL_IFINDEX);
} }
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
...@@ -595,7 +595,7 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface) ...@@ -595,7 +595,7 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)
goto dropped; goto dropped;
/* Register the client MAC in the transtable */ /* Register the client MAC in the transtable */
tt_local_add(soft_iface, ethhdr->h_source); tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif);
orig_node = transtable_search(bat_priv, ethhdr->h_dest); orig_node = transtable_search(bat_priv, ethhdr->h_dest);
if (is_multicast_ether_addr(ethhdr->h_dest) || if (is_multicast_ether_addr(ethhdr->h_dest) ||
......
...@@ -183,7 +183,8 @@ static int tt_local_init(struct bat_priv *bat_priv) ...@@ -183,7 +183,8 @@ static int tt_local_init(struct bat_priv *bat_priv)
return 1; return 1;
} }
void tt_local_add(struct net_device *soft_iface, const uint8_t *addr) void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
int ifindex)
{ {
struct bat_priv *bat_priv = netdev_priv(soft_iface); struct bat_priv *bat_priv = netdev_priv(soft_iface);
struct tt_local_entry *tt_local_entry = NULL; struct tt_local_entry *tt_local_entry = NULL;
...@@ -207,6 +208,8 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr) ...@@ -207,6 +208,8 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr)
memcpy(tt_local_entry->addr, addr, ETH_ALEN); memcpy(tt_local_entry->addr, addr, ETH_ALEN);
tt_local_entry->last_seen = jiffies; tt_local_entry->last_seen = jiffies;
tt_local_entry->flags = NO_FLAGS; tt_local_entry->flags = NO_FLAGS;
if (is_wifi_iface(ifindex))
tt_local_entry->flags |= TT_CLIENT_WIFI;
atomic_set(&tt_local_entry->refcount, 2); atomic_set(&tt_local_entry->refcount, 2);
/* the batman interface mac address should never be purged */ /* the batman interface mac address should never be purged */
...@@ -495,7 +498,8 @@ static void tt_changes_list_free(struct bat_priv *bat_priv) ...@@ -495,7 +498,8 @@ static void tt_changes_list_free(struct bat_priv *bat_priv)
/* caller must hold orig_node refcount */ /* caller must hold orig_node refcount */
int tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node, int tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
const unsigned char *tt_addr, uint8_t ttvn, bool roaming) const unsigned char *tt_addr, uint8_t ttvn, bool roaming,
bool wifi)
{ {
struct tt_global_entry *tt_global_entry; struct tt_global_entry *tt_global_entry;
struct orig_node *orig_node_tmp; struct orig_node *orig_node_tmp;
...@@ -537,6 +541,9 @@ int tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node, ...@@ -537,6 +541,9 @@ int tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
tt_global_entry->roam_at = 0; tt_global_entry->roam_at = 0;
} }
if (wifi)
tt_global_entry->flags |= TT_CLIENT_WIFI;
bat_dbg(DBG_TT, bat_priv, bat_dbg(DBG_TT, bat_priv,
"Creating new global tt entry: %pM (via %pM)\n", "Creating new global tt entry: %pM (via %pM)\n",
tt_global_entry->addr, orig_node->orig); tt_global_entry->addr, orig_node->orig);
...@@ -1363,7 +1370,9 @@ static void _tt_update_changes(struct bat_priv *bat_priv, ...@@ -1363,7 +1370,9 @@ static void _tt_update_changes(struct bat_priv *bat_priv,
(tt_change + i)->flags & TT_CLIENT_ROAM); (tt_change + i)->flags & TT_CLIENT_ROAM);
else else
if (!tt_global_add(bat_priv, orig_node, if (!tt_global_add(bat_priv, orig_node,
(tt_change + i)->addr, ttvn, false)) (tt_change + i)->addr, ttvn, false,
(tt_change + i)->flags &
TT_CLIENT_WIFI))
/* In case of problem while storing a /* In case of problem while storing a
* global_entry, we stop the updating * global_entry, we stop the updating
* procedure without committing the * procedure without committing the
......
...@@ -26,15 +26,16 @@ int tt_len(int changes_num); ...@@ -26,15 +26,16 @@ int tt_len(int changes_num);
int tt_changes_fill_buffer(struct bat_priv *bat_priv, int tt_changes_fill_buffer(struct bat_priv *bat_priv,
unsigned char *buff, int buff_len); unsigned char *buff, int buff_len);
int tt_init(struct bat_priv *bat_priv); int tt_init(struct bat_priv *bat_priv);
void tt_local_add(struct net_device *soft_iface, const uint8_t *addr); void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
int ifindex);
void tt_local_remove(struct bat_priv *bat_priv, void tt_local_remove(struct bat_priv *bat_priv,
const uint8_t *addr, const char *message, bool roaming); const uint8_t *addr, const char *message, bool roaming);
int tt_local_seq_print_text(struct seq_file *seq, void *offset); int tt_local_seq_print_text(struct seq_file *seq, void *offset);
void tt_global_add_orig(struct bat_priv *bat_priv, struct orig_node *orig_node, void tt_global_add_orig(struct bat_priv *bat_priv, struct orig_node *orig_node,
const unsigned char *tt_buff, int tt_buff_len); const unsigned char *tt_buff, int tt_buff_len);
int tt_global_add(struct bat_priv *bat_priv, int tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
struct orig_node *orig_node, const unsigned char *addr, const unsigned char *addr, uint8_t ttvn, bool roaming,
uint8_t ttvn, bool roaming); bool wifi);
int tt_global_seq_print_text(struct seq_file *seq, void *offset); int tt_global_seq_print_text(struct seq_file *seq, void *offset);
void tt_global_del_orig(struct bat_priv *bat_priv, void tt_global_del_orig(struct bat_priv *bat_priv,
struct orig_node *orig_node, const char *message); struct orig_node *orig_node, const char *message);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment