diff options
Diffstat (limited to 'net/batman-adv/aggregation.c')
-rw-r--r-- | net/batman-adv/aggregation.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/net/batman-adv/aggregation.c b/net/batman-adv/aggregation.c index af45d6b2031f..a8c32030527c 100644 --- a/net/batman-adv/aggregation.c +++ b/net/batman-adv/aggregation.c | |||
@@ -23,11 +23,12 @@ | |||
23 | #include "aggregation.h" | 23 | #include "aggregation.h" |
24 | #include "send.h" | 24 | #include "send.h" |
25 | #include "routing.h" | 25 | #include "routing.h" |
26 | #include "hard-interface.h" | ||
26 | 27 | ||
27 | /* calculate the size of the hna information for a given packet */ | 28 | /* calculate the size of the tt information for a given packet */ |
28 | static int hna_len(struct batman_packet *batman_packet) | 29 | static int tt_len(struct batman_packet *batman_packet) |
29 | { | 30 | { |
30 | return batman_packet->num_hna * ETH_ALEN; | 31 | return batman_packet->num_tt * ETH_ALEN; |
31 | } | 32 | } |
32 | 33 | ||
33 | /* return true if new_packet can be aggregated with forw_packet */ | 34 | /* return true if new_packet can be aggregated with forw_packet */ |
@@ -95,7 +96,6 @@ static bool can_aggregate_with(struct batman_packet *new_batman_packet, | |||
95 | return false; | 96 | return false; |
96 | } | 97 | } |
97 | 98 | ||
98 | #define atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0) | ||
99 | /* create a new aggregated packet and add this packet to it */ | 99 | /* create a new aggregated packet and add this packet to it */ |
100 | static void new_aggregated_packet(unsigned char *packet_buff, int packet_len, | 100 | static void new_aggregated_packet(unsigned char *packet_buff, int packet_len, |
101 | unsigned long send_time, bool direct_link, | 101 | unsigned long send_time, bool direct_link, |
@@ -106,12 +106,15 @@ static void new_aggregated_packet(unsigned char *packet_buff, int packet_len, | |||
106 | struct forw_packet *forw_packet_aggr; | 106 | struct forw_packet *forw_packet_aggr; |
107 | unsigned char *skb_buff; | 107 | unsigned char *skb_buff; |
108 | 108 | ||
109 | if (!atomic_inc_not_zero(&if_incoming->refcount)) | ||
110 | return; | ||
111 | |||
109 | /* own packet should always be scheduled */ | 112 | /* own packet should always be scheduled */ |
110 | if (!own_packet) { | 113 | if (!own_packet) { |
111 | if (!atomic_dec_not_zero(&bat_priv->batman_queue_left)) { | 114 | if (!atomic_dec_not_zero(&bat_priv->batman_queue_left)) { |
112 | bat_dbg(DBG_BATMAN, bat_priv, | 115 | bat_dbg(DBG_BATMAN, bat_priv, |
113 | "batman packet queue full\n"); | 116 | "batman packet queue full\n"); |
114 | return; | 117 | goto out; |
115 | } | 118 | } |
116 | } | 119 | } |
117 | 120 | ||
@@ -119,7 +122,7 @@ static void new_aggregated_packet(unsigned char *packet_buff, int packet_len, | |||
119 | if (!forw_packet_aggr) { | 122 | if (!forw_packet_aggr) { |
120 | if (!own_packet) | 123 | if (!own_packet) |
121 | atomic_inc(&bat_priv->batman_queue_left); | 124 | atomic_inc(&bat_priv->batman_queue_left); |
122 | return; | 125 | goto out; |
123 | } | 126 | } |
124 | 127 | ||
125 | if ((atomic_read(&bat_priv->aggregated_ogms)) && | 128 | if ((atomic_read(&bat_priv->aggregated_ogms)) && |
@@ -134,7 +137,7 @@ static void new_aggregated_packet(unsigned char *packet_buff, int packet_len, | |||
134 | if (!own_packet) | 137 | if (!own_packet) |
135 | atomic_inc(&bat_priv->batman_queue_left); | 138 | atomic_inc(&bat_priv->batman_queue_left); |
136 | kfree(forw_packet_aggr); | 139 | kfree(forw_packet_aggr); |
137 | return; | 140 | goto out; |
138 | } | 141 | } |
139 | skb_reserve(forw_packet_aggr->skb, sizeof(struct ethhdr)); | 142 | skb_reserve(forw_packet_aggr->skb, sizeof(struct ethhdr)); |
140 | 143 | ||
@@ -165,6 +168,10 @@ static void new_aggregated_packet(unsigned char *packet_buff, int packet_len, | |||
165 | queue_delayed_work(bat_event_workqueue, | 168 | queue_delayed_work(bat_event_workqueue, |
166 | &forw_packet_aggr->delayed_work, | 169 | &forw_packet_aggr->delayed_work, |
167 | send_time - jiffies); | 170 | send_time - jiffies); |
171 | |||
172 | return; | ||
173 | out: | ||
174 | hardif_free_ref(if_incoming); | ||
168 | } | 175 | } |
169 | 176 | ||
170 | /* aggregate a new packet into the existing aggregation */ | 177 | /* aggregate a new packet into the existing aggregation */ |
@@ -251,7 +258,7 @@ void receive_aggr_bat_packet(struct ethhdr *ethhdr, unsigned char *packet_buff, | |||
251 | { | 258 | { |
252 | struct batman_packet *batman_packet; | 259 | struct batman_packet *batman_packet; |
253 | int buff_pos = 0; | 260 | int buff_pos = 0; |
254 | unsigned char *hna_buff; | 261 | unsigned char *tt_buff; |
255 | 262 | ||
256 | batman_packet = (struct batman_packet *)packet_buff; | 263 | batman_packet = (struct batman_packet *)packet_buff; |
257 | 264 | ||
@@ -260,14 +267,14 @@ void receive_aggr_bat_packet(struct ethhdr *ethhdr, unsigned char *packet_buff, | |||
260 | orig_interval. */ | 267 | orig_interval. */ |
261 | batman_packet->seqno = ntohl(batman_packet->seqno); | 268 | batman_packet->seqno = ntohl(batman_packet->seqno); |
262 | 269 | ||
263 | hna_buff = packet_buff + buff_pos + BAT_PACKET_LEN; | 270 | tt_buff = packet_buff + buff_pos + BAT_PACKET_LEN; |
264 | receive_bat_packet(ethhdr, batman_packet, | 271 | receive_bat_packet(ethhdr, batman_packet, |
265 | hna_buff, hna_len(batman_packet), | 272 | tt_buff, tt_len(batman_packet), |
266 | if_incoming); | 273 | if_incoming); |
267 | 274 | ||
268 | buff_pos += BAT_PACKET_LEN + hna_len(batman_packet); | 275 | buff_pos += BAT_PACKET_LEN + tt_len(batman_packet); |
269 | batman_packet = (struct batman_packet *) | 276 | batman_packet = (struct batman_packet *) |
270 | (packet_buff + buff_pos); | 277 | (packet_buff + buff_pos); |
271 | } while (aggregated_packet(buff_pos, packet_len, | 278 | } while (aggregated_packet(buff_pos, packet_len, |
272 | batman_packet->num_hna)); | 279 | batman_packet->num_tt)); |
273 | } | 280 | } |