Loading net/batman-adv/bridge_loop_avoidance.c +41 −18 Original line number Diff line number Diff line Loading @@ -40,15 +40,11 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv, /* return the index of the claim */ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size) { const unsigned char *key = data; struct batadv_claim *claim = (struct batadv_claim *)data; uint32_t hash = 0; size_t i; for (i = 0; i < ETH_ALEN + sizeof(short); i++) { hash += key[i]; hash += (hash << 10); hash ^= (hash >> 6); } hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr)); hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid)); hash += (hash << 3); hash ^= (hash >> 11); Loading @@ -61,15 +57,11 @@ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size) static inline uint32_t batadv_choose_backbone_gw(const void *data, uint32_t size) { const unsigned char *key = data; struct batadv_claim *claim = (struct batadv_claim *)data; uint32_t hash = 0; size_t i; for (i = 0; i < ETH_ALEN + sizeof(short); i++) { hash += key[i]; hash += (hash << 10); hash ^= (hash >> 6); } hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr)); hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid)); hash += (hash << 3); hash ^= (hash >> 11); Loading Loading @@ -362,7 +354,7 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac, */ static struct batadv_backbone_gw * batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig, short vid) short vid, bool own_backbone) { struct batadv_backbone_gw *entry; struct batadv_orig_node *orig_node; Loading @@ -386,6 +378,7 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig, entry->crc = BATADV_BLA_CRC_INIT; entry->bat_priv = bat_priv; atomic_set(&entry->request_sent, 0); atomic_set(&entry->wait_periods, 0); memcpy(entry->orig, orig, ETH_ALEN); /* one for the hash, one for returning */ Loading @@ -409,6 +402,16 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig, "became a backbone gateway"); batadv_orig_node_free_ref(orig_node); } if (own_backbone) { batadv_bla_send_announce(bat_priv, entry); /* this will be decreased in the worker thread */ atomic_inc(&entry->request_sent); atomic_set(&entry->wait_periods, BATADV_BLA_WAIT_PERIODS); atomic_inc(&bat_priv->bla.num_requests); } return entry; } Loading @@ -424,7 +427,7 @@ batadv_bla_update_own_backbone_gw(struct batadv_priv *bat_priv, backbone_gw = batadv_bla_get_backbone_gw(bat_priv, primary_if->net_dev->dev_addr, vid); vid, true); if (unlikely(!backbone_gw)) return; Loading Loading @@ -632,7 +635,8 @@ static int batadv_handle_announce(struct batadv_priv *bat_priv, if (memcmp(an_addr, batadv_announce_mac, 4) != 0) return 0; backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid); backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid, false); if (unlikely(!backbone_gw)) return 1; Loading Loading @@ -730,7 +734,8 @@ static int batadv_handle_claim(struct batadv_priv *bat_priv, /* register the gateway if not yet available, and add the claim. */ backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid); backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid, false); if (unlikely(!backbone_gw)) return 1; Loading Loading @@ -1140,6 +1145,24 @@ static void batadv_bla_periodic_work(struct work_struct *work) backbone_gw->lasttime = jiffies; batadv_bla_send_announce(bat_priv, backbone_gw); /* request_sent is only set after creation to avoid * problems when we are not yet known as backbone gw * in the backbone. * * We can reset this now after we waited some periods * to give bridge forward delays and bla group forming * some grace time. */ if (atomic_read(&backbone_gw->request_sent) == 0) continue; if (!atomic_dec_and_test(&backbone_gw->wait_periods)) continue; atomic_dec(&backbone_gw->bat_priv->bla.num_requests); atomic_set(&backbone_gw->request_sent, 0); } rcu_read_unlock(); } Loading net/batman-adv/hard-interface.c +40 −1 Original line number Diff line number Diff line Loading @@ -59,6 +59,45 @@ batadv_hardif_get_by_netdev(const struct net_device *net_dev) return hard_iface; } /** * batadv_is_on_batman_iface - check if a device is a batman iface descendant * @net_dev: the device to check * * If the user creates any virtual device on top of a batman-adv interface, it * is important to prevent this new interface to be used to create a new mesh * network (this behaviour would lead to a batman-over-batman configuration). * This function recursively checks all the fathers of the device passed as * argument looking for a batman-adv soft interface. * * Returns true if the device is descendant of a batman-adv mesh interface (or * if it is a batman-adv interface itself), false otherwise */ static bool batadv_is_on_batman_iface(const struct net_device *net_dev) { struct net_device *parent_dev; bool ret; /* check if this is a batman-adv mesh interface */ if (batadv_softif_is_valid(net_dev)) return true; /* no more parents..stop recursion */ if (net_dev->iflink == net_dev->ifindex) return false; /* recurse over the parent device */ parent_dev = dev_get_by_index(&init_net, net_dev->iflink); /* if we got a NULL parent_dev there is something broken.. */ if (WARN(!parent_dev, "Cannot find parent device")) return false; ret = batadv_is_on_batman_iface(parent_dev); if (parent_dev) dev_put(parent_dev); return ret; } static int batadv_is_valid_iface(const struct net_device *net_dev) { if (net_dev->flags & IFF_LOOPBACK) Loading @@ -71,7 +110,7 @@ static int batadv_is_valid_iface(const struct net_device *net_dev) return 0; /* no batman over batman */ if (batadv_softif_is_valid(net_dev)) if (batadv_is_on_batman_iface(net_dev)) return 0; return 1; Loading net/batman-adv/hash.h +22 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,28 @@ static inline void batadv_hash_delete(struct batadv_hashtable *hash, batadv_hash_destroy(hash); } /** * batadv_hash_bytes - hash some bytes and add them to the previous hash * @hash: previous hash value * @data: data to be hashed * @size: number of bytes to be hashed * * Returns the new hash value. */ static inline uint32_t batadv_hash_bytes(uint32_t hash, void *data, uint32_t size) { const unsigned char *key = data; int i; for (i = 0; i < size; i++) { hash += key[i]; hash += (hash << 10); hash ^= (hash >> 6); } return hash; } /** * batadv_hash_add - adds data to the hashtable * @hash: storage hash table Loading net/batman-adv/main.h +1 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ #define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */ #define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3) #define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10) #define BATADV_BLA_WAIT_PERIODS 3 #define BATADV_DUPLIST_SIZE 16 #define BATADV_DUPLIST_TIMEOUT 500 /* 500 ms */ Loading net/batman-adv/originator.c +0 −1 Original line number Diff line number Diff line Loading @@ -221,7 +221,6 @@ struct batadv_orig_node *batadv_get_orig_node(struct batadv_priv *bat_priv, atomic_set(&orig_node->refcount, 2); orig_node->tt_initialised = false; orig_node->tt_poss_change = false; orig_node->bat_priv = bat_priv; memcpy(orig_node->orig, addr, ETH_ALEN); batadv_dat_init_orig_node_addr(orig_node); Loading Loading
net/batman-adv/bridge_loop_avoidance.c +41 −18 Original line number Diff line number Diff line Loading @@ -40,15 +40,11 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv, /* return the index of the claim */ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size) { const unsigned char *key = data; struct batadv_claim *claim = (struct batadv_claim *)data; uint32_t hash = 0; size_t i; for (i = 0; i < ETH_ALEN + sizeof(short); i++) { hash += key[i]; hash += (hash << 10); hash ^= (hash >> 6); } hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr)); hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid)); hash += (hash << 3); hash ^= (hash >> 11); Loading @@ -61,15 +57,11 @@ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size) static inline uint32_t batadv_choose_backbone_gw(const void *data, uint32_t size) { const unsigned char *key = data; struct batadv_claim *claim = (struct batadv_claim *)data; uint32_t hash = 0; size_t i; for (i = 0; i < ETH_ALEN + sizeof(short); i++) { hash += key[i]; hash += (hash << 10); hash ^= (hash >> 6); } hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr)); hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid)); hash += (hash << 3); hash ^= (hash >> 11); Loading Loading @@ -362,7 +354,7 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac, */ static struct batadv_backbone_gw * batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig, short vid) short vid, bool own_backbone) { struct batadv_backbone_gw *entry; struct batadv_orig_node *orig_node; Loading @@ -386,6 +378,7 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig, entry->crc = BATADV_BLA_CRC_INIT; entry->bat_priv = bat_priv; atomic_set(&entry->request_sent, 0); atomic_set(&entry->wait_periods, 0); memcpy(entry->orig, orig, ETH_ALEN); /* one for the hash, one for returning */ Loading @@ -409,6 +402,16 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig, "became a backbone gateway"); batadv_orig_node_free_ref(orig_node); } if (own_backbone) { batadv_bla_send_announce(bat_priv, entry); /* this will be decreased in the worker thread */ atomic_inc(&entry->request_sent); atomic_set(&entry->wait_periods, BATADV_BLA_WAIT_PERIODS); atomic_inc(&bat_priv->bla.num_requests); } return entry; } Loading @@ -424,7 +427,7 @@ batadv_bla_update_own_backbone_gw(struct batadv_priv *bat_priv, backbone_gw = batadv_bla_get_backbone_gw(bat_priv, primary_if->net_dev->dev_addr, vid); vid, true); if (unlikely(!backbone_gw)) return; Loading Loading @@ -632,7 +635,8 @@ static int batadv_handle_announce(struct batadv_priv *bat_priv, if (memcmp(an_addr, batadv_announce_mac, 4) != 0) return 0; backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid); backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid, false); if (unlikely(!backbone_gw)) return 1; Loading Loading @@ -730,7 +734,8 @@ static int batadv_handle_claim(struct batadv_priv *bat_priv, /* register the gateway if not yet available, and add the claim. */ backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid); backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid, false); if (unlikely(!backbone_gw)) return 1; Loading Loading @@ -1140,6 +1145,24 @@ static void batadv_bla_periodic_work(struct work_struct *work) backbone_gw->lasttime = jiffies; batadv_bla_send_announce(bat_priv, backbone_gw); /* request_sent is only set after creation to avoid * problems when we are not yet known as backbone gw * in the backbone. * * We can reset this now after we waited some periods * to give bridge forward delays and bla group forming * some grace time. */ if (atomic_read(&backbone_gw->request_sent) == 0) continue; if (!atomic_dec_and_test(&backbone_gw->wait_periods)) continue; atomic_dec(&backbone_gw->bat_priv->bla.num_requests); atomic_set(&backbone_gw->request_sent, 0); } rcu_read_unlock(); } Loading
net/batman-adv/hard-interface.c +40 −1 Original line number Diff line number Diff line Loading @@ -59,6 +59,45 @@ batadv_hardif_get_by_netdev(const struct net_device *net_dev) return hard_iface; } /** * batadv_is_on_batman_iface - check if a device is a batman iface descendant * @net_dev: the device to check * * If the user creates any virtual device on top of a batman-adv interface, it * is important to prevent this new interface to be used to create a new mesh * network (this behaviour would lead to a batman-over-batman configuration). * This function recursively checks all the fathers of the device passed as * argument looking for a batman-adv soft interface. * * Returns true if the device is descendant of a batman-adv mesh interface (or * if it is a batman-adv interface itself), false otherwise */ static bool batadv_is_on_batman_iface(const struct net_device *net_dev) { struct net_device *parent_dev; bool ret; /* check if this is a batman-adv mesh interface */ if (batadv_softif_is_valid(net_dev)) return true; /* no more parents..stop recursion */ if (net_dev->iflink == net_dev->ifindex) return false; /* recurse over the parent device */ parent_dev = dev_get_by_index(&init_net, net_dev->iflink); /* if we got a NULL parent_dev there is something broken.. */ if (WARN(!parent_dev, "Cannot find parent device")) return false; ret = batadv_is_on_batman_iface(parent_dev); if (parent_dev) dev_put(parent_dev); return ret; } static int batadv_is_valid_iface(const struct net_device *net_dev) { if (net_dev->flags & IFF_LOOPBACK) Loading @@ -71,7 +110,7 @@ static int batadv_is_valid_iface(const struct net_device *net_dev) return 0; /* no batman over batman */ if (batadv_softif_is_valid(net_dev)) if (batadv_is_on_batman_iface(net_dev)) return 0; return 1; Loading
net/batman-adv/hash.h +22 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,28 @@ static inline void batadv_hash_delete(struct batadv_hashtable *hash, batadv_hash_destroy(hash); } /** * batadv_hash_bytes - hash some bytes and add them to the previous hash * @hash: previous hash value * @data: data to be hashed * @size: number of bytes to be hashed * * Returns the new hash value. */ static inline uint32_t batadv_hash_bytes(uint32_t hash, void *data, uint32_t size) { const unsigned char *key = data; int i; for (i = 0; i < size; i++) { hash += key[i]; hash += (hash << 10); hash ^= (hash >> 6); } return hash; } /** * batadv_hash_add - adds data to the hashtable * @hash: storage hash table Loading
net/batman-adv/main.h +1 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ #define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */ #define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3) #define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10) #define BATADV_BLA_WAIT_PERIODS 3 #define BATADV_DUPLIST_SIZE 16 #define BATADV_DUPLIST_TIMEOUT 500 /* 500 ms */ Loading
net/batman-adv/originator.c +0 −1 Original line number Diff line number Diff line Loading @@ -221,7 +221,6 @@ struct batadv_orig_node *batadv_get_orig_node(struct batadv_priv *bat_priv, atomic_set(&orig_node->refcount, 2); orig_node->tt_initialised = false; orig_node->tt_poss_change = false; orig_node->bat_priv = bat_priv; memcpy(orig_node->orig, addr, ETH_ALEN); batadv_dat_init_orig_node_addr(orig_node); Loading