2012-05-12 04:09:43 +04:00
/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
2010-12-13 14:19:28 +03:00
*
* Andreas Langer
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA
* 02110 - 1301 , USA
*/
# ifndef _NET_BATMAN_ADV_UNICAST_H_
# define _NET_BATMAN_ADV_UNICAST_H_
2011-01-26 01:02:31 +03:00
# include "packet.h"
2012-06-04 00:19:15 +04:00
# define BATADV_FRAG_TIMEOUT 10000 /* purge frag list entries after time in ms */
# define BATADV_FRAG_BUFFER_SIZE 6 /* number of list elements in buffer */
2010-12-13 14:19:28 +03:00
2012-06-06 00:31:31 +04:00
int batadv_frag_reassemble_skb ( struct sk_buff * skb ,
struct batadv_priv * bat_priv ,
2012-05-12 04:09:40 +04:00
struct sk_buff * * new_skb ) ;
void batadv_frag_list_free ( struct list_head * head ) ;
2012-06-06 00:31:31 +04:00
int batadv_unicast_send_skb ( struct sk_buff * skb , struct batadv_priv * bat_priv ) ;
int batadv_frag_send_skb ( struct sk_buff * skb , struct batadv_priv * bat_priv ,
struct batadv_hard_iface * hard_iface ,
2012-05-12 04:09:40 +04:00
const uint8_t dstaddr [ ] ) ;
2010-12-13 14:19:28 +03:00
2012-05-12 15:48:57 +04:00
static inline int batadv_frag_can_reassemble ( const struct sk_buff * skb , int mtu )
2011-01-26 01:02:31 +03:00
{
2012-06-06 00:31:30 +04:00
const struct batadv_unicast_frag_packet * unicast_packet ;
2011-01-26 01:02:31 +03:00
int uneven_correction = 0 ;
unsigned int merged_size ;
2012-06-06 00:31:30 +04:00
unicast_packet = ( struct batadv_unicast_frag_packet * ) skb - > data ;
2011-01-26 01:02:31 +03:00
2012-06-04 00:19:21 +04:00
if ( unicast_packet - > flags & BATADV_UNI_FRAG_LARGETAIL ) {
if ( unicast_packet - > flags & BATADV_UNI_FRAG_HEAD )
2011-01-26 01:02:31 +03:00
uneven_correction = 1 ;
else
uneven_correction = - 1 ;
}
2011-05-15 01:14:54 +04:00
merged_size = ( skb - > len - sizeof ( * unicast_packet ) ) * 2 ;
2012-06-06 00:31:30 +04:00
merged_size + = sizeof ( struct batadv_unicast_packet ) + uneven_correction ;
2011-01-26 01:02:31 +03:00
return merged_size < = mtu ;
}
2010-12-13 14:19:28 +03:00
# endif /* _NET_BATMAN_ADV_UNICAST_H_ */