Commit 9323158e authored by Antonio Quartulli's avatar Antonio Quartulli Committed by Antonio Quartulli

batman-adv: OGMv2 - implement originators logic

Add the support for recognising new originators in the
network and rebroadcast their OGMs.
Signed-off-by: default avatarAntonio Quartulli <antonio@open-mesh.com>
Signed-off-by: default avatarMarek Lindner <mareklindner@neomailbox.ch>
parent 0da00359
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include "bat_algo.h" #include "bat_algo.h"
#include "bat_v_ogm.h"
#include "hard-interface.h" #include "hard-interface.h"
#include "hash.h"
#include "originator.h" #include "originator.h"
#include "packet.h" #include "packet.h"
#include "routing.h" #include "routing.h"
...@@ -195,45 +195,6 @@ void batadv_v_elp_primary_iface_set(struct batadv_hard_iface *primary_iface) ...@@ -195,45 +195,6 @@ void batadv_v_elp_primary_iface_set(struct batadv_hard_iface *primary_iface)
rcu_read_unlock(); rcu_read_unlock();
} }
/**
* batadv_v_ogm_orig_get - retrieve and possibly create an originator node
* @bat_priv: the bat priv with all the soft interface information
* @addr: the address of the originator
*
* Return: the orig_node corresponding to the specified address. If such object
* does not exist it is allocated here. In case of allocation failure returns
* NULL.
*/
static struct batadv_orig_node *
batadv_v_ogm_orig_get(struct batadv_priv *bat_priv,
const u8 *addr)
{
struct batadv_orig_node *orig_node;
int hash_added;
orig_node = batadv_orig_hash_find(bat_priv, addr);
if (orig_node)
return orig_node;
orig_node = batadv_orig_node_new(bat_priv, addr);
if (!orig_node)
return NULL;
hash_added = batadv_hash_add(bat_priv->orig_hash, batadv_compare_orig,
batadv_choose_orig, orig_node,
&orig_node->hash_entry);
if (hash_added != 0) {
/* orig_node->refcounter is initialised to 2 by
* batadv_orig_node_new()
*/
batadv_orig_node_put(orig_node);
batadv_orig_node_put(orig_node);
orig_node = NULL;
}
return orig_node;
}
/** /**
* batadv_v_elp_neigh_update - update an ELP neighbour node * batadv_v_elp_neigh_update - update an ELP neighbour node
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
......
This diff is collapsed.
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#ifndef _BATMAN_ADV_BATADV_V_OGM_H_ #ifndef _BATMAN_ADV_BATADV_V_OGM_H_
#define _BATMAN_ADV_BATADV_V_OGM_H_ #define _BATMAN_ADV_BATADV_V_OGM_H_
#include <linux/types.h>
struct batadv_hard_iface; struct batadv_hard_iface;
struct batadv_priv; struct batadv_priv;
struct sk_buff; struct sk_buff;
...@@ -25,6 +27,8 @@ struct sk_buff; ...@@ -25,6 +27,8 @@ struct sk_buff;
int batadv_v_ogm_init(struct batadv_priv *bat_priv); int batadv_v_ogm_init(struct batadv_priv *bat_priv);
void batadv_v_ogm_free(struct batadv_priv *bat_priv); void batadv_v_ogm_free(struct batadv_priv *bat_priv);
int batadv_v_ogm_iface_enable(struct batadv_hard_iface *hard_iface); int batadv_v_ogm_iface_enable(struct batadv_hard_iface *hard_iface);
struct batadv_orig_node *batadv_v_ogm_orig_get(struct batadv_priv *bat_priv,
const u8 *addr);
void batadv_v_ogm_primary_iface_set(struct batadv_hard_iface *primary_iface); void batadv_v_ogm_primary_iface_set(struct batadv_hard_iface *primary_iface);
int batadv_v_ogm_packet_recv(struct sk_buff *skb, int batadv_v_ogm_packet_recv(struct sk_buff *skb,
struct batadv_hard_iface *if_incoming); struct batadv_hard_iface *if_incoming);
......
...@@ -63,6 +63,8 @@ ...@@ -63,6 +63,8 @@
/* B.A.T.M.A.N. V */ /* B.A.T.M.A.N. V */
#define BATADV_ELP_MAX_AGE 64 #define BATADV_ELP_MAX_AGE 64
#define BATADV_OGM_MAX_ORIGDIFF 5
#define BATADV_OGM_MAX_AGE 64
/* number of OGMs sent with the last tt diff */ /* number of OGMs sent with the last tt diff */
#define BATADV_TT_OGM_APPEND_MAX 3 #define BATADV_TT_OGM_APPEND_MAX 3
......
...@@ -149,6 +149,7 @@ struct batadv_hard_iface { ...@@ -149,6 +149,7 @@ struct batadv_hard_iface {
* @router: router that should be used to reach this originator * @router: router that should be used to reach this originator
* @last_real_seqno: last and best known sequence number * @last_real_seqno: last and best known sequence number
* @last_ttl: ttl of last received packet * @last_ttl: ttl of last received packet
* @last_seqno_forwarded: seqno of the OGM which was forwarded last
* @batman_seqno_reset: time when the batman seqno window was reset * @batman_seqno_reset: time when the batman seqno window was reset
* @refcount: number of contexts the object is used * @refcount: number of contexts the object is used
* @rcu: struct used for freeing in an RCU-safe manner * @rcu: struct used for freeing in an RCU-safe manner
...@@ -159,6 +160,7 @@ struct batadv_orig_ifinfo { ...@@ -159,6 +160,7 @@ struct batadv_orig_ifinfo {
struct batadv_neigh_node __rcu *router; /* rcu protected pointer */ struct batadv_neigh_node __rcu *router; /* rcu protected pointer */
u32 last_real_seqno; u32 last_real_seqno;
u8 last_ttl; u8 last_ttl;
u32 last_seqno_forwarded;
unsigned long batman_seqno_reset; unsigned long batman_seqno_reset;
struct kref refcount; struct kref refcount;
struct rcu_head rcu; struct rcu_head rcu;
...@@ -448,9 +450,11 @@ struct batadv_neigh_ifinfo_bat_iv { ...@@ -448,9 +450,11 @@ struct batadv_neigh_ifinfo_bat_iv {
* struct batadv_neigh_ifinfo_bat_v - neighbor information per outgoing * struct batadv_neigh_ifinfo_bat_v - neighbor information per outgoing
* interface for B.A.T.M.A.N. V * interface for B.A.T.M.A.N. V
* @throughput: last throughput metric received from originator via this neigh * @throughput: last throughput metric received from originator via this neigh
* @last_seqno: last sequence number known for this neighbor
*/ */
struct batadv_neigh_ifinfo_bat_v { struct batadv_neigh_ifinfo_bat_v {
u32 throughput; u32 throughput;
u32 last_seqno;
}; };
/** /**
......
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