aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/fragmentation.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2017-05-02 02:25:25 -0400
committerTakashi Iwai <tiwai@suse.de>2017-05-02 02:25:25 -0400
commita5c3b32a1146e44f6b38fdfdfffc27842953420c (patch)
treeeca93f51c8deabe77ed079a3e9190717b6380009 /net/batman-adv/fragmentation.c
parentd7dc450d5a7162de96edbed6b1792240c2f3a55f (diff)
parent20d5c84bef067b7e804a163e2abca16c47125bad (diff)
Merge tag 'asoc-v4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Updates for v4.12 A quiet release for the core, but lots of new drivers this time around: - A new, generalized, API for hooking up jacks which makes it easier to write generic machine drivers for simple cases. - Continuing fixes for issues with the x86 CPU drivers. - New drivers for Cirrus CS35L35, DIO DIO2125, Everest ES7132, HiSilicon hi6210, Maxim MAX98927, MT2701 systems with WM8960, Nuvoton NAU8824, Odroid systems, ST STM32 SAI controllers and x86 systems with DA7213
Diffstat (limited to 'net/batman-adv/fragmentation.c')
-rw-r--r--net/batman-adv/fragmentation.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
index 11a23fd6e1a0..8f964beaac28 100644
--- a/net/batman-adv/fragmentation.c
+++ b/net/batman-adv/fragmentation.c
@@ -404,7 +404,7 @@ out:
404 * batadv_frag_create - create a fragment from skb 404 * batadv_frag_create - create a fragment from skb
405 * @skb: skb to create fragment from 405 * @skb: skb to create fragment from
406 * @frag_head: header to use in new fragment 406 * @frag_head: header to use in new fragment
407 * @mtu: size of new fragment 407 * @fragment_size: size of new fragment
408 * 408 *
409 * Split the passed skb into two fragments: A new one with size matching the 409 * Split the passed skb into two fragments: A new one with size matching the
410 * passed mtu and the old one with the rest. The new skb contains data from the 410 * passed mtu and the old one with the rest. The new skb contains data from the
@@ -414,11 +414,11 @@ out:
414 */ 414 */
415static struct sk_buff *batadv_frag_create(struct sk_buff *skb, 415static struct sk_buff *batadv_frag_create(struct sk_buff *skb,
416 struct batadv_frag_packet *frag_head, 416 struct batadv_frag_packet *frag_head,
417 unsigned int mtu) 417 unsigned int fragment_size)
418{ 418{
419 struct sk_buff *skb_fragment; 419 struct sk_buff *skb_fragment;
420 unsigned int header_size = sizeof(*frag_head); 420 unsigned int header_size = sizeof(*frag_head);
421 unsigned int fragment_size = mtu - header_size; 421 unsigned int mtu = fragment_size + header_size;
422 422
423 skb_fragment = netdev_alloc_skb(NULL, mtu + ETH_HLEN); 423 skb_fragment = netdev_alloc_skb(NULL, mtu + ETH_HLEN);
424 if (!skb_fragment) 424 if (!skb_fragment)
@@ -456,7 +456,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
456 struct sk_buff *skb_fragment; 456 struct sk_buff *skb_fragment;
457 unsigned int mtu = neigh_node->if_incoming->net_dev->mtu; 457 unsigned int mtu = neigh_node->if_incoming->net_dev->mtu;
458 unsigned int header_size = sizeof(frag_header); 458 unsigned int header_size = sizeof(frag_header);
459 unsigned int max_fragment_size, max_packet_size; 459 unsigned int max_fragment_size, num_fragments;
460 int ret; 460 int ret;
461 461
462 /* To avoid merge and refragmentation at next-hops we never send 462 /* To avoid merge and refragmentation at next-hops we never send
@@ -464,10 +464,15 @@ int batadv_frag_send_packet(struct sk_buff *skb,
464 */ 464 */
465 mtu = min_t(unsigned int, mtu, BATADV_FRAG_MAX_FRAG_SIZE); 465 mtu = min_t(unsigned int, mtu, BATADV_FRAG_MAX_FRAG_SIZE);
466 max_fragment_size = mtu - header_size; 466 max_fragment_size = mtu - header_size;
467 max_packet_size = max_fragment_size * BATADV_FRAG_MAX_FRAGMENTS; 467
468 if (skb->len == 0 || max_fragment_size == 0)
469 return -EINVAL;
470
471 num_fragments = (skb->len - 1) / max_fragment_size + 1;
472 max_fragment_size = (skb->len - 1) / num_fragments + 1;
468 473
469 /* Don't even try to fragment, if we need more than 16 fragments */ 474 /* Don't even try to fragment, if we need more than 16 fragments */
470 if (skb->len > max_packet_size) { 475 if (num_fragments > BATADV_FRAG_MAX_FRAGMENTS) {
471 ret = -EAGAIN; 476 ret = -EAGAIN;
472 goto free_skb; 477 goto free_skb;
473 } 478 }
@@ -507,7 +512,8 @@ int batadv_frag_send_packet(struct sk_buff *skb,
507 goto put_primary_if; 512 goto put_primary_if;
508 } 513 }
509 514
510 skb_fragment = batadv_frag_create(skb, &frag_header, mtu); 515 skb_fragment = batadv_frag_create(skb, &frag_header,
516 max_fragment_size);
511 if (!skb_fragment) { 517 if (!skb_fragment) {
512 ret = -ENOMEM; 518 ret = -ENOMEM;
513 goto put_primary_if; 519 goto put_primary_if;