aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv
diff options
context:
space:
mode:
authorMarek Lindner <lindner_marek@yahoo.de>2013-05-27 03:33:25 -0400
committerAntonio Quartulli <antonio@meshcoding.com>2013-10-23 11:03:43 -0400
commita19d3d85e1b854e4a483a55d740a42458085560d (patch)
treea289948258c78d0ea968059ab432046ac2938d56 /net/batman-adv
parent4627456a77782026ab60c4a16435b089bb444fce (diff)
batman-adv: limit local translation table max size
The local translation table size is limited by what can be transferred from one node to another via a full table request. The number of entries fitting into a full table request depend on whether the fragmentation is enabled or not. Therefore this patch introduces a max table size check and refuses to add more local clients when that size is reached. Moreover, if the max full table packet size changes (MTU change or fragmentation is disabled) the local table is downsized instantaneously. Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> Acked-by: Antonio Quartulli <ordex@autistici.org>
Diffstat (limited to 'net/batman-adv')
-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;