fragmentation.c (879f99ef2c4c05d9a7f0a67a05f1415663119825) fragmentation.c (be181015a189cd141398b761ba4e79d33fe69949)
1/* Copyright (C) 2013-2014 B.A.T.M.A.N. contributors:
2 *
3 * Martin Hundebøll <martin@hundeboll.net>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of version 2 of the GNU General Public
7 * License as published by the Free Software Foundation.
8 *

--- 404 unchanged lines hidden (view full) ---

413 *
414 * Returns true on success, false otherwise.
415 */
416bool batadv_frag_send_packet(struct sk_buff *skb,
417 struct batadv_orig_node *orig_node,
418 struct batadv_neigh_node *neigh_node)
419{
420 struct batadv_priv *bat_priv;
1/* Copyright (C) 2013-2014 B.A.T.M.A.N. contributors:
2 *
3 * Martin Hundebøll <martin@hundeboll.net>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of version 2 of the GNU General Public
7 * License as published by the Free Software Foundation.
8 *

--- 404 unchanged lines hidden (view full) ---

413 *
414 * Returns true on success, false otherwise.
415 */
416bool batadv_frag_send_packet(struct sk_buff *skb,
417 struct batadv_orig_node *orig_node,
418 struct batadv_neigh_node *neigh_node)
419{
420 struct batadv_priv *bat_priv;
421 struct batadv_hard_iface *primary_if;
421 struct batadv_hard_iface *primary_if = NULL;
422 struct batadv_frag_packet frag_header;
423 struct sk_buff *skb_fragment;
424 unsigned mtu = neigh_node->if_incoming->net_dev->mtu;
425 unsigned header_size = sizeof(frag_header);
426 unsigned max_fragment_size, max_packet_size;
422 struct batadv_frag_packet frag_header;
423 struct sk_buff *skb_fragment;
424 unsigned mtu = neigh_node->if_incoming->net_dev->mtu;
425 unsigned header_size = sizeof(frag_header);
426 unsigned max_fragment_size, max_packet_size;
427 bool ret = false;
427
428 /* To avoid merge and refragmentation at next-hops we never send
429 * fragments larger than BATADV_FRAG_MAX_FRAG_SIZE
430 */
431 mtu = min_t(unsigned, mtu, BATADV_FRAG_MAX_FRAG_SIZE);
432 max_fragment_size = (mtu - header_size - ETH_HLEN);
433 max_packet_size = max_fragment_size * BATADV_FRAG_MAX_FRAGMENTS;
434

--- 43 unchanged lines hidden (view full) ---

478 memcpy(skb->data, &frag_header, header_size);
479
480 /* Send the last fragment */
481 batadv_inc_counter(bat_priv, BATADV_CNT_FRAG_TX);
482 batadv_add_counter(bat_priv, BATADV_CNT_FRAG_TX_BYTES,
483 skb->len + ETH_HLEN);
484 batadv_send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
485
428
429 /* To avoid merge and refragmentation at next-hops we never send
430 * fragments larger than BATADV_FRAG_MAX_FRAG_SIZE
431 */
432 mtu = min_t(unsigned, mtu, BATADV_FRAG_MAX_FRAG_SIZE);
433 max_fragment_size = (mtu - header_size - ETH_HLEN);
434 max_packet_size = max_fragment_size * BATADV_FRAG_MAX_FRAGMENTS;
435

--- 43 unchanged lines hidden (view full) ---

479 memcpy(skb->data, &frag_header, header_size);
480
481 /* Send the last fragment */
482 batadv_inc_counter(bat_priv, BATADV_CNT_FRAG_TX);
483 batadv_add_counter(bat_priv, BATADV_CNT_FRAG_TX_BYTES,
484 skb->len + ETH_HLEN);
485 batadv_send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
486
486 return true;
487 ret = true;
488
487out_err:
489out_err:
488 return false;
490 if (primary_if)
491 batadv_hardif_free_ref(primary_if);
492
493 return ret;
489}
494}