@ -507,11 +507,10 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node,
const struct ethhdr * ethhdr ,
struct batman_ogm_packet * batman_ogm_packet ,
bool is_single_hop_neigh ,
bool is_from_best_next_hop ,
struct hard_iface * if_incoming )
{
struct bat_priv * bat_priv = netdev_priv ( if_incoming - > soft_iface ) ;
struct neigh_node * router ;
uint8_t in_tq , in_ttl , tq_avg = 0 ;
uint8_t tt_num_changes ;
if ( batman_ogm_packet - > header . ttl < = 1 ) {
@ -519,41 +518,30 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node,
return ;
}
router = orig_node_get_router ( orig_node ) ;
if ( ! is_from_best_next_hop ) {
/* Mark the forwarded packet when it is not coming from our
* best next hop . We still need to forward the packet for our
* neighbor link quality detection to work in case the packet
* originated from a single hop neighbor . Otherwise we can
* simply drop the ogm .
*/
if ( is_single_hop_neigh )
batman_ogm_packet - > flags | = NOT_BEST_NEXT_HOP ;
else
return ;
}
in_tq = batman_ogm_packet - > tq ;
in_ttl = batman_ogm_packet - > header . ttl ;
tt_num_changes = batman_ogm_packet - > tt_num_changes ;
batman_ogm_packet - > header . ttl - - ;
memcpy ( batman_ogm_packet - > prev_sender , ethhdr - > h_source , ETH_ALEN ) ;
/* rebroadcast tq of our best ranking neighbor to ensure the rebroadcast
* of our best tq value */
if ( router & & router - > tq_avg ! = 0 ) {
/* rebroadcast ogm of best ranking neighbor as is */
if ( ! compare_eth ( router - > addr , ethhdr - > h_source ) ) {
batman_ogm_packet - > tq = router - > tq_avg ;
if ( router - > last_ttl )
batman_ogm_packet - > header . ttl =
router - > last_ttl - 1 ;
}
tq_avg = router - > tq_avg ;
}
if ( router )
neigh_node_free_ref ( router ) ;
/* apply hop penalty */
batman_ogm_packet - > tq = hop_penalty ( batman_ogm_packet - > tq , bat_priv ) ;
bat_dbg ( DBG_BATMAN , bat_priv ,
" Forwarding packet: tq_orig: %i, tq_avg: %i, tq_forw: %i, ttl_orig: %i, ttl_forw: %i \n " ,
in_tq , tq_avg , batman_ogm_packet - > tq , in_ttl - 1 ,
batman_ogm_packet - > header . ttl ) ;
" Forwarding packet: tq: %i, ttl: %i \n " ,
batman_ogm_packet - > tq , batman_ogm_packet - > header . ttl ) ;
batman_ogm_packet - > seqno = htonl ( batman_ogm_packet - > seqno ) ;
batman_ogm_packet - > tt_crc = htons ( batman_ogm_packet - > tt_crc ) ;
@ -949,6 +937,7 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
int is_my_addr = 0 , is_my_orig = 0 , is_my_oldorig = 0 ;
int is_broadcast = 0 , is_bidirectional ;
bool is_single_hop_neigh = false ;
bool is_from_best_next_hop = false ;
int is_duplicate ;
uint32_t if_incoming_seqno ;
@ -1070,6 +1059,13 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
return ;
}
if ( batman_ogm_packet - > flags & NOT_BEST_NEXT_HOP ) {
bat_dbg ( DBG_BATMAN , bat_priv ,
" Drop packet: ignoring all packets not forwarded from "
" the best next hop (sender: %pM) \n " , ethhdr - > h_source ) ;
return ;
}
orig_node = get_orig_node ( bat_priv , batman_ogm_packet - > orig ) ;
if ( ! orig_node )
return ;
@ -1094,6 +1090,10 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
if ( router )
router_router = orig_node_get_router ( router - > orig_node ) ;
if ( ( router & & router - > tq_avg ! = 0 ) & &
( compare_eth ( router - > addr , ethhdr - > h_source ) ) )
is_from_best_next_hop = true ;
/* avoid temporary routing loops */
if ( router & & router_router & &
( compare_eth ( router - > addr , batman_ogm_packet - > prev_sender ) ) & &
@ -1144,7 +1144,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
/* mark direct link on incoming interface */
bat_iv_ogm_forward ( orig_node , ethhdr , batman_ogm_packet ,
is_single_hop_neigh , if_incoming ) ;
is_single_hop_neigh , is_from_best_next_hop ,
if_incoming ) ;
bat_dbg ( DBG_BATMAN , bat_priv ,
" Forwarding packet: rebroadcast neighbor packet with direct link flag \n " ) ;
@ -1167,7 +1168,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr,
bat_dbg ( DBG_BATMAN , bat_priv ,
" Forwarding packet: rebroadcast originator packet \n " ) ;
bat_iv_ogm_forward ( orig_node , ethhdr , batman_ogm_packet ,
is_single_hop_neigh , if_incoming ) ;
is_single_hop_neigh , is_from_best_next_hop ,
if_incoming ) ;
out_neigh :
if ( ( orig_neigh_node ) & & ( ! is_single_hop_neigh ) )