aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Lindner <lindner_marek@yahoo.de>2010-09-05 01:58:27 +0200
committerGreg Kroah-Hartman <gregkh@suse.de>2010-09-05 00:29:45 -0700
commit15cf5523d2e42f755b3b1d8ea0fa601ffcf8b9e7 (patch)
tree7ec59e81276bc8399e221186f7484da9ea26c932
parentd52e90aeaf93d62cc1a7f9a8a9f3a6f68c475cf5 (diff)
downloadmrst-s0i3-test-15cf5523d2e42f755b3b1d8ea0fa601ffcf8b9e7.tar.gz
mrst-s0i3-test-15cf5523d2e42f755b3b1d8ea0fa601ffcf8b9e7.tar.xz
mrst-s0i3-test-15cf5523d2e42f755b3b1d8ea0fa601ffcf8b9e7.zip
Staging: batman-adv: register the batman-adv packet type per interface
Batman-adv globally registered the batman-adv packet type and installed a hook to batman_skb_recv(). Each interface receiving a packet with that type would end up in this function which then had to loop through all batman-adv internal interface structures to find the its meta data. The more interfaces a system had the longer the loops might take. Each and every packet goes through this function making it a performance critical loop. This patch installs the hook for each activated interface. The called batman_skb_recv() can distinguish these calls, therefore avoiding the loop through the interface structures. Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> [sven.eckelmann@gmx.de: Rework on top of current version] Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/batman-adv/hard-interface.c12
-rw-r--r--drivers/staging/batman-adv/main.c10
-rw-r--r--drivers/staging/batman-adv/types.h2
3 files changed, 9 insertions, 15 deletions
diff --git a/drivers/staging/batman-adv/hard-interface.c b/drivers/staging/batman-adv/hard-interface.c
index 82d3d554467..f33c73f72d5 100644
--- a/drivers/staging/batman-adv/hard-interface.c
+++ b/drivers/staging/batman-adv/hard-interface.c
@@ -265,6 +265,11 @@ int hardif_enable_interface(struct batman_if *batman_if)
batman_if->if_status = IF_INACTIVE;
orig_hash_add_if(batman_if, bat_priv->num_ifaces);
+ batman_if->batman_adv_ptype.type = __constant_htons(ETH_P_BATMAN);
+ batman_if->batman_adv_ptype.func = batman_skb_recv;
+ batman_if->batman_adv_ptype.dev = batman_if->net_dev;
+ dev_add_pack(&batman_if->batman_adv_ptype);
+
atomic_set(&batman_if->seqno, 1);
atomic_set(&batman_if->frag_seqno, 1);
bat_info(soft_device, "Adding interface: %s\n", batman_if->dev);
@@ -319,6 +324,8 @@ void hardif_disable_interface(struct batman_if *batman_if)
return;
bat_info(soft_device, "Removing interface: %s\n", batman_if->dev);
+ dev_remove_pack(&batman_if->batman_adv_ptype);
+
bat_priv->num_ifaces--;
orig_hash_del_if(batman_if, bat_priv->num_ifaces);
@@ -468,6 +475,7 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
struct batman_if *batman_if;
int ret;
+ batman_if = container_of(ptype, struct batman_if, batman_adv_ptype);
skb = skb_share_check(skb, GFP_ATOMIC);
/* skb was released by skb_share_check() */
@@ -486,10 +494,6 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
|| !skb_mac_header(skb)))
goto err_free;
- batman_if = get_batman_if_by_netdev(skb->dev);
- if (!batman_if)
- goto err_free;
-
/* discard frames on not active interfaces */
if (batman_if->if_status != IF_ACTIVE)
goto err_free;
diff --git a/drivers/staging/batman-adv/main.c b/drivers/staging/batman-adv/main.c
index c0a3373a08a..eb0bfbe50e3 100644
--- a/drivers/staging/batman-adv/main.c
+++ b/drivers/staging/batman-adv/main.c
@@ -49,11 +49,6 @@ struct net_device *soft_device;
unsigned char broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
atomic_t module_state;
-static struct packet_type batman_adv_packet_type __read_mostly = {
- .type = __constant_htons(ETH_P_BATMAN),
- .func = batman_skb_recv,
-};
-
struct workqueue_struct *bat_event_workqueue;
static int __init batman_init(void)
@@ -103,7 +98,6 @@ static int __init batman_init(void)
goto unreg_sysfs;
register_netdevice_notifier(&hard_if_notifier);
- dev_add_pack(&batman_adv_packet_type);
pr_info("B.A.T.M.A.N. advanced %s%s (compatibility version %i) "
"loaded\n", SOURCE_VERSION, REVISION_VERSION_STR,
@@ -140,8 +134,6 @@ static void __exit batman_exit(void)
soft_device = NULL;
}
- dev_remove_pack(&batman_adv_packet_type);
-
destroy_workqueue(bat_event_workqueue);
bat_event_workqueue = NULL;
}
@@ -185,8 +177,6 @@ void deactivate_module(void)
vis_quit();
- /* TODO: unregister BATMAN pack */
-
originator_free();
hna_local_free();
diff --git a/drivers/staging/batman-adv/types.h b/drivers/staging/batman-adv/types.h
index ac165753e84..2b06944a56b 100644
--- a/drivers/staging/batman-adv/types.h
+++ b/drivers/staging/batman-adv/types.h
@@ -46,7 +46,7 @@ struct batman_if {
int packet_len;
struct kobject *hardif_obj;
struct rcu_head rcu;
-
+ struct packet_type batman_adv_ptype;
};
/**