aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/batman-adv/hard-interface.c41
-rw-r--r--net/batman-adv/soft-interface.c12
-rw-r--r--net/batman-adv/translation-table.c150
-rw-r--r--net/batman-adv/translation-table.h3
-rw-r--r--net/batman-adv/types.h3
5 files changed, 173 insertions, 36 deletions
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index c5f871f218c6..c60d3ed40257 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -266,16 +266,9 @@ static void batadv_check_known_mac_addr(const struct net_device *net_dev)
266 266
267int batadv_hardif_min_mtu(struct net_device *soft_iface) 267int batadv_hardif_min_mtu(struct net_device *soft_iface)
268{ 268{
269 const struct batadv_priv *bat_priv = netdev_priv(soft_iface); 269 struct batadv_priv *bat_priv = netdev_priv(soft_iface);
270 const struct batadv_hard_iface *hard_iface; 270 const struct batadv_hard_iface *hard_iface;
271 /* allow big frames if all devices are capable to do so
272 * (have MTU > 1500 + batadv_max_header_len())
273 */
274 int min_mtu = ETH_DATA_LEN; 271 int min_mtu = ETH_DATA_LEN;
275 int max_header_len = batadv_max_header_len();
276
277 if (atomic_read(&bat_priv->fragmentation))
278 goto out;
279 272
280 rcu_read_lock(); 273 rcu_read_lock();
281 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 274 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
@@ -286,22 +279,40 @@ int batadv_hardif_min_mtu(struct net_device *soft_iface)
286 if (hard_iface->soft_iface != soft_iface) 279 if (hard_iface->soft_iface != soft_iface)
287 continue; 280 continue;
288 281
289 min_mtu = min_t(int, hard_iface->net_dev->mtu - max_header_len, 282 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu);
290 min_mtu);
291 } 283 }
292 rcu_read_unlock(); 284 rcu_read_unlock();
285
286 atomic_set(&bat_priv->packet_size_max, min_mtu);
287
288 if (atomic_read(&bat_priv->fragmentation) == 0)
289 goto out;
290
291 /* with fragmentation enabled the maximum size of internally generated
292 * packets such as translation table exchanges or tvlv containers, etc
293 * has to be calculated
294 */
295 min_mtu = min_t(int, min_mtu, BATADV_FRAG_MAX_FRAG_SIZE);
296 min_mtu -= sizeof(struct batadv_frag_packet);
297 min_mtu *= BATADV_FRAG_MAX_FRAGMENTS;
298 atomic_set(&bat_priv->packet_size_max, min_mtu);
299
300 /* with fragmentation enabled we can fragment external packets easily */
301 min_mtu = min_t(int, min_mtu, ETH_DATA_LEN);
302
293out: 303out:
294 return min_mtu; 304 return min_mtu - batadv_max_header_len();
295} 305}
296 306
297/* adjusts the MTU if a new interface with a smaller MTU appeared. */ 307/* adjusts the MTU if a new interface with a smaller MTU appeared. */
298void batadv_update_min_mtu(struct net_device *soft_iface) 308void batadv_update_min_mtu(struct net_device *soft_iface)
299{ 309{
300 int min_mtu; 310 soft_iface->mtu = batadv_hardif_min_mtu(soft_iface);
301 311
302 min_mtu = batadv_hardif_min_mtu(soft_iface); 312 /* Check if the local translate table should be cleaned up to match a
303 if (soft_iface->mtu != min_mtu) 313 * new (and smaller) MTU.
304 soft_iface->mtu = min_mtu; 314 */
315 batadv_tt_local_resize_to_mtu(soft_iface);
305} 316}
306 317
307static void 318static void
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
index e70f530d8568..36f050876f82 100644
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -166,7 +166,7 @@ static int batadv_interface_tx(struct sk_buff *skb,
166 unsigned int header_len = 0; 166 unsigned int header_len = 0;
167 int data_len = skb->len, ret; 167 int data_len = skb->len, ret;
168 unsigned long brd_delay = 1; 168 unsigned long brd_delay = 1;
169 bool do_bcast = false; 169 bool do_bcast = false, client_added;
170 unsigned short vid; 170 unsigned short vid;
171 uint32_t seqno; 171 uint32_t seqno;
172 172
@@ -196,9 +196,12 @@ static int batadv_interface_tx(struct sk_buff *skb,
196 ethhdr = (struct ethhdr *)skb->data; 196 ethhdr = (struct ethhdr *)skb->data;
197 197
198 /* Register the client MAC in the transtable */ 198 /* Register the client MAC in the transtable */
199 if (!is_multicast_ether_addr(ethhdr->h_source)) 199 if (!is_multicast_ether_addr(ethhdr->h_source)) {
200 batadv_tt_local_add(soft_iface, ethhdr->h_source, vid, 200 client_added = batadv_tt_local_add(soft_iface, ethhdr->h_source,
201 skb->skb_iif); 201 vid, skb->skb_iif);
202 if (!client_added)
203 goto dropped;
204 }
202 205
203 /* don't accept stp packets. STP does not help in meshes. 206 /* don't accept stp packets. STP does not help in meshes.
204 * better use the bridge loop avoidance ... 207 * better use the bridge loop avoidance ...
@@ -674,6 +677,7 @@ static int batadv_softif_init_late(struct net_device *dev)
674 atomic_set(&bat_priv->log_level, 0); 677 atomic_set(&bat_priv->log_level, 0);
675#endif 678#endif
676 atomic_set(&bat_priv->fragmentation, 1); 679 atomic_set(&bat_priv->fragmentation, 1);
680 atomic_set(&bat_priv->packet_size_max, ETH_DATA_LEN);
677 atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN); 681 atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
678 atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN); 682 atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
679 683
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 4c28251dd8e6..a3c965dd1d96 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -401,6 +401,35 @@ static uint16_t batadv_tt_entries(uint16_t tt_len)
401 return tt_len / batadv_tt_len(1); 401 return tt_len / batadv_tt_len(1);
402} 402}
403 403
404/**
405 * batadv_tt_local_table_transmit_size - calculates the local translation table
406 * size when transmitted over the air
407 * @bat_priv: the bat priv with all the soft interface information
408 *
409 * Returns local translation table size in bytes.
410 */
411static int batadv_tt_local_table_transmit_size(struct batadv_priv *bat_priv)
412{
413 uint16_t num_vlan = 0, tt_local_entries = 0;
414 struct batadv_softif_vlan *vlan;
415 int hdr_size;
416
417 rcu_read_lock();
418 hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
419 num_vlan++;
420 tt_local_entries += atomic_read(&vlan->tt.num_entries);
421 }
422 rcu_read_unlock();
423
424 /* header size of tvlv encapsulated tt response payload */
425 hdr_size = sizeof(struct batadv_unicast_tvlv_packet);
426 hdr_size += sizeof(struct batadv_tvlv_hdr);
427 hdr_size += sizeof(struct batadv_tvlv_tt_data);
428 hdr_size += num_vlan * sizeof(struct batadv_tvlv_tt_vlan_data);
429
430 return hdr_size + batadv_tt_len(tt_local_entries);
431}
432
404static int batadv_tt_local_init(struct batadv_priv *bat_priv) 433static int batadv_tt_local_init(struct batadv_priv *bat_priv)
405{ 434{
406 if (bat_priv->tt.local_hash) 435 if (bat_priv->tt.local_hash)
@@ -439,8 +468,10 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv,
439 * @vid: VLAN identifier 468 * @vid: VLAN identifier
440 * @ifindex: index of the interface where the client is connected to (useful to 469 * @ifindex: index of the interface where the client is connected to (useful to
441 * identify wireless clients) 470 * identify wireless clients)
471 *
472 * Returns true if the client was successfully added, false otherwise.
442 */ 473 */
443void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, 474bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
444 unsigned short vid, int ifindex) 475 unsigned short vid, int ifindex)
445{ 476{
446 struct batadv_priv *bat_priv = netdev_priv(soft_iface); 477 struct batadv_priv *bat_priv = netdev_priv(soft_iface);
@@ -448,8 +479,8 @@ void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
448 struct batadv_tt_global_entry *tt_global; 479 struct batadv_tt_global_entry *tt_global;
449 struct hlist_head *head; 480 struct hlist_head *head;
450 struct batadv_tt_orig_list_entry *orig_entry; 481 struct batadv_tt_orig_list_entry *orig_entry;
451 int hash_added; 482 int hash_added, table_size, packet_size_max;
452 bool roamed_back = false; 483 bool ret = false, roamed_back = false;
453 484
454 tt_local = batadv_tt_local_hash_find(bat_priv, addr, vid); 485 tt_local = batadv_tt_local_hash_find(bat_priv, addr, vid);
455 tt_global = batadv_tt_global_hash_find(bat_priv, addr, vid); 486 tt_global = batadv_tt_global_hash_find(bat_priv, addr, vid);
@@ -484,6 +515,17 @@ void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
484 goto check_roaming; 515 goto check_roaming;
485 } 516 }
486 517
518 /* Ignore the client if we cannot send it in a full table response. */
519 table_size = batadv_tt_local_table_transmit_size(bat_priv);
520 table_size += batadv_tt_len(1);
521 packet_size_max = atomic_read(&bat_priv->packet_size_max);
522 if (table_size > packet_size_max) {
523 net_ratelimited_function(batadv_info, soft_iface,
524 "Local translation table size (%i) exceeds maximum packet size (%i); Ignoring new local tt entry: %pM\n",
525 table_size, packet_size_max, addr);
526 goto out;
527 }
528
487 tt_local = kmalloc(sizeof(*tt_local), GFP_ATOMIC); 529 tt_local = kmalloc(sizeof(*tt_local), GFP_ATOMIC);
488 if (!tt_local) 530 if (!tt_local)
489 goto out; 531 goto out;
@@ -550,11 +592,14 @@ check_roaming:
550 } 592 }
551 } 593 }
552 594
595 ret = true;
596
553out: 597out:
554 if (tt_local) 598 if (tt_local)
555 batadv_tt_local_entry_free_ref(tt_local); 599 batadv_tt_local_entry_free_ref(tt_local);
556 if (tt_global) 600 if (tt_global)
557 batadv_tt_global_entry_free_ref(tt_global); 601 batadv_tt_global_entry_free_ref(tt_global);
602 return ret;
558} 603}
559 604
560/** 605/**
@@ -926,8 +971,16 @@ out:
926 return curr_flags; 971 return curr_flags;
927} 972}
928 973
974/**
975 * batadv_tt_local_purge_list - purge inactive tt local entries
976 * @bat_priv: the bat priv with all the soft interface information
977 * @head: pointer to the list containing the local tt entries
978 * @timeout: parameter deciding whether a given tt local entry is considered
979 * inactive or not
980 */
929static void batadv_tt_local_purge_list(struct batadv_priv *bat_priv, 981static void batadv_tt_local_purge_list(struct batadv_priv *bat_priv,
930 struct hlist_head *head) 982 struct hlist_head *head,
983 int timeout)
931{ 984{
932 struct batadv_tt_local_entry *tt_local_entry; 985 struct batadv_tt_local_entry *tt_local_entry;
933 struct batadv_tt_common_entry *tt_common_entry; 986 struct batadv_tt_common_entry *tt_common_entry;
@@ -945,8 +998,7 @@ static void batadv_tt_local_purge_list(struct batadv_priv *bat_priv,
945 if (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING) 998 if (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING)
946 continue; 999 continue;
947 1000
948 if (!batadv_has_timed_out(tt_local_entry->last_seen, 1001 if (!batadv_has_timed_out(tt_local_entry->last_seen, timeout))
949 BATADV_TT_LOCAL_TIMEOUT))
950 continue; 1002 continue;
951 1003
952 batadv_tt_local_set_pending(bat_priv, tt_local_entry, 1004 batadv_tt_local_set_pending(bat_priv, tt_local_entry,
@@ -954,7 +1006,14 @@ static void batadv_tt_local_purge_list(struct batadv_priv *bat_priv,
954 } 1006 }
955} 1007}
956 1008
957static void batadv_tt_local_purge(struct batadv_priv *bat_priv) 1009/**
1010 * batadv_tt_local_purge - purge inactive tt local entries
1011 * @bat_priv: the bat priv with all the soft interface information
1012 * @timeout: parameter deciding whether a given tt local entry is considered
1013 * inactive or not
1014 */
1015static void batadv_tt_local_purge(struct batadv_priv *bat_priv,
1016 int timeout)
958{ 1017{
959 struct batadv_hashtable *hash = bat_priv->tt.local_hash; 1018 struct batadv_hashtable *hash = bat_priv->tt.local_hash;
960 struct hlist_head *head; 1019 struct hlist_head *head;
@@ -966,7 +1025,7 @@ static void batadv_tt_local_purge(struct batadv_priv *bat_priv)
966 list_lock = &hash->list_locks[i]; 1025 list_lock = &hash->list_locks[i];
967 1026
968 spin_lock_bh(list_lock); 1027 spin_lock_bh(list_lock);
969 batadv_tt_local_purge_list(bat_priv, head); 1028 batadv_tt_local_purge_list(bat_priv, head, timeout);
970 spin_unlock_bh(list_lock); 1029 spin_unlock_bh(list_lock);
971 } 1030 }
972} 1031}
@@ -2383,6 +2442,15 @@ static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv,
2383 req_dst_orig_node); 2442 req_dst_orig_node);
2384 } 2443 }
2385 2444
2445 /* Don't send the response, if larger than fragmented packet. */
2446 tt_len = sizeof(struct batadv_unicast_tvlv_packet) + tvlv_len;
2447 if (tt_len > atomic_read(&bat_priv->packet_size_max)) {
2448 net_ratelimited_function(batadv_info, bat_priv->soft_iface,
2449 "Ignoring TT_REQUEST from %pM; Response size exceeds max packet size.\n",
2450 res_dst_orig_node->orig);
2451 goto out;
2452 }
2453
2386 tvlv_tt_data->flags = BATADV_TT_RESPONSE; 2454 tvlv_tt_data->flags = BATADV_TT_RESPONSE;
2387 tvlv_tt_data->ttvn = req_ttvn; 2455 tvlv_tt_data->ttvn = req_ttvn;
2388 2456
@@ -2859,7 +2927,7 @@ static void batadv_tt_purge(struct work_struct *work)
2859 priv_tt = container_of(delayed_work, struct batadv_priv_tt, work); 2927 priv_tt = container_of(delayed_work, struct batadv_priv_tt, work);
2860 bat_priv = container_of(priv_tt, struct batadv_priv, tt); 2928 bat_priv = container_of(priv_tt, struct batadv_priv, tt);
2861 2929
2862 batadv_tt_local_purge(bat_priv); 2930 batadv_tt_local_purge(bat_priv, BATADV_TT_LOCAL_TIMEOUT);
2863 batadv_tt_global_purge(bat_priv); 2931 batadv_tt_global_purge(bat_priv);
2864 batadv_tt_req_purge(bat_priv); 2932 batadv_tt_req_purge(bat_priv);
2865 batadv_tt_roam_purge(bat_priv); 2933 batadv_tt_roam_purge(bat_priv);
@@ -2972,18 +3040,18 @@ static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv)
2972} 3040}
2973 3041
2974/** 3042/**
2975 * batadv_tt_local_commit_changes - commit all pending local tt changes which 3043 * batadv_tt_local_commit_changes_nolock - commit all pending local tt changes
2976 * have been queued in the time since the last commit 3044 * which have been queued in the time since the last commit
2977 * @bat_priv: the bat priv with all the soft interface information 3045 * @bat_priv: the bat priv with all the soft interface information
3046 *
3047 * Caller must hold tt->commit_lock.
2978 */ 3048 */
2979void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv) 3049static void batadv_tt_local_commit_changes_nolock(struct batadv_priv *bat_priv)
2980{ 3050{
2981 spin_lock_bh(&bat_priv->tt.commit_lock);
2982
2983 if (atomic_read(&bat_priv->tt.local_changes) < 1) { 3051 if (atomic_read(&bat_priv->tt.local_changes) < 1) {
2984 if (!batadv_atomic_dec_not_zero(&bat_priv->tt.ogm_append_cnt)) 3052 if (!batadv_atomic_dec_not_zero(&bat_priv->tt.ogm_append_cnt))
2985 batadv_tt_tvlv_container_update(bat_priv); 3053 batadv_tt_tvlv_container_update(bat_priv);
2986 goto out; 3054 return;
2987 } 3055 }
2988 3056
2989 batadv_tt_local_set_flags(bat_priv, BATADV_TT_CLIENT_NEW, false, true); 3057 batadv_tt_local_set_flags(bat_priv, BATADV_TT_CLIENT_NEW, false, true);
@@ -3000,8 +3068,17 @@ void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv)
3000 /* reset the sending counter */ 3068 /* reset the sending counter */
3001 atomic_set(&bat_priv->tt.ogm_append_cnt, BATADV_TT_OGM_APPEND_MAX); 3069 atomic_set(&bat_priv->tt.ogm_append_cnt, BATADV_TT_OGM_APPEND_MAX);
3002 batadv_tt_tvlv_container_update(bat_priv); 3070 batadv_tt_tvlv_container_update(bat_priv);
3071}
3003 3072
3004out: 3073/**
3074 * batadv_tt_local_commit_changes - commit all pending local tt changes which
3075 * have been queued in the time since the last commit
3076 * @bat_priv: the bat priv with all the soft interface information
3077 */
3078void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv)
3079{
3080 spin_lock_bh(&bat_priv->tt.commit_lock);
3081 batadv_tt_local_commit_changes_nolock(bat_priv);
3005 spin_unlock_bh(&bat_priv->tt.commit_lock); 3082 spin_unlock_bh(&bat_priv->tt.commit_lock);
3006} 3083}
3007 3084
@@ -3197,6 +3274,47 @@ out:
3197} 3274}
3198 3275
3199/** 3276/**
3277 * batadv_tt_local_resize_to_mtu - resize the local translation table fit the
3278 * maximum packet size that can be transported through the mesh
3279 * @soft_iface: netdev struct of the mesh interface
3280 *
3281 * Remove entries older than 'timeout' and half timeout if more entries need
3282 * to be removed.
3283 */
3284void batadv_tt_local_resize_to_mtu(struct net_device *soft_iface)
3285{
3286 struct batadv_priv *bat_priv = netdev_priv(soft_iface);
3287 int packet_size_max = atomic_read(&bat_priv->packet_size_max);
3288 int table_size, timeout = BATADV_TT_LOCAL_TIMEOUT / 2;
3289 bool reduced = false;
3290
3291 spin_lock_bh(&bat_priv->tt.commit_lock);
3292
3293 while (true) {
3294 table_size = batadv_tt_local_table_transmit_size(bat_priv);
3295 if (packet_size_max >= table_size)
3296 break;
3297
3298 batadv_tt_local_purge(bat_priv, timeout);
3299 batadv_tt_local_purge_pending_clients(bat_priv);
3300
3301 timeout /= 2;
3302 reduced = true;
3303 net_ratelimited_function(batadv_info, soft_iface,
3304 "Forced to purge local tt entries to fit new maximum fragment MTU (%i)\n",
3305 packet_size_max);
3306 }
3307
3308 /* commit these changes immediately, to avoid synchronization problem
3309 * with the TTVN
3310 */
3311 if (reduced)
3312 batadv_tt_local_commit_changes_nolock(bat_priv);
3313
3314 spin_unlock_bh(&bat_priv->tt.commit_lock);
3315}
3316
3317/**
3200 * batadv_tt_tvlv_ogm_handler_v1 - process incoming tt tvlv container 3318 * batadv_tt_tvlv_ogm_handler_v1 - process incoming tt tvlv container
3201 * @bat_priv: the bat priv with all the soft interface information 3319 * @bat_priv: the bat priv with all the soft interface information
3202 * @orig: the orig_node of the ogm 3320 * @orig: the orig_node of the ogm
diff --git a/net/batman-adv/translation-table.h b/net/batman-adv/translation-table.h
index dc6db4e00a43..026b1ffa6746 100644
--- a/net/batman-adv/translation-table.h
+++ b/net/batman-adv/translation-table.h
@@ -21,7 +21,7 @@
21#define _NET_BATMAN_ADV_TRANSLATION_TABLE_H_ 21#define _NET_BATMAN_ADV_TRANSLATION_TABLE_H_
22 22
23int batadv_tt_init(struct batadv_priv *bat_priv); 23int batadv_tt_init(struct batadv_priv *bat_priv);
24void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, 24bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
25 unsigned short vid, int ifindex); 25 unsigned short vid, int ifindex);
26uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv, 26uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv,
27 const uint8_t *addr, unsigned short vid, 27 const uint8_t *addr, unsigned short vid,
@@ -45,6 +45,7 @@ bool batadv_tt_global_client_is_roaming(struct batadv_priv *bat_priv,
45 uint8_t *addr, unsigned short vid); 45 uint8_t *addr, unsigned short vid);
46bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv, 46bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv,
47 uint8_t *addr, unsigned short vid); 47 uint8_t *addr, unsigned short vid);
48void batadv_tt_local_resize_to_mtu(struct net_device *soft_iface);
48bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv, 49bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv,
49 struct batadv_orig_node *orig_node, 50 struct batadv_orig_node *orig_node,
50 const unsigned char *addr, 51 const unsigned char *addr,
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index 672a8134d3ba..04b6b0b00af2 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -612,6 +612,8 @@ struct batadv_softif_vlan {
612 * @aggregated_ogms: bool indicating whether OGM aggregation is enabled 612 * @aggregated_ogms: bool indicating whether OGM aggregation is enabled
613 * @bonding: bool indicating whether traffic bonding is enabled 613 * @bonding: bool indicating whether traffic bonding is enabled
614 * @fragmentation: bool indicating whether traffic fragmentation is enabled 614 * @fragmentation: bool indicating whether traffic fragmentation is enabled
615 * @packet_size_max: max packet size that can be transmitted via
616 * multiple fragmented skbs or a single frame if fragmentation is disabled
615 * @frag_seqno: incremental counter to identify chains of egress fragments 617 * @frag_seqno: incremental counter to identify chains of egress fragments
616 * @bridge_loop_avoidance: bool indicating whether bridge loop avoidance is 618 * @bridge_loop_avoidance: bool indicating whether bridge loop avoidance is
617 * enabled 619 * enabled
@@ -658,6 +660,7 @@ struct batadv_priv {
658 atomic_t aggregated_ogms; 660 atomic_t aggregated_ogms;
659 atomic_t bonding; 661 atomic_t bonding;
660 atomic_t fragmentation; 662 atomic_t fragmentation;
663 atomic_t packet_size_max;
661 atomic_t frag_seqno; 664 atomic_t frag_seqno;
662#ifdef CONFIG_BATMAN_ADV_BLA 665#ifdef CONFIG_BATMAN_ADV_BLA
663 atomic_t bridge_loop_avoidance; 666 atomic_t bridge_loop_avoidance;