Re: [B.A.T.M.A.N.] [PATCHv2 3/6] batman-adv: register batman ogm receive function during protocol init

2012-03-05 Thread Simon Wunderlich
Hey Marek,

this looks much cleaner. Thanks!
Simon

Acked-by: Simon Wunderlich s...@hrz.tu-chemnitz.de

On Sun, Mar 04, 2012 at 04:56:25PM +0800, Marek Lindner wrote:
 The B.A.T.M.A.N. IV OGM receive function still was hard-coded although
 it is a routing protocol specific function. This patch takes advantage
 of the dynamic packet handler registration to remove the hard-coded
 function calls.
 
 Signed-off-by: Marek Lindner lindner_ma...@yahoo.de
 ---
  bat_iv_ogm.c |   31 +++
  main.c   |5 +
  routing.c|   22 ++
  routing.h|4 +++-
  types.h  |3 ---
  5 files changed, 41 insertions(+), 24 deletions(-)
 
 diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
 index aba0204..784fcef 100644
 --- a/bat_iv_ogm.c
 +++ b/bat_iv_ogm.c
 @@ -1166,13 +1166,18 @@ out:
   orig_node_free_ref(orig_node);
  }
  
 -static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
 -struct sk_buff *skb)
 +static int bat_iv_ogm_receive(struct sk_buff *skb,
 +   struct hard_iface *if_incoming)
  {
   struct batman_ogm_packet *batman_ogm_packet;
   struct ethhdr *ethhdr;
   int buff_pos = 0, packet_len;
   unsigned char *tt_buff, *packet_buff;
 + bool ret;
 +
 + ret = check_management_packet(skb, if_incoming, BATMAN_OGM_HLEN);
 + if (!ret)
 + return NET_RX_DROP;
  
   packet_len = skb_headlen(skb);
   ethhdr = (struct ethhdr *)skb_mac_header(skb);
 @@ -1198,6 +1203,9 @@ static void bat_iv_ogm_receive(struct hard_iface 
 *if_incoming,
   (packet_buff + buff_pos);
   } while (bat_iv_ogm_aggr_packet(buff_pos, packet_len,
   batman_ogm_packet-tt_num_changes));
 +
 + kfree_skb(skb);
 + return NET_RX_SUCCESS;
  }
  
  static struct bat_algo_ops batman_iv __read_mostly = {
 @@ -1208,10 +1216,25 @@ static struct bat_algo_ops batman_iv __read_mostly = {
   .bat_ogm_update_mac = bat_iv_ogm_update_mac,
   .bat_ogm_schedule = bat_iv_ogm_schedule,
   .bat_ogm_emit = bat_iv_ogm_emit,
 - .bat_ogm_receive = bat_iv_ogm_receive,
  };
  
  int __init bat_iv_init(void)
  {
 - return bat_algo_register(batman_iv);
 + int ret;
 +
 + /* batman originator packet */
 + ret = recv_handler_register(BAT_IV_OGM, bat_iv_ogm_receive);
 + if (ret  0)
 + goto out;
 +
 + ret = bat_algo_register(batman_iv);
 + if (ret  0)
 + goto handler_unregister;
 +
 + goto out;
 +
 +handler_unregister:
 + recv_handler_unregister(BAT_IV_OGM);
 +out:
 + return ret;
  }
 diff --git a/main.c b/main.c
 index 0d0cd48..8c3ff21 100644
 --- a/main.c
 +++ b/main.c
 @@ -263,8 +263,6 @@ static void recv_handler_init(void)
   for (i = 0; i  ARRAY_SIZE(recv_packet_handler); i++)
   recv_packet_handler[i] = recv_unhandled_packet;
  
 - /* batman originator packet */
 - recv_packet_handler[BAT_IV_OGM] = recv_bat_ogm_packet;
   /* batman icmp packet */
   recv_packet_handler[BAT_ICMP] = recv_icmp_packet;
   /* unicast packet */
 @@ -331,8 +329,7 @@ int bat_algo_register(struct bat_algo_ops *bat_algo_ops)
   !bat_algo_ops-bat_primary_iface_set ||
   !bat_algo_ops-bat_ogm_update_mac ||
   !bat_algo_ops-bat_ogm_schedule ||
 - !bat_algo_ops-bat_ogm_emit ||
 - !bat_algo_ops-bat_ogm_receive) {
 + !bat_algo_ops-bat_ogm_emit) {
   pr_info(Routing algo '%s' does not implement required ops\n,
   bat_algo_ops-name);
   goto out;
 diff --git a/routing.c b/routing.c
 index 0da9f5a..d83502a 100644
 --- a/routing.c
 +++ b/routing.c
 @@ -248,37 +248,35 @@ int window_protected(struct bat_priv *bat_priv, int32_t 
 seq_num_diff,
   return 0;
  }
  
 -int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
 +bool check_management_packet(struct sk_buff *skb,
 +  struct hard_iface *hard_iface,
 +  int header_len)
  {
 - struct bat_priv *bat_priv = netdev_priv(hard_iface-soft_iface);
   struct ethhdr *ethhdr;
  
   /* drop packet if it has not necessary minimum size */
 - if (unlikely(!pskb_may_pull(skb, BATMAN_OGM_HLEN)))
 - return NET_RX_DROP;
 + if (unlikely(!pskb_may_pull(skb, header_len)))
 + return false;
  
   ethhdr = (struct ethhdr *)skb_mac_header(skb);
  
   /* packet with broadcast indication but unicast recipient */
   if (!is_broadcast_ether_addr(ethhdr-h_dest))
 - return NET_RX_DROP;
 + return false;
  
   /* packet with broadcast sender address */
   if (is_broadcast_ether_addr(ethhdr-h_source))
 - return NET_RX_DROP;
 + return false;
  
   /* create a copy of the skb, if needed, to modify it. */
   if (skb_cow(skb, 0)  0)
 - 

Re: [B.A.T.M.A.N.] [PATCHv2 3/6] batman-adv: register batman ogm receive function during protocol init

2012-03-05 Thread Marek Lindner
On Sunday, March 04, 2012 16:56:25 Marek Lindner wrote:
 The B.A.T.M.A.N. IV OGM receive function still was hard-coded although
 it is a routing protocol specific function. This patch takes advantage
 of the dynamic packet handler registration to remove the hard-coded
 function calls.

Applied in revision 9f72fc2.

Regards,
Marek


[B.A.T.M.A.N.] [PATCHv2 3/6] batman-adv: register batman ogm receive function during protocol init

2012-03-04 Thread Marek Lindner
The B.A.T.M.A.N. IV OGM receive function still was hard-coded although
it is a routing protocol specific function. This patch takes advantage
of the dynamic packet handler registration to remove the hard-coded
function calls.

Signed-off-by: Marek Lindner lindner_ma...@yahoo.de
---
 bat_iv_ogm.c |   31 +++
 main.c   |5 +
 routing.c|   22 ++
 routing.h|4 +++-
 types.h  |3 ---
 5 files changed, 41 insertions(+), 24 deletions(-)

diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c
index aba0204..784fcef 100644
--- a/bat_iv_ogm.c
+++ b/bat_iv_ogm.c
@@ -1166,13 +1166,18 @@ out:
orig_node_free_ref(orig_node);
 }
 
-static void bat_iv_ogm_receive(struct hard_iface *if_incoming,
-  struct sk_buff *skb)
+static int bat_iv_ogm_receive(struct sk_buff *skb,
+ struct hard_iface *if_incoming)
 {
struct batman_ogm_packet *batman_ogm_packet;
struct ethhdr *ethhdr;
int buff_pos = 0, packet_len;
unsigned char *tt_buff, *packet_buff;
+   bool ret;
+
+   ret = check_management_packet(skb, if_incoming, BATMAN_OGM_HLEN);
+   if (!ret)
+   return NET_RX_DROP;
 
packet_len = skb_headlen(skb);
ethhdr = (struct ethhdr *)skb_mac_header(skb);
@@ -1198,6 +1203,9 @@ static void bat_iv_ogm_receive(struct hard_iface 
*if_incoming,
(packet_buff + buff_pos);
} while (bat_iv_ogm_aggr_packet(buff_pos, packet_len,
batman_ogm_packet-tt_num_changes));
+
+   kfree_skb(skb);
+   return NET_RX_SUCCESS;
 }
 
 static struct bat_algo_ops batman_iv __read_mostly = {
@@ -1208,10 +1216,25 @@ static struct bat_algo_ops batman_iv __read_mostly = {
.bat_ogm_update_mac = bat_iv_ogm_update_mac,
.bat_ogm_schedule = bat_iv_ogm_schedule,
.bat_ogm_emit = bat_iv_ogm_emit,
-   .bat_ogm_receive = bat_iv_ogm_receive,
 };
 
 int __init bat_iv_init(void)
 {
-   return bat_algo_register(batman_iv);
+   int ret;
+
+   /* batman originator packet */
+   ret = recv_handler_register(BAT_IV_OGM, bat_iv_ogm_receive);
+   if (ret  0)
+   goto out;
+
+   ret = bat_algo_register(batman_iv);
+   if (ret  0)
+   goto handler_unregister;
+
+   goto out;
+
+handler_unregister:
+   recv_handler_unregister(BAT_IV_OGM);
+out:
+   return ret;
 }
diff --git a/main.c b/main.c
index 0d0cd48..8c3ff21 100644
--- a/main.c
+++ b/main.c
@@ -263,8 +263,6 @@ static void recv_handler_init(void)
for (i = 0; i  ARRAY_SIZE(recv_packet_handler); i++)
recv_packet_handler[i] = recv_unhandled_packet;
 
-   /* batman originator packet */
-   recv_packet_handler[BAT_IV_OGM] = recv_bat_ogm_packet;
/* batman icmp packet */
recv_packet_handler[BAT_ICMP] = recv_icmp_packet;
/* unicast packet */
@@ -331,8 +329,7 @@ int bat_algo_register(struct bat_algo_ops *bat_algo_ops)
!bat_algo_ops-bat_primary_iface_set ||
!bat_algo_ops-bat_ogm_update_mac ||
!bat_algo_ops-bat_ogm_schedule ||
-   !bat_algo_ops-bat_ogm_emit ||
-   !bat_algo_ops-bat_ogm_receive) {
+   !bat_algo_ops-bat_ogm_emit) {
pr_info(Routing algo '%s' does not implement required ops\n,
bat_algo_ops-name);
goto out;
diff --git a/routing.c b/routing.c
index 0da9f5a..d83502a 100644
--- a/routing.c
+++ b/routing.c
@@ -248,37 +248,35 @@ int window_protected(struct bat_priv *bat_priv, int32_t 
seq_num_diff,
return 0;
 }
 
-int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
+bool check_management_packet(struct sk_buff *skb,
+struct hard_iface *hard_iface,
+int header_len)
 {
-   struct bat_priv *bat_priv = netdev_priv(hard_iface-soft_iface);
struct ethhdr *ethhdr;
 
/* drop packet if it has not necessary minimum size */
-   if (unlikely(!pskb_may_pull(skb, BATMAN_OGM_HLEN)))
-   return NET_RX_DROP;
+   if (unlikely(!pskb_may_pull(skb, header_len)))
+   return false;
 
ethhdr = (struct ethhdr *)skb_mac_header(skb);
 
/* packet with broadcast indication but unicast recipient */
if (!is_broadcast_ether_addr(ethhdr-h_dest))
-   return NET_RX_DROP;
+   return false;
 
/* packet with broadcast sender address */
if (is_broadcast_ether_addr(ethhdr-h_source))
-   return NET_RX_DROP;
+   return false;
 
/* create a copy of the skb, if needed, to modify it. */
if (skb_cow(skb, 0)  0)
-   return NET_RX_DROP;
+   return false;
 
/* keep skb linear */
if (skb_linearize(skb)  0)
-   return NET_RX_DROP;
-
-