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