Commit 01c4224b authored by Marek Lindner's avatar Marek Lindner

batman-adv: convert batman iv algorithm to use dynamic infrastructure

Signed-off-by: default avatarMarek Lindner <lindner_marek@yahoo.de>
parent 1c280471
This diff is collapsed.
/*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
*
* Marek Lindner, Simon Wunderlich
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA
*
*/
#ifndef _NET_BATMAN_ADV_OGM_H_
#define _NET_BATMAN_ADV_OGM_H_
#include "main.h"
void bat_ogm_init(struct hard_iface *hard_iface);
void bat_ogm_init_primary(struct hard_iface *hard_iface);
void bat_ogm_update_mac(struct hard_iface *hard_iface);
void bat_ogm_schedule(struct hard_iface *hard_iface, int tt_num_changes);
void bat_ogm_emit(struct forw_packet *forw_packet);
void bat_ogm_receive(struct hard_iface *if_incoming, struct sk_buff *skb);
#endif /* _NET_BATMAN_ADV_OGM_H_ */
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#include "bat_sysfs.h" #include "bat_sysfs.h"
#include "originator.h" #include "originator.h"
#include "hash.h" #include "hash.h"
#include "bat_ogm.h"
#include <linux/if_arp.h> #include <linux/if_arp.h>
...@@ -147,7 +146,7 @@ static void primary_if_select(struct bat_priv *bat_priv, ...@@ -147,7 +146,7 @@ static void primary_if_select(struct bat_priv *bat_priv,
if (!new_hard_iface) if (!new_hard_iface)
return; return;
bat_ogm_init_primary(new_hard_iface); bat_priv->bat_algo_ops->bat_ogm_init_primary(new_hard_iface);
primary_if_update_addr(bat_priv); primary_if_update_addr(bat_priv);
} }
...@@ -233,7 +232,7 @@ static void hardif_activate_interface(struct hard_iface *hard_iface) ...@@ -233,7 +232,7 @@ static void hardif_activate_interface(struct hard_iface *hard_iface)
bat_priv = netdev_priv(hard_iface->soft_iface); bat_priv = netdev_priv(hard_iface->soft_iface);
bat_ogm_update_mac(hard_iface); bat_priv->bat_algo_ops->bat_ogm_update_mac(hard_iface);
hard_iface->if_status = IF_TO_BE_ACTIVATED; hard_iface->if_status = IF_TO_BE_ACTIVATED;
/** /**
...@@ -315,7 +314,7 @@ int hardif_enable_interface(struct hard_iface *hard_iface, ...@@ -315,7 +314,7 @@ int hardif_enable_interface(struct hard_iface *hard_iface,
hard_iface->soft_iface = soft_iface; hard_iface->soft_iface = soft_iface;
bat_priv = netdev_priv(hard_iface->soft_iface); bat_priv = netdev_priv(hard_iface->soft_iface);
bat_ogm_init(hard_iface); bat_priv->bat_algo_ops->bat_ogm_init(hard_iface);
if (!hard_iface->packet_buff) { if (!hard_iface->packet_buff) {
bat_err(hard_iface->soft_iface, "Can't add interface packet " bat_err(hard_iface->soft_iface, "Can't add interface packet "
...@@ -535,9 +534,10 @@ static int hard_if_event(struct notifier_block *this, ...@@ -535,9 +534,10 @@ static int hard_if_event(struct notifier_block *this,
goto hardif_put; goto hardif_put;
check_known_mac_addr(hard_iface->net_dev); check_known_mac_addr(hard_iface->net_dev);
bat_ogm_update_mac(hard_iface);
bat_priv = netdev_priv(hard_iface->soft_iface); bat_priv = netdev_priv(hard_iface->soft_iface);
bat_priv->bat_algo_ops->bat_ogm_update_mac(hard_iface);
primary_if = primary_if_get_selected(bat_priv); primary_if = primary_if_get_selected(bat_priv);
if (!primary_if) if (!primary_if)
goto hardif_put; goto hardif_put;
......
...@@ -206,6 +206,18 @@ int bat_algo_register(struct bat_algo_ops *bat_algo_ops) ...@@ -206,6 +206,18 @@ int bat_algo_register(struct bat_algo_ops *bat_algo_ops)
goto out; goto out;
} }
/* all algorithms must implement all ops (for now) */
if (!bat_algo_ops->bat_ogm_init ||
!bat_algo_ops->bat_ogm_init_primary ||
!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) {
pr_info("Routing algo '%s' does not implement required ops\n",
bat_algo_ops->name);
goto out;
}
INIT_HLIST_NODE(&bat_algo_ops->list); INIT_HLIST_NODE(&bat_algo_ops->list);
hlist_add_head(&bat_algo_ops->list, &bat_algo_list); hlist_add_head(&bat_algo_ops->list, &bat_algo_list);
ret = 0; ret = 0;
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include "originator.h" #include "originator.h"
#include "vis.h" #include "vis.h"
#include "unicast.h" #include "unicast.h"
#include "bat_ogm.h"
void slide_own_bcast_window(struct hard_iface *hard_iface) void slide_own_bcast_window(struct hard_iface *hard_iface)
{ {
...@@ -248,6 +247,7 @@ int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff, ...@@ -248,6 +247,7 @@ int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface) int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
{ {
struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
struct ethhdr *ethhdr; struct ethhdr *ethhdr;
/* drop packet if it has not necessary minimum size */ /* drop packet if it has not necessary minimum size */
...@@ -272,7 +272,7 @@ int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface) ...@@ -272,7 +272,7 @@ int recv_bat_ogm_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
if (skb_linearize(skb) < 0) if (skb_linearize(skb) < 0)
return NET_RX_DROP; return NET_RX_DROP;
bat_ogm_receive(hard_iface, skb); bat_priv->bat_algo_ops->bat_ogm_receive(hard_iface, skb);
kfree_skb(skb); kfree_skb(skb);
return NET_RX_SUCCESS; return NET_RX_SUCCESS;
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#include "vis.h" #include "vis.h"
#include "gateway_common.h" #include "gateway_common.h"
#include "originator.h" #include "originator.h"
#include "bat_ogm.h"
static void send_outstanding_bcast_packet(struct work_struct *work); static void send_outstanding_bcast_packet(struct work_struct *work);
...@@ -168,7 +167,7 @@ void schedule_bat_ogm(struct hard_iface *hard_iface) ...@@ -168,7 +167,7 @@ void schedule_bat_ogm(struct hard_iface *hard_iface)
if (primary_if) if (primary_if)
hardif_free_ref(primary_if); hardif_free_ref(primary_if);
bat_ogm_schedule(hard_iface, tt_num_changes); bat_priv->bat_algo_ops->bat_ogm_schedule(hard_iface, tt_num_changes);
} }
static void forw_packet_free(struct forw_packet *forw_packet) static void forw_packet_free(struct forw_packet *forw_packet)
...@@ -318,7 +317,7 @@ void send_outstanding_bat_ogm_packet(struct work_struct *work) ...@@ -318,7 +317,7 @@ void send_outstanding_bat_ogm_packet(struct work_struct *work)
if (atomic_read(&bat_priv->mesh_state) == MESH_DEACTIVATING) if (atomic_read(&bat_priv->mesh_state) == MESH_DEACTIVATING)
goto out; goto out;
bat_ogm_emit(forw_packet); bat_priv->bat_algo_ops->bat_ogm_emit(forw_packet);
/** /**
* we have to have at least one packet in the queue * we have to have at least one packet in the queue
......
...@@ -348,6 +348,20 @@ struct softif_neigh { ...@@ -348,6 +348,20 @@ struct softif_neigh {
struct bat_algo_ops { struct bat_algo_ops {
struct hlist_node list; struct hlist_node list;
char *name; char *name;
/* init OGM when hard-interface is enabled */
void (*bat_ogm_init)(struct hard_iface *hard_iface);
/* init primary OGM when primary interface is selected */
void (*bat_ogm_init_primary)(struct hard_iface *hard_iface);
/* init mac addresses of the OGM belonging to this hard-interface */
void (*bat_ogm_update_mac)(struct hard_iface *hard_iface);
/* prepare a new outgoing OGM for the send queue */
void (*bat_ogm_schedule)(struct hard_iface *hard_iface,
int tt_num_changes);
/* send scheduled OGM */
void (*bat_ogm_emit)(struct forw_packet *forw_packet);
/* receive incoming OGM */
void (*bat_ogm_receive)(struct hard_iface *if_incoming,
struct sk_buff *skb);
}; };
#endif /* _NET_BATMAN_ADV_TYPES_H_ */ #endif /* _NET_BATMAN_ADV_TYPES_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment