diff options
Diffstat (limited to 'net/batman-adv')
-rw-r--r-- | net/batman-adv/aggregation.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/net/batman-adv/aggregation.c b/net/batman-adv/aggregation.c index c583e049f421..69467fe71ff2 100644 --- a/net/batman-adv/aggregation.c +++ b/net/batman-adv/aggregation.c | |||
@@ -28,6 +28,7 @@ | |||
28 | 28 | ||
29 | /* return true if new_packet can be aggregated with forw_packet */ | 29 | /* return true if new_packet can be aggregated with forw_packet */ |
30 | static bool can_aggregate_with(const struct batman_packet *new_batman_packet, | 30 | static bool can_aggregate_with(const struct batman_packet *new_batman_packet, |
31 | struct bat_priv *bat_priv, | ||
31 | int packet_len, | 32 | int packet_len, |
32 | unsigned long send_time, | 33 | unsigned long send_time, |
33 | bool directlink, | 34 | bool directlink, |
@@ -37,6 +38,8 @@ static bool can_aggregate_with(const struct batman_packet *new_batman_packet, | |||
37 | struct batman_packet *batman_packet = | 38 | struct batman_packet *batman_packet = |
38 | (struct batman_packet *)forw_packet->skb->data; | 39 | (struct batman_packet *)forw_packet->skb->data; |
39 | int aggregated_bytes = forw_packet->packet_len + packet_len; | 40 | int aggregated_bytes = forw_packet->packet_len + packet_len; |
41 | struct hard_iface *primary_if = NULL; | ||
42 | bool res = false; | ||
40 | 43 | ||
41 | /** | 44 | /** |
42 | * we can aggregate the current packet to this aggregated packet | 45 | * we can aggregate the current packet to this aggregated packet |
@@ -61,6 +64,10 @@ static bool can_aggregate_with(const struct batman_packet *new_batman_packet, | |||
61 | * packet | 64 | * packet |
62 | */ | 65 | */ |
63 | 66 | ||
67 | primary_if = primary_if_get_selected(bat_priv); | ||
68 | if (!primary_if) | ||
69 | goto out; | ||
70 | |||
64 | /* packets without direct link flag and high TTL | 71 | /* packets without direct link flag and high TTL |
65 | * are flooded through the net */ | 72 | * are flooded through the net */ |
66 | if ((!directlink) && | 73 | if ((!directlink) && |
@@ -70,8 +77,10 @@ static bool can_aggregate_with(const struct batman_packet *new_batman_packet, | |||
70 | /* own packets originating non-primary | 77 | /* own packets originating non-primary |
71 | * interfaces leave only that interface */ | 78 | * interfaces leave only that interface */ |
72 | ((!forw_packet->own) || | 79 | ((!forw_packet->own) || |
73 | (forw_packet->if_incoming->if_num == 0))) | 80 | (forw_packet->if_incoming == primary_if))) { |
74 | return true; | 81 | res = true; |
82 | goto out; | ||
83 | } | ||
75 | 84 | ||
76 | /* if the incoming packet is sent via this one | 85 | /* if the incoming packet is sent via this one |
77 | * interface only - we still can aggregate */ | 86 | * interface only - we still can aggregate */ |
@@ -84,11 +93,16 @@ static bool can_aggregate_with(const struct batman_packet *new_batman_packet, | |||
84 | * (= secondary interface packets in general) */ | 93 | * (= secondary interface packets in general) */ |
85 | (batman_packet->flags & DIRECTLINK || | 94 | (batman_packet->flags & DIRECTLINK || |
86 | (forw_packet->own && | 95 | (forw_packet->own && |
87 | forw_packet->if_incoming->if_num != 0))) | 96 | forw_packet->if_incoming != primary_if))) { |
88 | return true; | 97 | res = true; |
98 | goto out; | ||
99 | } | ||
89 | } | 100 | } |
90 | 101 | ||
91 | return false; | 102 | out: |
103 | if (primary_if) | ||
104 | hardif_free_ref(primary_if); | ||
105 | return res; | ||
92 | } | 106 | } |
93 | 107 | ||
94 | /* create a new aggregated packet and add this packet to it */ | 108 | /* create a new aggregated packet and add this packet to it */ |
@@ -210,6 +224,7 @@ void add_bat_packet_to_list(struct bat_priv *bat_priv, | |||
210 | hlist_for_each_entry(forw_packet_pos, tmp_node, | 224 | hlist_for_each_entry(forw_packet_pos, tmp_node, |
211 | &bat_priv->forw_bat_list, list) { | 225 | &bat_priv->forw_bat_list, list) { |
212 | if (can_aggregate_with(batman_packet, | 226 | if (can_aggregate_with(batman_packet, |
227 | bat_priv, | ||
213 | packet_len, | 228 | packet_len, |
214 | send_time, | 229 | send_time, |
215 | direct_link, | 230 | direct_link, |