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} |