[1/6] batman-adv: implement an helper function to forge unicast packets

Message ID 1319964962-5092-2-git-send-email-ordex@autistici.org (mailing list archive)
State Superseded, archived
Headers

Commit Message

Antonio Quartulli Oct. 30, 2011, 8:55 a.m. UTC
  A new function named prepare_unicast_packet() has been implemented so that it can
do all the needed operations to set up a skb for unicast sending. It is general
enough to be used in every context. Helpful for later developments

Signed-off-by: Antonio Quartulli <ordex@autistici.org>
---
 unicast.c |   48 ++++++++++++++++++++++++++++++++----------------
 unicast.h |    2 ++
 2 files changed, 34 insertions(+), 16 deletions(-)
  

Comments

Simon Wunderlich Oct. 31, 2011, 12:05 a.m. UTC | #1
On Sun, Oct 30, 2011 at 09:55:57AM +0100, Antonio Quartulli wrote:
> @@ -304,33 +331,22 @@ int unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv)
>  	orig_node = transtable_search(bat_priv, ethhdr->h_source,
>  				      ethhdr->h_dest);
>  
> -find_router:
> +prepare_packet:
>  	/**
>  	 * find_router():

I guess the comment should be changed as well when the label is renamed.

>  	 *  - if orig_node is NULL it returns NULL
>  	 *  - increases neigh_nodes refcount if found.
>  	 */
>  	neigh_node = find_router(bat_priv, orig_node, NULL);
> -

Do we really need to remove this newline?


>  	if (!neigh_node)
>  		goto out;
>  
> -	if (my_skb_head_push(skb, sizeof(*unicast_packet)) < 0)
> +	skb = prepare_unicast_packet(skb, orig_node);
> +	if (!skb)
>  		goto out;
>  
>  	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);
> -	/* set the destination tt version number */
> -	unicast_packet->ttvn =
> -		(uint8_t)atomic_read(&orig_node->last_ttvn);
> -
>  	if (atomic_read(&bat_priv->fragmentation) &&
>  	    data_len + sizeof(*unicast_packet) >
>  				neigh_node->if_incoming->net_dev->mtu) {
> @@ -350,7 +366,7 @@ out:
>  		neigh_node_free_ref(neigh_node);
>  	if (orig_node)
>  		orig_node_free_ref(orig_node);
> -	if (ret == 1)
> +	if (ret == 1 && skb)
>  		kfree_skb(skb);
>  	return ret;
>  }
  
Antonio Quartulli Nov. 1, 2011, 9:12 a.m. UTC | #2
On Mon, Oct 31, 2011 at 01:05:46AM +0100, Simon Wunderlich wrote:
> On Sun, Oct 30, 2011 at 09:55:57AM +0100, Antonio Quartulli wrote:
> > -find_router:
> > +prepare_packet:
> >  	/**
> >  	 * find_router():
> 
> I guess the comment should be changed as well when the label is renamed.

Actually this comment refers to the function below, not to the label.

> 
> >  	 *  - if orig_node is NULL it returns NULL
> >  	 *  - increases neigh_nodes refcount if found.
> >  	 */
> >  	neigh_node = find_router(bat_priv, orig_node, NULL);
> > -
> 
> Do we really need to remove this newline?
>

Don't think so ;)

Thanks,
  

Patch

diff --git a/unicast.c b/unicast.c
index 07d1c1d..ee7bceb 100644
--- a/unicast.c
+++ b/unicast.c
@@ -283,6 +283,33 @@  out:
 	return ret;
 }
 
+struct sk_buff *prepare_unicast_packet(struct sk_buff *skb,
+				       struct orig_node *orig_node)
+{
+	struct unicast_packet *unicast_packet;
+
+	if (my_skb_head_push(skb, sizeof(*unicast_packet)) < 0)
+		goto out;
+
+	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);
+	/* set the destination tt version number */
+	unicast_packet->ttvn =
+		(uint8_t)atomic_read(&orig_node->last_ttvn);
+
+	return skb;
+out:
+	kfree(skb);
+	return NULL;
+}
+
 int unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv)
 {
 	struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
@@ -296,7 +323,7 @@  int unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv)
 	if (is_multicast_ether_addr(ethhdr->h_dest)) {
 		orig_node = gw_get_selected_orig(bat_priv);
 		if (orig_node)
-			goto find_router;
+			goto prepare_packet;
 	}
 
 	/* check for tt host - increases orig_node refcount.
@@ -304,33 +331,22 @@  int unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv)
 	orig_node = transtable_search(bat_priv, ethhdr->h_source,
 				      ethhdr->h_dest);
 
-find_router:
+prepare_packet:
 	/**
 	 * find_router():
 	 *  - if orig_node is NULL it returns NULL
 	 *  - increases neigh_nodes refcount if found.
 	 */
 	neigh_node = find_router(bat_priv, orig_node, NULL);
-
 	if (!neigh_node)
 		goto out;
 
-	if (my_skb_head_push(skb, sizeof(*unicast_packet)) < 0)
+	skb = prepare_unicast_packet(skb, orig_node);
+	if (!skb)
 		goto out;
 
 	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);
-	/* set the destination tt version number */
-	unicast_packet->ttvn =
-		(uint8_t)atomic_read(&orig_node->last_ttvn);
-
 	if (atomic_read(&bat_priv->fragmentation) &&
 	    data_len + sizeof(*unicast_packet) >
 				neigh_node->if_incoming->net_dev->mtu) {
@@ -350,7 +366,7 @@  out:
 		neigh_node_free_ref(neigh_node);
 	if (orig_node)
 		orig_node_free_ref(orig_node);
-	if (ret == 1)
+	if (ret == 1 && skb)
 		kfree_skb(skb);
 	return ret;
 }
diff --git a/unicast.h b/unicast.h
index 8fd5535..f53a735 100644
--- a/unicast.h
+++ b/unicast.h
@@ -33,6 +33,8 @@  void frag_list_free(struct list_head *head);
 int unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv);
 int frag_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv,
 		  struct hard_iface *hard_iface, const uint8_t dstaddr[]);
+struct sk_buff *prepare_unicast_packet(struct sk_buff *skb,
+				       struct orig_node *orig_node);
 
 static inline int frag_can_reassemble(const struct sk_buff *skb, int mtu)
 {