2012-05-12 02:09:43 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 *  Marek  Lindner ,  Simon  Wunderlich 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 *  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 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "main.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "hard-interface.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "soft-interface.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "send.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "translation-table.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "routing.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-10 23:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "sysfs.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								# include  "originator.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "hash.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-22 20:00:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "bridge_loop_avoidance.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <linux/if_arp.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  batadv_hardif_free_rcu ( struct  rcu_head  * rcu ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface  =  container_of ( rcu ,  struct  batadv_hard_iface ,  rcu ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									dev_put ( hard_iface - > net_dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									kfree ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								struct  batadv_hard_iface  * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								batadv_hardif_get_by_netdev ( const  struct  net_device  * net_dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rcu_read_lock ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									list_for_each_entry_rcu ( hard_iface ,  & batadv_hardif_list ,  list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( hard_iface - > net_dev  = =  net_dev  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    atomic_inc_not_zero ( & hard_iface - > refcount ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rcu_read_unlock ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  int  batadv_is_valid_iface ( const  struct  net_device  * net_dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( net_dev - > flags  &  IFF_LOOPBACK ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( net_dev - > type  ! =  ARPHRD_ETHER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( net_dev - > addr_len  ! =  ETH_ALEN ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									/* no batman over batman */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( batadv_softif_is_valid ( net_dev ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  struct  batadv_hard_iface  * 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								batadv_hardif_get_active ( const  struct  net_device  * soft_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rcu_read_lock ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									list_for_each_entry_rcu ( hard_iface ,  & batadv_hardif_list ,  list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( hard_iface - > soft_iface  ! =  soft_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( hard_iface - > if_status  = =  BATADV_IF_ACTIVE  & & 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										    atomic_inc_not_zero ( & hard_iface - > refcount ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rcu_read_unlock ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  void  batadv_primary_if_update_addr ( struct  batadv_priv  * bat_priv , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													  struct  batadv_hard_iface  * oldif ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_vis_packet  * vis_packet ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * primary_if ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-07-15 22:26:51 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  sk_buff  * skb ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									primary_if  =  batadv_primary_if_get_selected ( bat_priv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! primary_if ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-07-15 22:26:51 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									skb  =  bat_priv - > vis . my_info - > skb_packet ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									vis_packet  =  ( struct  batadv_vis_packet  * ) skb - > data ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									memcpy ( vis_packet - > vis_orig ,  primary_if - > net_dev - > dev_addr ,  ETH_ALEN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									memcpy ( vis_packet - > sender_orig , 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									       primary_if - > net_dev - > dev_addr ,  ETH_ALEN ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:38:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_bla_update_orig_address ( bat_priv ,  primary_if ,  oldif ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( primary_if ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_free_ref ( primary_if ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  void  batadv_primary_if_select ( struct  batadv_priv  * bat_priv , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												     struct  batadv_hard_iface  * new_hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * curr_hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-03 11:51:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ASSERT_RTNL ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( new_hard_iface  & &  ! atomic_inc_not_zero ( & new_hard_iface - > refcount ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										new_hard_iface  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-15 00:50:21 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									curr_hard_iface  =  rcu_dereference_protected ( bat_priv - > primary_if ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									rcu_assign_pointer ( bat_priv - > primary_if ,  new_hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! new_hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-22 20:00:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 17:20:49 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									bat_priv - > bat_algo_ops - > bat_primary_iface_set ( new_hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_primary_if_update_addr ( bat_priv ,  curr_hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-01-22 20:00:19 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( curr_hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_free_ref ( curr_hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								batadv_hardif_is_iface_up ( const  struct  batadv_hard_iface  * hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( hard_iface - > net_dev - > flags  &  IFF_UP ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  void  batadv_check_known_mac_addr ( const  struct  net_device  * net_dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  struct  batadv_hard_iface  * hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rcu_read_lock ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									list_for_each_entry_rcu ( hard_iface ,  & batadv_hardif_list ,  list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ( hard_iface - > if_status  ! =  BATADV_IF_ACTIVE )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    ( hard_iface - > if_status  ! =  BATADV_IF_TO_BE_ACTIVATED ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( hard_iface - > net_dev  = =  net_dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ! batadv_compare_eth ( hard_iface - > net_dev - > dev_addr , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
													net_dev - > dev_addr ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-26 16:22:45 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										pr_warn ( " The newly added mac address (%pM) already exists on: %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											net_dev - > dev_addr ,  hard_iface - > net_dev - > name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pr_warn ( " It is strongly recommended to keep mac addresses unique to avoid problems! \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rcu_read_unlock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								int  batadv_hardif_min_mtu ( struct  net_device  * soft_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  struct  batadv_priv  * bat_priv  =  netdev_priv ( soft_iface ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  struct  batadv_hard_iface  * hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									/* allow big frames if all devices are capable to do so
 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:43 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									 *  ( have  MTU  >  1500  +  BAT_HEADER_LEN ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									int  min_mtu  =  ETH_DATA_LEN ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( atomic_read ( & bat_priv - > fragmentation ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rcu_read_lock ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									list_for_each_entry_rcu ( hard_iface ,  & batadv_hardif_list ,  list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ( hard_iface - > if_status  ! =  BATADV_IF_ACTIVE )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    ( hard_iface - > if_status  ! =  BATADV_IF_TO_BE_ACTIVATED ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( hard_iface - > soft_iface  ! =  soft_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										min_mtu  =  min_t ( int , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												hard_iface - > net_dev - > mtu  -  BATADV_HEADER_LEN , 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
												min_mtu ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rcu_read_unlock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  min_mtu ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								/* adjusts the MTU if a new interface with a smaller MTU appeared. */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  batadv_update_min_mtu ( struct  net_device  * soft_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									int  min_mtu ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									min_mtu  =  batadv_hardif_min_mtu ( soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									if  ( soft_iface - > mtu  ! =  min_mtu ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										soft_iface - > mtu  =  min_mtu ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  void 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								batadv_hardif_activate_interface ( struct  batadv_hard_iface  * hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_priv  * bat_priv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * primary_if  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( hard_iface - > if_status  ! =  BATADV_IF_INACTIVE ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									bat_priv  =  netdev_priv ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-03-11 06:17:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									bat_priv - > bat_algo_ops - > bat_iface_update_mac ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > if_status  =  BATADV_IF_TO_BE_ACTIVATED ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:43 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									/* the first active interface becomes our primary interface or
 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-09 17:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									 *  the  next  active  interface  after  the  old  primary  interface  was  removed 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									primary_if  =  batadv_primary_if_get_selected ( bat_priv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! primary_if ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_primary_if_select ( bat_priv ,  hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 20:23:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_info ( hard_iface - > soft_iface ,  " Interface activated: %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    hard_iface - > net_dev - > name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_update_min_mtu ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( primary_if ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_free_ref ( primary_if ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  void 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								batadv_hardif_deactivate_interface ( struct  batadv_hard_iface  * hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ( hard_iface - > if_status  ! =  BATADV_IF_ACTIVE )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    ( hard_iface - > if_status  ! =  BATADV_IF_TO_BE_ACTIVATED ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > if_status  =  BATADV_IF_INACTIVE ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 20:23:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_info ( hard_iface - > soft_iface ,  " Interface deactivated: %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    hard_iface - > net_dev - > name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_update_min_mtu ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								int  batadv_hardif_enable_interface ( struct  batadv_hard_iface  * hard_iface , 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												   const  char  * iface_name ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_priv  * bat_priv ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  net_device  * soft_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									__be16  ethertype  =  __constant_htons ( BATADV_ETH_P_BATMAN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									int  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( hard_iface - > if_status  ! =  BATADV_IF_NOT_IN_USE ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! atomic_inc_not_zero ( & hard_iface - > refcount ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-10 14:33:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 18:02:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									/* hard-interface is part of a bridge */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( hard_iface - > net_dev - > priv_flags  &  IFF_BRIDGE_PORT ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-07 09:07:45 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										pr_err ( " You are about to enable batman-adv on '%s' which already is part of a bridge. Unless you know exactly what you are doing this is probably wrong and won't work the way you think it would. \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 18:02:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										       hard_iface - > net_dev - > name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									soft_iface  =  dev_get_by_name ( & init_net ,  iface_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! soft_iface )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										soft_iface  =  batadv_softif_create ( iface_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ! soft_iface )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ret  =  - ENOMEM ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											goto  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										/* dev_get_by_name() increases the reference counter for us */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										dev_hold ( soft_iface ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! batadv_softif_is_valid ( soft_iface ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-07 09:07:45 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										pr_err ( " Can't create batman mesh interface %s: already exists as regular interface \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										       soft_iface - > name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ret  =  - EINVAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 17:20:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										goto  err_dev ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > soft_iface  =  soft_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									bat_priv  =  netdev_priv ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-30 12:33:33 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 17:20:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ret  =  bat_priv - > bat_algo_ops - > bat_iface_enable ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-05 13:27:28 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ret  <  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 17:20:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										goto  err_dev ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > if_num  =  bat_priv - > num_ifaces ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									bat_priv - > num_ifaces + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > if_status  =  BATADV_IF_INACTIVE ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-07-01 22:51:55 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ret  =  batadv_orig_hash_add_if ( hard_iface ,  bat_priv - > num_ifaces ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										bat_priv - > bat_algo_ops - > bat_iface_disable ( hard_iface ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										bat_priv - > num_ifaces - - ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										hard_iface - > if_status  =  BATADV_IF_NOT_IN_USE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										goto  err_dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > batman_adv_ptype . type  =  ethertype ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > batman_adv_ptype . func  =  batadv_batman_skb_recv ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > batman_adv_ptype . dev  =  hard_iface - > net_dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									dev_add_pack ( & hard_iface - > batman_adv_ptype ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									atomic_set ( & hard_iface - > frag_seqno ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 20:23:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_info ( hard_iface - > soft_iface ,  " Adding interface: %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    hard_iface - > net_dev - > name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-19 20:26:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( atomic_read ( & bat_priv - > fragmentation )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    hard_iface - > net_dev - > mtu  <  ETH_DATA_LEN  +  BATADV_HEADER_LEN ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 20:23:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_info ( hard_iface - > soft_iface , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											    " The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. Packets going over this interface will be fragmented on layer2 which could impact the performance. Setting the MTU to %zi would solve the problem. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											    hard_iface - > net_dev - > name ,  hard_iface - > net_dev - > mtu , 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											    ETH_DATA_LEN  +  BATADV_HEADER_LEN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-19 20:26:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! atomic_read ( & bat_priv - > fragmentation )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    hard_iface - > net_dev - > mtu  <  ETH_DATA_LEN  +  BATADV_HEADER_LEN ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 20:23:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_info ( hard_iface - > soft_iface , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											    " The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. If you experience problems getting traffic through try increasing the MTU to %zi. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											    hard_iface - > net_dev - > name ,  hard_iface - > net_dev - > mtu , 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											    ETH_DATA_LEN  +  BATADV_HEADER_LEN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( batadv_hardif_is_iface_up ( hard_iface ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										batadv_hardif_activate_interface ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 20:23:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_err ( hard_iface - > soft_iface , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											   " Not using interface %s (retrying later): interface not active \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											   hard_iface - > net_dev - > name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									/* begin scheduling originator messages on that interface */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_schedule_bat_ogm ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 17:20:48 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								err_dev : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									dev_put ( soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								err : 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_hardif_free_ref ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-04 21:36:41 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  batadv_hardif_disable_interface ( struct  batadv_hard_iface  * hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_priv  * bat_priv  =  netdev_priv ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * primary_if  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( hard_iface - > if_status  = =  BATADV_IF_ACTIVE ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_deactivate_interface ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( hard_iface - > if_status  ! =  BATADV_IF_INACTIVE ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-16 20:23:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_info ( hard_iface - > soft_iface ,  " Removing interface: %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    hard_iface - > net_dev - > name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									dev_remove_pack ( & hard_iface - > batman_adv_ptype ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									bat_priv - > num_ifaces - - ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:34 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_orig_hash_del_if ( hard_iface ,  bat_priv - > num_ifaces ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									primary_if  =  batadv_primary_if_get_selected ( bat_priv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( hard_iface  = =  primary_if )  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										struct  batadv_hard_iface  * new_if ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										new_if  =  batadv_hardif_get_active ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										batadv_primary_if_select ( bat_priv ,  new_if ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( new_if ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											batadv_hardif_free_ref ( new_if ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 17:20:47 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									bat_priv - > bat_algo_ops - > bat_iface_disable ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > if_status  =  BATADV_IF_NOT_IN_USE ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									/* delete all references to this hard_iface */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:34 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_purge_orig_ref ( bat_priv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_purge_outstanding_packets ( bat_priv ,  hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									dev_put ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									/* nobody uses this interface anymore */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( ! bat_priv - > num_ifaces ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_softif_destroy ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > soft_iface  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_hardif_free_ref ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( primary_if ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_free_ref ( primary_if ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  struct  batadv_hard_iface  * 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								batadv_hardif_add_interface ( struct  net_device  * net_dev ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									int  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-03 11:51:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ASSERT_RTNL ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ret  =  batadv_is_valid_iface ( net_dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									if  ( ret  ! =  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									dev_hold ( net_dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-14 23:14:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface  =  kmalloc ( sizeof ( * hard_iface ) ,  GFP_ATOMIC ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 14:17:24 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										goto  release_dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:24 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ret  =  batadv_sysfs_add_hardif ( & hard_iface - > hardif_obj ,  net_dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									if  ( ret ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										goto  free_if ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > if_num  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									hard_iface - > net_dev  =  net_dev ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									hard_iface - > soft_iface  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > if_status  =  BATADV_IF_NOT_IN_USE ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									INIT_LIST_HEAD ( & hard_iface - > list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-10 14:33:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									/* extra reference for return */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									atomic_set ( & hard_iface - > refcount ,  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_check_known_mac_addr ( hard_iface - > net_dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									list_add_tail_rcu ( & hard_iface - > list ,  & batadv_hardif_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:43 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									/* This can't be called via a bat_priv callback because
 
							 
						 
					
						
							
								
									
										
										
										
											2012-02-07 17:19:58 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									 *  we  have  no  bat_priv  yet . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									atomic_set ( & hard_iface - > seqno ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									hard_iface - > packet_buff  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  hard_iface ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								free_if : 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									kfree ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								release_dev : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									dev_put ( net_dev ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  void  batadv_hardif_remove_interface ( struct  batadv_hard_iface  * hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-03 11:51:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ASSERT_RTNL ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									/* first deactivate interface */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( hard_iface - > if_status  ! =  BATADV_IF_NOT_IN_USE ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_disable_interface ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( hard_iface - > if_status  ! =  BATADV_IF_NOT_IN_USE ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface - > if_status  =  BATADV_IF_TO_BE_REMOVED ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:24 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_sysfs_del_hardif ( & hard_iface - > hardif_obj ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_hardif_free_ref ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  batadv_hardif_remove_interfaces ( void ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * hard_iface ,  * hard_iface_tmp ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-05-03 11:51:38 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									rtnl_lock ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									list_for_each_entry_safe ( hard_iface ,  hard_iface_tmp , 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:42 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
												 & batadv_hardif_list ,  list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										list_del_rcu ( & hard_iface - > list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_remove_interface ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									rtnl_unlock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  int  batadv_hard_if_event ( struct  notifier_block  * this , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												unsigned  long  event ,  void  * ptr ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-05-14 23:14:52 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  net_device  * net_dev  =  ptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * hard_iface ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									struct  batadv_hard_iface  * primary_if  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									struct  batadv_priv  * bat_priv ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-05 22:31:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									hard_iface  =  batadv_hardif_get_by_netdev ( net_dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! hard_iface  & &  event  = =  NETDEV_REGISTER ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										hard_iface  =  batadv_hardif_add_interface ( net_dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! hard_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									switch  ( event )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  NETDEV_UP : 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_activate_interface ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  NETDEV_GOING_DOWN : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  NETDEV_DOWN : 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_deactivate_interface ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  NETDEV_UNREGISTER : 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										list_del_rcu ( & hard_iface - > list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_remove_interface ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  NETDEV_CHANGEMTU : 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( hard_iface - > soft_iface ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											batadv_update_min_mtu ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									case  NETDEV_CHANGEADDR : 
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( hard_iface - > if_status  = =  BATADV_IF_NOT_IN_USE ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
											goto  hardif_put ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_check_known_mac_addr ( hard_iface - > net_dev ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-18 12:33:20 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										bat_priv  =  netdev_priv ( hard_iface - > soft_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-11 06:17:50 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										bat_priv - > bat_algo_ops - > bat_iface_update_mac ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 21:31:55 +08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										primary_if  =  batadv_primary_if_get_selected ( bat_priv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ! primary_if ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											goto  hardif_put ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( hard_iface  = =  primary_if ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											batadv_primary_if_update_addr ( bat_priv ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-03 11:51:19 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								hardif_put : 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									batadv_hardif_free_ref ( hard_iface ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-20 15:40:58 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( primary_if ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 13:48:54 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										batadv_hardif_free_ref ( primary_if ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
									return  NOTIFY_DONE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-07 15:35:35 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								/* This function returns true if the interface represented by ifindex is a
 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:43 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 *  802.11  wireless  device 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								bool  batadv_is_wifi_iface ( int  ifindex ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-07 15:35:35 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									struct  net_device  * net_device  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									bool  ret  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-06-03 22:19:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ifindex  = =  BATADV_NULL_IFINDEX ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-07 15:35:35 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									net_device  =  dev_get_by_index ( & init_net ,  ifindex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( ! net_device ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										goto  out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# ifdef CONFIG_WIRELESS_EXT 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									/* pre-cfg80211 drivers have to implement WEXT, so it is possible to
 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:43 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									 *  check  for  wireless_handlers  ! =  NULL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-07 15:35:35 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( net_device - > wireless_handlers ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ret  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										/* cfg80211 drivers have to set ieee80211_ptr */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( net_device - > ieee80211_ptr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ret  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								out : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( net_device ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										dev_put ( net_device ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 02:09:31 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								struct  notifier_block  batadv_hard_if_notifier  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2012-05-12 18:33:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									. notifier_call  =  batadv_hard_if_event , 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-13 11:19:28 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} ;