2012-05-12 02:09:43 +02:00
/* Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
2010-12-13 11:19:28 +00: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-25 22:02:31 +00:00
# include "packet.h"
2012-06-03 22:19:15 +02: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 11:19:28 +00:00
2012-06-05 22:31:31 +02:00
int batadv_frag_reassemble_skb ( struct sk_buff * skb ,
struct batadv_priv * bat_priv ,
2012-05-12 02:09:40 +02:00
struct sk_buff * * new_skb ) ;
void batadv_frag_list_free ( struct list_head * head ) ;
2012-06-05 22:31:31 +02:00
int batadv_frag_send_skb ( struct sk_buff * skb , struct batadv_priv * bat_priv ,
struct batadv_hard_iface * hard_iface ,
2012-05-12 02:09:40 +02:00
const uint8_t dstaddr [ ] ) ;
2011-11-23 11:35:44 +01:00
bool batadv_unicast_4addr_prepare_skb ( struct batadv_priv * bat_priv ,
struct sk_buff * skb ,
struct batadv_orig_node * orig_node ,
int packet_subtype ) ;
2012-10-01 09:57:35 +02:00
int batadv_unicast_generic_send_skb ( struct batadv_priv * bat_priv ,
struct sk_buff * skb , int packet_type ,
int packet_subtype ) ;
/**
* batadv_unicast_send_skb - send the skb encapsulated in a unicast packet
* @ bat_priv : the bat priv with all the soft interface information
* @ skb : the payload to send
*/
static inline int batadv_unicast_send_skb ( struct batadv_priv * bat_priv ,
struct sk_buff * skb )
{
return batadv_unicast_generic_send_skb ( bat_priv , skb , BATADV_UNICAST ,
0 ) ;
}
/**
* batadv_unicast_send_skb - send the skb encapsulated in a unicast4addr packet
* @ bat_priv : the bat priv with all the soft interface information
* @ skb : the payload to send
* @ packet_subtype : the batman 4 addr packet subtype to use
*/
static inline int batadv_unicast_4addr_send_skb ( struct batadv_priv * bat_priv ,
struct sk_buff * skb ,
int packet_subtype )
{
return batadv_unicast_generic_send_skb ( bat_priv , skb ,
BATADV_UNICAST_4ADDR ,
packet_subtype ) ;
}
2010-12-13 11:19:28 +00:00
2012-05-12 13:48:57 +02:00
static inline int batadv_frag_can_reassemble ( const struct sk_buff * skb , int mtu )
2011-01-25 22:02:31 +00:00
{
2012-06-05 22:31:30 +02:00
const struct batadv_unicast_frag_packet * unicast_packet ;
2011-01-25 22:02:31 +00:00
int uneven_correction = 0 ;
unsigned int merged_size ;
2012-06-05 22:31:30 +02:00
unicast_packet = ( struct batadv_unicast_frag_packet * ) skb - > data ;
2011-01-25 22:02:31 +00:00
2012-06-03 22:19:21 +02:00
if ( unicast_packet - > flags & BATADV_UNI_FRAG_LARGETAIL ) {
if ( unicast_packet - > flags & BATADV_UNI_FRAG_HEAD )
2011-01-25 22:02:31 +00:00
uneven_correction = 1 ;
else
uneven_correction = - 1 ;
}
2011-05-14 23:14:54 +02:00
merged_size = ( skb - > len - sizeof ( * unicast_packet ) ) * 2 ;
2012-06-05 22:31:30 +02:00
merged_size + = sizeof ( struct batadv_unicast_packet ) + uneven_correction ;
2011-01-25 22:02:31 +00:00
return merged_size < = mtu ;
}
2010-12-13 11:19:28 +00:00
# endif /* _NET_BATMAN_ADV_UNICAST_H_ */