[linux-next] LinuxNextTracking branch, master, updated. next-20110624

batman at open-mesh.org batman at open-mesh.org
Fri Jun 24 16:09:31 CEST 2011


The following commit has been merged in the master branch:
commit 02e73c1edc3746e308d1768a27fdc8121f641ab1
Merge: c5216cc70fa769e5a51837f2cf07c4a0aa734fcf 27aea2128ec09924dfe08e97739b2bf8b15c8619
Author: David S. Miller <davem at davemloft.net>
Date:   Sun May 8 15:39:11 2011 -0700

    Merge branch 'batman-adv/next' of git://git.open-mesh.org/ecsv/linux-merge

diff --combined Documentation/networking/batman-adv.txt
index ee496eb,713f7c0..88d4afb
--- a/Documentation/networking/batman-adv.txt
+++ b/Documentation/networking/batman-adv.txt
@@@ -1,4 -1,4 +1,4 @@@
- [state: 27-01-2011]
+ [state: 17-04-2011]
  
  BATMAN-ADV
  ----------
@@@ -19,6 -19,7 +19,7 @@@ duce the overhead to a minimum. It doe
  network driver, and can be used on wifi as well as ethernet  lan,
  vpn,  etc ... (anything with ethernet-style layer 2).
  
+ 
  CONFIGURATION
  -------------
  
@@@ -72,7 -73,7 +73,7 @@@ folder
  #  fragmentation    gw_sel_class  vis_mode
  
  
 -There is a special folder for debugging informations:
 +There is a special folder for debugging information:
  
  #  ls /sys/kernel/debug/batman_adv/bat0/
  #  gateways     socket        transtable_global  vis_data
@@@ -160,13 -161,13 +161,13 @@@ face.  Each  entry can/has to have the 
  -> "TQ mac  value"  -  src mac's link quality towards mac address
                         of a neighbor originator's interface which
                         is being used for routing
- -> "HNA mac" - HNA announced by source mac
+ -> "TT mac" - TT announced by source mac
  -> "PRIMARY" - this  is a primary interface
  -> "SEC mac" - secondary mac address of source
                 (requires preceding PRIMARY)
  
  The TQ value has a range from 4 to 255 with 255 being  the  best.
- The HNA entries are showing which hosts are connected to the mesh
+ The TT entries are showing which hosts are connected to the mesh
  via bat0 or being bridged into the mesh network.  The PRIMARY/SEC
  values are only applied on primary interfaces
  
@@@ -199,7 -200,7 +200,7 @@@ abled  during run time. Following log_l
  
  0 - All  debug  output  disabled
  1 - Enable messages related to routing / flooding / broadcasting
- 2 - Enable route or hna added / changed / deleted
+ 2 - Enable route or tt entry added / changed / deleted
  3 - Enable all messages
  
  The debug output can be changed at runtime  using  the  file
@@@ -207,7 -208,7 +208,7 @@@
  
  # echo 2 > /sys/class/net/bat0/mesh/log_level
  
- will enable debug messages for when routes or HNAs change.
+ will enable debug messages for when routes or TTs change.
  
  
  BATCTL
diff --combined net/batman-adv/soft-interface.c
index 9e5fcd1,8e962e3..c76a33e
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@@ -43,6 -43,8 +43,6 @@@ static void bat_get_drvinfo(struct net_
  static u32 bat_get_msglevel(struct net_device *dev);
  static void bat_set_msglevel(struct net_device *dev, u32 value);
  static u32 bat_get_link(struct net_device *dev);
 -static u32 bat_get_rx_csum(struct net_device *dev);
 -static int bat_set_rx_csum(struct net_device *dev, u32 data);
  
  static const struct ethtool_ops bat_ethtool_ops = {
  	.get_settings = bat_get_settings,
@@@ -50,6 -52,8 +50,6 @@@
  	.get_msglevel = bat_get_msglevel,
  	.set_msglevel = bat_set_msglevel,
  	.get_link = bat_get_link,
 -	.get_rx_csum = bat_get_rx_csum,
 -	.set_rx_csum = bat_set_rx_csum
  };
  
  int my_skb_head_push(struct sk_buff *skb, unsigned int len)
@@@ -86,135 -90,251 +86,251 @@@ static void softif_neigh_free_ref(struc
  		call_rcu(&softif_neigh->rcu, softif_neigh_free_rcu);
  }
  
- static struct softif_neigh *softif_neigh_get_selected(struct bat_priv *bat_priv)
+ static void softif_neigh_vid_free_rcu(struct rcu_head *rcu)
  {
- 	struct softif_neigh *neigh;
- 
- 	rcu_read_lock();
- 	neigh = rcu_dereference(bat_priv->softif_neigh);
- 
- 	if (neigh && !atomic_inc_not_zero(&neigh->refcount))
- 		neigh = NULL;
- 
- 	rcu_read_unlock();
- 	return neigh;
- }
+ 	struct softif_neigh_vid *softif_neigh_vid;
+ 	struct softif_neigh *softif_neigh;
+ 	struct hlist_node *node, *node_tmp;
+ 	struct bat_priv *bat_priv;
  
- static void softif_neigh_select(struct bat_priv *bat_priv,
- 				struct softif_neigh *new_neigh)
- {
- 	struct softif_neigh *curr_neigh;
+ 	softif_neigh_vid = container_of(rcu, struct softif_neigh_vid, rcu);
+ 	bat_priv = softif_neigh_vid->bat_priv;
  
  	spin_lock_bh(&bat_priv->softif_neigh_lock);
- 
- 	if (new_neigh && !atomic_inc_not_zero(&new_neigh->refcount))
- 		new_neigh = NULL;
- 
- 	curr_neigh = bat_priv->softif_neigh;
- 	rcu_assign_pointer(bat_priv->softif_neigh, new_neigh);
- 
- 	if (curr_neigh)
- 		softif_neigh_free_ref(curr_neigh);
- 
+ 	hlist_for_each_entry_safe(softif_neigh, node, node_tmp,
+ 				  &softif_neigh_vid->softif_neigh_list, list) {
+ 		hlist_del_rcu(&softif_neigh->list);
+ 		softif_neigh_free_ref(softif_neigh);
+ 	}
  	spin_unlock_bh(&bat_priv->softif_neigh_lock);
+ 
+ 	kfree(softif_neigh_vid);
  }
  
- static void softif_neigh_deselect(struct bat_priv *bat_priv)
+ static void softif_neigh_vid_free_ref(struct softif_neigh_vid *softif_neigh_vid)
  {
- 	softif_neigh_select(bat_priv, NULL);
+ 	if (atomic_dec_and_test(&softif_neigh_vid->refcount))
+ 		call_rcu(&softif_neigh_vid->rcu, softif_neigh_vid_free_rcu);
  }
  
- void softif_neigh_purge(struct bat_priv *bat_priv)
+ static struct softif_neigh_vid *softif_neigh_vid_get(struct bat_priv *bat_priv,
+ 						     short vid)
  {
- 	struct softif_neigh *softif_neigh, *curr_softif_neigh;
- 	struct hlist_node *node, *node_tmp;
- 	char do_deselect = 0;
- 
- 	curr_softif_neigh = softif_neigh_get_selected(bat_priv);
- 
- 	spin_lock_bh(&bat_priv->softif_neigh_lock);
- 
- 	hlist_for_each_entry_safe(softif_neigh, node, node_tmp,
- 				  &bat_priv->softif_neigh_list, list) {
+ 	struct softif_neigh_vid *softif_neigh_vid;
+ 	struct hlist_node *node;
  
- 		if ((!time_after(jiffies, softif_neigh->last_seen +
- 				msecs_to_jiffies(SOFTIF_NEIGH_TIMEOUT))) &&
- 		    (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE))
+ 	rcu_read_lock();
+ 	hlist_for_each_entry_rcu(softif_neigh_vid, node,
+ 				 &bat_priv->softif_neigh_vids, list) {
+ 		if (softif_neigh_vid->vid != vid)
  			continue;
  
- 		if (curr_softif_neigh == softif_neigh) {
- 			bat_dbg(DBG_ROUTES, bat_priv,
- 				 "Current mesh exit point '%pM' vanished "
- 				 "(vid: %d).\n",
- 				 softif_neigh->addr, softif_neigh->vid);
- 			do_deselect = 1;
- 		}
+ 		if (!atomic_inc_not_zero(&softif_neigh_vid->refcount))
+ 			continue;
  
- 		hlist_del_rcu(&softif_neigh->list);
- 		softif_neigh_free_ref(softif_neigh);
+ 		goto out;
  	}
  
- 	spin_unlock_bh(&bat_priv->softif_neigh_lock);
+ 	softif_neigh_vid = kzalloc(sizeof(struct softif_neigh_vid),
+ 				   GFP_ATOMIC);
+ 	if (!softif_neigh_vid)
+ 		goto out;
  
- 	/* soft_neigh_deselect() needs to acquire the softif_neigh_lock */
- 	if (do_deselect)
- 		softif_neigh_deselect(bat_priv);
+ 	softif_neigh_vid->vid = vid;
+ 	softif_neigh_vid->bat_priv = bat_priv;
  
- 	if (curr_softif_neigh)
- 		softif_neigh_free_ref(curr_softif_neigh);
+ 	/* initialize with 2 - caller decrements counter by one */
+ 	atomic_set(&softif_neigh_vid->refcount, 2);
+ 	INIT_HLIST_HEAD(&softif_neigh_vid->softif_neigh_list);
+ 	INIT_HLIST_NODE(&softif_neigh_vid->list);
+ 	spin_lock_bh(&bat_priv->softif_neigh_vid_lock);
+ 	hlist_add_head_rcu(&softif_neigh_vid->list,
+ 			   &bat_priv->softif_neigh_vids);
+ 	spin_unlock_bh(&bat_priv->softif_neigh_vid_lock);
+ 
+ out:
+ 	rcu_read_unlock();
+ 	return softif_neigh_vid;
  }
  
  static struct softif_neigh *softif_neigh_get(struct bat_priv *bat_priv,
  					     uint8_t *addr, short vid)
  {
- 	struct softif_neigh *softif_neigh;
+ 	struct softif_neigh_vid *softif_neigh_vid;
+ 	struct softif_neigh *softif_neigh = NULL;
  	struct hlist_node *node;
  
+ 	softif_neigh_vid = softif_neigh_vid_get(bat_priv, vid);
+ 	if (!softif_neigh_vid)
+ 		goto out;
+ 
  	rcu_read_lock();
  	hlist_for_each_entry_rcu(softif_neigh, node,
- 				 &bat_priv->softif_neigh_list, list) {
+ 				 &softif_neigh_vid->softif_neigh_list,
+ 				 list) {
  		if (!compare_eth(softif_neigh->addr, addr))
  			continue;
  
- 		if (softif_neigh->vid != vid)
- 			continue;
- 
  		if (!atomic_inc_not_zero(&softif_neigh->refcount))
  			continue;
  
  		softif_neigh->last_seen = jiffies;
- 		goto out;
+ 		goto unlock;
  	}
  
  	softif_neigh = kzalloc(sizeof(struct softif_neigh), GFP_ATOMIC);
  	if (!softif_neigh)
- 		goto out;
+ 		goto unlock;
  
  	memcpy(softif_neigh->addr, addr, ETH_ALEN);
- 	softif_neigh->vid = vid;
  	softif_neigh->last_seen = jiffies;
  	/* initialize with 2 - caller decrements counter by one */
  	atomic_set(&softif_neigh->refcount, 2);
  
  	INIT_HLIST_NODE(&softif_neigh->list);
  	spin_lock_bh(&bat_priv->softif_neigh_lock);
- 	hlist_add_head_rcu(&softif_neigh->list, &bat_priv->softif_neigh_list);
+ 	hlist_add_head_rcu(&softif_neigh->list,
+ 			   &softif_neigh_vid->softif_neigh_list);
  	spin_unlock_bh(&bat_priv->softif_neigh_lock);
  
+ unlock:
+ 	rcu_read_unlock();
  out:
+ 	if (softif_neigh_vid)
+ 		softif_neigh_vid_free_ref(softif_neigh_vid);
+ 	return softif_neigh;
+ }
+ 
+ static struct softif_neigh *softif_neigh_get_selected(
+ 				struct softif_neigh_vid *softif_neigh_vid)
+ {
+ 	struct softif_neigh *softif_neigh;
+ 
+ 	rcu_read_lock();
+ 	softif_neigh = rcu_dereference(softif_neigh_vid->softif_neigh);
+ 
+ 	if (softif_neigh && !atomic_inc_not_zero(&softif_neigh->refcount))
+ 		softif_neigh = NULL;
+ 
  	rcu_read_unlock();
  	return softif_neigh;
  }
  
+ static struct softif_neigh *softif_neigh_vid_get_selected(
+ 						struct bat_priv *bat_priv,
+ 						short vid)
+ {
+ 	struct softif_neigh_vid *softif_neigh_vid;
+ 	struct softif_neigh *softif_neigh = NULL;
+ 
+ 	softif_neigh_vid = softif_neigh_vid_get(bat_priv, vid);
+ 	if (!softif_neigh_vid)
+ 		goto out;
+ 
+ 	softif_neigh = softif_neigh_get_selected(softif_neigh_vid);
+ out:
+ 	if (softif_neigh_vid)
+ 		softif_neigh_vid_free_ref(softif_neigh_vid);
+ 	return softif_neigh;
+ }
+ 
+ static void softif_neigh_vid_select(struct bat_priv *bat_priv,
+ 				    struct softif_neigh *new_neigh,
+ 				    short vid)
+ {
+ 	struct softif_neigh_vid *softif_neigh_vid;
+ 	struct softif_neigh *curr_neigh;
+ 
+ 	softif_neigh_vid = softif_neigh_vid_get(bat_priv, vid);
+ 	if (!softif_neigh_vid)
+ 		goto out;
+ 
+ 	spin_lock_bh(&bat_priv->softif_neigh_lock);
+ 
+ 	if (new_neigh && !atomic_inc_not_zero(&new_neigh->refcount))
+ 		new_neigh = NULL;
+ 
+ 	curr_neigh = softif_neigh_vid->softif_neigh;
+ 	rcu_assign_pointer(softif_neigh_vid->softif_neigh, new_neigh);
+ 
+ 	if ((curr_neigh) && (!new_neigh))
+ 		bat_dbg(DBG_ROUTES, bat_priv,
+ 			"Removing mesh exit point on vid: %d (prev: %pM).\n",
+ 			vid, curr_neigh->addr);
+ 	else if ((curr_neigh) && (new_neigh))
+ 		bat_dbg(DBG_ROUTES, bat_priv,
+ 			"Changing mesh exit point on vid: %d from %pM "
+ 			"to %pM.\n", vid, curr_neigh->addr, new_neigh->addr);
+ 	else if ((!curr_neigh) && (new_neigh))
+ 		bat_dbg(DBG_ROUTES, bat_priv,
+ 			"Setting mesh exit point on vid: %d to %pM.\n",
+ 			vid, new_neigh->addr);
+ 
+ 	if (curr_neigh)
+ 		softif_neigh_free_ref(curr_neigh);
+ 
+ 	spin_unlock_bh(&bat_priv->softif_neigh_lock);
+ 
+ out:
+ 	if (softif_neigh_vid)
+ 		softif_neigh_vid_free_ref(softif_neigh_vid);
+ }
+ 
+ static void softif_neigh_vid_deselect(struct bat_priv *bat_priv,
+ 				      struct softif_neigh_vid *softif_neigh_vid)
+ {
+ 	struct softif_neigh *curr_neigh;
+ 	struct softif_neigh *softif_neigh = NULL, *softif_neigh_tmp;
+ 	struct hard_iface *primary_if = NULL;
+ 	struct hlist_node *node;
+ 
+ 	primary_if = primary_if_get_selected(bat_priv);
+ 	if (!primary_if)
+ 		goto out;
+ 
+ 	/* find new softif_neigh immediately to avoid temporary loops */
+ 	rcu_read_lock();
+ 	curr_neigh = rcu_dereference(softif_neigh_vid->softif_neigh);
+ 
+ 	hlist_for_each_entry_rcu(softif_neigh_tmp, node,
+ 				 &softif_neigh_vid->softif_neigh_list,
+ 				 list) {
+ 		if (softif_neigh_tmp == curr_neigh)
+ 			continue;
+ 
+ 		/* we got a neighbor but its mac is 'bigger' than ours  */
+ 		if (memcmp(primary_if->net_dev->dev_addr,
+ 			   softif_neigh_tmp->addr, ETH_ALEN) < 0)
+ 			continue;
+ 
+ 		if (!atomic_inc_not_zero(&softif_neigh_tmp->refcount))
+ 			continue;
+ 
+ 		softif_neigh = softif_neigh_tmp;
+ 		goto unlock;
+ 	}
+ 
+ unlock:
+ 	rcu_read_unlock();
+ out:
+ 	softif_neigh_vid_select(bat_priv, softif_neigh, softif_neigh_vid->vid);
+ 
+ 	if (primary_if)
+ 		hardif_free_ref(primary_if);
+ 	if (softif_neigh)
+ 		softif_neigh_free_ref(softif_neigh);
+ }
+ 
  int softif_neigh_seq_print_text(struct seq_file *seq, void *offset)
  {
  	struct net_device *net_dev = (struct net_device *)seq->private;
  	struct bat_priv *bat_priv = netdev_priv(net_dev);
+ 	struct softif_neigh_vid *softif_neigh_vid;
  	struct softif_neigh *softif_neigh;
  	struct hard_iface *primary_if;
- 	struct hlist_node *node;
+ 	struct hlist_node *node, *node_tmp;
  	struct softif_neigh *curr_softif_neigh;
- 	int ret = 0;
+ 	int ret = 0, last_seen_secs, last_seen_msecs;
  
  	primary_if = primary_if_get_selected(bat_priv);
  	if (!primary_if) {
@@@ -233,17 -353,33 +349,33 @@@
  
  	seq_printf(seq, "Softif neighbor list (%s)\n", net_dev->name);
  
- 	curr_softif_neigh = softif_neigh_get_selected(bat_priv);
  	rcu_read_lock();
- 	hlist_for_each_entry_rcu(softif_neigh, node,
- 				 &bat_priv->softif_neigh_list, list)
- 		seq_printf(seq, "%s %pM (vid: %d)\n",
- 				curr_softif_neigh == softif_neigh
- 				? "=>" : "  ", softif_neigh->addr,
- 				softif_neigh->vid);
+ 	hlist_for_each_entry_rcu(softif_neigh_vid, node,
+ 				 &bat_priv->softif_neigh_vids, list) {
+ 		seq_printf(seq, "     %-15s %s on vid: %d\n",
+ 			   "Originator", "last-seen", softif_neigh_vid->vid);
+ 
+ 		curr_softif_neigh = softif_neigh_get_selected(softif_neigh_vid);
+ 
+ 		hlist_for_each_entry_rcu(softif_neigh, node_tmp,
+ 					 &softif_neigh_vid->softif_neigh_list,
+ 					 list) {
+ 			last_seen_secs = jiffies_to_msecs(jiffies -
+ 						softif_neigh->last_seen) / 1000;
+ 			last_seen_msecs = jiffies_to_msecs(jiffies -
+ 						softif_neigh->last_seen) % 1000;
+ 			seq_printf(seq, "%s %pM  %3i.%03is\n",
+ 				   curr_softif_neigh == softif_neigh
+ 				   ? "=>" : "  ", softif_neigh->addr,
+ 				   last_seen_secs, last_seen_msecs);
+ 		}
+ 
+ 		if (curr_softif_neigh)
+ 			softif_neigh_free_ref(curr_softif_neigh);
+ 
+ 		seq_printf(seq, "\n");
+ 	}
  	rcu_read_unlock();
- 	if (curr_softif_neigh)
- 		softif_neigh_free_ref(curr_softif_neigh);
  
  out:
  	if (primary_if)
@@@ -251,6 -387,70 +383,70 @@@
  	return ret;
  }
  
+ void softif_neigh_purge(struct bat_priv *bat_priv)
+ {
+ 	struct softif_neigh *softif_neigh, *curr_softif_neigh;
+ 	struct softif_neigh_vid *softif_neigh_vid;
+ 	struct hlist_node *node, *node_tmp, *node_tmp2;
+ 	char do_deselect;
+ 
+ 	rcu_read_lock();
+ 	hlist_for_each_entry_rcu(softif_neigh_vid, node,
+ 				 &bat_priv->softif_neigh_vids, list) {
+ 		if (!atomic_inc_not_zero(&softif_neigh_vid->refcount))
+ 			continue;
+ 
+ 		curr_softif_neigh = softif_neigh_get_selected(softif_neigh_vid);
+ 		do_deselect = 0;
+ 
+ 		spin_lock_bh(&bat_priv->softif_neigh_lock);
+ 		hlist_for_each_entry_safe(softif_neigh, node_tmp, node_tmp2,
+ 					  &softif_neigh_vid->softif_neigh_list,
+ 					  list) {
+ 			if ((!time_after(jiffies, softif_neigh->last_seen +
+ 				msecs_to_jiffies(SOFTIF_NEIGH_TIMEOUT))) &&
+ 			    (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE))
+ 				continue;
+ 
+ 			if (curr_softif_neigh == softif_neigh) {
+ 				bat_dbg(DBG_ROUTES, bat_priv,
+ 					"Current mesh exit point on vid: %d "
+ 					"'%pM' vanished.\n",
+ 					softif_neigh_vid->vid,
+ 					softif_neigh->addr);
+ 				do_deselect = 1;
+ 			}
+ 
+ 			hlist_del_rcu(&softif_neigh->list);
+ 			softif_neigh_free_ref(softif_neigh);
+ 		}
+ 		spin_unlock_bh(&bat_priv->softif_neigh_lock);
+ 
+ 		/* soft_neigh_vid_deselect() needs to acquire the
+ 		 * softif_neigh_lock */
+ 		if (do_deselect)
+ 			softif_neigh_vid_deselect(bat_priv, softif_neigh_vid);
+ 
+ 		if (curr_softif_neigh)
+ 			softif_neigh_free_ref(curr_softif_neigh);
+ 
+ 		softif_neigh_vid_free_ref(softif_neigh_vid);
+ 	}
+ 	rcu_read_unlock();
+ 
+ 	spin_lock_bh(&bat_priv->softif_neigh_vid_lock);
+ 	hlist_for_each_entry_safe(softif_neigh_vid, node, node_tmp,
+ 				  &bat_priv->softif_neigh_vids, list) {
+ 		if (!hlist_empty(&softif_neigh_vid->softif_neigh_list))
+ 			continue;
+ 
+ 		hlist_del_rcu(&softif_neigh_vid->list);
+ 		softif_neigh_vid_free_ref(softif_neigh_vid);
+ 	}
+ 	spin_unlock_bh(&bat_priv->softif_neigh_vid_lock);
+ 
+ }
+ 
  static void softif_batman_recv(struct sk_buff *skb, struct net_device *dev,
  			       short vid)
  {
@@@ -283,10 -483,7 +479,7 @@@
  	if (!softif_neigh)
  		goto out;
  
- 	curr_softif_neigh = softif_neigh_get_selected(bat_priv);
- 	if (!curr_softif_neigh)
- 		goto out;
- 
+ 	curr_softif_neigh = softif_neigh_vid_get_selected(bat_priv, vid);
  	if (curr_softif_neigh == softif_neigh)
  		goto out;
  
@@@ -299,33 -496,16 +492,16 @@@
  		   softif_neigh->addr, ETH_ALEN) < 0)
  		goto out;
  
- 	/* switch to new 'smallest neighbor' */
- 	if ((curr_softif_neigh) &&
- 	    (memcmp(softif_neigh->addr, curr_softif_neigh->addr,
- 							ETH_ALEN) < 0)) {
- 		bat_dbg(DBG_ROUTES, bat_priv,
- 			"Changing mesh exit point from %pM (vid: %d) "
- 			"to %pM (vid: %d).\n",
- 			 curr_softif_neigh->addr,
- 			 curr_softif_neigh->vid,
- 			 softif_neigh->addr, softif_neigh->vid);
- 
- 		softif_neigh_select(bat_priv, softif_neigh);
- 		goto out;
- 	}
- 
  	/* close own batX device and use softif_neigh as exit node */
- 	if ((!curr_softif_neigh) &&
- 	    (memcmp(softif_neigh->addr,
- 		    primary_if->net_dev->dev_addr, ETH_ALEN) < 0)) {
- 		bat_dbg(DBG_ROUTES, bat_priv,
- 			"Setting mesh exit point to %pM (vid: %d).\n",
- 			softif_neigh->addr, softif_neigh->vid);
- 
- 		softif_neigh_select(bat_priv, softif_neigh);
+ 	if (!curr_softif_neigh) {
+ 		softif_neigh_vid_select(bat_priv, softif_neigh, vid);
  		goto out;
  	}
  
+ 	/* switch to new 'smallest neighbor' */
+ 	if (memcmp(softif_neigh->addr, curr_softif_neigh->addr, ETH_ALEN) < 0)
+ 		softif_neigh_vid_select(bat_priv, softif_neigh, vid);
+ 
  out:
  	kfree_skb(skb);
  	if (softif_neigh)
@@@ -363,11 -543,11 +539,11 @@@ static int interface_set_mac_addr(struc
  	if (!is_valid_ether_addr(addr->sa_data))
  		return -EADDRNOTAVAIL;
  
- 	/* only modify hna-table if it has been initialised before */
+ 	/* only modify transtable if it has been initialised before */
  	if (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE) {
- 		hna_local_remove(bat_priv, dev->dev_addr,
+ 		tt_local_remove(bat_priv, dev->dev_addr,
  				 "mac address changed");
- 		hna_local_add(dev, addr->sa_data);
+ 		tt_local_add(dev, addr->sa_data);
  	}
  
  	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
@@@ -420,12 -600,12 +596,12 @@@ int interface_tx(struct sk_buff *skb, s
  	 * if we have a another chosen mesh exit node in range
  	 * it will transport the packets to the mesh
  	 */
- 	curr_softif_neigh = softif_neigh_get_selected(bat_priv);
- 	if ((curr_softif_neigh) && (curr_softif_neigh->vid == vid))
+ 	curr_softif_neigh = softif_neigh_vid_get_selected(bat_priv, vid);
+ 	if (curr_softif_neigh)
  		goto dropped;
  
  	/* TODO: check this for locks */
- 	hna_local_add(soft_iface, ethhdr->h_source);
+ 	tt_local_add(soft_iface, ethhdr->h_source);
  
  	if (is_multicast_ether_addr(ethhdr->h_dest)) {
  		ret = gw_is_target(bat_priv, skb);
@@@ -529,8 -709,8 +705,8 @@@ void interface_rx(struct net_device *so
  	 * if we have a another chosen mesh exit node in range
  	 * it will transport the packets to the non-mesh network
  	 */
- 	curr_softif_neigh = softif_neigh_get_selected(bat_priv);
- 	if (curr_softif_neigh && (curr_softif_neigh->vid == vid)) {
+ 	curr_softif_neigh = softif_neigh_vid_get_selected(bat_priv, vid);
+ 	if (curr_softif_neigh) {
  		skb_push(skb, hdr_size);
  		unicast_packet = (struct unicast_packet *)skb->data;
  
@@@ -554,7 -734,7 +730,7 @@@
  		goto dropped;
  	skb->protocol = eth_type_trans(skb, soft_iface);
  
 -	/* should not be neccesary anymore as we use skb_pull_rcsum()
 +	/* should not be necessary anymore as we use skb_pull_rcsum()
  	 * TODO: please verify this and remove this TODO
  	 * -- Dec 21st 2009, Simon Wunderlich */
  
@@@ -613,8 -793,8 +789,8 @@@ static void interface_setup(struct net_
  	 * have not been initialized yet
  	 */
  	dev->mtu = ETH_DATA_LEN;
- 	dev->hard_header_len = BAT_HEADER_LEN; /* reserve more space in the
- 						* skbuff for our header */
+ 	/* reserve more space in the skbuff for our header */
+ 	dev->hard_header_len = BAT_HEADER_LEN;
  
  	/* generate random address */
  	random_ether_addr(dev_addr);
@@@ -639,7 -819,7 +815,7 @@@ struct net_device *softif_create(char *
  		goto out;
  	}
  
- 	ret = register_netdev(soft_iface);
+ 	ret = register_netdevice(soft_iface);
  	if (ret < 0) {
  		pr_err("Unable to register the batman interface '%s': %i\n",
  		       name, ret);
@@@ -663,11 -843,10 +839,10 @@@
  
  	atomic_set(&bat_priv->mesh_state, MESH_INACTIVE);
  	atomic_set(&bat_priv->bcast_seqno, 1);
- 	atomic_set(&bat_priv->hna_local_changed, 0);
+ 	atomic_set(&bat_priv->tt_local_changed, 0);
  
  	bat_priv->primary_if = NULL;
  	bat_priv->num_ifaces = 0;
- 	bat_priv->softif_neigh = NULL;
  
  	ret = sysfs_add_meshif(soft_iface);
  	if (ret < 0)
@@@ -723,7 -902,7 +898,7 @@@ static int bat_get_settings(struct net_
  {
  	cmd->supported = 0;
  	cmd->advertising = 0;
 -	cmd->speed = SPEED_10;
 +	ethtool_cmd_speed_set(cmd, SPEED_10);
  	cmd->duplex = DUPLEX_FULL;
  	cmd->port = PORT_TP;
  	cmd->phy_address = 0;
@@@ -758,3 -937,12 +933,3 @@@ static u32 bat_get_link(struct net_devi
  	return 1;
  }
  
 -static u32 bat_get_rx_csum(struct net_device *dev)
 -{
 -	return 0;
 -}
 -
 -static int bat_set_rx_csum(struct net_device *dev, u32 data)
 -{
 -	return -EOPNOTSUPP;
 -}

-- 
LinuxNextTracking


More information about the linux-merge mailing list