diff options
author | Marek Lindner <lindner_marek@yahoo.de> | 2010-09-05 01:58:24 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-09-05 00:29:44 -0700 |
commit | 24c76fc07b7680536fa372905f16b57a45c0d514 (patch) | |
tree | a344c4f88907f12379b35e3e54940454faecc1a5 /drivers/staging/batman-adv/soft-interface.c | |
parent | 7d02674f71e6369bb125354b23fd0abaa2edfcab (diff) | |
download | op-kernel-dev-24c76fc07b7680536fa372905f16b57a45c0d514.zip op-kernel-dev-24c76fc07b7680536fa372905f16b57a45c0d514.tar.gz |
Staging: batman-adv: refactoring unicast payload code
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>
Diffstat (limited to 'drivers/staging/batman-adv/soft-interface.c')
-rw-r--r-- | drivers/staging/batman-adv/soft-interface.c | 74 |
1 files changed, 13 insertions, 61 deletions
diff --git a/drivers/staging/batman-adv/soft-interface.c b/drivers/staging/batman-adv/soft-interface.c index 6f22e6e..315fdeb 100644 --- a/drivers/staging/batman-adv/soft-interface.c +++ b/drivers/staging/batman-adv/soft-interface.c @@ -22,14 +22,12 @@ #include "main.h" #include "soft-interface.h" #include "hard-interface.h" -#include "routing.h" -#include "send.h" #include "translation-table.h" -#include "types.h" -#include "hash.h" +#include "send.h" #include <linux/slab.h> #include <linux/ethtool.h> #include <linux/etherdevice.h> +#include "unicast.h" static uint32_t bcast_seqno = 1; /* give own bcast messages seq numbers to avoid * broadcast storms */ @@ -127,24 +125,14 @@ static int interface_change_mtu(struct net_device *dev, int new_mtu) int interface_tx(struct sk_buff *skb, struct net_device *dev) { - struct unicast_packet *unicast_packet; - struct bcast_packet *bcast_packet; - struct orig_node *orig_node; - struct neigh_node *router; struct ethhdr *ethhdr = (struct ethhdr *)skb->data; - struct bat_priv *priv = netdev_priv(dev); - struct batman_if *batman_if; - struct bat_priv *bat_priv; - uint8_t dstaddr[6]; - int data_len = skb->len; - unsigned long flags; + struct bat_priv *bat_priv = netdev_priv(dev); + struct bcast_packet *bcast_packet; + int data_len = skb->len, ret; if (atomic_read(&module_state) != MODULE_ACTIVE) goto dropped; - /* FIXME: each batman_if will be attached to a softif */ - bat_priv = netdev_priv(soft_device); - dev->trans_start = jiffies; /* TODO: check this for locks */ hna_local_add(ethhdr->h_source); @@ -179,55 +167,19 @@ int interface_tx(struct sk_buff *skb, struct net_device *dev) /* unicast packet */ } else { - spin_lock_irqsave(&orig_hash_lock, flags); - /* get routing information */ - orig_node = ((struct orig_node *)hash_find(orig_hash, - ethhdr->h_dest)); - - /* check for hna host */ - if (!orig_node) - orig_node = transtable_search(ethhdr->h_dest); - - router = find_router(orig_node, NULL); - - if (!router) - goto unlock; - - /* don't lock while sending the packets ... we therefore - * copy the required data before sending */ - - batman_if = router->if_incoming; - memcpy(dstaddr, router->addr, ETH_ALEN); - - spin_unlock_irqrestore(&orig_hash_lock, flags); - - if (batman_if->if_status != IF_ACTIVE) - goto dropped; - - if (my_skb_push(skb, sizeof(struct unicast_packet)) < 0) - goto dropped; - - unicast_packet = (struct unicast_packet *)skb->data; - - unicast_packet->version = COMPAT_VERSION; - /* batman packet type: unicast */ - unicast_packet->packet_type = BAT_UNICAST; - /* set unicast ttl */ - unicast_packet->ttl = TTL; - /* copy the destination for faster routing */ - memcpy(unicast_packet->dest, orig_node->orig, ETH_ALEN); - - send_skb_packet(skb, batman_if, dstaddr); + ret = unicast_send_skb(skb, bat_priv); + if (ret != 0) { + bat_priv->stats.tx_dropped++; + goto end; + } } - priv->stats.tx_packets++; - priv->stats.tx_bytes += data_len; + bat_priv->stats.tx_packets++; + bat_priv->stats.tx_bytes += data_len; goto end; -unlock: - spin_unlock_irqrestore(&orig_hash_lock, flags); dropped: - priv->stats.tx_dropped++; + bat_priv->stats.tx_dropped++; kfree_skb(skb); end: return NETDEV_TX_OK; |