diff options
-rw-r--r-- | net/batman-adv/hard-interface.c | 41 | ||||
-rw-r--r-- | net/batman-adv/soft-interface.c | 12 | ||||
-rw-r--r-- | net/batman-adv/translation-table.c | 150 | ||||
-rw-r--r-- | net/batman-adv/translation-table.h | 3 | ||||
-rw-r--r-- | net/batman-adv/types.h | 3 |
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 | ||
267 | int batadv_hardif_min_mtu(struct net_device *soft_iface) | 267 | int 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 | |||
293 | out: | 303 | out: |
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. */ |
298 | void batadv_update_min_mtu(struct net_device *soft_iface) | 308 | void 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 | ||
307 | static void | 318 | static 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 | */ | ||
411 | static 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 | |||
404 | static int batadv_tt_local_init(struct batadv_priv *bat_priv) | 433 | static 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 | */ |
443 | void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | 474 | bool 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 | |||
553 | out: | 597 | out: |
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 | */ | ||
929 | static void batadv_tt_local_purge_list(struct batadv_priv *bat_priv, | 981 | static 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 | ||
957 | static 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 | */ | ||
1015 | static 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 | */ |
2979 | void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv) | 3049 | static 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 | ||
3004 | out: | 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 | */ | ||
3078 | void 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 | */ | ||
3284 | void 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 | ||
23 | int batadv_tt_init(struct batadv_priv *bat_priv); | 23 | int batadv_tt_init(struct batadv_priv *bat_priv); |
24 | void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | 24 | bool 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); |
26 | uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv, | 26 | uint16_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); |
46 | bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv, | 46 | bool 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); |
48 | void batadv_tt_local_resize_to_mtu(struct net_device *soft_iface); | ||
48 | bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv, | 49 | bool 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; |