aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv
diff options
context:
space:
mode:
Diffstat (limited to 'net/batman-adv')
-rw-r--r--net/batman-adv/bat_iv_ogm.c37
-rw-r--r--net/batman-adv/routing.c29
-rw-r--r--net/batman-adv/routing.h1
3 files changed, 36 insertions, 31 deletions
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
index 31c2891c2cd0..42b7a94d61b3 100644
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -630,6 +630,41 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
630 if_incoming, 0, batadv_iv_ogm_fwd_send_time()); 630 if_incoming, 0, batadv_iv_ogm_fwd_send_time());
631} 631}
632 632
633/**
634 * batadv_iv_ogm_slide_own_bcast_window - bitshift own OGM broadcast windows for
635 * the given interface
636 * @hard_iface: the interface for which the windows have to be shifted
637 */
638static void
639batadv_iv_ogm_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
640{
641 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
642 struct batadv_hashtable *hash = bat_priv->orig_hash;
643 struct hlist_head *head;
644 struct batadv_orig_node *orig_node;
645 unsigned long *word;
646 uint32_t i;
647 size_t word_index;
648 uint8_t *w;
649
650 for (i = 0; i < hash->size; i++) {
651 head = &hash->table[i];
652
653 rcu_read_lock();
654 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
655 spin_lock_bh(&orig_node->ogm_cnt_lock);
656 word_index = hard_iface->if_num * BATADV_NUM_WORDS;
657 word = &(orig_node->bcast_own[word_index]);
658
659 batadv_bit_get_packet(bat_priv, word, 1, 0);
660 w = &orig_node->bcast_own_sum[hard_iface->if_num];
661 *w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
662 spin_unlock_bh(&orig_node->ogm_cnt_lock);
663 }
664 rcu_read_unlock();
665 }
666}
667
633static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) 668static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
634{ 669{
635 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); 670 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
@@ -674,7 +709,7 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
674 batadv_ogm_packet->gw_flags = BATADV_NO_FLAGS; 709 batadv_ogm_packet->gw_flags = BATADV_NO_FLAGS;
675 } 710 }
676 711
677 batadv_slide_own_bcast_window(hard_iface); 712 batadv_iv_ogm_slide_own_bcast_window(hard_iface);
678 batadv_iv_ogm_queue_add(bat_priv, hard_iface->bat_iv.ogm_buff, 713 batadv_iv_ogm_queue_add(bat_priv, hard_iface->bat_iv.ogm_buff,
679 hard_iface->bat_iv.ogm_buff_len, hard_iface, 1, 714 hard_iface->bat_iv.ogm_buff_len, hard_iface, 1,
680 batadv_iv_ogm_emit_send_time(bat_priv)); 715 batadv_iv_ogm_emit_send_time(bat_priv));
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
index beeab2e8cd66..fad08469767d 100644
--- a/net/batman-adv/routing.c
+++ b/net/batman-adv/routing.c
@@ -34,35 +34,6 @@
34static int batadv_route_unicast_packet(struct sk_buff *skb, 34static int batadv_route_unicast_packet(struct sk_buff *skb,
35 struct batadv_hard_iface *recv_if); 35 struct batadv_hard_iface *recv_if);
36 36
37void batadv_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
38{
39 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
40 struct batadv_hashtable *hash = bat_priv->orig_hash;
41 struct hlist_head *head;
42 struct batadv_orig_node *orig_node;
43 unsigned long *word;
44 uint32_t i;
45 size_t word_index;
46 uint8_t *w;
47
48 for (i = 0; i < hash->size; i++) {
49 head = &hash->table[i];
50
51 rcu_read_lock();
52 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
53 spin_lock_bh(&orig_node->ogm_cnt_lock);
54 word_index = hard_iface->if_num * BATADV_NUM_WORDS;
55 word = &(orig_node->bcast_own[word_index]);
56
57 batadv_bit_get_packet(bat_priv, word, 1, 0);
58 w = &orig_node->bcast_own_sum[hard_iface->if_num];
59 *w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
60 spin_unlock_bh(&orig_node->ogm_cnt_lock);
61 }
62 rcu_read_unlock();
63 }
64}
65
66static void _batadv_update_route(struct batadv_priv *bat_priv, 37static void _batadv_update_route(struct batadv_priv *bat_priv,
67 struct batadv_orig_node *orig_node, 38 struct batadv_orig_node *orig_node,
68 struct batadv_neigh_node *neigh_node) 39 struct batadv_neigh_node *neigh_node)
diff --git a/net/batman-adv/routing.h b/net/batman-adv/routing.h
index 99eeafaba407..72a29bde2010 100644
--- a/net/batman-adv/routing.h
+++ b/net/batman-adv/routing.h
@@ -20,7 +20,6 @@
20#ifndef _NET_BATMAN_ADV_ROUTING_H_ 20#ifndef _NET_BATMAN_ADV_ROUTING_H_
21#define _NET_BATMAN_ADV_ROUTING_H_ 21#define _NET_BATMAN_ADV_ROUTING_H_
22 22
23void batadv_slide_own_bcast_window(struct batadv_hard_iface *hard_iface);
24bool batadv_check_management_packet(struct sk_buff *skb, 23bool batadv_check_management_packet(struct sk_buff *skb,
25 struct batadv_hard_iface *hard_iface, 24 struct batadv_hard_iface *hard_iface,
26 int header_len); 25 int header_len);