Commit 82aee5d7 authored by David S. Miller's avatar David S. Miller

Merge tag 'batman-adv-for-davem' of git://git.open-mesh.org/linux-merge

Included changes:
- another batch of patches meant to clean batman-adv namespace
- deletion of an obsolete intermediate buffer used in the visualization code to
  print the output
- TT code cleanups
parents 41347dcd 42d0b044
...@@ -35,14 +35,14 @@ ...@@ -35,14 +35,14 @@
static struct dentry *batadv_debugfs; static struct dentry *batadv_debugfs;
#ifdef CONFIG_BATMAN_ADV_DEBUG #ifdef CONFIG_BATMAN_ADV_DEBUG
#define LOG_BUFF_MASK (batadv_log_buff_len - 1) #define BATADV_LOG_BUFF_MASK (batadv_log_buff_len - 1)
#define LOG_BUFF(idx) (debug_log->log_buff[(idx) & LOG_BUFF_MASK]) #define BATADV_LOG_BUFF(idx) (debug_log->log_buff[(idx) & BATADV_LOG_BUFF_MASK])
static int batadv_log_buff_len = LOG_BUF_LEN; static int batadv_log_buff_len = BATADV_LOG_BUF_LEN;
static void batadv_emit_log_char(struct debug_log *debug_log, char c) static void batadv_emit_log_char(struct debug_log *debug_log, char c)
{ {
LOG_BUFF(debug_log->log_end) = c; BATADV_LOG_BUFF(debug_log->log_end) = c;
debug_log->log_end++; debug_log->log_end++;
if (debug_log->log_end - debug_log->log_start > batadv_log_buff_len) if (debug_log->log_end - debug_log->log_start > batadv_log_buff_len)
...@@ -133,7 +133,7 @@ static ssize_t batadv_log_read(struct file *file, char __user *buf, ...@@ -133,7 +133,7 @@ static ssize_t batadv_log_read(struct file *file, char __user *buf,
while ((!error) && (i < count) && while ((!error) && (i < count) &&
(debug_log->log_start != debug_log->log_end)) { (debug_log->log_start != debug_log->log_end)) {
c = LOG_BUFF(debug_log->log_start); c = BATADV_LOG_BUFF(debug_log->log_start);
debug_log->log_start++; debug_log->log_start++;
...@@ -270,7 +270,7 @@ struct bat_debuginfo { ...@@ -270,7 +270,7 @@ struct bat_debuginfo {
const struct file_operations fops; const struct file_operations fops;
}; };
#define BAT_DEBUGINFO(_name, _mode, _open) \ #define BATADV_DEBUGINFO(_name, _mode, _open) \
struct bat_debuginfo batadv_debuginfo_##_name = { \ struct bat_debuginfo batadv_debuginfo_##_name = { \
.attr = { .name = __stringify(_name), \ .attr = { .name = __stringify(_name), \
.mode = _mode, }, \ .mode = _mode, }, \
...@@ -282,15 +282,17 @@ struct bat_debuginfo batadv_debuginfo_##_name = { \ ...@@ -282,15 +282,17 @@ struct bat_debuginfo batadv_debuginfo_##_name = { \
} \ } \
}; };
static BAT_DEBUGINFO(routing_algos, S_IRUGO, batadv_algorithms_open); static BATADV_DEBUGINFO(routing_algos, S_IRUGO, batadv_algorithms_open);
static BAT_DEBUGINFO(originators, S_IRUGO, batadv_originators_open); static BATADV_DEBUGINFO(originators, S_IRUGO, batadv_originators_open);
static BAT_DEBUGINFO(gateways, S_IRUGO, batadv_gateways_open); static BATADV_DEBUGINFO(gateways, S_IRUGO, batadv_gateways_open);
static BAT_DEBUGINFO(transtable_global, S_IRUGO, batadv_transtable_global_open); static BATADV_DEBUGINFO(transtable_global, S_IRUGO,
batadv_transtable_global_open);
#ifdef CONFIG_BATMAN_ADV_BLA #ifdef CONFIG_BATMAN_ADV_BLA
static BAT_DEBUGINFO(bla_claim_table, S_IRUGO, batadv_bla_claim_table_open); static BATADV_DEBUGINFO(bla_claim_table, S_IRUGO, batadv_bla_claim_table_open);
#endif #endif
static BAT_DEBUGINFO(transtable_local, S_IRUGO, batadv_transtable_local_open); static BATADV_DEBUGINFO(transtable_local, S_IRUGO,
static BAT_DEBUGINFO(vis_data, S_IRUGO, batadv_vis_data_open); batadv_transtable_local_open);
static BATADV_DEBUGINFO(vis_data, S_IRUGO, batadv_vis_data_open);
static struct bat_debuginfo *batadv_mesh_debuginfos[] = { static struct bat_debuginfo *batadv_mesh_debuginfos[] = {
&batadv_debuginfo_originators, &batadv_debuginfo_originators,
...@@ -309,7 +311,7 @@ void batadv_debugfs_init(void) ...@@ -309,7 +311,7 @@ void batadv_debugfs_init(void)
struct bat_debuginfo *bat_debug; struct bat_debuginfo *bat_debug;
struct dentry *file; struct dentry *file;
batadv_debugfs = debugfs_create_dir(DEBUGFS_BAT_SUBDIR, NULL); batadv_debugfs = debugfs_create_dir(BATADV_DEBUGFS_SUBDIR, NULL);
if (batadv_debugfs == ERR_PTR(-ENODEV)) if (batadv_debugfs == ERR_PTR(-ENODEV))
batadv_debugfs = NULL; batadv_debugfs = NULL;
...@@ -360,8 +362,8 @@ int batadv_debugfs_add_meshif(struct net_device *dev) ...@@ -360,8 +362,8 @@ int batadv_debugfs_add_meshif(struct net_device *dev)
bat_priv->debug_dir, bat_priv->debug_dir,
dev, &(*bat_debug)->fops); dev, &(*bat_debug)->fops);
if (!file) { if (!file) {
bat_err(dev, "Can't add debugfs file: %s/%s\n", batadv_err(dev, "Can't add debugfs file: %s/%s\n",
dev->name, ((*bat_debug)->attr).name); dev->name, ((*bat_debug)->attr).name);
goto rem_attr; goto rem_attr;
} }
} }
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#ifndef _NET_BATMAN_ADV_DEBUGFS_H_ #ifndef _NET_BATMAN_ADV_DEBUGFS_H_
#define _NET_BATMAN_ADV_DEBUGFS_H_ #define _NET_BATMAN_ADV_DEBUGFS_H_
#define DEBUGFS_BAT_SUBDIR "batman_adv" #define BATADV_DEBUGFS_SUBDIR "batman_adv"
void batadv_debugfs_init(void); void batadv_debugfs_init(void);
void batadv_debugfs_destroy(void); void batadv_debugfs_destroy(void);
......
...@@ -64,7 +64,7 @@ static int batadv_iv_ogm_iface_enable(struct hard_iface *hard_iface) ...@@ -64,7 +64,7 @@ static int batadv_iv_ogm_iface_enable(struct hard_iface *hard_iface)
get_random_bytes(&random_seqno, sizeof(random_seqno)); get_random_bytes(&random_seqno, sizeof(random_seqno));
atomic_set(&hard_iface->seqno, random_seqno); atomic_set(&hard_iface->seqno, random_seqno);
hard_iface->packet_len = BATMAN_OGM_HLEN; hard_iface->packet_len = BATADV_OGM_HLEN;
hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC); hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC);
if (!hard_iface->packet_buff) if (!hard_iface->packet_buff)
...@@ -72,10 +72,10 @@ static int batadv_iv_ogm_iface_enable(struct hard_iface *hard_iface) ...@@ -72,10 +72,10 @@ static int batadv_iv_ogm_iface_enable(struct hard_iface *hard_iface)
batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff; batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
batman_ogm_packet->header.packet_type = BAT_IV_OGM; batman_ogm_packet->header.packet_type = BAT_IV_OGM;
batman_ogm_packet->header.version = COMPAT_VERSION; batman_ogm_packet->header.version = BATADV_COMPAT_VERSION;
batman_ogm_packet->header.ttl = 2; batman_ogm_packet->header.ttl = 2;
batman_ogm_packet->flags = NO_FLAGS; batman_ogm_packet->flags = BATADV_NO_FLAGS;
batman_ogm_packet->tq = TQ_MAX_VALUE; batman_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
batman_ogm_packet->tt_num_changes = 0; batman_ogm_packet->tt_num_changes = 0;
batman_ogm_packet->ttvn = 0; batman_ogm_packet->ttvn = 0;
...@@ -108,29 +108,37 @@ static void batadv_iv_ogm_primary_iface_set(struct hard_iface *hard_iface) ...@@ -108,29 +108,37 @@ static void batadv_iv_ogm_primary_iface_set(struct hard_iface *hard_iface)
batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff; batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
batman_ogm_packet->flags = PRIMARIES_FIRST_HOP; batman_ogm_packet->flags = PRIMARIES_FIRST_HOP;
batman_ogm_packet->header.ttl = TTL; batman_ogm_packet->header.ttl = BATADV_TTL;
} }
/* when do we schedule our own ogm to be sent */ /* when do we schedule our own ogm to be sent */
static unsigned long static unsigned long
batadv_iv_ogm_emit_send_time(const struct bat_priv *bat_priv) batadv_iv_ogm_emit_send_time(const struct bat_priv *bat_priv)
{ {
return jiffies + msecs_to_jiffies( unsigned int msecs;
atomic_read(&bat_priv->orig_interval) -
JITTER + (random32() % 2*JITTER)); msecs = atomic_read(&bat_priv->orig_interval) - BATADV_JITTER;
msecs += (random32() % 2 * BATADV_JITTER);
return jiffies + msecs_to_jiffies(msecs);
} }
/* when do we schedule a ogm packet to be sent */ /* when do we schedule a ogm packet to be sent */
static unsigned long batadv_iv_ogm_fwd_send_time(void) static unsigned long batadv_iv_ogm_fwd_send_time(void)
{ {
return jiffies + msecs_to_jiffies(random32() % (JITTER/2)); return jiffies + msecs_to_jiffies(random32() % (BATADV_JITTER / 2));
} }
/* apply hop penalty for a normal link */ /* apply hop penalty for a normal link */
static uint8_t batadv_hop_penalty(uint8_t tq, const struct bat_priv *bat_priv) static uint8_t batadv_hop_penalty(uint8_t tq, const struct bat_priv *bat_priv)
{ {
int hop_penalty = atomic_read(&bat_priv->hop_penalty); int hop_penalty = atomic_read(&bat_priv->hop_penalty);
return (tq * (TQ_MAX_VALUE - hop_penalty)) / (TQ_MAX_VALUE); int new_tq;
new_tq = tq * (BATADV_TQ_MAX_VALUE - hop_penalty);
new_tq /= BATADV_TQ_MAX_VALUE;
return new_tq;
} }
/* is there another aggregated packet here? */ /* is there another aggregated packet here? */
...@@ -139,11 +147,11 @@ static int batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, ...@@ -139,11 +147,11 @@ static int batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
{ {
int next_buff_pos = 0; int next_buff_pos = 0;
next_buff_pos += buff_pos + BATMAN_OGM_HLEN; next_buff_pos += buff_pos + BATADV_OGM_HLEN;
next_buff_pos += batadv_tt_len(tt_num_changes); next_buff_pos += batadv_tt_len(tt_num_changes);
return (next_buff_pos <= packet_len) && return (next_buff_pos <= packet_len) &&
(next_buff_pos <= MAX_AGGREGATION_BYTES); (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
} }
/* send a batman ogm to a given interface */ /* send a batman ogm to a given interface */
...@@ -191,7 +199,7 @@ static void batadv_iv_ogm_send_to_if(struct forw_packet *forw_packet, ...@@ -191,7 +199,7 @@ static void batadv_iv_ogm_send_to_if(struct forw_packet *forw_packet,
batman_ogm_packet->ttvn, hard_iface->net_dev->name, batman_ogm_packet->ttvn, hard_iface->net_dev->name,
hard_iface->net_dev->dev_addr); hard_iface->net_dev->dev_addr);
buff_pos += BATMAN_OGM_HLEN; buff_pos += BATADV_OGM_HLEN;
buff_pos += batadv_tt_len(batman_ogm_packet->tt_num_changes); buff_pos += batadv_tt_len(batman_ogm_packet->tt_num_changes);
packet_num++; packet_num++;
batman_ogm_packet = (struct batman_ogm_packet *) batman_ogm_packet = (struct batman_ogm_packet *)
...@@ -290,8 +298,11 @@ batadv_iv_ogm_can_aggregate(const struct batman_ogm_packet *new_bat_ogm_packet, ...@@ -290,8 +298,11 @@ batadv_iv_ogm_can_aggregate(const struct batman_ogm_packet *new_bat_ogm_packet,
int aggregated_bytes = forw_packet->packet_len + packet_len; int aggregated_bytes = forw_packet->packet_len + packet_len;
struct hard_iface *primary_if = NULL; struct hard_iface *primary_if = NULL;
bool res = false; bool res = false;
unsigned long aggregation_end_time;
batman_ogm_packet = (struct batman_ogm_packet *)forw_packet->skb->data; batman_ogm_packet = (struct batman_ogm_packet *)forw_packet->skb->data;
aggregation_end_time = send_time;
aggregation_end_time += msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
/* we can aggregate the current packet to this aggregated packet /* we can aggregate the current packet to this aggregated packet
* if: * if:
...@@ -301,9 +312,8 @@ batadv_iv_ogm_can_aggregate(const struct batman_ogm_packet *new_bat_ogm_packet, ...@@ -301,9 +312,8 @@ batadv_iv_ogm_can_aggregate(const struct batman_ogm_packet *new_bat_ogm_packet,
* MAX_AGGREGATION_BYTES * MAX_AGGREGATION_BYTES
*/ */
if (time_before(send_time, forw_packet->send_time) && if (time_before(send_time, forw_packet->send_time) &&
time_after_eq(send_time + msecs_to_jiffies(MAX_AGGREGATION_MS), time_after_eq(aggregation_end_time, forw_packet->send_time) &&
forw_packet->send_time) && (aggregated_bytes <= BATADV_MAX_AGGREGATION_BYTES)) {
(aggregated_bytes <= MAX_AGGREGATION_BYTES)) {
/* check aggregation compatibility /* check aggregation compatibility
* -> direct link packets are broadcasted on * -> direct link packets are broadcasted on
...@@ -367,13 +377,14 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff, ...@@ -367,13 +377,14 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface); struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
struct forw_packet *forw_packet_aggr; struct forw_packet *forw_packet_aggr;
unsigned char *skb_buff; unsigned char *skb_buff;
unsigned int skb_size;
if (!atomic_inc_not_zero(&if_incoming->refcount)) if (!atomic_inc_not_zero(&if_incoming->refcount))
return; return;
/* own packet should always be scheduled */ /* own packet should always be scheduled */
if (!own_packet) { if (!own_packet) {
if (!atomic_dec_not_zero(&bat_priv->batman_queue_left)) { if (!batadv_atomic_dec_not_zero(&bat_priv->batman_queue_left)) {
batadv_dbg(DBG_BATMAN, bat_priv, batadv_dbg(DBG_BATMAN, bat_priv,
"batman packet queue full\n"); "batman packet queue full\n");
goto out; goto out;
...@@ -388,12 +399,12 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff, ...@@ -388,12 +399,12 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
} }
if ((atomic_read(&bat_priv->aggregated_ogms)) && if ((atomic_read(&bat_priv->aggregated_ogms)) &&
(packet_len < MAX_AGGREGATION_BYTES)) (packet_len < BATADV_MAX_AGGREGATION_BYTES))
forw_packet_aggr->skb = dev_alloc_skb(MAX_AGGREGATION_BYTES + skb_size = BATADV_MAX_AGGREGATION_BYTES + ETH_HLEN;
ETH_HLEN);
else else
forw_packet_aggr->skb = dev_alloc_skb(packet_len + ETH_HLEN); skb_size = packet_len + ETH_HLEN;
forw_packet_aggr->skb = dev_alloc_skb(skb_size);
if (!forw_packet_aggr->skb) { if (!forw_packet_aggr->skb) {
if (!own_packet) if (!own_packet)
atomic_inc(&bat_priv->batman_queue_left); atomic_inc(&bat_priv->batman_queue_left);
...@@ -411,7 +422,7 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff, ...@@ -411,7 +422,7 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
forw_packet_aggr->own = own_packet; forw_packet_aggr->own = own_packet;
forw_packet_aggr->if_incoming = if_incoming; forw_packet_aggr->if_incoming = if_incoming;
forw_packet_aggr->num_packets = 0; forw_packet_aggr->num_packets = 0;
forw_packet_aggr->direct_link_flags = NO_FLAGS; forw_packet_aggr->direct_link_flags = BATADV_NO_FLAGS;
forw_packet_aggr->send_time = send_time; forw_packet_aggr->send_time = send_time;
/* save packet direct link flag status */ /* save packet direct link flag status */
...@@ -466,9 +477,11 @@ static void batadv_iv_ogm_queue_add(struct bat_priv *bat_priv, ...@@ -466,9 +477,11 @@ static void batadv_iv_ogm_queue_add(struct bat_priv *bat_priv,
struct hlist_node *tmp_node; struct hlist_node *tmp_node;
struct batman_ogm_packet *batman_ogm_packet; struct batman_ogm_packet *batman_ogm_packet;
bool direct_link; bool direct_link;
unsigned long max_aggregation_jiffies;
batman_ogm_packet = (struct batman_ogm_packet *)packet_buff; batman_ogm_packet = (struct batman_ogm_packet *)packet_buff;
direct_link = batman_ogm_packet->flags & DIRECTLINK ? 1 : 0; direct_link = batman_ogm_packet->flags & DIRECTLINK ? 1 : 0;
max_aggregation_jiffies = msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
/* find position for the packet in the forward queue */ /* find position for the packet in the forward queue */
spin_lock_bh(&bat_priv->forw_bat_list_lock); spin_lock_bh(&bat_priv->forw_bat_list_lock);
...@@ -498,9 +511,8 @@ static void batadv_iv_ogm_queue_add(struct bat_priv *bat_priv, ...@@ -498,9 +511,8 @@ static void batadv_iv_ogm_queue_add(struct bat_priv *bat_priv,
* we hold it back for a while, so that it might be aggregated * we hold it back for a while, so that it might be aggregated
* later on * later on
*/ */
if ((!own_packet) && if (!own_packet && atomic_read(&bat_priv->aggregated_ogms))
(atomic_read(&bat_priv->aggregated_ogms))) send_time += max_aggregation_jiffies;
send_time += msecs_to_jiffies(MAX_AGGREGATION_MS);
batadv_iv_ogm_aggregate_new(packet_buff, packet_len, batadv_iv_ogm_aggregate_new(packet_buff, packet_len,
send_time, direct_link, send_time, direct_link,
...@@ -561,7 +573,7 @@ static void batadv_iv_ogm_forward(struct orig_node *orig_node, ...@@ -561,7 +573,7 @@ static void batadv_iv_ogm_forward(struct orig_node *orig_node,
batman_ogm_packet->flags &= ~DIRECTLINK; batman_ogm_packet->flags &= ~DIRECTLINK;
batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batman_ogm_packet, batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batman_ogm_packet,
BATMAN_OGM_HLEN + batadv_tt_len(tt_num_changes), BATADV_OGM_HLEN + batadv_tt_len(tt_num_changes),
if_incoming, 0, batadv_iv_ogm_fwd_send_time()); if_incoming, 0, batadv_iv_ogm_fwd_send_time());
} }
...@@ -579,7 +591,7 @@ static void batadv_iv_ogm_schedule(struct hard_iface *hard_iface) ...@@ -579,7 +591,7 @@ static void batadv_iv_ogm_schedule(struct hard_iface *hard_iface)
tt_num_changes = batadv_tt_append_diff(bat_priv, tt_num_changes = batadv_tt_append_diff(bat_priv,
&hard_iface->packet_buff, &hard_iface->packet_buff,
&hard_iface->packet_len, &hard_iface->packet_len,
BATMAN_OGM_HLEN); BATADV_OGM_HLEN);
batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff; batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
...@@ -603,7 +615,7 @@ static void batadv_iv_ogm_schedule(struct hard_iface *hard_iface) ...@@ -603,7 +615,7 @@ static void batadv_iv_ogm_schedule(struct hard_iface *hard_iface)
batman_ogm_packet->gw_flags = batman_ogm_packet->gw_flags =
(uint8_t)atomic_read(&bat_priv->gw_bandwidth); (uint8_t)atomic_read(&bat_priv->gw_bandwidth);
else else
batman_ogm_packet->gw_flags = NO_FLAGS; batman_ogm_packet->gw_flags = BATADV_NO_FLAGS;
batadv_slide_own_bcast_window(hard_iface); batadv_slide_own_bcast_window(hard_iface);
batadv_iv_ogm_queue_add(bat_priv, hard_iface->packet_buff, batadv_iv_ogm_queue_add(bat_priv, hard_iface->packet_buff,
...@@ -772,8 +784,10 @@ static int batadv_iv_ogm_calc_tq(struct orig_node *orig_node, ...@@ -772,8 +784,10 @@ static int batadv_iv_ogm_calc_tq(struct orig_node *orig_node,
struct neigh_node *neigh_node = NULL, *tmp_neigh_node; struct neigh_node *neigh_node = NULL, *tmp_neigh_node;
struct hlist_node *node; struct hlist_node *node;
uint8_t total_count; uint8_t total_count;
uint8_t orig_eq_count, neigh_rq_count, tq_own; uint8_t orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own;
int tq_asym_penalty, ret = 0; unsigned int neigh_rq_inv_cube, neigh_rq_max_cube;
int tq_asym_penalty, inv_asym_penalty, ret = 0;
unsigned int combined_tq;
/* find corresponding one hop neighbor */ /* find corresponding one hop neighbor */
rcu_read_lock(); rcu_read_lock();
...@@ -824,32 +838,33 @@ static int batadv_iv_ogm_calc_tq(struct orig_node *orig_node, ...@@ -824,32 +838,33 @@ static int batadv_iv_ogm_calc_tq(struct orig_node *orig_node,
/* if we have too few packets (too less data) we set tq_own to zero /* if we have too few packets (too less data) we set tq_own to zero
* if we receive too few packets it is not considered bidirectional * if we receive too few packets it is not considered bidirectional
*/ */
if ((total_count < TQ_LOCAL_BIDRECT_SEND_MINIMUM) || if (total_count < BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM ||
(neigh_rq_count < TQ_LOCAL_BIDRECT_RECV_MINIMUM)) neigh_rq_count < BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM)
tq_own = 0; tq_own = 0;
else else
/* neigh_node->real_packet_count is never zero as we /* neigh_node->real_packet_count is never zero as we
* only purge old information when getting new * only purge old information when getting new
* information * information
*/ */
tq_own = (TQ_MAX_VALUE * total_count) / neigh_rq_count; tq_own = (BATADV_TQ_MAX_VALUE * total_count) / neigh_rq_count;
/* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does /* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does
* affect the nearly-symmetric links only a little, but * affect the nearly-symmetric links only a little, but
* punishes asymmetric links more. This will give a value * punishes asymmetric links more. This will give a value
* between 0 and TQ_MAX_VALUE * between 0 and TQ_MAX_VALUE
*/ */
tq_asym_penalty = TQ_MAX_VALUE - (TQ_MAX_VALUE * neigh_rq_inv = BATADV_TQ_LOCAL_WINDOW_SIZE - neigh_rq_count;
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count) * neigh_rq_inv_cube = neigh_rq_inv * neigh_rq_inv * neigh_rq_inv;
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count) * neigh_rq_max_cube = BATADV_TQ_LOCAL_WINDOW_SIZE *
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count)) / BATADV_TQ_LOCAL_WINDOW_SIZE *
(TQ_LOCAL_WINDOW_SIZE * BATADV_TQ_LOCAL_WINDOW_SIZE;
TQ_LOCAL_WINDOW_SIZE * inv_asym_penalty = BATADV_TQ_MAX_VALUE * neigh_rq_inv_cube;
TQ_LOCAL_WINDOW_SIZE); inv_asym_penalty /= neigh_rq_max_cube;
tq_asym_penalty = BATADV_TQ_MAX_VALUE - inv_asym_penalty;
batman_ogm_packet->tq = ((batman_ogm_packet->tq * tq_own
* tq_asym_penalty) / combined_tq = batman_ogm_packet->tq * tq_own * tq_asym_penalty;
(TQ_MAX_VALUE * TQ_MAX_VALUE)); combined_tq /= BATADV_TQ_MAX_VALUE * BATADV_TQ_MAX_VALUE;
batman_ogm_packet->tq = combined_tq;
batadv_dbg(DBG_BATMAN, bat_priv, batadv_dbg(DBG_BATMAN, bat_priv,
"bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, total tq: %3i\n", "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, total tq: %3i\n",
...@@ -860,7 +875,7 @@ static int batadv_iv_ogm_calc_tq(struct orig_node *orig_node, ...@@ -860,7 +875,7 @@ static int batadv_iv_ogm_calc_tq(struct orig_node *orig_node,
/* if link has the minimum required transmission quality /* if link has the minimum required transmission quality
* consider it bidirectional * consider it bidirectional
*/ */
if (batman_ogm_packet->tq >= TQ_TOTAL_BIDRECT_LIMIT) if (batman_ogm_packet->tq >= BATADV_TQ_TOTAL_BIDRECT_LIMIT)
ret = 1; ret = 1;
out: out:
...@@ -928,7 +943,7 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, ...@@ -928,7 +943,7 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
tmp_neigh_node->real_packet_count = tmp_neigh_node->real_packet_count =
bitmap_weight(tmp_neigh_node->real_bits, bitmap_weight(tmp_neigh_node->real_bits,
TQ_LOCAL_WINDOW_SIZE); BATADV_TQ_LOCAL_WINDOW_SIZE);
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -1025,7 +1040,7 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, ...@@ -1025,7 +1040,7 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
} }
rcu_read_unlock(); rcu_read_unlock();
if (batman_ogm_packet->header.version != COMPAT_VERSION) { if (batman_ogm_packet->header.version != BATADV_COMPAT_VERSION) {
batadv_dbg(DBG_BATMAN, bat_priv, batadv_dbg(DBG_BATMAN, bat_priv,
"Drop packet: incompatible batman version (%i)\n", "Drop packet: incompatible batman version (%i)\n",
batman_ogm_packet->header.version); batman_ogm_packet->header.version);
...@@ -1050,6 +1065,8 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, ...@@ -1050,6 +1065,8 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
unsigned long *word; unsigned long *word;
int offset; int offset;
int32_t bit_pos; int32_t bit_pos;
int16_t if_num;
uint8_t *weight;
orig_neigh_node = batadv_get_orig_node(bat_priv, orig_neigh_node = batadv_get_orig_node(bat_priv,
ethhdr->h_source); ethhdr->h_source);
...@@ -1063,15 +1080,17 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, ...@@ -1063,15 +1080,17 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
if (has_directlink_flag && if (has_directlink_flag &&
batadv_compare_eth(if_incoming->net_dev->dev_addr, batadv_compare_eth(if_incoming->net_dev->dev_addr,
batman_ogm_packet->orig)) { batman_ogm_packet->orig)) {
offset = if_incoming->if_num * NUM_WORDS; if_num = if_incoming->if_num;
offset = if_num * BATADV_NUM_WORDS;
spin_lock_bh(&orig_neigh_node->ogm_cnt_lock); spin_lock_bh(&orig_neigh_node->ogm_cnt_lock);
word = &(orig_neigh_node->bcast_own[offset]); word = &(orig_neigh_node->bcast_own[offset]);
bit_pos = if_incoming_seqno - 2; bit_pos = if_incoming_seqno - 2;
bit_pos -= ntohl(batman_ogm_packet->seqno); bit_pos -= ntohl(batman_ogm_packet->seqno);
batadv_set_bit(word, bit_pos); batadv_set_bit(word, bit_pos);
orig_neigh_node->bcast_own_sum[if_incoming->if_num] = weight = &orig_neigh_node->bcast_own_sum[if_num];
bitmap_weight(word, TQ_LOCAL_WINDOW_SIZE); *weight = bitmap_weight(word,
BATADV_TQ_LOCAL_WINDOW_SIZE);
spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock); spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock);
} }
...@@ -1227,7 +1246,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, ...@@ -1227,7 +1246,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
unsigned char *tt_buff, *packet_buff; unsigned char *tt_buff, *packet_buff;
bool ret; bool ret;
ret = batadv_check_management_packet(skb, if_incoming, BATMAN_OGM_HLEN); ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN);
if (!ret) if (!ret)
return NET_RX_DROP; return NET_RX_DROP;
...@@ -1248,12 +1267,12 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, ...@@ -1248,12 +1267,12 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
/* unpack the aggregated packets and process them one by one */ /* unpack the aggregated packets and process them one by one */
do { do {
tt_buff = packet_buff + buff_pos + BATMAN_OGM_HLEN; tt_buff = packet_buff + buff_pos + BATADV_OGM_HLEN;
batadv_iv_ogm_process(ethhdr, batman_ogm_packet, tt_buff, batadv_iv_ogm_process(ethhdr, batman_ogm_packet, tt_buff,
if_incoming); if_incoming);
buff_pos += BATMAN_OGM_HLEN; buff_pos += BATADV_OGM_HLEN;
buff_pos += batadv_tt_len(batman_ogm_packet->tt_num_changes); buff_pos += batadv_tt_len(batman_ogm_packet->tt_num_changes);
batman_ogm_packet = (struct batman_ogm_packet *) batman_ogm_packet = (struct batman_ogm_packet *)
......
...@@ -38,9 +38,9 @@ static struct bat_priv *batadv_kobj_to_batpriv(struct kobject *obj) ...@@ -38,9 +38,9 @@ static struct bat_priv *batadv_kobj_to_batpriv(struct kobject *obj)
return netdev_priv(net_dev); return netdev_priv(net_dev);
} }
#define UEV_TYPE_VAR "BATTYPE=" #define BATADV_UEV_TYPE_VAR "BATTYPE="
#define UEV_ACTION_VAR "BATACTION=" #define BATADV_UEV_ACTION_VAR "BATACTION="
#define UEV_DATA_VAR "BATDATA=" #define BATADV_UEV_DATA_VAR "BATDATA="
static char *batadv_uev_action_str[] = { static char *batadv_uev_action_str[] = {
"add", "add",
...@@ -53,15 +53,15 @@ static char *batadv_uev_type_str[] = { ...@@ -53,15 +53,15 @@ static char *batadv_uev_type_str[] = {
}; };
/* Use this, if you have customized show and store functions */ /* Use this, if you have customized show and store functions */
#define BAT_ATTR(_name, _mode, _show, _store) \ #define BATADV_ATTR(_name, _mode, _show, _store) \
struct bat_attribute batadv_attr_##_name = { \ struct bat_attribute batadv_attr_##_name = { \
.attr = {.name = __stringify(_name), \ .attr = {.name = __stringify(_name), \
.mode = _mode }, \ .mode = _mode }, \
.show = _show, \ .show = _show, \
.store = _store, \ .store = _store, \
}; };
#define BAT_ATTR_SIF_STORE_BOOL(_name, _post_func) \ #define BATADV_ATTR_SIF_STORE_BOOL(_name, _post_func) \
ssize_t batadv_store_##_name(struct kobject *kobj, \ ssize_t batadv_store_##_name(struct kobject *kobj, \
struct attribute *attr, char *buff, \ struct attribute *attr, char *buff, \
size_t count) \ size_t count) \
...@@ -72,7 +72,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \ ...@@ -72,7 +72,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
&bat_priv->_name, net_dev); \ &bat_priv->_name, net_dev); \
} }
#define BAT_ATTR_SIF_SHOW_BOOL(_name) \ #define BATADV_ATTR_SIF_SHOW_BOOL(_name) \
ssize_t batadv_show_##_name(struct kobject *kobj, \ ssize_t batadv_show_##_name(struct kobject *kobj, \
struct attribute *attr, char *buff) \ struct attribute *attr, char *buff) \
{ \ { \
...@@ -85,14 +85,14 @@ ssize_t batadv_show_##_name(struct kobject *kobj, \ ...@@ -85,14 +85,14 @@ ssize_t batadv_show_##_name(struct kobject *kobj, \
/* Use this, if you are going to turn a [name] in the soft-interface /* Use this, if you are going to turn a [name] in the soft-interface
* (bat_priv) on or off * (bat_priv) on or off
*/ */
#define BAT_ATTR_SIF_BOOL(_name, _mode, _post_func) \ #define BATADV_ATTR_SIF_BOOL(_name, _mode, _post_func) \
static BAT_ATTR_SIF_STORE_BOOL(_name, _post_func) \ static BATADV_ATTR_SIF_STORE_BOOL(_name, _post_func) \
static BAT_ATTR_SIF_SHOW_BOOL(_name) \ static BATADV_ATTR_SIF_SHOW_BOOL(_name) \
static BAT_ATTR(_name, _mode, batadv_show_##_name, \ static BATADV_ATTR(_name, _mode, batadv_show_##_name, \
batadv_store_##_name) batadv_store_##_name)
#define BAT_ATTR_SIF_STORE_UINT(_name, _min, _max, _post_func) \ #define BATADV_ATTR_SIF_STORE_UINT(_name, _min, _max, _post_func) \
ssize_t batadv_store_##_name(struct kobject *kobj, \ ssize_t batadv_store_##_name(struct kobject *kobj, \
struct attribute *attr, char *buff, \ struct attribute *attr, char *buff, \
size_t count) \ size_t count) \
...@@ -104,7 +104,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \ ...@@ -104,7 +104,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
&bat_priv->_name, net_dev); \ &bat_priv->_name, net_dev); \
} }
#define BAT_ATTR_SIF_SHOW_UINT(_name) \ #define BATADV_ATTR_SIF_SHOW_UINT(_name) \
ssize_t batadv_show_##_name(struct kobject *kobj, \ ssize_t batadv_show_##_name(struct kobject *kobj, \
struct attribute *attr, char *buff) \ struct attribute *attr, char *buff) \
{ \ { \
...@@ -115,14 +115,14 @@ ssize_t batadv_show_##_name(struct kobject *kobj, \ ...@@ -115,14 +115,14 @@ ssize_t batadv_show_##_name(struct kobject *kobj, \
/* Use this, if you are going to set [name] in the soft-interface /* Use this, if you are going to set [name] in the soft-interface
* (bat_priv) to an unsigned integer value * (bat_priv) to an unsigned integer value
*/ */
#define BAT_ATTR_SIF_UINT(_name, _mode, _min, _max, _post_func) \ #define BATADV_ATTR_SIF_UINT(_name, _mode, _min, _max, _post_func) \
static BAT_ATTR_SIF_STORE_UINT(_name, _min, _max, _post_func) \ static BATADV_ATTR_SIF_STORE_UINT(_name, _min, _max, _post_func)\
static BAT_ATTR_SIF_SHOW_UINT(_name) \ static BATADV_ATTR_SIF_SHOW_UINT(_name) \
static BAT_ATTR(_name, _mode, batadv_show_##_name, \ static BATADV_ATTR(_name, _mode, batadv_show_##_name, \
batadv_store_##_name) batadv_store_##_name)
#define BAT_ATTR_HIF_STORE_UINT(_name, _min, _max, _post_func) \ #define BATADV_ATTR_HIF_STORE_UINT(_name, _min, _max, _post_func) \
ssize_t batadv_store_##_name(struct kobject *kobj, \ ssize_t batadv_store_##_name(struct kobject *kobj, \
struct attribute *attr, char *buff, \ struct attribute *attr, char *buff, \
size_t count) \ size_t count) \
...@@ -143,7 +143,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \ ...@@ -143,7 +143,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
return length; \ return length; \
} }
#define BAT_ATTR_HIF_SHOW_UINT(_name) \ #define BATADV_ATTR_HIF_SHOW_UINT(_name) \
ssize_t batadv_show_##_name(struct kobject *kobj, \ ssize_t batadv_show_##_name(struct kobject *kobj, \
struct attribute *attr, char *buff) \ struct attribute *attr, char *buff) \
{ \ { \
...@@ -164,11 +164,11 @@ ssize_t batadv_show_##_name(struct kobject *kobj, \ ...@@ -164,11 +164,11 @@ ssize_t batadv_show_##_name(struct kobject *kobj, \
/* Use this, if you are going to set [name] in hard_iface to an /* Use this, if you are going to set [name] in hard_iface to an
* unsigned integer value * unsigned integer value
*/ */
#define BAT_ATTR_HIF_UINT(_name, _mode, _min, _max, _post_func) \ #define BATADV_ATTR_HIF_UINT(_name, _mode, _min, _max, _post_func) \
static BAT_ATTR_HIF_STORE_UINT(_name, _min, _max, _post_func) \ static BATADV_ATTR_HIF_STORE_UINT(_name, _min, _max, _post_func)\
static BAT_ATTR_HIF_SHOW_UINT(_name) \ static BATADV_ATTR_HIF_SHOW_UINT(_name) \
static BAT_ATTR(_name, _mode, batadv_show_##_name, \ static BATADV_ATTR(_name, _mode, batadv_show_##_name, \
batadv_store_##_name) batadv_store_##_name)
static int batadv_store_bool_attr(char *buff, size_t count, static int batadv_store_bool_attr(char *buff, size_t count,
...@@ -191,18 +191,17 @@ static int batadv_store_bool_attr(char *buff, size_t count, ...@@ -191,18 +191,17 @@ static int batadv_store_bool_attr(char *buff, size_t count,
enabled = 0; enabled = 0;
if (enabled < 0) { if (enabled < 0) {
bat_info(net_dev, batadv_info(net_dev, "%s: Invalid parameter received: %s\n",
"%s: Invalid parameter received: %s\n", attr_name, buff);
attr_name, buff);
return -EINVAL; return -EINVAL;
} }
if (atomic_read(attr) == enabled) if (atomic_read(attr) == enabled)
return count; return count;
bat_info(net_dev, "%s: Changing from: %s to: %s\n", attr_name, batadv_info(net_dev, "%s: Changing from: %s to: %s\n", attr_name,
atomic_read(attr) == 1 ? "enabled" : "disabled", atomic_read(attr) == 1 ? "enabled" : "disabled",
enabled == 1 ? "enabled" : "disabled"); enabled == 1 ? "enabled" : "disabled");
atomic_set(attr, (unsigned int)enabled); atomic_set(attr, (unsigned int)enabled);
return count; return count;
...@@ -235,29 +234,28 @@ static int batadv_store_uint_attr(const char *buff, size_t count, ...@@ -235,29 +234,28 @@ static int batadv_store_uint_attr(const char *buff, size_t count,
ret = kstrtoul(buff, 10, &uint_val); ret = kstrtoul(buff, 10, &uint_val);
if (ret) { if (ret) {
bat_info(net_dev, batadv_info(net_dev, "%s: Invalid parameter received: %s\n",
"%s: Invalid parameter received: %s\n", attr_name, buff);
attr_name, buff);
return -EINVAL; return -EINVAL;
} }
if (uint_val < min) { if (uint_val < min) {
bat_info(net_dev, "%s: Value is too small: %lu min: %u\n", batadv_info(net_dev, "%s: Value is too small: %lu min: %u\n",
attr_name, uint_val, min); attr_name, uint_val, min);
return -EINVAL; return -EINVAL;
} }
if (uint_val > max) { if (uint_val > max) {
bat_info(net_dev, "%s: Value is too big: %lu max: %u\n", batadv_info(net_dev, "%s: Value is too big: %lu max: %u\n",
attr_name, uint_val, max); attr_name, uint_val, max);
return -EINVAL; return -EINVAL;
} }
if (atomic_read(attr) == uint_val) if (atomic_read(attr) == uint_val)
return count; return count;
bat_info(net_dev, "%s: Changing from: %i to: %lu\n", batadv_info(net_dev, "%s: Changing from: %i to: %lu\n",
attr_name, atomic_read(attr), uint_val); attr_name, atomic_read(attr), uint_val);
atomic_set(attr, uint_val); atomic_set(attr, uint_val);
return count; return count;
...@@ -299,6 +297,7 @@ static ssize_t batadv_store_vis_mode(struct kobject *kobj, ...@@ -299,6 +297,7 @@ static ssize_t batadv_store_vis_mode(struct kobject *kobj,
struct bat_priv *bat_priv = netdev_priv(net_dev); struct bat_priv *bat_priv = netdev_priv(net_dev);
unsigned long val; unsigned long val;
int ret, vis_mode_tmp = -1; int ret, vis_mode_tmp = -1;
const char *old_mode, *new_mode;
ret = kstrtoul(buff, 10, &val); ret = kstrtoul(buff, 10, &val);
...@@ -315,19 +314,27 @@ static ssize_t batadv_store_vis_mode(struct kobject *kobj, ...@@ -315,19 +314,27 @@ static ssize_t batadv_store_vis_mode(struct kobject *kobj,
if (buff[count - 1] == '\n') if (buff[count - 1] == '\n')
buff[count - 1] = '\0'; buff[count - 1] = '\0';
bat_info(net_dev, batadv_info(net_dev,
"Invalid parameter for 'vis mode' setting received: %s\n", "Invalid parameter for 'vis mode' setting received: %s\n",
buff); buff);
return -EINVAL; return -EINVAL;
} }
if (atomic_read(&bat_priv->vis_mode) == vis_mode_tmp) if (atomic_read(&bat_priv->vis_mode) == vis_mode_tmp)
return count; return count;
bat_info(net_dev, "Changing vis mode from: %s to: %s\n", if (atomic_read(&bat_priv->vis_mode) == VIS_TYPE_CLIENT_UPDATE)
atomic_read(&bat_priv->vis_mode) == VIS_TYPE_CLIENT_UPDATE ? old_mode = "client";
"client" : "server", vis_mode_tmp == VIS_TYPE_CLIENT_UPDATE ? else
"client" : "server"); old_mode = "server";
if (vis_mode_tmp == VIS_TYPE_CLIENT_UPDATE)
new_mode = "client";
else
new_mode = "server";
batadv_info(net_dev, "Changing vis mode from: %s to: %s\n", old_mode,
new_mode);
atomic_set(&bat_priv->vis_mode, (unsigned int)vis_mode_tmp); atomic_set(&bat_priv->vis_mode, (unsigned int)vis_mode_tmp);
return count; return count;
...@@ -354,13 +361,16 @@ static ssize_t batadv_show_gw_mode(struct kobject *kobj, struct attribute *attr, ...@@ -354,13 +361,16 @@ static ssize_t batadv_show_gw_mode(struct kobject *kobj, struct attribute *attr,
switch (atomic_read(&bat_priv->gw_mode)) { switch (atomic_read(&bat_priv->gw_mode)) {
case GW_MODE_CLIENT: case GW_MODE_CLIENT:
bytes_written = sprintf(buff, "%s\n", GW_MODE_CLIENT_NAME); bytes_written = sprintf(buff, "%s\n",
BATADV_GW_MODE_CLIENT_NAME);
break; break;
case GW_MODE_SERVER: case GW_MODE_SERVER:
bytes_written = sprintf(buff, "%s\n", GW_MODE_SERVER_NAME); bytes_written = sprintf(buff, "%s\n",
BATADV_GW_MODE_SERVER_NAME);
break; break;
default: default:
bytes_written = sprintf(buff, "%s\n", GW_MODE_OFF_NAME); bytes_written = sprintf(buff, "%s\n",
BATADV_GW_MODE_OFF_NAME);
break; break;
} }
...@@ -379,21 +389,22 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj, ...@@ -379,21 +389,22 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj,
if (buff[count - 1] == '\n') if (buff[count - 1] == '\n')
buff[count - 1] = '\0'; buff[count - 1] = '\0';
if (strncmp(buff, GW_MODE_OFF_NAME, strlen(GW_MODE_OFF_NAME)) == 0) if (strncmp(buff, BATADV_GW_MODE_OFF_NAME,
strlen(BATADV_GW_MODE_OFF_NAME)) == 0)
gw_mode_tmp = GW_MODE_OFF; gw_mode_tmp = GW_MODE_OFF;
if (strncmp(buff, GW_MODE_CLIENT_NAME, if (strncmp(buff, BATADV_GW_MODE_CLIENT_NAME,
strlen(GW_MODE_CLIENT_NAME)) == 0) strlen(BATADV_GW_MODE_CLIENT_NAME)) == 0)
gw_mode_tmp = GW_MODE_CLIENT; gw_mode_tmp = GW_MODE_CLIENT;
if (strncmp(buff, GW_MODE_SERVER_NAME, if (strncmp(buff, BATADV_GW_MODE_SERVER_NAME,
strlen(GW_MODE_SERVER_NAME)) == 0) strlen(BATADV_GW_MODE_SERVER_NAME)) == 0)
gw_mode_tmp = GW_MODE_SERVER; gw_mode_tmp = GW_MODE_SERVER;
if (gw_mode_tmp < 0) { if (gw_mode_tmp < 0) {
bat_info(net_dev, batadv_info(net_dev,
"Invalid parameter for 'gw mode' setting received: %s\n", "Invalid parameter for 'gw mode' setting received: %s\n",
buff); buff);
return -EINVAL; return -EINVAL;
} }
...@@ -402,18 +413,18 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj, ...@@ -402,18 +413,18 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj,
switch (atomic_read(&bat_priv->gw_mode)) { switch (atomic_read(&bat_priv->gw_mode)) {
case GW_MODE_CLIENT: case GW_MODE_CLIENT:
curr_gw_mode_str = GW_MODE_CLIENT_NAME; curr_gw_mode_str = BATADV_GW_MODE_CLIENT_NAME;
break; break;
case GW_MODE_SERVER: case GW_MODE_SERVER:
curr_gw_mode_str = GW_MODE_SERVER_NAME; curr_gw_mode_str = BATADV_GW_MODE_SERVER_NAME;
break; break;
default: default:
curr_gw_mode_str = GW_MODE_OFF_NAME; curr_gw_mode_str = BATADV_GW_MODE_OFF_NAME;
break; break;
} }
bat_info(net_dev, "Changing gw mode from: %s to: %s\n", batadv_info(net_dev, "Changing gw mode from: %s to: %s\n",
curr_gw_mode_str, buff); curr_gw_mode_str, buff);
batadv_gw_deselect(bat_priv); batadv_gw_deselect(bat_priv);
atomic_set(&bat_priv->gw_mode, (unsigned int)gw_mode_tmp); atomic_set(&bat_priv->gw_mode, (unsigned int)gw_mode_tmp);
...@@ -447,26 +458,28 @@ static ssize_t batadv_store_gw_bwidth(struct kobject *kobj, ...@@ -447,26 +458,28 @@ static ssize_t batadv_store_gw_bwidth(struct kobject *kobj,
return batadv_gw_bandwidth_set(net_dev, buff, count); return batadv_gw_bandwidth_set(net_dev, buff, count);
} }
BAT_ATTR_SIF_BOOL(aggregated_ogms, S_IRUGO | S_IWUSR, NULL); BATADV_ATTR_SIF_BOOL(aggregated_ogms, S_IRUGO | S_IWUSR, NULL);
BAT_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL); BATADV_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
#ifdef CONFIG_BATMAN_ADV_BLA #ifdef CONFIG_BATMAN_ADV_BLA
BAT_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL); BATADV_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL);
#endif #endif
BAT_ATTR_SIF_BOOL(fragmentation, S_IRUGO | S_IWUSR, batadv_update_min_mtu); BATADV_ATTR_SIF_BOOL(fragmentation, S_IRUGO | S_IWUSR, batadv_update_min_mtu);
BAT_ATTR_SIF_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL); BATADV_ATTR_SIF_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
static BAT_ATTR(vis_mode, S_IRUGO | S_IWUSR, batadv_show_vis_mode, static BATADV_ATTR(vis_mode, S_IRUGO | S_IWUSR, batadv_show_vis_mode,
batadv_store_vis_mode); batadv_store_vis_mode);
static BAT_ATTR(routing_algo, S_IRUGO, batadv_show_bat_algo, NULL); static BATADV_ATTR(routing_algo, S_IRUGO, batadv_show_bat_algo, NULL);
static BAT_ATTR(gw_mode, S_IRUGO | S_IWUSR, batadv_show_gw_mode, static BATADV_ATTR(gw_mode, S_IRUGO | S_IWUSR, batadv_show_gw_mode,
batadv_store_gw_mode); batadv_store_gw_mode);
BAT_ATTR_SIF_UINT(orig_interval, S_IRUGO | S_IWUSR, 2 * JITTER, INT_MAX, NULL); BATADV_ATTR_SIF_UINT(orig_interval, S_IRUGO | S_IWUSR, 2 * BATADV_JITTER,
BAT_ATTR_SIF_UINT(hop_penalty, S_IRUGO | S_IWUSR, 0, TQ_MAX_VALUE, NULL); INT_MAX, NULL);
BAT_ATTR_SIF_UINT(gw_sel_class, S_IRUGO | S_IWUSR, 1, TQ_MAX_VALUE, BATADV_ATTR_SIF_UINT(hop_penalty, S_IRUGO | S_IWUSR, 0, BATADV_TQ_MAX_VALUE,
batadv_post_gw_deselect); NULL);
static BAT_ATTR(gw_bandwidth, S_IRUGO | S_IWUSR, batadv_show_gw_bwidth, BATADV_ATTR_SIF_UINT(gw_sel_class, S_IRUGO | S_IWUSR, 1, BATADV_TQ_MAX_VALUE,
batadv_store_gw_bwidth); batadv_post_gw_deselect);
static BATADV_ATTR(gw_bandwidth, S_IRUGO | S_IWUSR, batadv_show_gw_bwidth,
batadv_store_gw_bwidth);
#ifdef CONFIG_BATMAN_ADV_DEBUG #ifdef CONFIG_BATMAN_ADV_DEBUG
BAT_ATTR_SIF_UINT(log_level, S_IRUGO | S_IWUSR, 0, DBG_ALL, NULL); BATADV_ATTR_SIF_UINT(log_level, S_IRUGO | S_IWUSR, 0, DBG_ALL, NULL);
#endif #endif
static struct bat_attribute *batadv_mesh_attrs[] = { static struct bat_attribute *batadv_mesh_attrs[] = {
...@@ -497,11 +510,11 @@ int batadv_sysfs_add_meshif(struct net_device *dev) ...@@ -497,11 +510,11 @@ int batadv_sysfs_add_meshif(struct net_device *dev)
struct bat_attribute **bat_attr; struct bat_attribute **bat_attr;
int err; int err;
bat_priv->mesh_obj = kobject_create_and_add(SYSFS_IF_MESH_SUBDIR, bat_priv->mesh_obj = kobject_create_and_add(BATADV_SYSFS_IF_MESH_SUBDIR,
batif_kobject); batif_kobject);
if (!bat_priv->mesh_obj) { if (!bat_priv->mesh_obj) {
bat_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name, batadv_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
SYSFS_IF_MESH_SUBDIR); BATADV_SYSFS_IF_MESH_SUBDIR);
goto out; goto out;
} }
...@@ -509,9 +522,9 @@ int batadv_sysfs_add_meshif(struct net_device *dev) ...@@ -509,9 +522,9 @@ int batadv_sysfs_add_meshif(struct net_device *dev)
err = sysfs_create_file(bat_priv->mesh_obj, err = sysfs_create_file(bat_priv->mesh_obj,
&((*bat_attr)->attr)); &((*bat_attr)->attr));
if (err) { if (err) {
bat_err(dev, "Can't add sysfs file: %s/%s/%s\n", batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
dev->name, SYSFS_IF_MESH_SUBDIR, dev->name, BATADV_SYSFS_IF_MESH_SUBDIR,
((*bat_attr)->attr).name); ((*bat_attr)->attr).name);
goto rem_attr; goto rem_attr;
} }
} }
...@@ -649,9 +662,9 @@ static ssize_t batadv_show_iface_status(struct kobject *kobj, ...@@ -649,9 +662,9 @@ static ssize_t batadv_show_iface_status(struct kobject *kobj,
return length; return length;
} }
static BAT_ATTR(mesh_iface, S_IRUGO | S_IWUSR, static BATADV_ATTR(mesh_iface, S_IRUGO | S_IWUSR, batadv_show_mesh_iface,
batadv_show_mesh_iface, batadv_store_mesh_iface); batadv_store_mesh_iface);
static BAT_ATTR(iface_status, S_IRUGO, batadv_show_iface_status, NULL); static BATADV_ATTR(iface_status, S_IRUGO, batadv_show_iface_status, NULL);
static struct bat_attribute *batadv_batman_attrs[] = { static struct bat_attribute *batadv_batman_attrs[] = {
&batadv_attr_mesh_iface, &batadv_attr_mesh_iface,
...@@ -665,21 +678,21 @@ int batadv_sysfs_add_hardif(struct kobject **hardif_obj, struct net_device *dev) ...@@ -665,21 +678,21 @@ int batadv_sysfs_add_hardif(struct kobject **hardif_obj, struct net_device *dev)
struct bat_attribute **bat_attr; struct bat_attribute **bat_attr;
int err; int err;
*hardif_obj = kobject_create_and_add(SYSFS_IF_BAT_SUBDIR, *hardif_obj = kobject_create_and_add(BATADV_SYSFS_IF_BAT_SUBDIR,
hardif_kobject); hardif_kobject);
if (!*hardif_obj) { if (!*hardif_obj) {
bat_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name, batadv_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
SYSFS_IF_BAT_SUBDIR); BATADV_SYSFS_IF_BAT_SUBDIR);
goto out; goto out;
} }
for (bat_attr = batadv_batman_attrs; *bat_attr; ++bat_attr) { for (bat_attr = batadv_batman_attrs; *bat_attr; ++bat_attr) {
err = sysfs_create_file(*hardif_obj, &((*bat_attr)->attr)); err = sysfs_create_file(*hardif_obj, &((*bat_attr)->attr));
if (err) { if (err) {
bat_err(dev, "Can't add sysfs file: %s/%s/%s\n", batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
dev->name, SYSFS_IF_BAT_SUBDIR, dev->name, BATADV_SYSFS_IF_BAT_SUBDIR,
((*bat_attr)->attr).name); ((*bat_attr)->attr).name);
goto rem_attr; goto rem_attr;
} }
} }
...@@ -713,31 +726,32 @@ int batadv_throw_uevent(struct bat_priv *bat_priv, enum uev_type type, ...@@ -713,31 +726,32 @@ int batadv_throw_uevent(struct bat_priv *bat_priv, enum uev_type type,
bat_kobj = &primary_if->soft_iface->dev.kobj; bat_kobj = &primary_if->soft_iface->dev.kobj;
uevent_env[0] = kmalloc(strlen(UEV_TYPE_VAR) + uevent_env[0] = kmalloc(strlen(BATADV_UEV_TYPE_VAR) +
strlen(batadv_uev_type_str[type]) + 1, strlen(batadv_uev_type_str[type]) + 1,
GFP_ATOMIC); GFP_ATOMIC);
if (!uevent_env[0]) if (!uevent_env[0])
goto out; goto out;
sprintf(uevent_env[0], "%s%s", UEV_TYPE_VAR, batadv_uev_type_str[type]); sprintf(uevent_env[0], "%s%s", BATADV_UEV_TYPE_VAR,
batadv_uev_type_str[type]);
uevent_env[1] = kmalloc(strlen(UEV_ACTION_VAR) + uevent_env[1] = kmalloc(strlen(BATADV_UEV_ACTION_VAR) +
strlen(batadv_uev_action_str[action]) + 1, strlen(batadv_uev_action_str[action]) + 1,
GFP_ATOMIC); GFP_ATOMIC);
if (!uevent_env[1]) if (!uevent_env[1])
goto out; goto out;
sprintf(uevent_env[1], "%s%s", UEV_ACTION_VAR, sprintf(uevent_env[1], "%s%s", BATADV_UEV_ACTION_VAR,
batadv_uev_action_str[action]); batadv_uev_action_str[action]);
/* If the event is DEL, ignore the data field */ /* If the event is DEL, ignore the data field */
if (action != UEV_DEL) { if (action != UEV_DEL) {
uevent_env[2] = kmalloc(strlen(UEV_DATA_VAR) + uevent_env[2] = kmalloc(strlen(BATADV_UEV_DATA_VAR) +
strlen(data) + 1, GFP_ATOMIC); strlen(data) + 1, GFP_ATOMIC);
if (!uevent_env[2]) if (!uevent_env[2])
goto out; goto out;
sprintf(uevent_env[2], "%s%s", UEV_DATA_VAR, data); sprintf(uevent_env[2], "%s%s", BATADV_UEV_DATA_VAR, data);
} }
ret = kobject_uevent_env(bat_kobj, KOBJ_CHANGE, uevent_env); ret = kobject_uevent_env(bat_kobj, KOBJ_CHANGE, uevent_env);
......
...@@ -20,8 +20,8 @@ ...@@ -20,8 +20,8 @@
#ifndef _NET_BATMAN_ADV_SYSFS_H_ #ifndef _NET_BATMAN_ADV_SYSFS_H_
#define _NET_BATMAN_ADV_SYSFS_H_ #define _NET_BATMAN_ADV_SYSFS_H_
#define SYSFS_IF_MESH_SUBDIR "mesh" #define BATADV_SYSFS_IF_MESH_SUBDIR "mesh"
#define SYSFS_IF_BAT_SUBDIR "batman_adv" #define BATADV_SYSFS_IF_BAT_SUBDIR "batman_adv"
struct bat_attribute { struct bat_attribute {
struct attribute attr; struct attribute attr;
......
...@@ -25,10 +25,10 @@ ...@@ -25,10 +25,10 @@
/* shift the packet array by n places. */ /* shift the packet array by n places. */
static void batadv_bitmap_shift_left(unsigned long *seq_bits, int32_t n) static void batadv_bitmap_shift_left(unsigned long *seq_bits, int32_t n)
{ {
if (n <= 0 || n >= TQ_LOCAL_WINDOW_SIZE) if (n <= 0 || n >= BATADV_TQ_LOCAL_WINDOW_SIZE)
return; return;
bitmap_shift_left(seq_bits, seq_bits, n, TQ_LOCAL_WINDOW_SIZE); bitmap_shift_left(seq_bits, seq_bits, n, BATADV_TQ_LOCAL_WINDOW_SIZE);
} }
...@@ -46,7 +46,7 @@ int batadv_bit_get_packet(void *priv, unsigned long *seq_bits, ...@@ -46,7 +46,7 @@ int batadv_bit_get_packet(void *priv, unsigned long *seq_bits,
/* sequence number is slightly older. We already got a sequence number /* sequence number is slightly older. We already got a sequence number
* higher than this one, so we just mark it. * higher than this one, so we just mark it.
*/ */
if ((seq_num_diff <= 0) && (seq_num_diff > -TQ_LOCAL_WINDOW_SIZE)) { if (seq_num_diff <= 0 && seq_num_diff > -BATADV_TQ_LOCAL_WINDOW_SIZE) {
if (set_mark) if (set_mark)
batadv_set_bit(seq_bits, -seq_num_diff); batadv_set_bit(seq_bits, -seq_num_diff);
return 0; return 0;
...@@ -55,7 +55,7 @@ int batadv_bit_get_packet(void *priv, unsigned long *seq_bits, ...@@ -55,7 +55,7 @@ int batadv_bit_get_packet(void *priv, unsigned long *seq_bits,
/* sequence number is slightly newer, so we shift the window and /* sequence number is slightly newer, so we shift the window and
* set the mark if required * set the mark if required
*/ */
if ((seq_num_diff > 0) && (seq_num_diff < TQ_LOCAL_WINDOW_SIZE)) { if (seq_num_diff > 0 && seq_num_diff < BATADV_TQ_LOCAL_WINDOW_SIZE) {
batadv_bitmap_shift_left(seq_bits, seq_num_diff); batadv_bitmap_shift_left(seq_bits, seq_num_diff);
if (set_mark) if (set_mark)
...@@ -64,12 +64,12 @@ int batadv_bit_get_packet(void *priv, unsigned long *seq_bits, ...@@ -64,12 +64,12 @@ int batadv_bit_get_packet(void *priv, unsigned long *seq_bits,
} }
/* sequence number is much newer, probably missed a lot of packets */ /* sequence number is much newer, probably missed a lot of packets */
if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE) && if (seq_num_diff >= BATADV_TQ_LOCAL_WINDOW_SIZE &&
(seq_num_diff < EXPECTED_SEQNO_RANGE)) { seq_num_diff < BATADV_EXPECTED_SEQNO_RANGE) {
batadv_dbg(DBG_BATMAN, bat_priv, batadv_dbg(DBG_BATMAN, bat_priv,
"We missed a lot of packets (%i) !\n", "We missed a lot of packets (%i) !\n",
seq_num_diff - 1); seq_num_diff - 1);
bitmap_zero(seq_bits, TQ_LOCAL_WINDOW_SIZE); bitmap_zero(seq_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
if (set_mark) if (set_mark)
batadv_set_bit(seq_bits, 0); batadv_set_bit(seq_bits, 0);
return 1; return 1;
...@@ -80,13 +80,13 @@ int batadv_bit_get_packet(void *priv, unsigned long *seq_bits, ...@@ -80,13 +80,13 @@ int batadv_bit_get_packet(void *priv, unsigned long *seq_bits,
* packet should be dropped without calling this function if the * packet should be dropped without calling this function if the
* seqno window is protected. * seqno window is protected.
*/ */
if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) || if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
(seq_num_diff >= EXPECTED_SEQNO_RANGE)) { seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
batadv_dbg(DBG_BATMAN, bat_priv, batadv_dbg(DBG_BATMAN, bat_priv,
"Other host probably restarted!\n"); "Other host probably restarted!\n");
bitmap_zero(seq_bits, TQ_LOCAL_WINDOW_SIZE); bitmap_zero(seq_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
if (set_mark) if (set_mark)
batadv_set_bit(seq_bits, 0); batadv_set_bit(seq_bits, 0);
......
...@@ -29,7 +29,7 @@ static inline int batadv_test_bit(const unsigned long *seq_bits, ...@@ -29,7 +29,7 @@ static inline int batadv_test_bit(const unsigned long *seq_bits,
int32_t diff; int32_t diff;
diff = last_seqno - curr_seqno; diff = last_seqno - curr_seqno;
if (diff < 0 || diff >= TQ_LOCAL_WINDOW_SIZE) if (diff < 0 || diff >= BATADV_TQ_LOCAL_WINDOW_SIZE)
return 0; return 0;
else else
return test_bit(diff, seq_bits); return test_bit(diff, seq_bits);
...@@ -39,7 +39,7 @@ static inline int batadv_test_bit(const unsigned long *seq_bits, ...@@ -39,7 +39,7 @@ static inline int batadv_test_bit(const unsigned long *seq_bits,
static inline void batadv_set_bit(unsigned long *seq_bits, int32_t n) static inline void batadv_set_bit(unsigned long *seq_bits, int32_t n)
{ {
/* if too old, just drop it */ /* if too old, just drop it */
if (n < 0 || n >= TQ_LOCAL_WINDOW_SIZE) if (n < 0 || n >= BATADV_TQ_LOCAL_WINDOW_SIZE)
return; return;
set_bit(n, seq_bits); /* turn the position on */ set_bit(n, seq_bits); /* turn the position on */
......
...@@ -237,7 +237,7 @@ static void batadv_bla_del_backbone_claims(struct backbone_gw *backbone_gw) ...@@ -237,7 +237,7 @@ static void batadv_bla_del_backbone_claims(struct backbone_gw *backbone_gw)
} }
/* all claims gone, intialize CRC */ /* all claims gone, intialize CRC */
backbone_gw->crc = BLA_CRC_INIT; backbone_gw->crc = BATADV_BLA_CRC_INIT;
} }
/* @bat_priv: the bat priv with all the soft interface information /* @bat_priv: the bat priv with all the soft interface information
...@@ -375,7 +375,7 @@ static struct backbone_gw *batadv_bla_get_backbone_gw(struct bat_priv *bat_priv, ...@@ -375,7 +375,7 @@ static struct backbone_gw *batadv_bla_get_backbone_gw(struct bat_priv *bat_priv,
entry->vid = vid; entry->vid = vid;
entry->lasttime = jiffies; entry->lasttime = jiffies;
entry->crc = BLA_CRC_INIT; entry->crc = BATADV_BLA_CRC_INIT;
entry->bat_priv = bat_priv; entry->bat_priv = bat_priv;
atomic_set(&entry->request_sent, 0); atomic_set(&entry->request_sent, 0);
memcpy(entry->orig, orig, ETH_ALEN); memcpy(entry->orig, orig, ETH_ALEN);
...@@ -949,7 +949,7 @@ static void batadv_bla_purge_backbone_gw(struct bat_priv *bat_priv, int now) ...@@ -949,7 +949,7 @@ static void batadv_bla_purge_backbone_gw(struct bat_priv *bat_priv, int now)
if (now) if (now)
goto purge_now; goto purge_now;
if (!batadv_has_timed_out(backbone_gw->lasttime, if (!batadv_has_timed_out(backbone_gw->lasttime,
BLA_BACKBONE_TIMEOUT)) BATADV_BLA_BACKBONE_TIMEOUT))
continue; continue;
batadv_dbg(DBG_BLA, backbone_gw->bat_priv, batadv_dbg(DBG_BLA, backbone_gw->bat_priv,
...@@ -1001,7 +1001,7 @@ static void batadv_bla_purge_claims(struct bat_priv *bat_priv, ...@@ -1001,7 +1001,7 @@ static void batadv_bla_purge_claims(struct bat_priv *bat_priv,
primary_if->net_dev->dev_addr)) primary_if->net_dev->dev_addr))
continue; continue;
if (!batadv_has_timed_out(claim->lasttime, if (!batadv_has_timed_out(claim->lasttime,
BLA_CLAIM_TIMEOUT)) BATADV_BLA_CLAIM_TIMEOUT))
continue; continue;
batadv_dbg(DBG_BLA, bat_priv, batadv_dbg(DBG_BLA, bat_priv,
...@@ -1075,7 +1075,7 @@ static void batadv_bla_start_timer(struct bat_priv *bat_priv) ...@@ -1075,7 +1075,7 @@ static void batadv_bla_start_timer(struct bat_priv *bat_priv)
{ {
INIT_DELAYED_WORK(&bat_priv->bla_work, batadv_bla_periodic_work); INIT_DELAYED_WORK(&bat_priv->bla_work, batadv_bla_periodic_work);
queue_delayed_work(batadv_event_workqueue, &bat_priv->bla_work, queue_delayed_work(batadv_event_workqueue, &bat_priv->bla_work,
msecs_to_jiffies(BLA_PERIOD_LENGTH)); msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));
} }
/* periodic work to do: /* periodic work to do:
...@@ -1162,9 +1162,9 @@ int batadv_bla_init(struct bat_priv *bat_priv) ...@@ -1162,9 +1162,9 @@ int batadv_bla_init(struct bat_priv *bat_priv)
} }
/* initialize the duplicate list */ /* initialize the duplicate list */
for (i = 0; i < DUPLIST_SIZE; i++) for (i = 0; i < BATADV_DUPLIST_SIZE; i++)
bat_priv->bcast_duplist[i].entrytime = bat_priv->bcast_duplist[i].entrytime =
jiffies - msecs_to_jiffies(DUPLIST_TIMEOUT); jiffies - msecs_to_jiffies(BATADV_DUPLIST_TIMEOUT);
bat_priv->bcast_duplist_curr = 0; bat_priv->bcast_duplist_curr = 0;
if (bat_priv->claim_hash) if (bat_priv->claim_hash)
...@@ -1216,14 +1216,15 @@ int batadv_bla_check_bcast_duplist(struct bat_priv *bat_priv, ...@@ -1216,14 +1216,15 @@ int batadv_bla_check_bcast_duplist(struct bat_priv *bat_priv,
/* calculate the crc ... */ /* calculate the crc ... */
crc = crc16(0, content, length); crc = crc16(0, content, length);
for (i = 0 ; i < DUPLIST_SIZE; i++) { for (i = 0; i < BATADV_DUPLIST_SIZE; i++) {
curr = (bat_priv->bcast_duplist_curr + i) % DUPLIST_SIZE; curr = (bat_priv->bcast_duplist_curr + i) % BATADV_DUPLIST_SIZE;
entry = &bat_priv->bcast_duplist[curr]; entry = &bat_priv->bcast_duplist[curr];
/* we can stop searching if the entry is too old ; /* we can stop searching if the entry is too old ;
* later entries will be even older * later entries will be even older
*/ */
if (batadv_has_timed_out(entry->entrytime, DUPLIST_TIMEOUT)) if (batadv_has_timed_out(entry->entrytime,
BATADV_DUPLIST_TIMEOUT))
break; break;
if (entry->crc != crc) if (entry->crc != crc)
...@@ -1238,7 +1239,8 @@ int batadv_bla_check_bcast_duplist(struct bat_priv *bat_priv, ...@@ -1238,7 +1239,8 @@ int batadv_bla_check_bcast_duplist(struct bat_priv *bat_priv,
return 1; return 1;
} }
/* not found, add a new entry (overwrite the oldest entry) */ /* not found, add a new entry (overwrite the oldest entry) */
curr = (bat_priv->bcast_duplist_curr + DUPLIST_SIZE - 1) % DUPLIST_SIZE; curr = (bat_priv->bcast_duplist_curr + BATADV_DUPLIST_SIZE - 1);
curr %= BATADV_DUPLIST_SIZE;
entry = &bat_priv->bcast_duplist[curr]; entry = &bat_priv->bcast_duplist[curr];
entry->crc = crc; entry->crc = crc;
entry->entrytime = jiffies; entry->entrytime = jiffies;
......
...@@ -36,7 +36,7 @@ void batadv_bla_update_orig_address(struct bat_priv *bat_priv, ...@@ -36,7 +36,7 @@ void batadv_bla_update_orig_address(struct bat_priv *bat_priv,
int batadv_bla_init(struct bat_priv *bat_priv); int batadv_bla_init(struct bat_priv *bat_priv);
void batadv_bla_free(struct bat_priv *bat_priv); void batadv_bla_free(struct bat_priv *bat_priv);
#define BLA_CRC_INIT 0 #define BATADV_BLA_CRC_INIT 0
#else /* ifdef CONFIG_BATMAN_ADV_BLA */ #else /* ifdef CONFIG_BATMAN_ADV_BLA */
static inline int batadv_bla_rx(struct bat_priv *bat_priv, struct sk_buff *skb, static inline int batadv_bla_rx(struct bat_priv *bat_priv, struct sk_buff *skb,
......
...@@ -33,8 +33,8 @@ ...@@ -33,8 +33,8 @@
/* This is the offset of the options field in a dhcp packet starting at /* This is the offset of the options field in a dhcp packet starting at
* the beginning of the dhcp header * the beginning of the dhcp header
*/ */
#define DHCP_OPTIONS_OFFSET 240 #define BATADV_DHCP_OPTIONS_OFFSET 240
#define DHCP_REQUEST 3 #define BATADV_DHCP_REQUEST 3
static void batadv_gw_node_free_ref(struct gw_node *gw_node) static void batadv_gw_node_free_ref(struct gw_node *gw_node)
{ {
...@@ -138,8 +138,8 @@ static struct gw_node *batadv_gw_get_best_gw_node(struct bat_priv *bat_priv) ...@@ -138,8 +138,8 @@ static struct gw_node *batadv_gw_get_best_gw_node(struct bat_priv *bat_priv)
tmp_gw_factor = (router->tq_avg * router->tq_avg * tmp_gw_factor = (router->tq_avg * router->tq_avg *
down * 100 * 100) / down * 100 * 100) /
(TQ_LOCAL_WINDOW_SIZE * (BATADV_TQ_LOCAL_WINDOW_SIZE *
TQ_LOCAL_WINDOW_SIZE * 64); BATADV_TQ_LOCAL_WINDOW_SIZE * 64);
if ((tmp_gw_factor > max_gw_factor) || if ((tmp_gw_factor > max_gw_factor) ||
((tmp_gw_factor == max_gw_factor) && ((tmp_gw_factor == max_gw_factor) &&
...@@ -197,7 +197,7 @@ void batadv_gw_election(struct bat_priv *bat_priv) ...@@ -197,7 +197,7 @@ void batadv_gw_election(struct bat_priv *bat_priv)
if (atomic_read(&bat_priv->gw_mode) != GW_MODE_CLIENT) if (atomic_read(&bat_priv->gw_mode) != GW_MODE_CLIENT)
goto out; goto out;
if (!atomic_dec_not_zero(&bat_priv->gw_reselect)) if (!batadv_atomic_dec_not_zero(&bat_priv->gw_reselect))
goto out; goto out;
curr_gw = batadv_gw_get_selected_gw_node(bat_priv); curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
...@@ -354,7 +354,7 @@ void batadv_gw_node_update(struct bat_priv *bat_priv, ...@@ -354,7 +354,7 @@ void batadv_gw_node_update(struct bat_priv *bat_priv,
gw_node->deleted = 0; gw_node->deleted = 0;
if (new_gwflags == NO_FLAGS) { if (new_gwflags == BATADV_NO_FLAGS) {
gw_node->deleted = jiffies; gw_node->deleted = jiffies;
batadv_dbg(DBG_BATMAN, bat_priv, batadv_dbg(DBG_BATMAN, bat_priv,
"Gateway %pM removed from gateway list\n", "Gateway %pM removed from gateway list\n",
...@@ -367,7 +367,7 @@ void batadv_gw_node_update(struct bat_priv *bat_priv, ...@@ -367,7 +367,7 @@ void batadv_gw_node_update(struct bat_priv *bat_priv,
goto unlock; goto unlock;
} }
if (new_gwflags == NO_FLAGS) if (new_gwflags == BATADV_NO_FLAGS)
goto unlock; goto unlock;
batadv_gw_node_add(bat_priv, orig_node, new_gwflags); batadv_gw_node_add(bat_priv, orig_node, new_gwflags);
...@@ -392,7 +392,7 @@ void batadv_gw_node_purge(struct bat_priv *bat_priv) ...@@ -392,7 +392,7 @@ void batadv_gw_node_purge(struct bat_priv *bat_priv)
{ {
struct gw_node *gw_node, *curr_gw; struct gw_node *gw_node, *curr_gw;
struct hlist_node *node, *node_tmp; struct hlist_node *node, *node_tmp;
unsigned long timeout = msecs_to_jiffies(2 * PURGE_TIMEOUT); unsigned long timeout = msecs_to_jiffies(2 * BATADV_PURGE_TIMEOUT);
int do_deselect = 0; int do_deselect = 0;
curr_gw = batadv_gw_get_selected_gw_node(bat_priv); curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
...@@ -484,8 +484,8 @@ int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset) ...@@ -484,8 +484,8 @@ int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset)
seq_printf(seq, seq_printf(seq,
" %-12s (%s/%i) %17s [%10s]: gw_class ... [B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s)]\n", " %-12s (%s/%i) %17s [%10s]: gw_class ... [B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s)]\n",
"Gateway", "#", TQ_MAX_VALUE, "Nexthop", "outgoingIF", "Gateway", "#", BATADV_TQ_MAX_VALUE, "Nexthop", "outgoingIF",
SOURCE_VERSION, primary_if->net_dev->name, BATADV_SOURCE_VERSION, primary_if->net_dev->name,
primary_if->net_dev->dev_addr, net_dev->name); primary_if->net_dev->dev_addr, net_dev->name);
rcu_read_lock(); rcu_read_lock();
...@@ -521,11 +521,11 @@ static bool batadv_is_type_dhcprequest(struct sk_buff *skb, int header_len) ...@@ -521,11 +521,11 @@ static bool batadv_is_type_dhcprequest(struct sk_buff *skb, int header_len)
pkt_len = skb_headlen(skb); pkt_len = skb_headlen(skb);
if (pkt_len < header_len + DHCP_OPTIONS_OFFSET + 1) if (pkt_len < header_len + BATADV_DHCP_OPTIONS_OFFSET + 1)
goto out; goto out;
p = skb->data + header_len + DHCP_OPTIONS_OFFSET; p = skb->data + header_len + BATADV_DHCP_OPTIONS_OFFSET;
pkt_len -= header_len + DHCP_OPTIONS_OFFSET + 1; pkt_len -= header_len + BATADV_DHCP_OPTIONS_OFFSET + 1;
/* Access the dhcp option lists. Each entry is made up by: /* Access the dhcp option lists. Each entry is made up by:
* - octet 1: option type * - octet 1: option type
...@@ -543,7 +543,7 @@ static bool batadv_is_type_dhcprequest(struct sk_buff *skb, int header_len) ...@@ -543,7 +543,7 @@ static bool batadv_is_type_dhcprequest(struct sk_buff *skb, int header_len)
p += 2; p += 2;
/* check if the message type is what we need */ /* check if the message type is what we need */
if (*p == DHCP_REQUEST) if (*p == BATADV_DHCP_REQUEST)
ret = true; ret = true;
break; break;
} else if (*p == 0) { } else if (*p == 0) {
...@@ -667,7 +667,7 @@ bool batadv_gw_out_of_range(struct bat_priv *bat_priv, ...@@ -667,7 +667,7 @@ bool batadv_gw_out_of_range(struct bat_priv *bat_priv,
/* If we are a GW then we are our best GW. We can artificially /* If we are a GW then we are our best GW. We can artificially
* set the tq towards ourself as the maximum value * set the tq towards ourself as the maximum value
*/ */
curr_tq_avg = TQ_MAX_VALUE; curr_tq_avg = BATADV_TQ_MAX_VALUE;
break; break;
case GW_MODE_CLIENT: case GW_MODE_CLIENT:
curr_gw = batadv_gw_get_selected_gw_node(bat_priv); curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
...@@ -698,7 +698,7 @@ bool batadv_gw_out_of_range(struct bat_priv *bat_priv, ...@@ -698,7 +698,7 @@ bool batadv_gw_out_of_range(struct bat_priv *bat_priv,
if (!neigh_old) if (!neigh_old)
goto out; goto out;
if (curr_tq_avg - neigh_old->tq_avg > GW_THRESHOLD) if (curr_tq_avg - neigh_old->tq_avg > BATADV_GW_THRESHOLD)
out_of_range = true; out_of_range = true;
out: out:
......
...@@ -97,9 +97,9 @@ static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff, ...@@ -97,9 +97,9 @@ static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
ret = kstrtol(buff, 10, &ldown); ret = kstrtol(buff, 10, &ldown);
if (ret) { if (ret) {
bat_err(net_dev, batadv_err(net_dev,
"Download speed of gateway mode invalid: %s\n", "Download speed of gateway mode invalid: %s\n",
buff); buff);
return false; return false;
} }
...@@ -122,9 +122,9 @@ static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff, ...@@ -122,9 +122,9 @@ static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
ret = kstrtol(slash_ptr + 1, 10, &lup); ret = kstrtol(slash_ptr + 1, 10, &lup);
if (ret) { if (ret) {
bat_err(net_dev, batadv_err(net_dev,
"Upload speed of gateway mode invalid: %s\n", "Upload speed of gateway mode invalid: %s\n",
slash_ptr + 1); slash_ptr + 1);
return false; return false;
} }
...@@ -164,13 +164,13 @@ ssize_t batadv_gw_bandwidth_set(struct net_device *net_dev, char *buff, ...@@ -164,13 +164,13 @@ ssize_t batadv_gw_bandwidth_set(struct net_device *net_dev, char *buff,
return count; return count;
batadv_gw_deselect(bat_priv); batadv_gw_deselect(bat_priv);
bat_info(net_dev, batadv_info(net_dev,
"Changing gateway bandwidth from: '%i' to: '%ld' (propagating: %d%s/%d%s)\n", "Changing gateway bandwidth from: '%i' to: '%ld' (propagating: %d%s/%d%s)\n",
atomic_read(&bat_priv->gw_bandwidth), gw_bandwidth_tmp, atomic_read(&bat_priv->gw_bandwidth), gw_bandwidth_tmp,
(down > 2048 ? down / 1024 : down), (down > 2048 ? down / 1024 : down),
(down > 2048 ? "MBit" : "KBit"), (down > 2048 ? "MBit" : "KBit"),
(up > 2048 ? up / 1024 : up), (up > 2048 ? up / 1024 : up),
(up > 2048 ? "MBit" : "KBit")); (up > 2048 ? "MBit" : "KBit"));
atomic_set(&bat_priv->gw_bandwidth, gw_bandwidth_tmp); atomic_set(&bat_priv->gw_bandwidth, gw_bandwidth_tmp);
......
...@@ -26,9 +26,9 @@ enum gw_modes { ...@@ -26,9 +26,9 @@ enum gw_modes {
GW_MODE_SERVER, GW_MODE_SERVER,
}; };
#define GW_MODE_OFF_NAME "off" #define BATADV_GW_MODE_OFF_NAME "off"
#define GW_MODE_CLIENT_NAME "client" #define BATADV_GW_MODE_CLIENT_NAME "client"
#define GW_MODE_SERVER_NAME "server" #define BATADV_GW_MODE_SERVER_NAME "server"
void batadv_gw_bandwidth_to_kbit(uint8_t gw_class, int *down, int *up); void batadv_gw_bandwidth_to_kbit(uint8_t gw_class, int *down, int *up);
ssize_t batadv_gw_bandwidth_set(struct net_device *net_dev, char *buff, ssize_t batadv_gw_bandwidth_set(struct net_device *net_dev, char *buff,
......
...@@ -196,7 +196,8 @@ int batadv_hardif_min_mtu(struct net_device *soft_iface) ...@@ -196,7 +196,8 @@ int batadv_hardif_min_mtu(struct net_device *soft_iface)
if (hard_iface->soft_iface != soft_iface) if (hard_iface->soft_iface != soft_iface)
continue; continue;
min_mtu = min_t(int, hard_iface->net_dev->mtu - BAT_HEADER_LEN, min_mtu = min_t(int,
hard_iface->net_dev->mtu - BATADV_HEADER_LEN,
min_mtu); min_mtu);
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -234,8 +235,8 @@ static void batadv_hardif_activate_interface(struct hard_iface *hard_iface) ...@@ -234,8 +235,8 @@ static void batadv_hardif_activate_interface(struct hard_iface *hard_iface)
if (!primary_if) if (!primary_if)
batadv_primary_if_select(bat_priv, hard_iface); batadv_primary_if_select(bat_priv, hard_iface);
bat_info(hard_iface->soft_iface, "Interface activated: %s\n", batadv_info(hard_iface->soft_iface, "Interface activated: %s\n",
hard_iface->net_dev->name); hard_iface->net_dev->name);
batadv_update_min_mtu(hard_iface->soft_iface); batadv_update_min_mtu(hard_iface->soft_iface);
...@@ -252,8 +253,8 @@ static void batadv_hardif_deactivate_interface(struct hard_iface *hard_iface) ...@@ -252,8 +253,8 @@ static void batadv_hardif_deactivate_interface(struct hard_iface *hard_iface)
hard_iface->if_status = IF_INACTIVE; hard_iface->if_status = IF_INACTIVE;
bat_info(hard_iface->soft_iface, "Interface deactivated: %s\n", batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
hard_iface->net_dev->name); hard_iface->net_dev->name);
batadv_update_min_mtu(hard_iface->soft_iface); batadv_update_min_mtu(hard_iface->soft_iface);
} }
...@@ -263,6 +264,7 @@ int batadv_hardif_enable_interface(struct hard_iface *hard_iface, ...@@ -263,6 +264,7 @@ int batadv_hardif_enable_interface(struct hard_iface *hard_iface,
{ {
struct bat_priv *bat_priv; struct bat_priv *bat_priv;
struct net_device *soft_iface; struct net_device *soft_iface;
__be16 ethertype = __constant_htons(BATADV_ETH_P_BATMAN);
int ret; int ret;
if (hard_iface->if_status != IF_NOT_IN_USE) if (hard_iface->if_status != IF_NOT_IN_USE)
...@@ -309,35 +311,35 @@ int batadv_hardif_enable_interface(struct hard_iface *hard_iface, ...@@ -309,35 +311,35 @@ int batadv_hardif_enable_interface(struct hard_iface *hard_iface,
hard_iface->if_status = IF_INACTIVE; hard_iface->if_status = IF_INACTIVE;
batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces); batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces);
hard_iface->batman_adv_ptype.type = __constant_htons(ETH_P_BATMAN); hard_iface->batman_adv_ptype.type = ethertype;
hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv; hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv;
hard_iface->batman_adv_ptype.dev = hard_iface->net_dev; hard_iface->batman_adv_ptype.dev = hard_iface->net_dev;
dev_add_pack(&hard_iface->batman_adv_ptype); dev_add_pack(&hard_iface->batman_adv_ptype);
atomic_set(&hard_iface->frag_seqno, 1); atomic_set(&hard_iface->frag_seqno, 1);
bat_info(hard_iface->soft_iface, "Adding interface: %s\n", batadv_info(hard_iface->soft_iface, "Adding interface: %s\n",
hard_iface->net_dev->name); hard_iface->net_dev->name);
if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu < if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
ETH_DATA_LEN + BAT_HEADER_LEN) ETH_DATA_LEN + BATADV_HEADER_LEN)
bat_info(hard_iface->soft_iface, batadv_info(hard_iface->soft_iface,
"The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. Packets going over this interface will be fragmented on layer2 which could impact the performance. Setting the MTU to %zi would solve the problem.\n", "The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. Packets going over this interface will be fragmented on layer2 which could impact the performance. Setting the MTU to %zi would solve the problem.\n",
hard_iface->net_dev->name, hard_iface->net_dev->mtu, hard_iface->net_dev->name, hard_iface->net_dev->mtu,
ETH_DATA_LEN + BAT_HEADER_LEN); ETH_DATA_LEN + BATADV_HEADER_LEN);
if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu < if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
ETH_DATA_LEN + BAT_HEADER_LEN) ETH_DATA_LEN + BATADV_HEADER_LEN)
bat_info(hard_iface->soft_iface, batadv_info(hard_iface->soft_iface,
"The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. If you experience problems getting traffic through try increasing the MTU to %zi.\n", "The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. If you experience problems getting traffic through try increasing the MTU to %zi.\n",
hard_iface->net_dev->name, hard_iface->net_dev->mtu, hard_iface->net_dev->name, hard_iface->net_dev->mtu,
ETH_DATA_LEN + BAT_HEADER_LEN); ETH_DATA_LEN + BATADV_HEADER_LEN);
if (batadv_hardif_is_iface_up(hard_iface)) if (batadv_hardif_is_iface_up(hard_iface))
batadv_hardif_activate_interface(hard_iface); batadv_hardif_activate_interface(hard_iface);
else else
bat_err(hard_iface->soft_iface, batadv_err(hard_iface->soft_iface,
"Not using interface %s (retrying later): interface not active\n", "Not using interface %s (retrying later): interface not active\n",
hard_iface->net_dev->name); hard_iface->net_dev->name);
/* begin scheduling originator messages on that interface */ /* begin scheduling originator messages on that interface */
batadv_schedule_bat_ogm(hard_iface); batadv_schedule_bat_ogm(hard_iface);
...@@ -363,8 +365,8 @@ void batadv_hardif_disable_interface(struct hard_iface *hard_iface) ...@@ -363,8 +365,8 @@ void batadv_hardif_disable_interface(struct hard_iface *hard_iface)
if (hard_iface->if_status != IF_INACTIVE) if (hard_iface->if_status != IF_INACTIVE)
goto out; goto out;
bat_info(hard_iface->soft_iface, "Removing interface: %s\n", batadv_info(hard_iface->soft_iface, "Removing interface: %s\n",
hard_iface->net_dev->name); hard_iface->net_dev->name);
dev_remove_pack(&hard_iface->batman_adv_ptype); dev_remove_pack(&hard_iface->batman_adv_ptype);
bat_priv->num_ifaces--; bat_priv->num_ifaces--;
...@@ -546,7 +548,7 @@ bool batadv_is_wifi_iface(int ifindex) ...@@ -546,7 +548,7 @@ bool batadv_is_wifi_iface(int ifindex)
struct net_device *net_device = NULL; struct net_device *net_device = NULL;
bool ret = false; bool ret = false;
if (ifindex == NULL_IFINDEX) if (ifindex == BATADV_NULL_IFINDEX)
goto out; goto out;
net_device = dev_get_by_index(&init_net, ifindex); net_device = dev_get_by_index(&init_net, ifindex);
......
...@@ -203,9 +203,9 @@ static ssize_t batadv_socket_write(struct file *file, const char __user *buff, ...@@ -203,9 +203,9 @@ static ssize_t batadv_socket_write(struct file *file, const char __user *buff,
icmp_packet->uid = socket_client->index; icmp_packet->uid = socket_client->index;
if (icmp_packet->header.version != COMPAT_VERSION) { if (icmp_packet->header.version != BATADV_COMPAT_VERSION) {
icmp_packet->msg_type = PARAMETER_PROBLEM; icmp_packet->msg_type = PARAMETER_PROBLEM;
icmp_packet->header.version = COMPAT_VERSION; icmp_packet->header.version = BATADV_COMPAT_VERSION;
batadv_socket_add_packet(socket_client, icmp_packet, batadv_socket_add_packet(socket_client, icmp_packet,
packet_len); packet_len);
goto free_skb; goto free_skb;
...@@ -282,7 +282,7 @@ int batadv_socket_setup(struct bat_priv *bat_priv) ...@@ -282,7 +282,7 @@ int batadv_socket_setup(struct bat_priv *bat_priv)
if (!bat_priv->debug_dir) if (!bat_priv->debug_dir)
goto err; goto err;
d = debugfs_create_file(ICMP_SOCKET, S_IFREG | S_IWUSR | S_IRUSR, d = debugfs_create_file(BATADV_ICMP_SOCKET, S_IFREG | S_IWUSR | S_IRUSR,
bat_priv->debug_dir, bat_priv, &batadv_fops); bat_priv->debug_dir, bat_priv, &batadv_fops);
if (!d) if (!d)
goto err; goto err;
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#ifndef _NET_BATMAN_ADV_ICMP_SOCKET_H_ #ifndef _NET_BATMAN_ADV_ICMP_SOCKET_H_
#define _NET_BATMAN_ADV_ICMP_SOCKET_H_ #define _NET_BATMAN_ADV_ICMP_SOCKET_H_
#define ICMP_SOCKET "socket" #define BATADV_ICMP_SOCKET "socket"
void batadv_socket_init(void); void batadv_socket_init(void);
int batadv_socket_setup(struct bat_priv *bat_priv); int batadv_socket_setup(struct bat_priv *bat_priv);
......
...@@ -38,22 +38,23 @@ ...@@ -38,22 +38,23 @@
* list traversals just rcu-locked * list traversals just rcu-locked
*/ */
struct list_head batadv_hardif_list; struct list_head batadv_hardif_list;
static int (*recv_packet_handler[256])(struct sk_buff *, struct hard_iface *); static int (*batadv_rx_handler[256])(struct sk_buff *,
struct hard_iface *);
char batadv_routing_algo[20] = "BATMAN_IV"; char batadv_routing_algo[20] = "BATMAN_IV";
static struct hlist_head bat_algo_list; static struct hlist_head batadv_algo_list;
unsigned char batadv_broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; unsigned char batadv_broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
struct workqueue_struct *batadv_event_workqueue; struct workqueue_struct *batadv_event_workqueue;
static void recv_handler_init(void); static void batadv_recv_handler_init(void);
static int __init batman_init(void) static int __init batadv_init(void)
{ {
INIT_LIST_HEAD(&batadv_hardif_list); INIT_LIST_HEAD(&batadv_hardif_list);
INIT_HLIST_HEAD(&bat_algo_list); INIT_HLIST_HEAD(&batadv_algo_list);
recv_handler_init(); batadv_recv_handler_init();
batadv_iv_init(); batadv_iv_init();
...@@ -71,12 +72,12 @@ static int __init batman_init(void) ...@@ -71,12 +72,12 @@ static int __init batman_init(void)
register_netdevice_notifier(&batadv_hard_if_notifier); register_netdevice_notifier(&batadv_hard_if_notifier);
pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) loaded\n", pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) loaded\n",
SOURCE_VERSION, COMPAT_VERSION); BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION);
return 0; return 0;
} }
static void __exit batman_exit(void) static void __exit batadv_exit(void)
{ {
batadv_debugfs_destroy(); batadv_debugfs_destroy();
unregister_netdevice_notifier(&batadv_hard_if_notifier); unregister_netdevice_notifier(&batadv_hard_if_notifier);
...@@ -119,7 +120,8 @@ int batadv_mesh_init(struct net_device *soft_iface) ...@@ -119,7 +120,8 @@ int batadv_mesh_init(struct net_device *soft_iface)
if (ret < 0) if (ret < 0)
goto err; goto err;
batadv_tt_local_add(soft_iface, soft_iface->dev_addr, NULL_IFINDEX); batadv_tt_local_add(soft_iface, soft_iface->dev_addr,
BATADV_NULL_IFINDEX);
ret = batadv_vis_init(bat_priv); ret = batadv_vis_init(bat_priv);
if (ret < 0) if (ret < 0)
...@@ -189,8 +191,8 @@ int batadv_is_my_mac(const uint8_t *addr) ...@@ -189,8 +191,8 @@ int batadv_is_my_mac(const uint8_t *addr)
return 0; return 0;
} }
static int recv_unhandled_packet(struct sk_buff *skb, static int batadv_recv_unhandled_packet(struct sk_buff *skb,
struct hard_iface *recv_if) struct hard_iface *recv_if)
{ {
return NET_RX_DROP; return NET_RX_DROP;
} }
...@@ -237,7 +239,7 @@ int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -237,7 +239,7 @@ int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
batman_ogm_packet = (struct batman_ogm_packet *)skb->data; batman_ogm_packet = (struct batman_ogm_packet *)skb->data;
if (batman_ogm_packet->header.version != COMPAT_VERSION) { if (batman_ogm_packet->header.version != BATADV_COMPAT_VERSION) {
batadv_dbg(DBG_BATMAN, bat_priv, batadv_dbg(DBG_BATMAN, bat_priv,
"Drop packet: incompatible batman version (%i)\n", "Drop packet: incompatible batman version (%i)\n",
batman_ogm_packet->header.version); batman_ogm_packet->header.version);
...@@ -248,7 +250,7 @@ int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -248,7 +250,7 @@ int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
* the supplied skb. if not, we have to free the skb. * the supplied skb. if not, we have to free the skb.
*/ */
idx = batman_ogm_packet->header.packet_type; idx = batman_ogm_packet->header.packet_type;
ret = (*recv_packet_handler[idx])(skb, hard_iface); ret = (*batadv_rx_handler[idx])(skb, hard_iface);
if (ret == NET_RX_DROP) if (ret == NET_RX_DROP)
kfree_skb(skb); kfree_skb(skb);
...@@ -265,51 +267,51 @@ int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -265,51 +267,51 @@ int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
return NET_RX_DROP; return NET_RX_DROP;
} }
static void recv_handler_init(void) static void batadv_recv_handler_init(void)
{ {
int i; int i;
for (i = 0; i < ARRAY_SIZE(recv_packet_handler); i++) for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++)
recv_packet_handler[i] = recv_unhandled_packet; batadv_rx_handler[i] = batadv_recv_unhandled_packet;
/* batman icmp packet */ /* batman icmp packet */
recv_packet_handler[BAT_ICMP] = batadv_recv_icmp_packet; batadv_rx_handler[BAT_ICMP] = batadv_recv_icmp_packet;
/* unicast packet */ /* unicast packet */
recv_packet_handler[BAT_UNICAST] = batadv_recv_unicast_packet; batadv_rx_handler[BAT_UNICAST] = batadv_recv_unicast_packet;
/* fragmented unicast packet */ /* fragmented unicast packet */
recv_packet_handler[BAT_UNICAST_FRAG] = batadv_recv_ucast_frag_packet; batadv_rx_handler[BAT_UNICAST_FRAG] = batadv_recv_ucast_frag_packet;
/* broadcast packet */ /* broadcast packet */
recv_packet_handler[BAT_BCAST] = batadv_recv_bcast_packet; batadv_rx_handler[BAT_BCAST] = batadv_recv_bcast_packet;
/* vis packet */ /* vis packet */
recv_packet_handler[BAT_VIS] = batadv_recv_vis_packet; batadv_rx_handler[BAT_VIS] = batadv_recv_vis_packet;
/* Translation table query (request or response) */ /* Translation table query (request or response) */
recv_packet_handler[BAT_TT_QUERY] = batadv_recv_tt_query; batadv_rx_handler[BAT_TT_QUERY] = batadv_recv_tt_query;
/* Roaming advertisement */ /* Roaming advertisement */
recv_packet_handler[BAT_ROAM_ADV] = batadv_recv_roam_adv; batadv_rx_handler[BAT_ROAM_ADV] = batadv_recv_roam_adv;
} }
int batadv_recv_handler_register(uint8_t packet_type, int batadv_recv_handler_register(uint8_t packet_type,
int (*recv_handler)(struct sk_buff *, int (*recv_handler)(struct sk_buff *,
struct hard_iface *)) struct hard_iface *))
{ {
if (recv_packet_handler[packet_type] != &recv_unhandled_packet) if (batadv_rx_handler[packet_type] != &batadv_recv_unhandled_packet)
return -EBUSY; return -EBUSY;
recv_packet_handler[packet_type] = recv_handler; batadv_rx_handler[packet_type] = recv_handler;
return 0; return 0;
} }
void batadv_recv_handler_unregister(uint8_t packet_type) void batadv_recv_handler_unregister(uint8_t packet_type)
{ {
recv_packet_handler[packet_type] = recv_unhandled_packet; batadv_rx_handler[packet_type] = batadv_recv_unhandled_packet;
} }
static struct bat_algo_ops *bat_algo_get(char *name) static struct bat_algo_ops *batadv_algo_get(char *name)
{ {
struct bat_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp; struct bat_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
struct hlist_node *node; struct hlist_node *node;
hlist_for_each_entry(bat_algo_ops_tmp, node, &bat_algo_list, list) { hlist_for_each_entry(bat_algo_ops_tmp, node, &batadv_algo_list, list) {
if (strcmp(bat_algo_ops_tmp->name, name) != 0) if (strcmp(bat_algo_ops_tmp->name, name) != 0)
continue; continue;
...@@ -325,7 +327,7 @@ int batadv_algo_register(struct bat_algo_ops *bat_algo_ops) ...@@ -325,7 +327,7 @@ int batadv_algo_register(struct bat_algo_ops *bat_algo_ops)
struct bat_algo_ops *bat_algo_ops_tmp; struct bat_algo_ops *bat_algo_ops_tmp;
int ret; int ret;
bat_algo_ops_tmp = bat_algo_get(bat_algo_ops->name); bat_algo_ops_tmp = batadv_algo_get(bat_algo_ops->name);
if (bat_algo_ops_tmp) { if (bat_algo_ops_tmp) {
pr_info("Trying to register already registered routing algorithm: %s\n", pr_info("Trying to register already registered routing algorithm: %s\n",
bat_algo_ops->name); bat_algo_ops->name);
...@@ -347,7 +349,7 @@ int batadv_algo_register(struct bat_algo_ops *bat_algo_ops) ...@@ -347,7 +349,7 @@ int batadv_algo_register(struct bat_algo_ops *bat_algo_ops)
} }
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, &batadv_algo_list);
ret = 0; ret = 0;
out: out:
...@@ -359,7 +361,7 @@ int batadv_algo_select(struct bat_priv *bat_priv, char *name) ...@@ -359,7 +361,7 @@ int batadv_algo_select(struct bat_priv *bat_priv, char *name)
struct bat_algo_ops *bat_algo_ops; struct bat_algo_ops *bat_algo_ops;
int ret = -EINVAL; int ret = -EINVAL;
bat_algo_ops = bat_algo_get(name); bat_algo_ops = batadv_algo_get(name);
if (!bat_algo_ops) if (!bat_algo_ops)
goto out; goto out;
...@@ -377,14 +379,14 @@ int batadv_algo_seq_print_text(struct seq_file *seq, void *offset) ...@@ -377,14 +379,14 @@ int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
seq_printf(seq, "Available routing algorithms:\n"); seq_printf(seq, "Available routing algorithms:\n");
hlist_for_each_entry(bat_algo_ops, node, &bat_algo_list, list) { hlist_for_each_entry(bat_algo_ops, node, &batadv_algo_list, list) {
seq_printf(seq, "%s\n", bat_algo_ops->name); seq_printf(seq, "%s\n", bat_algo_ops->name);
} }
return 0; return 0;
} }
static int param_set_ra(const char *val, const struct kernel_param *kp) static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
{ {
struct bat_algo_ops *bat_algo_ops; struct bat_algo_ops *bat_algo_ops;
char *algo_name = (char *)val; char *algo_name = (char *)val;
...@@ -393,7 +395,7 @@ static int param_set_ra(const char *val, const struct kernel_param *kp) ...@@ -393,7 +395,7 @@ static int param_set_ra(const char *val, const struct kernel_param *kp)
if (algo_name[name_len - 1] == '\n') if (algo_name[name_len - 1] == '\n')
algo_name[name_len - 1] = '\0'; algo_name[name_len - 1] = '\0';
bat_algo_ops = bat_algo_get(algo_name); bat_algo_ops = batadv_algo_get(algo_name);
if (!bat_algo_ops) { if (!bat_algo_ops) {
pr_err("Routing algorithm '%s' is not supported\n", algo_name); pr_err("Routing algorithm '%s' is not supported\n", algo_name);
return -EINVAL; return -EINVAL;
...@@ -402,23 +404,24 @@ static int param_set_ra(const char *val, const struct kernel_param *kp) ...@@ -402,23 +404,24 @@ static int param_set_ra(const char *val, const struct kernel_param *kp)
return param_set_copystring(algo_name, kp); return param_set_copystring(algo_name, kp);
} }
static const struct kernel_param_ops param_ops_ra = { static const struct kernel_param_ops batadv_param_ops_ra = {
.set = param_set_ra, .set = batadv_param_set_ra,
.get = param_get_string, .get = param_get_string,
}; };
static struct kparam_string __param_string_ra = { static struct kparam_string batadv_param_string_ra = {
.maxlen = sizeof(batadv_routing_algo), .maxlen = sizeof(batadv_routing_algo),
.string = batadv_routing_algo, .string = batadv_routing_algo,
}; };
module_param_cb(routing_algo, &param_ops_ra, &__param_string_ra, 0644); module_param_cb(routing_algo, &batadv_param_ops_ra, &batadv_param_string_ra,
module_init(batman_init); 0644);
module_exit(batman_exit); module_init(batadv_init);
module_exit(batadv_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_AUTHOR(BATADV_DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC); MODULE_DESCRIPTION(BATADV_DRIVER_DESC);
MODULE_SUPPORTED_DEVICE(DRIVER_DEVICE); MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE);
MODULE_VERSION(SOURCE_VERSION); MODULE_VERSION(BATADV_SOURCE_VERSION);
...@@ -20,79 +20,80 @@ ...@@ -20,79 +20,80 @@
#ifndef _NET_BATMAN_ADV_MAIN_H_ #ifndef _NET_BATMAN_ADV_MAIN_H_
#define _NET_BATMAN_ADV_MAIN_H_ #define _NET_BATMAN_ADV_MAIN_H_
#define DRIVER_AUTHOR "Marek Lindner <lindner_marek@yahoo.de>, " \ #define BATADV_DRIVER_AUTHOR "Marek Lindner <lindner_marek@yahoo.de>, " \
"Simon Wunderlich <siwu@hrz.tu-chemnitz.de>" "Simon Wunderlich <siwu@hrz.tu-chemnitz.de>"
#define DRIVER_DESC "B.A.T.M.A.N. advanced" #define BATADV_DRIVER_DESC "B.A.T.M.A.N. advanced"
#define DRIVER_DEVICE "batman-adv" #define BATADV_DRIVER_DEVICE "batman-adv"
#ifndef SOURCE_VERSION #ifndef BATADV_SOURCE_VERSION
#define SOURCE_VERSION "2012.3.0" #define BATADV_SOURCE_VERSION "2012.3.0"
#endif #endif
/* B.A.T.M.A.N. parameters */ /* B.A.T.M.A.N. parameters */
#define TQ_MAX_VALUE 255 #define BATADV_TQ_MAX_VALUE 255
#define JITTER 20 #define BATADV_JITTER 20
/* Time To Live of broadcast messages */ /* Time To Live of broadcast messages */
#define TTL 50 #define BATADV_TTL 50
/* purge originators after time in seconds if no valid packet comes in /* purge originators after time in seconds if no valid packet comes in
* -> TODO: check influence on TQ_LOCAL_WINDOW_SIZE * -> TODO: check influence on BATADV_TQ_LOCAL_WINDOW_SIZE
*/ */
#define PURGE_TIMEOUT 200000 /* 200 seconds */ #define BATADV_PURGE_TIMEOUT 200000 /* 200 seconds */
#define TT_LOCAL_TIMEOUT 3600000 /* in miliseconds */ #define BATADV_TT_LOCAL_TIMEOUT 3600000 /* in miliseconds */
#define TT_CLIENT_ROAM_TIMEOUT 600000 /* in miliseconds */ #define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000 /* in miliseconds */
/* sliding packet range of received originator messages in sequence numbers /* sliding packet range of received originator messages in sequence numbers
* (should be a multiple of our word size) * (should be a multiple of our word size)
*/ */
#define TQ_LOCAL_WINDOW_SIZE 64 #define BATADV_TQ_LOCAL_WINDOW_SIZE 64
/* miliseconds we have to keep pending tt_req */ /* miliseconds we have to keep pending tt_req */
#define TT_REQUEST_TIMEOUT 3000 #define BATADV_TT_REQUEST_TIMEOUT 3000
#define TQ_GLOBAL_WINDOW_SIZE 5 #define BATADV_TQ_GLOBAL_WINDOW_SIZE 5
#define TQ_LOCAL_BIDRECT_SEND_MINIMUM 1 #define BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
#define TQ_LOCAL_BIDRECT_RECV_MINIMUM 1 #define BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM 1
#define TQ_TOTAL_BIDRECT_LIMIT 1 #define BATADV_TQ_TOTAL_BIDRECT_LIMIT 1
#define TT_OGM_APPEND_MAX 3 /* 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
/* Time in which a client can roam at most ROAMING_MAX_COUNT times in /* Time in which a client can roam at most ROAMING_MAX_COUNT times in
* miliseconds * miliseconds
*/ */
#define ROAMING_MAX_TIME 20000 #define BATADV_ROAMING_MAX_TIME 20000
#define ROAMING_MAX_COUNT 5 #define BATADV_ROAMING_MAX_COUNT 5
#define NO_FLAGS 0 #define BATADV_NO_FLAGS 0
#define NULL_IFINDEX 0 /* dummy ifindex used to avoid iface checks */ #define BATADV_NULL_IFINDEX 0 /* dummy ifindex used to avoid iface checks */
#define NUM_WORDS BITS_TO_LONGS(TQ_LOCAL_WINDOW_SIZE) #define BATADV_NUM_WORDS BITS_TO_LONGS(BATADV_TQ_LOCAL_WINDOW_SIZE)
#define LOG_BUF_LEN 8192 /* has to be a power of 2 */ #define BATADV_LOG_BUF_LEN 8192 /* has to be a power of 2 */
#define VIS_INTERVAL 5000 /* 5 seconds */ #define BATADV_VIS_INTERVAL 5000 /* 5 seconds */
/* how much worse secondary interfaces may be to be considered as bonding /* how much worse secondary interfaces may be to be considered as bonding
* candidates * candidates
*/ */
#define BONDING_TQ_THRESHOLD 50 #define BATADV_BONDING_TQ_THRESHOLD 50
/* should not be bigger than 512 bytes or change the size of /* should not be bigger than 512 bytes or change the size of
* forw_packet->direct_link_flags * forw_packet->direct_link_flags
*/ */
#define MAX_AGGREGATION_BYTES 512 #define BATADV_MAX_AGGREGATION_BYTES 512
#define MAX_AGGREGATION_MS 100 #define BATADV_MAX_AGGREGATION_MS 100
#define BLA_PERIOD_LENGTH 10000 /* 10 seconds */ #define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */
#define BLA_BACKBONE_TIMEOUT (BLA_PERIOD_LENGTH * 3) #define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3)
#define BLA_CLAIM_TIMEOUT (BLA_PERIOD_LENGTH * 10) #define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10)
#define DUPLIST_SIZE 16 #define BATADV_DUPLIST_SIZE 16
#define DUPLIST_TIMEOUT 500 /* 500 ms */ #define BATADV_DUPLIST_TIMEOUT 500 /* 500 ms */
/* don't reset again within 30 seconds */ /* don't reset again within 30 seconds */
#define RESET_PROTECTION_MS 30000 #define BATADV_RESET_PROTECTION_MS 30000
#define EXPECTED_SEQNO_RANGE 65536 #define BATADV_EXPECTED_SEQNO_RANGE 65536
enum mesh_state { enum mesh_state {
MESH_INACTIVE, MESH_INACTIVE,
...@@ -100,8 +101,8 @@ enum mesh_state { ...@@ -100,8 +101,8 @@ enum mesh_state {
MESH_DEACTIVATING MESH_DEACTIVATING
}; };
#define BCAST_QUEUE_LEN 256 #define BATADV_BCAST_QUEUE_LEN 256
#define BATMAN_QUEUE_LEN 256 #define BATADV_BATMAN_QUEUE_LEN 256
enum uev_action { enum uev_action {
UEV_ADD = 0, UEV_ADD = 0,
...@@ -113,7 +114,7 @@ enum uev_type { ...@@ -113,7 +114,7 @@ enum uev_type {
UEV_GW = 0 UEV_GW = 0
}; };
#define GW_THRESHOLD 50 #define BATADV_GW_THRESHOLD 50
/* Debug Messages */ /* Debug Messages */
#ifdef pr_fmt #ifdef pr_fmt
...@@ -190,14 +191,14 @@ static inline void batadv_dbg(int type __always_unused, ...@@ -190,14 +191,14 @@ static inline void batadv_dbg(int type __always_unused,
} }
#endif #endif
#define bat_info(net_dev, fmt, arg...) \ #define batadv_info(net_dev, fmt, arg...) \
do { \ do { \
struct net_device *_netdev = (net_dev); \ struct net_device *_netdev = (net_dev); \
struct bat_priv *_batpriv = netdev_priv(_netdev); \ struct bat_priv *_batpriv = netdev_priv(_netdev); \
batadv_dbg(DBG_ALL, _batpriv, fmt, ## arg); \ batadv_dbg(DBG_ALL, _batpriv, fmt, ## arg); \
pr_info("%s: " fmt, _netdev->name, ## arg); \ pr_info("%s: " fmt, _netdev->name, ## arg); \
} while (0) } while (0)
#define bat_err(net_dev, fmt, arg...) \ #define batadv_err(net_dev, fmt, arg...) \
do { \ do { \
struct net_device *_netdev = (net_dev); \ struct net_device *_netdev = (net_dev); \
struct bat_priv *_batpriv = netdev_priv(_netdev); \ struct bat_priv *_batpriv = netdev_priv(_netdev); \
...@@ -226,10 +227,10 @@ static inline bool batadv_has_timed_out(unsigned long timestamp, ...@@ -226,10 +227,10 @@ static inline bool batadv_has_timed_out(unsigned long timestamp,
return time_is_before_jiffies(timestamp + msecs_to_jiffies(timeout)); return time_is_before_jiffies(timestamp + msecs_to_jiffies(timeout));
} }
#define atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0) #define batadv_atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0)
/* Returns the smallest signed integer in two's complement with the sizeof x */ /* Returns the smallest signed integer in two's complement with the sizeof x */
#define smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u))) #define batadv_smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
/* Checks if a sequence number x is a predecessor/successor of y. /* Checks if a sequence number x is a predecessor/successor of y.
* they handle overflows/underflows and can correctly check for a * they handle overflows/underflows and can correctly check for a
...@@ -241,12 +242,12 @@ static inline bool batadv_has_timed_out(unsigned long timestamp, ...@@ -241,12 +242,12 @@ static inline bool batadv_has_timed_out(unsigned long timestamp,
* - when adding 128 - it is neither a predecessor nor a successor, * - when adding 128 - it is neither a predecessor nor a successor,
* - after adding more than 127 to the starting value - it is a successor * - after adding more than 127 to the starting value - it is a successor
*/ */
#define seq_before(x, y) ({typeof(x) _d1 = (x); \ #define batadv_seq_before(x, y) ({typeof(x) _d1 = (x); \
typeof(y) _d2 = (y); \ typeof(y) _d2 = (y); \
typeof(x) _dummy = (_d1 - _d2); \ typeof(x) _dummy = (_d1 - _d2); \
(void) (&_d1 == &_d2); \ (void) (&_d1 == &_d2); \
_dummy > smallest_signed_int(_dummy); }) _dummy > batadv_smallest_signed_int(_dummy); })
#define seq_after(x, y) seq_before(y, x) #define batadv_seq_after(x, y) batadv_seq_before(y, x)
/* Stop preemption on local cpu while incrementing the counter */ /* Stop preemption on local cpu while incrementing the counter */
static inline void batadv_add_counter(struct bat_priv *bat_priv, size_t idx, static inline void batadv_add_counter(struct bat_priv *bat_priv, size_t idx,
......
...@@ -194,6 +194,7 @@ struct orig_node *batadv_get_orig_node(struct bat_priv *bat_priv, ...@@ -194,6 +194,7 @@ struct orig_node *batadv_get_orig_node(struct bat_priv *bat_priv,
struct orig_node *orig_node; struct orig_node *orig_node;
int size; int size;
int hash_added; int hash_added;
unsigned long reset_time;
orig_node = batadv_orig_hash_find(bat_priv, addr); orig_node = batadv_orig_hash_find(bat_priv, addr);
if (orig_node) if (orig_node)
...@@ -226,14 +227,13 @@ struct orig_node *batadv_get_orig_node(struct bat_priv *bat_priv, ...@@ -226,14 +227,13 @@ struct orig_node *batadv_get_orig_node(struct bat_priv *bat_priv,
orig_node->tt_buff = NULL; orig_node->tt_buff = NULL;
orig_node->tt_buff_len = 0; orig_node->tt_buff_len = 0;
atomic_set(&orig_node->tt_size, 0); atomic_set(&orig_node->tt_size, 0);
orig_node->bcast_seqno_reset = jiffies - 1 reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);
- msecs_to_jiffies(RESET_PROTECTION_MS); orig_node->bcast_seqno_reset = reset_time;
orig_node->batman_seqno_reset = jiffies - 1 orig_node->batman_seqno_reset = reset_time;
- msecs_to_jiffies(RESET_PROTECTION_MS);
atomic_set(&orig_node->bond_candidates, 0); atomic_set(&orig_node->bond_candidates, 0);
size = bat_priv->num_ifaces * sizeof(unsigned long) * NUM_WORDS; size = bat_priv->num_ifaces * sizeof(unsigned long) * BATADV_NUM_WORDS;
orig_node->bcast_own = kzalloc(size, GFP_ATOMIC); orig_node->bcast_own = kzalloc(size, GFP_ATOMIC);
if (!orig_node->bcast_own) if (!orig_node->bcast_own)
...@@ -285,7 +285,7 @@ static bool batadv_purge_orig_neighbors(struct bat_priv *bat_priv, ...@@ -285,7 +285,7 @@ static bool batadv_purge_orig_neighbors(struct bat_priv *bat_priv,
last_seen = neigh_node->last_seen; last_seen = neigh_node->last_seen;
if_incoming = neigh_node->if_incoming; if_incoming = neigh_node->if_incoming;
if ((batadv_has_timed_out(last_seen, PURGE_TIMEOUT)) || if ((batadv_has_timed_out(last_seen, BATADV_PURGE_TIMEOUT)) ||
(if_incoming->if_status == IF_INACTIVE) || (if_incoming->if_status == IF_INACTIVE) ||
(if_incoming->if_status == IF_NOT_IN_USE) || (if_incoming->if_status == IF_NOT_IN_USE) ||
(if_incoming->if_status == IF_TO_BE_REMOVED)) { (if_incoming->if_status == IF_TO_BE_REMOVED)) {
...@@ -324,7 +324,8 @@ static bool batadv_purge_orig_node(struct bat_priv *bat_priv, ...@@ -324,7 +324,8 @@ static bool batadv_purge_orig_node(struct bat_priv *bat_priv,
{ {
struct neigh_node *best_neigh_node; struct neigh_node *best_neigh_node;
if (batadv_has_timed_out(orig_node->last_seen, 2 * PURGE_TIMEOUT)) { if (batadv_has_timed_out(orig_node->last_seen,
2 * BATADV_PURGE_TIMEOUT)) {
batadv_dbg(DBG_BATMAN, bat_priv, batadv_dbg(DBG_BATMAN, bat_priv,
"Originator timeout: originator %pM, last_seen %u\n", "Originator timeout: originator %pM, last_seen %u\n",
orig_node->orig, orig_node->orig,
...@@ -370,7 +371,7 @@ static void _batadv_purge_orig(struct bat_priv *bat_priv) ...@@ -370,7 +371,7 @@ static void _batadv_purge_orig(struct bat_priv *bat_priv)
} }
if (batadv_has_timed_out(orig_node->last_frag_packet, if (batadv_has_timed_out(orig_node->last_frag_packet,
FRAG_TIMEOUT)) BATADV_FRAG_TIMEOUT))
batadv_frag_list_free(&orig_node->frag_list); batadv_frag_list_free(&orig_node->frag_list);
} }
spin_unlock_bh(list_lock); spin_unlock_bh(list_lock);
...@@ -429,11 +430,11 @@ int batadv_orig_seq_print_text(struct seq_file *seq, void *offset) ...@@ -429,11 +430,11 @@ int batadv_orig_seq_print_text(struct seq_file *seq, void *offset)
} }
seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s)]\n", seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s)]\n",
SOURCE_VERSION, primary_if->net_dev->name, BATADV_SOURCE_VERSION, primary_if->net_dev->name,
primary_if->net_dev->dev_addr, net_dev->name); primary_if->net_dev->dev_addr, net_dev->name);
seq_printf(seq, " %-15s %s (%s/%i) %17s [%10s]: %20s ...\n", seq_printf(seq, " %-15s %s (%s/%i) %17s [%10s]: %20s ...\n",
"Originator", "last-seen", "#", TQ_MAX_VALUE, "Nexthop", "Originator", "last-seen", "#", BATADV_TQ_MAX_VALUE,
"outgoingIF", "Potential nexthops"); "Nexthop", "outgoingIF", "Potential nexthops");
for (i = 0; i < hash->size; i++) { for (i = 0; i < hash->size; i++) {
head = &hash->table[i]; head = &hash->table[i];
...@@ -486,14 +487,15 @@ int batadv_orig_seq_print_text(struct seq_file *seq, void *offset) ...@@ -486,14 +487,15 @@ int batadv_orig_seq_print_text(struct seq_file *seq, void *offset)
static int batadv_orig_node_add_if(struct orig_node *orig_node, int max_if_num) static int batadv_orig_node_add_if(struct orig_node *orig_node, int max_if_num)
{ {
void *data_ptr; void *data_ptr;
size_t data_size, old_size;
data_ptr = kmalloc(max_if_num * sizeof(unsigned long) * NUM_WORDS, data_size = max_if_num * sizeof(unsigned long) * BATADV_NUM_WORDS;
GFP_ATOMIC); old_size = (max_if_num - 1) * sizeof(unsigned long) * BATADV_NUM_WORDS;
data_ptr = kmalloc(data_size, GFP_ATOMIC);
if (!data_ptr) if (!data_ptr)
return -ENOMEM; return -ENOMEM;
memcpy(data_ptr, orig_node->bcast_own, memcpy(data_ptr, orig_node->bcast_own, old_size);
(max_if_num - 1) * sizeof(unsigned long) * NUM_WORDS);
kfree(orig_node->bcast_own); kfree(orig_node->bcast_own);
orig_node->bcast_own = data_ptr; orig_node->bcast_own = data_ptr;
...@@ -554,7 +556,7 @@ static int batadv_orig_node_del_if(struct orig_node *orig_node, ...@@ -554,7 +556,7 @@ static int batadv_orig_node_del_if(struct orig_node *orig_node,
if (max_if_num == 0) if (max_if_num == 0)
goto free_bcast_own; goto free_bcast_own;
chunk_size = sizeof(unsigned long) * NUM_WORDS; chunk_size = sizeof(unsigned long) * BATADV_NUM_WORDS;
data_ptr = kmalloc(max_if_num * chunk_size, GFP_ATOMIC); data_ptr = kmalloc(max_if_num * chunk_size, GFP_ATOMIC);
if (!data_ptr) if (!data_ptr)
return -ENOMEM; return -ENOMEM;
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#ifndef _NET_BATMAN_ADV_PACKET_H_ #ifndef _NET_BATMAN_ADV_PACKET_H_
#define _NET_BATMAN_ADV_PACKET_H_ #define _NET_BATMAN_ADV_PACKET_H_
#define ETH_P_BATMAN 0x4305 /* unofficial/not registered Ethertype */ #define BATADV_ETH_P_BATMAN 0x4305 /* unofficial/not registered Ethertype */
enum bat_packettype { enum bat_packettype {
BAT_IV_OGM = 0x01, BAT_IV_OGM = 0x01,
...@@ -34,7 +34,7 @@ enum bat_packettype { ...@@ -34,7 +34,7 @@ enum bat_packettype {
}; };
/* this file is included by batctl which needs these defines */ /* this file is included by batctl which needs these defines */
#define COMPAT_VERSION 14 #define BATADV_COMPAT_VERSION 14
enum batman_iv_flags { enum batman_iv_flags {
NOT_BEST_NEXT_HOP = 1 << 3, NOT_BEST_NEXT_HOP = 1 << 3,
...@@ -65,7 +65,7 @@ enum unicast_frag_flags { ...@@ -65,7 +65,7 @@ enum unicast_frag_flags {
}; };
/* TT_QUERY subtypes */ /* TT_QUERY subtypes */
#define TT_QUERY_TYPE_MASK 0x3 #define BATADV_TT_QUERY_TYPE_MASK 0x3
enum tt_query_packettype { enum tt_query_packettype {
TT_REQUEST = 0, TT_REQUEST = 0,
...@@ -126,7 +126,7 @@ struct batman_ogm_packet { ...@@ -126,7 +126,7 @@ struct batman_ogm_packet {
__be16 tt_crc; __be16 tt_crc;
} __packed; } __packed;
#define BATMAN_OGM_HLEN sizeof(struct batman_ogm_packet) #define BATADV_OGM_HLEN sizeof(struct batman_ogm_packet)
struct icmp_packet { struct icmp_packet {
struct batman_header header; struct batman_header header;
...@@ -138,7 +138,7 @@ struct icmp_packet { ...@@ -138,7 +138,7 @@ struct icmp_packet {
uint8_t reserved; uint8_t reserved;
} __packed; } __packed;
#define BAT_RR_LEN 16 #define BATADV_RR_LEN 16
/* icmp_packet_rr must start with all fields from imcp_packet /* icmp_packet_rr must start with all fields from imcp_packet
* as this is assumed by code that handles ICMP packets * as this is assumed by code that handles ICMP packets
...@@ -151,7 +151,7 @@ struct icmp_packet_rr { ...@@ -151,7 +151,7 @@ struct icmp_packet_rr {
__be16 seqno; __be16 seqno;
uint8_t uid; uint8_t uid;
uint8_t rr_cur; uint8_t rr_cur;
uint8_t rr[BAT_RR_LEN][ETH_ALEN]; uint8_t rr[BATADV_RR_LEN][ETH_ALEN];
} __packed; } __packed;
struct unicast_packet { struct unicast_packet {
......
...@@ -24,7 +24,7 @@ void batadv_ring_buffer_set(uint8_t lq_recv[], uint8_t *lq_index, ...@@ -24,7 +24,7 @@ void batadv_ring_buffer_set(uint8_t lq_recv[], uint8_t *lq_index,
uint8_t value) uint8_t value)
{ {
lq_recv[*lq_index] = value; lq_recv[*lq_index] = value;
*lq_index = (*lq_index + 1) % TQ_GLOBAL_WINDOW_SIZE; *lq_index = (*lq_index + 1) % BATADV_TQ_GLOBAL_WINDOW_SIZE;
} }
uint8_t batadv_ring_buffer_avg(const uint8_t lq_recv[]) uint8_t batadv_ring_buffer_avg(const uint8_t lq_recv[])
...@@ -34,7 +34,7 @@ uint8_t batadv_ring_buffer_avg(const uint8_t lq_recv[]) ...@@ -34,7 +34,7 @@ uint8_t batadv_ring_buffer_avg(const uint8_t lq_recv[])
ptr = lq_recv; ptr = lq_recv;
while (i < TQ_GLOBAL_WINDOW_SIZE) { while (i < BATADV_TQ_GLOBAL_WINDOW_SIZE) {
if (*ptr != 0) { if (*ptr != 0) {
count++; count++;
sum += *ptr; sum += *ptr;
......
...@@ -42,6 +42,7 @@ void batadv_slide_own_bcast_window(struct hard_iface *hard_iface) ...@@ -42,6 +42,7 @@ void batadv_slide_own_bcast_window(struct hard_iface *hard_iface)
unsigned long *word; unsigned long *word;
uint32_t i; uint32_t i;
size_t word_index; size_t word_index;
uint8_t *w;
for (i = 0; i < hash->size; i++) { for (i = 0; i < hash->size; i++) {
head = &hash->table[i]; head = &hash->table[i];
...@@ -49,12 +50,12 @@ void batadv_slide_own_bcast_window(struct hard_iface *hard_iface) ...@@ -49,12 +50,12 @@ void batadv_slide_own_bcast_window(struct hard_iface *hard_iface)
rcu_read_lock(); rcu_read_lock();
hlist_for_each_entry_rcu(orig_node, node, head, hash_entry) { hlist_for_each_entry_rcu(orig_node, node, head, hash_entry) {
spin_lock_bh(&orig_node->ogm_cnt_lock); spin_lock_bh(&orig_node->ogm_cnt_lock);
word_index = hard_iface->if_num * NUM_WORDS; word_index = hard_iface->if_num * BATADV_NUM_WORDS;
word = &(orig_node->bcast_own[word_index]); word = &(orig_node->bcast_own[word_index]);
batadv_bit_get_packet(bat_priv, word, 1, 0); batadv_bit_get_packet(bat_priv, word, 1, 0);
orig_node->bcast_own_sum[hard_iface->if_num] = w = &orig_node->bcast_own_sum[hard_iface->if_num];
bitmap_weight(word, TQ_LOCAL_WINDOW_SIZE); *w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
spin_unlock_bh(&orig_node->ogm_cnt_lock); spin_unlock_bh(&orig_node->ogm_cnt_lock);
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -160,7 +161,7 @@ void batadv_bonding_candidate_add(struct orig_node *orig_node, ...@@ -160,7 +161,7 @@ void batadv_bonding_candidate_add(struct orig_node *orig_node,
goto candidate_del; goto candidate_del;
/* ... and is good enough to be considered */ /* ... and is good enough to be considered */
if (neigh_node->tq_avg < router->tq_avg - BONDING_TQ_THRESHOLD) if (neigh_node->tq_avg < router->tq_avg - BATADV_BONDING_TQ_THRESHOLD)
goto candidate_del; goto candidate_del;
/* check if we have another candidate with the same mac address or /* check if we have another candidate with the same mac address or
...@@ -232,9 +233,10 @@ batadv_bonding_save_primary(const struct orig_node *orig_node, ...@@ -232,9 +233,10 @@ batadv_bonding_save_primary(const struct orig_node *orig_node,
int batadv_window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff, int batadv_window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
unsigned long *last_reset) unsigned long *last_reset)
{ {
if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) || if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
(seq_num_diff >= EXPECTED_SEQNO_RANGE)) { seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
if (!batadv_has_timed_out(*last_reset, RESET_PROTECTION_MS)) if (!batadv_has_timed_out(*last_reset,
BATADV_RESET_PROTECTION_MS))
return 1; return 1;
*last_reset = jiffies; *last_reset = jiffies;
...@@ -316,7 +318,7 @@ static int batadv_recv_my_icmp_packet(struct bat_priv *bat_priv, ...@@ -316,7 +318,7 @@ static int batadv_recv_my_icmp_packet(struct bat_priv *bat_priv,
memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN); memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN); memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
icmp_packet->msg_type = ECHO_REPLY; icmp_packet->msg_type = ECHO_REPLY;
icmp_packet->header.ttl = TTL; icmp_packet->header.ttl = BATADV_TTL;
batadv_send_skb_packet(skb, router->if_incoming, router->addr); batadv_send_skb_packet(skb, router->if_incoming, router->addr);
ret = NET_RX_SUCCESS; ret = NET_RX_SUCCESS;
...@@ -371,7 +373,7 @@ static int batadv_recv_icmp_ttl_exceeded(struct bat_priv *bat_priv, ...@@ -371,7 +373,7 @@ static int batadv_recv_icmp_ttl_exceeded(struct bat_priv *bat_priv,
memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN); memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN); memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
icmp_packet->msg_type = TTL_EXCEEDED; icmp_packet->msg_type = TTL_EXCEEDED;
icmp_packet->header.ttl = TTL; icmp_packet->header.ttl = BATADV_TTL;
batadv_send_skb_packet(skb, router->if_incoming, router->addr); batadv_send_skb_packet(skb, router->if_incoming, router->addr);
ret = NET_RX_SUCCESS; ret = NET_RX_SUCCESS;
...@@ -423,7 +425,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if) ...@@ -423,7 +425,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if)
/* add record route information if not full */ /* add record route information if not full */
if ((hdr_size == sizeof(struct icmp_packet_rr)) && if ((hdr_size == sizeof(struct icmp_packet_rr)) &&
(icmp_packet->rr_cur < BAT_RR_LEN)) { (icmp_packet->rr_cur < BATADV_RR_LEN)) {
memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]), memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
ethhdr->h_dest, ETH_ALEN); ethhdr->h_dest, ETH_ALEN);
icmp_packet->rr_cur++; icmp_packet->rr_cur++;
...@@ -603,7 +605,7 @@ int batadv_recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if) ...@@ -603,7 +605,7 @@ int batadv_recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)
tt_query = (struct tt_query_packet *)skb->data; tt_query = (struct tt_query_packet *)skb->data;
switch (tt_query->flags & TT_QUERY_TYPE_MASK) { switch (tt_query->flags & BATADV_TT_QUERY_TYPE_MASK) {
case TT_REQUEST: case TT_REQUEST:
batadv_inc_counter(bat_priv, BAT_CNT_TT_REQUEST_RX); batadv_inc_counter(bat_priv, BAT_CNT_TT_REQUEST_RX);
...@@ -699,8 +701,8 @@ int batadv_recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if) ...@@ -699,8 +701,8 @@ int batadv_recv_roam_adv(struct sk_buff *skb, struct hard_iface *recv_if)
roam_adv_packet->src, roam_adv_packet->client); roam_adv_packet->src, roam_adv_packet->client);
batadv_tt_global_add(bat_priv, orig_node, roam_adv_packet->client, batadv_tt_global_add(bat_priv, orig_node, roam_adv_packet->client,
atomic_read(&orig_node->last_ttvn) + 1, true, TT_CLIENT_ROAM,
false); atomic_read(&orig_node->last_ttvn) + 1);
/* Roaming phase starts: I have new information but the ttvn has not /* Roaming phase starts: I have new information but the ttvn has not
* been incremented yet. This flag will make me check all the incoming * been incremented yet. This flag will make me check all the incoming
...@@ -922,6 +924,7 @@ static int batadv_check_unicast_ttvn(struct bat_priv *bat_priv, ...@@ -922,6 +924,7 @@ static int batadv_check_unicast_ttvn(struct bat_priv *bat_priv,
struct hard_iface *primary_if; struct hard_iface *primary_if;
struct unicast_packet *unicast_packet; struct unicast_packet *unicast_packet;
bool tt_poss_change; bool tt_poss_change;
int is_old_ttvn;
/* I could need to modify it */ /* I could need to modify it */
if (skb_cow(skb, sizeof(struct unicast_packet)) < 0) if (skb_cow(skb, sizeof(struct unicast_packet)) < 0)
...@@ -945,7 +948,8 @@ static int batadv_check_unicast_ttvn(struct bat_priv *bat_priv, ...@@ -945,7 +948,8 @@ static int batadv_check_unicast_ttvn(struct bat_priv *bat_priv,
} }
/* Check whether I have to reroute the packet */ /* Check whether I have to reroute the packet */
if (seq_before(unicast_packet->ttvn, curr_ttvn) || tt_poss_change) { is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
if (is_old_ttvn || tt_poss_change) {
/* check if there is enough data before accessing it */ /* check if there is enough data before accessing it */
if (pskb_may_pull(skb, sizeof(struct unicast_packet) + if (pskb_may_pull(skb, sizeof(struct unicast_packet) +
ETH_HLEN) < 0) ETH_HLEN) < 0)
......
...@@ -58,11 +58,11 @@ int batadv_send_skb_packet(struct sk_buff *skb, struct hard_iface *hard_iface, ...@@ -58,11 +58,11 @@ int batadv_send_skb_packet(struct sk_buff *skb, struct hard_iface *hard_iface,
ethhdr = (struct ethhdr *)skb_mac_header(skb); ethhdr = (struct ethhdr *)skb_mac_header(skb);
memcpy(ethhdr->h_source, hard_iface->net_dev->dev_addr, ETH_ALEN); memcpy(ethhdr->h_source, hard_iface->net_dev->dev_addr, ETH_ALEN);
memcpy(ethhdr->h_dest, dst_addr, ETH_ALEN); memcpy(ethhdr->h_dest, dst_addr, ETH_ALEN);
ethhdr->h_proto = __constant_htons(ETH_P_BATMAN); ethhdr->h_proto = __constant_htons(BATADV_ETH_P_BATMAN);
skb_set_network_header(skb, ETH_HLEN); skb_set_network_header(skb, ETH_HLEN);
skb->priority = TC_PRIO_CONTROL; skb->priority = TC_PRIO_CONTROL;
skb->protocol = __constant_htons(ETH_P_BATMAN); skb->protocol = __constant_htons(BATADV_ETH_P_BATMAN);
skb->dev = hard_iface->net_dev; skb->dev = hard_iface->net_dev;
...@@ -141,7 +141,7 @@ int batadv_add_bcast_packet_to_list(struct bat_priv *bat_priv, ...@@ -141,7 +141,7 @@ int batadv_add_bcast_packet_to_list(struct bat_priv *bat_priv,
struct bcast_packet *bcast_packet; struct bcast_packet *bcast_packet;
struct sk_buff *newskb; struct sk_buff *newskb;
if (!atomic_dec_not_zero(&bat_priv->bcast_queue_left)) { if (!batadv_atomic_dec_not_zero(&bat_priv->bcast_queue_left)) {
batadv_dbg(DBG_BATMAN, bat_priv, "bcast packet queue full\n"); batadv_dbg(DBG_BATMAN, bat_priv, "bcast packet queue full\n");
goto out; goto out;
} }
......
...@@ -108,7 +108,7 @@ static int batadv_interface_set_mac_addr(struct net_device *dev, void *p) ...@@ -108,7 +108,7 @@ static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
if (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE) { if (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE) {
batadv_tt_local_remove(bat_priv, dev->dev_addr, batadv_tt_local_remove(bat_priv, dev->dev_addr,
"mac address changed", false); "mac address changed", false);
batadv_tt_local_add(dev, addr->sa_data, NULL_IFINDEX); batadv_tt_local_add(dev, addr->sa_data, BATADV_NULL_IFINDEX);
} }
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
...@@ -135,6 +135,7 @@ static int batadv_interface_tx(struct sk_buff *skb, ...@@ -135,6 +135,7 @@ static int batadv_interface_tx(struct sk_buff *skb,
struct hard_iface *primary_if = NULL; struct hard_iface *primary_if = NULL;
struct bcast_packet *bcast_packet; struct bcast_packet *bcast_packet;
struct vlan_ethhdr *vhdr; struct vlan_ethhdr *vhdr;
__be16 ethertype = __constant_htons(BATADV_ETH_P_BATMAN);
static const uint8_t stp_addr[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00, 0x00, static const uint8_t stp_addr[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00, 0x00,
0x00}; 0x00};
unsigned int header_len = 0; unsigned int header_len = 0;
...@@ -152,11 +153,11 @@ static int batadv_interface_tx(struct sk_buff *skb, ...@@ -152,11 +153,11 @@ static int batadv_interface_tx(struct sk_buff *skb,
vhdr = (struct vlan_ethhdr *)skb->data; vhdr = (struct vlan_ethhdr *)skb->data;
vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK; vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
if (ntohs(vhdr->h_vlan_encapsulated_proto) != ETH_P_BATMAN) if (vhdr->h_vlan_encapsulated_proto != ethertype)
break; break;
/* fall through */ /* fall through */
case ETH_P_BATMAN: case BATADV_ETH_P_BATMAN:
goto dropped; goto dropped;
} }
...@@ -208,8 +209,8 @@ static int batadv_interface_tx(struct sk_buff *skb, ...@@ -208,8 +209,8 @@ static int batadv_interface_tx(struct sk_buff *skb,
goto dropped; goto dropped;
bcast_packet = (struct bcast_packet *)skb->data; bcast_packet = (struct bcast_packet *)skb->data;
bcast_packet->header.version = COMPAT_VERSION; bcast_packet->header.version = BATADV_COMPAT_VERSION;
bcast_packet->header.ttl = TTL; bcast_packet->header.ttl = BATADV_TTL;
/* batman packet type: broadcast */ /* batman packet type: broadcast */
bcast_packet->header.packet_type = BAT_BCAST; bcast_packet->header.packet_type = BAT_BCAST;
...@@ -266,6 +267,7 @@ void batadv_interface_rx(struct net_device *soft_iface, ...@@ -266,6 +267,7 @@ void batadv_interface_rx(struct net_device *soft_iface,
struct ethhdr *ethhdr; struct ethhdr *ethhdr;
struct vlan_ethhdr *vhdr; struct vlan_ethhdr *vhdr;
short vid __maybe_unused = -1; short vid __maybe_unused = -1;
__be16 ethertype = __constant_htons(BATADV_ETH_P_BATMAN);
/* check if enough space is available for pulling, and pull */ /* check if enough space is available for pulling, and pull */
if (!pskb_may_pull(skb, hdr_size)) if (!pskb_may_pull(skb, hdr_size))
...@@ -281,11 +283,11 @@ void batadv_interface_rx(struct net_device *soft_iface, ...@@ -281,11 +283,11 @@ void batadv_interface_rx(struct net_device *soft_iface,
vhdr = (struct vlan_ethhdr *)skb->data; vhdr = (struct vlan_ethhdr *)skb->data;
vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK; vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
if (ntohs(vhdr->h_vlan_encapsulated_proto) != ETH_P_BATMAN) if (vhdr->h_vlan_encapsulated_proto != ethertype)
break; break;
/* fall through */ /* fall through */
case ETH_P_BATMAN: case BATADV_ETH_P_BATMAN:
goto dropped; goto dropped;
} }
...@@ -349,7 +351,7 @@ static void batadv_interface_setup(struct net_device *dev) ...@@ -349,7 +351,7 @@ static void batadv_interface_setup(struct net_device *dev)
*/ */
dev->mtu = ETH_DATA_LEN; dev->mtu = ETH_DATA_LEN;
/* reserve more space in the skbuff for our header */ /* reserve more space in the skbuff for our header */
dev->hard_header_len = BAT_HEADER_LEN; dev->hard_header_len = BATADV_HEADER_LEN;
/* generate random address */ /* generate random address */
eth_hw_addr_random(dev); eth_hw_addr_random(dev);
...@@ -392,8 +394,8 @@ struct net_device *batadv_softif_create(const char *name) ...@@ -392,8 +394,8 @@ struct net_device *batadv_softif_create(const char *name)
atomic_set(&bat_priv->hop_penalty, 30); atomic_set(&bat_priv->hop_penalty, 30);
atomic_set(&bat_priv->log_level, 0); atomic_set(&bat_priv->log_level, 0);
atomic_set(&bat_priv->fragmentation, 1); atomic_set(&bat_priv->fragmentation, 1);
atomic_set(&bat_priv->bcast_queue_left, BCAST_QUEUE_LEN); atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
atomic_set(&bat_priv->batman_queue_left, BATMAN_QUEUE_LEN); atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
atomic_set(&bat_priv->mesh_state, MESH_INACTIVE); atomic_set(&bat_priv->mesh_state, MESH_INACTIVE);
atomic_set(&bat_priv->bcast_seqno, 1); atomic_set(&bat_priv->bcast_seqno, 1);
...@@ -485,7 +487,7 @@ static void batadv_get_drvinfo(struct net_device *dev, ...@@ -485,7 +487,7 @@ static void batadv_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo *info) struct ethtool_drvinfo *info)
{ {
strcpy(info->driver, "B.A.T.M.A.N. advanced"); strcpy(info->driver, "B.A.T.M.A.N. advanced");
strcpy(info->version, SOURCE_VERSION); strcpy(info->version, BATADV_SOURCE_VERSION);
strcpy(info->fw_version, "N/A"); strcpy(info->fw_version, "N/A");
strcpy(info->bus_info, "batman"); strcpy(info->bus_info, "batman");
} }
......
...@@ -157,7 +157,9 @@ batadv_tt_orig_list_entry_free_ref(struct tt_orig_list_entry *orig_entry) ...@@ -157,7 +157,9 @@ batadv_tt_orig_list_entry_free_ref(struct tt_orig_list_entry *orig_entry)
static void batadv_tt_local_event(struct bat_priv *bat_priv, static void batadv_tt_local_event(struct bat_priv *bat_priv,
const uint8_t *addr, uint8_t flags) const uint8_t *addr, uint8_t flags)
{ {
struct tt_change_node *tt_change_node; struct tt_change_node *tt_change_node, *entry, *safe;
bool event_removed = false;
bool del_op_requested, del_op_entry;
tt_change_node = kmalloc(sizeof(*tt_change_node), GFP_ATOMIC); tt_change_node = kmalloc(sizeof(*tt_change_node), GFP_ATOMIC);
...@@ -167,13 +169,45 @@ static void batadv_tt_local_event(struct bat_priv *bat_priv, ...@@ -167,13 +169,45 @@ static void batadv_tt_local_event(struct bat_priv *bat_priv,
tt_change_node->change.flags = flags; tt_change_node->change.flags = flags;
memcpy(tt_change_node->change.addr, addr, ETH_ALEN); memcpy(tt_change_node->change.addr, addr, ETH_ALEN);
del_op_requested = flags & TT_CLIENT_DEL;
/* check for ADD+DEL or DEL+ADD events */
spin_lock_bh(&bat_priv->tt_changes_list_lock); spin_lock_bh(&bat_priv->tt_changes_list_lock);
list_for_each_entry_safe(entry, safe, &bat_priv->tt_changes_list,
list) {
if (!batadv_compare_eth(entry->change.addr, addr))
continue;
/* DEL+ADD in the same orig interval have no effect and can be
* removed to avoid silly behaviour on the receiver side. The
* other way around (ADD+DEL) can happen in case of roaming of
* a client still in the NEW state. Roaming of NEW clients is
* now possible due to automatically recognition of "temporary"
* clients
*/
del_op_entry = entry->change.flags & TT_CLIENT_DEL;
if (!del_op_requested && del_op_entry)
goto del;
if (del_op_requested && !del_op_entry)
goto del;
continue;
del:
list_del(&entry->list);
kfree(entry);
event_removed = true;
goto unlock;
}
/* track the change in the OGMinterval list */ /* track the change in the OGMinterval list */
list_add_tail(&tt_change_node->list, &bat_priv->tt_changes_list); list_add_tail(&tt_change_node->list, &bat_priv->tt_changes_list);
atomic_inc(&bat_priv->tt_local_changes);
unlock:
spin_unlock_bh(&bat_priv->tt_changes_list_lock); spin_unlock_bh(&bat_priv->tt_changes_list_lock);
atomic_set(&bat_priv->tt_ogm_append_cnt, 0); if (event_removed)
atomic_dec(&bat_priv->tt_local_changes);
else
atomic_inc(&bat_priv->tt_local_changes);
} }
int batadv_tt_len(int changes_num) int batadv_tt_len(int changes_num)
...@@ -223,7 +257,7 @@ void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, ...@@ -223,7 +257,7 @@ void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
(uint8_t)atomic_read(&bat_priv->ttvn)); (uint8_t)atomic_read(&bat_priv->ttvn));
memcpy(tt_local_entry->common.addr, addr, ETH_ALEN); memcpy(tt_local_entry->common.addr, addr, ETH_ALEN);
tt_local_entry->common.flags = NO_FLAGS; tt_local_entry->common.flags = BATADV_NO_FLAGS;
if (batadv_is_wifi_iface(ifindex)) if (batadv_is_wifi_iface(ifindex))
tt_local_entry->common.flags |= TT_CLIENT_WIFI; tt_local_entry->common.flags |= TT_CLIENT_WIFI;
atomic_set(&tt_local_entry->common.refcount, 2); atomic_set(&tt_local_entry->common.refcount, 2);
...@@ -459,14 +493,17 @@ void batadv_tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr, ...@@ -459,14 +493,17 @@ void batadv_tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr,
const char *message, bool roaming) const char *message, bool roaming)
{ {
struct tt_local_entry *tt_local_entry = NULL; struct tt_local_entry *tt_local_entry = NULL;
uint16_t flags;
tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr); tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr);
if (!tt_local_entry) if (!tt_local_entry)
goto out; goto out;
batadv_tt_local_set_pending(bat_priv, tt_local_entry, TT_CLIENT_DEL | flags = TT_CLIENT_DEL;
(roaming ? TT_CLIENT_ROAM : NO_FLAGS), if (roaming)
message); flags |= TT_CLIENT_ROAM;
batadv_tt_local_set_pending(bat_priv, tt_local_entry, flags, message);
out: out:
if (tt_local_entry) if (tt_local_entry)
batadv_tt_local_entry_free_ref(tt_local_entry); batadv_tt_local_entry_free_ref(tt_local_entry);
...@@ -500,7 +537,7 @@ static void batadv_tt_local_purge(struct bat_priv *bat_priv) ...@@ -500,7 +537,7 @@ static void batadv_tt_local_purge(struct bat_priv *bat_priv)
continue; continue;
if (!batadv_has_timed_out(tt_local_entry->last_seen, if (!batadv_has_timed_out(tt_local_entry->last_seen,
TT_LOCAL_TIMEOUT)) BATADV_TT_LOCAL_TIMEOUT))
continue; continue;
batadv_tt_local_set_pending(bat_priv, tt_local_entry, batadv_tt_local_set_pending(bat_priv, tt_local_entry,
...@@ -623,8 +660,8 @@ batadv_tt_global_add_orig_entry(struct tt_global_entry *tt_global_entry, ...@@ -623,8 +660,8 @@ batadv_tt_global_add_orig_entry(struct tt_global_entry *tt_global_entry,
/* caller must hold orig_node refcount */ /* caller must hold orig_node refcount */
int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node, int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
const unsigned char *tt_addr, uint8_t ttvn, const unsigned char *tt_addr, uint8_t flags,
bool roaming, bool wifi) uint8_t ttvn)
{ {
struct tt_global_entry *tt_global_entry = NULL; struct tt_global_entry *tt_global_entry = NULL;
int ret = 0; int ret = 0;
...@@ -634,15 +671,14 @@ int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node, ...@@ -634,15 +671,14 @@ int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr); tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr);
if (!tt_global_entry) { if (!tt_global_entry) {
tt_global_entry = kzalloc(sizeof(*tt_global_entry), tt_global_entry = kzalloc(sizeof(*tt_global_entry), GFP_ATOMIC);
GFP_ATOMIC);
if (!tt_global_entry) if (!tt_global_entry)
goto out; goto out;
common = &tt_global_entry->common; common = &tt_global_entry->common;
memcpy(common->addr, tt_addr, ETH_ALEN); memcpy(common->addr, tt_addr, ETH_ALEN);
common->flags = NO_FLAGS; common->flags = flags;
tt_global_entry->roam_at = 0; tt_global_entry->roam_at = 0;
atomic_set(&common->refcount, 2); atomic_set(&common->refcount, 2);
...@@ -684,9 +720,6 @@ int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node, ...@@ -684,9 +720,6 @@ int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
orig_node, ttvn); orig_node, ttvn);
} }
if (wifi)
tt_global_entry->common.flags |= TT_CLIENT_WIFI;
batadv_dbg(DBG_TT, bat_priv, batadv_dbg(DBG_TT, bat_priv,
"Creating new global tt entry: %pM (via %pM)\n", "Creating new global tt entry: %pM (via %pM)\n",
tt_global_entry->common.addr, orig_node->orig); tt_global_entry->common.addr, orig_node->orig);
...@@ -694,7 +727,7 @@ int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node, ...@@ -694,7 +727,7 @@ int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
out_remove: out_remove:
/* remove address from local hash if present */ /* remove address from local hash if present */
batadv_tt_local_remove(bat_priv, tt_global_entry->common.addr, batadv_tt_local_remove(bat_priv, tt_global_entry->common.addr,
"global tt received", roaming); "global tt received", flags & TT_CLIENT_ROAM);
ret = 1; ret = 1;
out: out:
if (tt_global_entry) if (tt_global_entry)
...@@ -978,12 +1011,35 @@ void batadv_tt_global_del_orig(struct bat_priv *bat_priv, ...@@ -978,12 +1011,35 @@ void batadv_tt_global_del_orig(struct bat_priv *bat_priv,
orig_node->tt_initialised = false; orig_node->tt_initialised = false;
} }
static void batadv_tt_global_roam_purge(struct bat_priv *bat_priv) static void batadv_tt_global_roam_purge_list(struct bat_priv *bat_priv,
struct hlist_head *head)
{ {
struct hashtable_t *hash = bat_priv->tt_global_hash;
struct tt_common_entry *tt_common_entry; struct tt_common_entry *tt_common_entry;
struct tt_global_entry *tt_global_entry; struct tt_global_entry *tt_global_entry;
struct hlist_node *node, *node_tmp; struct hlist_node *node, *node_tmp;
hlist_for_each_entry_safe(tt_common_entry, node, node_tmp, head,
hash_entry) {
tt_global_entry = container_of(tt_common_entry,
struct tt_global_entry, common);
if (!(tt_global_entry->common.flags & TT_CLIENT_ROAM))
continue;
if (!batadv_has_timed_out(tt_global_entry->roam_at,
BATADV_TT_CLIENT_ROAM_TIMEOUT))
continue;
batadv_dbg(DBG_TT, bat_priv,
"Deleting global tt entry (%pM): Roaming timeout\n",
tt_global_entry->common.addr);
hlist_del_rcu(node);
batadv_tt_global_entry_free_ref(tt_global_entry);
}
}
static void batadv_tt_global_roam_purge(struct bat_priv *bat_priv)
{
struct hashtable_t *hash = bat_priv->tt_global_hash;
struct hlist_head *head; struct hlist_head *head;
spinlock_t *list_lock; /* protects write access to the hash lists */ spinlock_t *list_lock; /* protects write access to the hash lists */
uint32_t i; uint32_t i;
...@@ -993,24 +1049,7 @@ static void batadv_tt_global_roam_purge(struct bat_priv *bat_priv) ...@@ -993,24 +1049,7 @@ static void batadv_tt_global_roam_purge(struct bat_priv *bat_priv)
list_lock = &hash->list_locks[i]; list_lock = &hash->list_locks[i];
spin_lock_bh(list_lock); spin_lock_bh(list_lock);
hlist_for_each_entry_safe(tt_common_entry, node, node_tmp, batadv_tt_global_roam_purge_list(bat_priv, head);
head, hash_entry) {
tt_global_entry = container_of(tt_common_entry,
struct tt_global_entry,
common);
if (!(tt_global_entry->common.flags & TT_CLIENT_ROAM))
continue;
if (!batadv_has_timed_out(tt_global_entry->roam_at,
TT_CLIENT_ROAM_TIMEOUT))
continue;
batadv_dbg(DBG_TT, bat_priv,
"Deleting global tt entry (%pM): Roaming timeout\n",
tt_global_entry->common.addr);
hlist_del_rcu(node);
batadv_tt_global_entry_free_ref(tt_global_entry);
}
spin_unlock_bh(list_lock); spin_unlock_bh(list_lock);
} }
...@@ -1248,7 +1287,8 @@ static void batadv_tt_req_purge(struct bat_priv *bat_priv) ...@@ -1248,7 +1287,8 @@ static void batadv_tt_req_purge(struct bat_priv *bat_priv)
spin_lock_bh(&bat_priv->tt_req_list_lock); spin_lock_bh(&bat_priv->tt_req_list_lock);
list_for_each_entry_safe(node, safe, &bat_priv->tt_req_list, list) { list_for_each_entry_safe(node, safe, &bat_priv->tt_req_list, list) {
if (batadv_has_timed_out(node->issued_at, TT_REQUEST_TIMEOUT)) { if (batadv_has_timed_out(node->issued_at,
BATADV_TT_REQUEST_TIMEOUT)) {
list_del(&node->list); list_del(&node->list);
kfree(node); kfree(node);
} }
...@@ -1268,7 +1308,7 @@ static struct tt_req_node *batadv_new_tt_req_node(struct bat_priv *bat_priv, ...@@ -1268,7 +1308,7 @@ static struct tt_req_node *batadv_new_tt_req_node(struct bat_priv *bat_priv,
list_for_each_entry(tt_req_node_tmp, &bat_priv->tt_req_list, list) { list_for_each_entry(tt_req_node_tmp, &bat_priv->tt_req_list, list) {
if (batadv_compare_eth(tt_req_node_tmp, orig_node) && if (batadv_compare_eth(tt_req_node_tmp, orig_node) &&
!batadv_has_timed_out(tt_req_node_tmp->issued_at, !batadv_has_timed_out(tt_req_node_tmp->issued_at,
TT_REQUEST_TIMEOUT)) BATADV_TT_REQUEST_TIMEOUT))
goto unlock; goto unlock;
} }
...@@ -1361,7 +1401,7 @@ batadv_tt_response_fill_table(uint16_t tt_len, uint8_t ttvn, ...@@ -1361,7 +1401,7 @@ batadv_tt_response_fill_table(uint16_t tt_len, uint8_t ttvn,
memcpy(tt_change->addr, tt_common_entry->addr, memcpy(tt_change->addr, tt_common_entry->addr,
ETH_ALEN); ETH_ALEN);
tt_change->flags = NO_FLAGS; tt_change->flags = BATADV_NO_FLAGS;
tt_count++; tt_count++;
tt_change++; tt_change++;
...@@ -1411,10 +1451,10 @@ static int batadv_send_tt_request(struct bat_priv *bat_priv, ...@@ -1411,10 +1451,10 @@ static int batadv_send_tt_request(struct bat_priv *bat_priv,
sizeof(struct tt_query_packet)); sizeof(struct tt_query_packet));
tt_request->header.packet_type = BAT_TT_QUERY; tt_request->header.packet_type = BAT_TT_QUERY;
tt_request->header.version = COMPAT_VERSION; tt_request->header.version = BATADV_COMPAT_VERSION;
memcpy(tt_request->src, primary_if->net_dev->dev_addr, ETH_ALEN); memcpy(tt_request->src, primary_if->net_dev->dev_addr, ETH_ALEN);
memcpy(tt_request->dst, dst_orig_node->orig, ETH_ALEN); memcpy(tt_request->dst, dst_orig_node->orig, ETH_ALEN);
tt_request->header.ttl = TTL; tt_request->header.ttl = BATADV_TTL;
tt_request->ttvn = ttvn; tt_request->ttvn = ttvn;
tt_request->tt_data = htons(tt_crc); tt_request->tt_data = htons(tt_crc);
tt_request->flags = TT_REQUEST; tt_request->flags = TT_REQUEST;
...@@ -1545,8 +1585,8 @@ static bool batadv_send_other_tt_response(struct bat_priv *bat_priv, ...@@ -1545,8 +1585,8 @@ static bool batadv_send_other_tt_response(struct bat_priv *bat_priv,
} }
tt_response->header.packet_type = BAT_TT_QUERY; tt_response->header.packet_type = BAT_TT_QUERY;
tt_response->header.version = COMPAT_VERSION; tt_response->header.version = BATADV_COMPAT_VERSION;
tt_response->header.ttl = TTL; tt_response->header.ttl = BATADV_TTL;
memcpy(tt_response->src, req_dst_orig_node->orig, ETH_ALEN); memcpy(tt_response->src, req_dst_orig_node->orig, ETH_ALEN);
memcpy(tt_response->dst, tt_request->src, ETH_ALEN); memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
tt_response->flags = TT_RESPONSE; tt_response->flags = TT_RESPONSE;
...@@ -1666,8 +1706,8 @@ static bool batadv_send_my_tt_response(struct bat_priv *bat_priv, ...@@ -1666,8 +1706,8 @@ static bool batadv_send_my_tt_response(struct bat_priv *bat_priv,
} }
tt_response->header.packet_type = BAT_TT_QUERY; tt_response->header.packet_type = BAT_TT_QUERY;
tt_response->header.version = COMPAT_VERSION; tt_response->header.version = BATADV_COMPAT_VERSION;
tt_response->header.ttl = TTL; tt_response->header.ttl = BATADV_TTL;
memcpy(tt_response->src, primary_if->net_dev->dev_addr, ETH_ALEN); memcpy(tt_response->src, primary_if->net_dev->dev_addr, ETH_ALEN);
memcpy(tt_response->dst, tt_request->src, ETH_ALEN); memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
tt_response->flags = TT_RESPONSE; tt_response->flags = TT_RESPONSE;
...@@ -1721,7 +1761,6 @@ static void _batadv_tt_update_changes(struct bat_priv *bat_priv, ...@@ -1721,7 +1761,6 @@ static void _batadv_tt_update_changes(struct bat_priv *bat_priv,
uint16_t tt_num_changes, uint8_t ttvn) uint16_t tt_num_changes, uint8_t ttvn)
{ {
int i; int i;
int is_wifi;
int roams; int roams;
for (i = 0; i < tt_num_changes; i++) { for (i = 0; i < tt_num_changes; i++) {
...@@ -1729,13 +1768,12 @@ static void _batadv_tt_update_changes(struct bat_priv *bat_priv, ...@@ -1729,13 +1768,12 @@ static void _batadv_tt_update_changes(struct bat_priv *bat_priv,
roams = (tt_change + i)->flags & TT_CLIENT_ROAM; roams = (tt_change + i)->flags & TT_CLIENT_ROAM;
batadv_tt_global_del(bat_priv, orig_node, batadv_tt_global_del(bat_priv, orig_node,
(tt_change + i)->addr, (tt_change + i)->addr,
"tt removed by changes", "tt removed by changes",
roams); roams);
} else { } else {
is_wifi = (tt_change + i)->flags & TT_CLIENT_WIFI;
if (!batadv_tt_global_add(bat_priv, orig_node, if (!batadv_tt_global_add(bat_priv, orig_node,
(tt_change + i)->addr, ttvn, (tt_change + i)->addr,
false, is_wifi)) (tt_change + i)->flags, ttvn))
/* In case of problem while storing a /* In case of problem while storing a
* global_entry, we stop the updating * global_entry, we stop the updating
* procedure without committing the * procedure without committing the
...@@ -1897,7 +1935,8 @@ static void batadv_tt_roam_purge(struct bat_priv *bat_priv) ...@@ -1897,7 +1935,8 @@ static void batadv_tt_roam_purge(struct bat_priv *bat_priv)
spin_lock_bh(&bat_priv->tt_roam_list_lock); spin_lock_bh(&bat_priv->tt_roam_list_lock);
list_for_each_entry_safe(node, safe, &bat_priv->tt_roam_list, list) { list_for_each_entry_safe(node, safe, &bat_priv->tt_roam_list, list) {
if (!batadv_has_timed_out(node->first_time, ROAMING_MAX_TIME)) if (!batadv_has_timed_out(node->first_time,
BATADV_ROAMING_MAX_TIME))
continue; continue;
list_del(&node->list); list_del(&node->list);
...@@ -1927,10 +1966,10 @@ static bool batadv_tt_check_roam_count(struct bat_priv *bat_priv, ...@@ -1927,10 +1966,10 @@ static bool batadv_tt_check_roam_count(struct bat_priv *bat_priv,
continue; continue;
if (batadv_has_timed_out(tt_roam_node->first_time, if (batadv_has_timed_out(tt_roam_node->first_time,
ROAMING_MAX_TIME)) BATADV_ROAMING_MAX_TIME))
continue; continue;
if (!atomic_dec_not_zero(&tt_roam_node->counter)) if (!batadv_atomic_dec_not_zero(&tt_roam_node->counter))
/* Sorry, you roamed too many times! */ /* Sorry, you roamed too many times! */
goto unlock; goto unlock;
ret = true; ret = true;
...@@ -1943,7 +1982,8 @@ static bool batadv_tt_check_roam_count(struct bat_priv *bat_priv, ...@@ -1943,7 +1982,8 @@ static bool batadv_tt_check_roam_count(struct bat_priv *bat_priv,
goto unlock; goto unlock;
tt_roam_node->first_time = jiffies; tt_roam_node->first_time = jiffies;
atomic_set(&tt_roam_node->counter, ROAMING_MAX_COUNT - 1); atomic_set(&tt_roam_node->counter,
BATADV_ROAMING_MAX_COUNT - 1);
memcpy(tt_roam_node->addr, client, ETH_ALEN); memcpy(tt_roam_node->addr, client, ETH_ALEN);
list_add(&tt_roam_node->list, &bat_priv->tt_roam_list); list_add(&tt_roam_node->list, &bat_priv->tt_roam_list);
...@@ -1980,8 +2020,8 @@ static void batadv_send_roam_adv(struct bat_priv *bat_priv, uint8_t *client, ...@@ -1980,8 +2020,8 @@ static void batadv_send_roam_adv(struct bat_priv *bat_priv, uint8_t *client,
sizeof(struct roam_adv_packet)); sizeof(struct roam_adv_packet));
roam_adv_packet->header.packet_type = BAT_ROAM_ADV; roam_adv_packet->header.packet_type = BAT_ROAM_ADV;
roam_adv_packet->header.version = COMPAT_VERSION; roam_adv_packet->header.version = BATADV_COMPAT_VERSION;
roam_adv_packet->header.ttl = TTL; roam_adv_packet->header.ttl = BATADV_TTL;
primary_if = batadv_primary_if_get_selected(bat_priv); primary_if = batadv_primary_if_get_selected(bat_priv);
if (!primary_if) if (!primary_if)
goto out; goto out;
...@@ -2142,7 +2182,7 @@ static int batadv_tt_commit_changes(struct bat_priv *bat_priv, ...@@ -2142,7 +2182,7 @@ static int batadv_tt_commit_changes(struct bat_priv *bat_priv,
bat_priv->tt_poss_change = false; bat_priv->tt_poss_change = false;
/* reset the sending counter */ /* reset the sending counter */
atomic_set(&bat_priv->tt_ogm_append_cnt, TT_OGM_APPEND_MAX); atomic_set(&bat_priv->tt_ogm_append_cnt, BATADV_TT_OGM_APPEND_MAX);
return batadv_tt_changes_fill_buff(bat_priv, packet_buff, return batadv_tt_changes_fill_buff(bat_priv, packet_buff,
packet_buff_len, packet_min_len); packet_buff_len, packet_min_len);
...@@ -2162,7 +2202,7 @@ int batadv_tt_append_diff(struct bat_priv *bat_priv, ...@@ -2162,7 +2202,7 @@ int batadv_tt_append_diff(struct bat_priv *bat_priv,
/* if the changes have been sent often enough */ /* if the changes have been sent often enough */
if ((tt_num_changes < 0) && if ((tt_num_changes < 0) &&
(!atomic_dec_not_zero(&bat_priv->tt_ogm_append_cnt))) { (!batadv_atomic_dec_not_zero(&bat_priv->tt_ogm_append_cnt))) {
batadv_tt_realloc_packet_buff(packet_buff, packet_buff_len, batadv_tt_realloc_packet_buff(packet_buff, packet_buff_len,
packet_min_len, packet_min_len); packet_min_len, packet_min_len);
tt_num_changes = 0; tt_num_changes = 0;
...@@ -2220,7 +2260,8 @@ void batadv_tt_update_orig(struct bat_priv *bat_priv, ...@@ -2220,7 +2260,8 @@ void batadv_tt_update_orig(struct bat_priv *bat_priv,
if ((!orig_node->tt_initialised && ttvn == 1) || if ((!orig_node->tt_initialised && ttvn == 1) ||
ttvn - orig_ttvn == 1) { ttvn - orig_ttvn == 1) {
/* the OGM could not contain the changes due to their size or /* the OGM could not contain the changes due to their size or
* because they have already been sent TT_OGM_APPEND_MAX times. * because they have already been sent BATADV_TT_OGM_APPEND_MAX
* times.
* In this case send a tt request * In this case send a tt request
*/ */
if (!tt_num_changes) { if (!tt_num_changes) {
......
...@@ -32,8 +32,8 @@ void batadv_tt_global_add_orig(struct bat_priv *bat_priv, ...@@ -32,8 +32,8 @@ void batadv_tt_global_add_orig(struct bat_priv *bat_priv,
struct orig_node *orig_node, struct orig_node *orig_node,
const unsigned char *tt_buff, int tt_buff_len); const unsigned char *tt_buff, int tt_buff_len);
int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node, int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
const unsigned char *addr, uint8_t ttvn, bool roaming, const unsigned char *addr, uint8_t flags,
bool wifi); uint8_t ttvn);
int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset); int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset);
void batadv_tt_global_del_orig(struct bat_priv *bat_priv, void batadv_tt_global_del_orig(struct bat_priv *bat_priv,
struct orig_node *orig_node, struct orig_node *orig_node,
......
...@@ -22,12 +22,11 @@ ...@@ -22,12 +22,11 @@
#include "packet.h" #include "packet.h"
#include "bitarray.h" #include "bitarray.h"
#include <linux/kernel.h>
#define BAT_HEADER_LEN (ETH_HLEN + \ #define BATADV_HEADER_LEN \
((sizeof(struct unicast_packet) > sizeof(struct bcast_packet) ? \ (ETH_HLEN + max(sizeof(struct unicast_packet), \
sizeof(struct unicast_packet) : \ sizeof(struct bcast_packet)))
sizeof(struct bcast_packet))))
struct hard_iface { struct hard_iface {
struct list_head list; struct list_head list;
...@@ -86,7 +85,7 @@ struct orig_node { ...@@ -86,7 +85,7 @@ struct orig_node {
bool tt_poss_change; bool tt_poss_change;
uint32_t last_real_seqno; uint32_t last_real_seqno;
uint8_t last_ttl; uint8_t last_ttl;
DECLARE_BITMAP(bcast_bits, TQ_LOCAL_WINDOW_SIZE); DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
uint32_t last_bcast_seqno; uint32_t last_bcast_seqno;
struct hlist_head neigh_list; struct hlist_head neigh_list;
struct list_head frag_list; struct list_head frag_list;
...@@ -122,13 +121,13 @@ struct neigh_node { ...@@ -122,13 +121,13 @@ struct neigh_node {
struct hlist_node list; struct hlist_node list;
uint8_t addr[ETH_ALEN]; uint8_t addr[ETH_ALEN];
uint8_t real_packet_count; uint8_t real_packet_count;
uint8_t tq_recv[TQ_GLOBAL_WINDOW_SIZE]; uint8_t tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
uint8_t tq_index; uint8_t tq_index;
uint8_t tq_avg; uint8_t tq_avg;
uint8_t last_ttl; uint8_t last_ttl;
struct list_head bonding_list; struct list_head bonding_list;
unsigned long last_seen; unsigned long last_seen;
DECLARE_BITMAP(real_bits, TQ_LOCAL_WINDOW_SIZE); DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
atomic_t refcount; atomic_t refcount;
struct rcu_head rcu; struct rcu_head rcu;
struct orig_node *orig_node; struct orig_node *orig_node;
...@@ -210,7 +209,7 @@ struct bat_priv { ...@@ -210,7 +209,7 @@ struct bat_priv {
struct list_head tt_roam_list; struct list_head tt_roam_list;
struct hashtable_t *vis_hash; struct hashtable_t *vis_hash;
#ifdef CONFIG_BATMAN_ADV_BLA #ifdef CONFIG_BATMAN_ADV_BLA
struct bcast_duplist_entry bcast_duplist[DUPLIST_SIZE]; struct bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
int bcast_duplist_curr; int bcast_duplist_curr;
struct bla_claim_dst claim_dest; struct bla_claim_dst claim_dest;
#endif #endif
...@@ -349,7 +348,7 @@ struct if_list_entry { ...@@ -349,7 +348,7 @@ struct if_list_entry {
}; };
struct debug_log { struct debug_log {
char log_buff[LOG_BUF_LEN]; char log_buff[BATADV_LOG_BUF_LEN];
unsigned long log_start; unsigned long log_start;
unsigned long log_end; unsigned long log_end;
spinlock_t lock; /* protects log_buff, log_start and log_end */ spinlock_t lock; /* protects log_buff, log_start and log_end */
......
...@@ -29,9 +29,10 @@ ...@@ -29,9 +29,10 @@
#include "hard-interface.h" #include "hard-interface.h"
static struct sk_buff *frag_merge_packet(struct list_head *head, static struct sk_buff *
struct frag_packet_list_entry *tfp, batadv_frag_merge_packet(struct list_head *head,
struct sk_buff *skb) struct frag_packet_list_entry *tfp,
struct sk_buff *skb)
{ {
struct unicast_frag_packet *up = struct unicast_frag_packet *up =
(struct unicast_frag_packet *)skb->data; (struct unicast_frag_packet *)skb->data;
...@@ -75,7 +76,8 @@ static struct sk_buff *frag_merge_packet(struct list_head *head, ...@@ -75,7 +76,8 @@ static struct sk_buff *frag_merge_packet(struct list_head *head,
return NULL; return NULL;
} }
static void frag_create_entry(struct list_head *head, struct sk_buff *skb) static void batadv_frag_create_entry(struct list_head *head,
struct sk_buff *skb)
{ {
struct frag_packet_list_entry *tfp; struct frag_packet_list_entry *tfp;
struct unicast_frag_packet *up = struct unicast_frag_packet *up =
...@@ -91,12 +93,12 @@ static void frag_create_entry(struct list_head *head, struct sk_buff *skb) ...@@ -91,12 +93,12 @@ static void frag_create_entry(struct list_head *head, struct sk_buff *skb)
return; return;
} }
static int frag_create_buffer(struct list_head *head) static int batadv_frag_create_buffer(struct list_head *head)
{ {
int i; int i;
struct frag_packet_list_entry *tfp; struct frag_packet_list_entry *tfp;
for (i = 0; i < FRAG_BUFFER_SIZE; i++) { for (i = 0; i < BATADV_FRAG_BUFFER_SIZE; i++) {
tfp = kmalloc(sizeof(*tfp), GFP_ATOMIC); tfp = kmalloc(sizeof(*tfp), GFP_ATOMIC);
if (!tfp) { if (!tfp) {
batadv_frag_list_free(head); batadv_frag_list_free(head);
...@@ -111,8 +113,9 @@ static int frag_create_buffer(struct list_head *head) ...@@ -111,8 +113,9 @@ static int frag_create_buffer(struct list_head *head)
return 0; return 0;
} }
static struct frag_packet_list_entry *frag_search_packet(struct list_head *head, static struct frag_packet_list_entry *
const struct unicast_frag_packet *up) batadv_frag_search_packet(struct list_head *head,
const struct unicast_frag_packet *up)
{ {
struct frag_packet_list_entry *tfp; struct frag_packet_list_entry *tfp;
struct unicast_frag_packet *tmp_up = NULL; struct unicast_frag_packet *tmp_up = NULL;
...@@ -188,22 +191,22 @@ int batadv_frag_reassemble_skb(struct sk_buff *skb, struct bat_priv *bat_priv, ...@@ -188,22 +191,22 @@ int batadv_frag_reassemble_skb(struct sk_buff *skb, struct bat_priv *bat_priv,
orig_node->last_frag_packet = jiffies; orig_node->last_frag_packet = jiffies;
if (list_empty(&orig_node->frag_list) && if (list_empty(&orig_node->frag_list) &&
frag_create_buffer(&orig_node->frag_list)) { batadv_frag_create_buffer(&orig_node->frag_list)) {
pr_debug("couldn't create frag buffer\n"); pr_debug("couldn't create frag buffer\n");
goto out; goto out;
} }
tmp_frag_entry = frag_search_packet(&orig_node->frag_list, tmp_frag_entry = batadv_frag_search_packet(&orig_node->frag_list,
unicast_packet); unicast_packet);
if (!tmp_frag_entry) { if (!tmp_frag_entry) {
frag_create_entry(&orig_node->frag_list, skb); batadv_frag_create_entry(&orig_node->frag_list, skb);
ret = NET_RX_SUCCESS; ret = NET_RX_SUCCESS;
goto out; goto out;
} }
*new_skb = frag_merge_packet(&orig_node->frag_list, tmp_frag_entry, *new_skb = batadv_frag_merge_packet(&orig_node->frag_list,
skb); tmp_frag_entry, skb);
/* if not, merge failed */ /* if not, merge failed */
if (*new_skb) if (*new_skb)
ret = NET_RX_SUCCESS; ret = NET_RX_SUCCESS;
...@@ -250,7 +253,7 @@ int batadv_frag_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv, ...@@ -250,7 +253,7 @@ int batadv_frag_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv,
memcpy(frag1, &tmp_uc, sizeof(tmp_uc)); memcpy(frag1, &tmp_uc, sizeof(tmp_uc));
frag1->header.ttl--; frag1->header.ttl--;
frag1->header.version = COMPAT_VERSION; frag1->header.version = BATADV_COMPAT_VERSION;
frag1->header.packet_type = BAT_UNICAST_FRAG; frag1->header.packet_type = BAT_UNICAST_FRAG;
memcpy(frag1->orig, primary_if->net_dev->dev_addr, ETH_ALEN); memcpy(frag1->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
...@@ -316,11 +319,11 @@ int batadv_unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv) ...@@ -316,11 +319,11 @@ int batadv_unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv)
unicast_packet = (struct unicast_packet *)skb->data; unicast_packet = (struct unicast_packet *)skb->data;
unicast_packet->header.version = COMPAT_VERSION; unicast_packet->header.version = BATADV_COMPAT_VERSION;
/* batman packet type: unicast */ /* batman packet type: unicast */
unicast_packet->header.packet_type = BAT_UNICAST; unicast_packet->header.packet_type = BAT_UNICAST;
/* set unicast ttl */ /* set unicast ttl */
unicast_packet->header.ttl = TTL; unicast_packet->header.ttl = BATADV_TTL;
/* copy the destination for faster routing */ /* copy the destination for faster routing */
memcpy(unicast_packet->dest, orig_node->orig, ETH_ALEN); memcpy(unicast_packet->dest, orig_node->orig, ETH_ALEN);
/* set the destination tt version number */ /* set the destination tt version number */
......
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
#include "packet.h" #include "packet.h"
#define FRAG_TIMEOUT 10000 /* purge frag list entries after time in ms */ #define BATADV_FRAG_TIMEOUT 10000 /* purge frag list entries after time in ms */
#define FRAG_BUFFER_SIZE 6 /* number of list elements in buffer */ #define BATADV_FRAG_BUFFER_SIZE 6 /* number of list elements in buffer */
int batadv_frag_reassemble_skb(struct sk_buff *skb, struct bat_priv *bat_priv, int batadv_frag_reassemble_skb(struct sk_buff *skb, struct bat_priv *bat_priv,
struct sk_buff **new_skb); struct sk_buff **new_skb);
......
...@@ -26,12 +26,12 @@ ...@@ -26,12 +26,12 @@
#include "hash.h" #include "hash.h"
#include "originator.h" #include "originator.h"
#define MAX_VIS_PACKET_SIZE 1000 #define BATADV_MAX_VIS_PACKET_SIZE 1000
static void start_vis_timer(struct bat_priv *bat_priv); static void batadv_start_vis_timer(struct bat_priv *bat_priv);
/* free the info */ /* free the info */
static void free_info(struct kref *ref) static void batadv_free_info(struct kref *ref)
{ {
struct vis_info *info = container_of(ref, struct vis_info, refcount); struct vis_info *info = container_of(ref, struct vis_info, refcount);
struct bat_priv *bat_priv = info->bat_priv; struct bat_priv *bat_priv = info->bat_priv;
...@@ -50,7 +50,7 @@ static void free_info(struct kref *ref) ...@@ -50,7 +50,7 @@ static void free_info(struct kref *ref)
} }
/* Compare two vis packets, used by the hashing algorithm */ /* Compare two vis packets, used by the hashing algorithm */
static int vis_info_cmp(const struct hlist_node *node, const void *data2) static int batadv_vis_info_cmp(const struct hlist_node *node, const void *data2)
{ {
const struct vis_info *d1, *d2; const struct vis_info *d1, *d2;
const struct vis_packet *p1, *p2; const struct vis_packet *p1, *p2;
...@@ -65,7 +65,7 @@ static int vis_info_cmp(const struct hlist_node *node, const void *data2) ...@@ -65,7 +65,7 @@ static int vis_info_cmp(const struct hlist_node *node, const void *data2)
/* hash function to choose an entry in a hash table of given size /* hash function to choose an entry in a hash table of given size
* hash algorithm from http://en.wikipedia.org/wiki/Hash_table * hash algorithm from http://en.wikipedia.org/wiki/Hash_table
*/ */
static uint32_t vis_info_choose(const void *data, uint32_t size) static uint32_t batadv_vis_info_choose(const void *data, uint32_t size)
{ {
const struct vis_info *vis_info = data; const struct vis_info *vis_info = data;
const struct vis_packet *packet; const struct vis_packet *packet;
...@@ -88,8 +88,8 @@ static uint32_t vis_info_choose(const void *data, uint32_t size) ...@@ -88,8 +88,8 @@ static uint32_t vis_info_choose(const void *data, uint32_t size)
return hash % size; return hash % size;
} }
static struct vis_info *vis_hash_find(struct bat_priv *bat_priv, static struct vis_info *batadv_vis_hash_find(struct bat_priv *bat_priv,
const void *data) const void *data)
{ {
struct hashtable_t *hash = bat_priv->vis_hash; struct hashtable_t *hash = bat_priv->vis_hash;
struct hlist_head *head; struct hlist_head *head;
...@@ -100,12 +100,12 @@ static struct vis_info *vis_hash_find(struct bat_priv *bat_priv, ...@@ -100,12 +100,12 @@ static struct vis_info *vis_hash_find(struct bat_priv *bat_priv,
if (!hash) if (!hash)
return NULL; return NULL;
index = vis_info_choose(data, hash->size); index = batadv_vis_info_choose(data, hash->size);
head = &hash->table[index]; head = &hash->table[index];
rcu_read_lock(); rcu_read_lock();
hlist_for_each_entry_rcu(vis_info, node, head, hash_entry) { hlist_for_each_entry_rcu(vis_info, node, head, hash_entry) {
if (!vis_info_cmp(node, data)) if (!batadv_vis_info_cmp(node, data))
continue; continue;
vis_info_tmp = vis_info; vis_info_tmp = vis_info;
...@@ -119,9 +119,9 @@ static struct vis_info *vis_hash_find(struct bat_priv *bat_priv, ...@@ -119,9 +119,9 @@ static struct vis_info *vis_hash_find(struct bat_priv *bat_priv,
/* insert interface to the list of interfaces of one originator, if it /* insert interface to the list of interfaces of one originator, if it
* does not already exist in the list * does not already exist in the list
*/ */
static void vis_data_insert_interface(const uint8_t *interface, static void batadv_vis_data_insert_interface(const uint8_t *interface,
struct hlist_head *if_list, struct hlist_head *if_list,
bool primary) bool primary)
{ {
struct if_list_entry *entry; struct if_list_entry *entry;
struct hlist_node *pos; struct hlist_node *pos;
...@@ -140,73 +140,117 @@ static void vis_data_insert_interface(const uint8_t *interface, ...@@ -140,73 +140,117 @@ static void vis_data_insert_interface(const uint8_t *interface,
hlist_add_head(&entry->list, if_list); hlist_add_head(&entry->list, if_list);
} }
static ssize_t vis_data_read_prim_sec(char *buff, static void batadv_vis_data_read_prim_sec(struct seq_file *seq,
const struct hlist_head *if_list) const struct hlist_head *if_list)
{ {
struct if_list_entry *entry; struct if_list_entry *entry;
struct hlist_node *pos; struct hlist_node *pos;
size_t len = 0;
hlist_for_each_entry(entry, pos, if_list, list) { hlist_for_each_entry(entry, pos, if_list, list) {
if (entry->primary) if (entry->primary)
len += sprintf(buff + len, "PRIMARY, "); seq_printf(seq, "PRIMARY, ");
else else
len += sprintf(buff + len, "SEC %pM, ", entry->addr); seq_printf(seq, "SEC %pM, ", entry->addr);
} }
}
/* read an entry */
static ssize_t batadv_vis_data_read_entry(struct seq_file *seq,
const struct vis_info_entry *entry,
const uint8_t *src, bool primary)
{
if (primary && entry->quality == 0)
return seq_printf(seq, "TT %pM, ", entry->dest);
else if (batadv_compare_eth(entry->src, src))
return seq_printf(seq, "TQ %pM %d, ", entry->dest,
entry->quality);
return 0;
}
static void batadv_vis_data_insert_interfaces(struct hlist_head *list,
struct vis_packet *packet,
struct vis_info_entry *entries)
{
int i;
for (i = 0; i < packet->entries; i++) {
if (entries[i].quality == 0)
continue;
if (batadv_compare_eth(entries[i].src, packet->vis_orig))
continue;
return len; batadv_vis_data_insert_interface(entries[i].src, list, false);
}
} }
static size_t vis_data_count_prim_sec(struct hlist_head *if_list) static void batadv_vis_data_read_entries(struct seq_file *seq,
struct hlist_head *list,
struct vis_packet *packet,
struct vis_info_entry *entries)
{ {
int i;
struct if_list_entry *entry; struct if_list_entry *entry;
struct hlist_node *pos; struct hlist_node *pos;
size_t count = 0;
hlist_for_each_entry(entry, pos, if_list, list) { hlist_for_each_entry(entry, pos, list, list) {
if (entry->primary) seq_printf(seq, "%pM,", entry->addr);
count += 9;
else
count += 23;
}
return count; for (i = 0; i < packet->entries; i++)
batadv_vis_data_read_entry(seq, &entries[i],
entry->addr, entry->primary);
/* add primary/secondary records */
if (batadv_compare_eth(entry->addr, packet->vis_orig))
batadv_vis_data_read_prim_sec(seq, list);
seq_printf(seq, "\n");
}
} }
/* read an entry */ static void batadv_vis_seq_print_text_bucket(struct seq_file *seq,
static ssize_t vis_data_read_entry(char *buff, const struct hlist_head *head)
const struct vis_info_entry *entry,
const uint8_t *src, bool primary)
{ {
/* maximal length: max(4+17+2, 3+17+1+3+2) == 26 */ struct hlist_node *node;
if (primary && entry->quality == 0) struct vis_info *info;
return sprintf(buff, "TT %pM, ", entry->dest); struct vis_packet *packet;
else if (batadv_compare_eth(entry->src, src)) uint8_t *entries_pos;
return sprintf(buff, "TQ %pM %d, ", entry->dest, struct vis_info_entry *entries;
entry->quality); struct if_list_entry *entry;
struct hlist_node *pos, *n;
return 0; HLIST_HEAD(vis_if_list);
hlist_for_each_entry_rcu(info, node, head, hash_entry) {
packet = (struct vis_packet *)info->skb_packet->data;
entries_pos = (uint8_t *)packet + sizeof(*packet);
entries = (struct vis_info_entry *)entries_pos;
batadv_vis_data_insert_interface(packet->vis_orig, &vis_if_list,
true);
batadv_vis_data_insert_interfaces(&vis_if_list, packet,
entries);
batadv_vis_data_read_entries(seq, &vis_if_list, packet,
entries);
hlist_for_each_entry_safe(entry, pos, n, &vis_if_list, list) {
hlist_del(&entry->list);
kfree(entry);
}
}
} }
int batadv_vis_seq_print_text(struct seq_file *seq, void *offset) int batadv_vis_seq_print_text(struct seq_file *seq, void *offset)
{ {
struct hard_iface *primary_if; struct hard_iface *primary_if;
struct hlist_node *node;
struct hlist_head *head; struct hlist_head *head;
struct vis_info *info;
struct vis_packet *packet;
struct vis_info_entry *entries;
struct net_device *net_dev = (struct net_device *)seq->private; struct net_device *net_dev = (struct net_device *)seq->private;
struct bat_priv *bat_priv = netdev_priv(net_dev); struct bat_priv *bat_priv = netdev_priv(net_dev);
struct hashtable_t *hash = bat_priv->vis_hash; struct hashtable_t *hash = bat_priv->vis_hash;
HLIST_HEAD(vis_if_list);
struct if_list_entry *entry;
struct hlist_node *pos, *n;
uint32_t i; uint32_t i;
int j, ret = 0; int ret = 0;
int vis_server = atomic_read(&bat_priv->vis_mode); int vis_server = atomic_read(&bat_priv->vis_mode);
size_t buff_pos, buf_size;
char *buff;
primary_if = batadv_primary_if_get_selected(bat_priv); primary_if = batadv_primary_if_get_selected(bat_priv);
if (!primary_if) if (!primary_if)
...@@ -215,120 +259,13 @@ int batadv_vis_seq_print_text(struct seq_file *seq, void *offset) ...@@ -215,120 +259,13 @@ int batadv_vis_seq_print_text(struct seq_file *seq, void *offset)
if (vis_server == VIS_TYPE_CLIENT_UPDATE) if (vis_server == VIS_TYPE_CLIENT_UPDATE)
goto out; goto out;
buf_size = 1;
/* Estimate length */
spin_lock_bh(&bat_priv->vis_hash_lock); spin_lock_bh(&bat_priv->vis_hash_lock);
for (i = 0; i < hash->size; i++) { for (i = 0; i < hash->size; i++) {
head = &hash->table[i]; head = &hash->table[i];
batadv_vis_seq_print_text_bucket(seq, head);
rcu_read_lock();
hlist_for_each_entry_rcu(info, node, head, hash_entry) {
packet = (struct vis_packet *)info->skb_packet->data;
entries = (struct vis_info_entry *)
((char *)packet + sizeof(*packet));
vis_data_insert_interface(packet->vis_orig,
&vis_if_list, true);
for (j = 0; j < packet->entries; j++) {
if (entries[j].quality == 0)
continue;
if (batadv_compare_eth(entries[j].src,
packet->vis_orig))
continue;
vis_data_insert_interface(entries[j].src,
&vis_if_list,
false);
}
hlist_for_each_entry(entry, pos, &vis_if_list, list) {
buf_size += 18 + 26 * packet->entries;
/* add primary/secondary records */
if (batadv_compare_eth(entry->addr,
packet->vis_orig))
buf_size +=
vis_data_count_prim_sec(&vis_if_list);
buf_size += 1;
}
hlist_for_each_entry_safe(entry, pos, n, &vis_if_list,
list) {
hlist_del(&entry->list);
kfree(entry);
}
}
rcu_read_unlock();
}
buff = kmalloc(buf_size, GFP_ATOMIC);
if (!buff) {
spin_unlock_bh(&bat_priv->vis_hash_lock);
ret = -ENOMEM;
goto out;
}
buff[0] = '\0';
buff_pos = 0;
for (i = 0; i < hash->size; i++) {
head = &hash->table[i];
rcu_read_lock();
hlist_for_each_entry_rcu(info, node, head, hash_entry) {
packet = (struct vis_packet *)info->skb_packet->data;
entries = (struct vis_info_entry *)
((char *)packet + sizeof(*packet));
vis_data_insert_interface(packet->vis_orig,
&vis_if_list, true);
for (j = 0; j < packet->entries; j++) {
if (entries[j].quality == 0)
continue;
if (batadv_compare_eth(entries[j].src,
packet->vis_orig))
continue;
vis_data_insert_interface(entries[j].src,
&vis_if_list,
false);
}
hlist_for_each_entry(entry, pos, &vis_if_list, list) {
buff_pos += sprintf(buff + buff_pos, "%pM,",
entry->addr);
for (j = 0; j < packet->entries; j++)
buff_pos += vis_data_read_entry(
buff + buff_pos,
&entries[j],
entry->addr,
entry->primary);
/* add primary/secondary records */
if (batadv_compare_eth(entry->addr,
packet->vis_orig))
buff_pos +=
vis_data_read_prim_sec(buff + buff_pos,
&vis_if_list);
buff_pos += sprintf(buff + buff_pos, "\n");
}
hlist_for_each_entry_safe(entry, pos, n, &vis_if_list,
list) {
hlist_del(&entry->list);
kfree(entry);
}
}
rcu_read_unlock();
} }
spin_unlock_bh(&bat_priv->vis_hash_lock); spin_unlock_bh(&bat_priv->vis_hash_lock);
seq_printf(seq, "%s", buff);
kfree(buff);
out: out:
if (primary_if) if (primary_if)
batadv_hardif_free_ref(primary_if); batadv_hardif_free_ref(primary_if);
...@@ -338,7 +275,8 @@ int batadv_vis_seq_print_text(struct seq_file *seq, void *offset) ...@@ -338,7 +275,8 @@ int batadv_vis_seq_print_text(struct seq_file *seq, void *offset)
/* add the info packet to the send list, if it was not /* add the info packet to the send list, if it was not
* already linked in. * already linked in.
*/ */
static void send_list_add(struct bat_priv *bat_priv, struct vis_info *info) static void batadv_send_list_add(struct bat_priv *bat_priv,
struct vis_info *info)
{ {
if (list_empty(&info->send_list)) { if (list_empty(&info->send_list)) {
kref_get(&info->refcount); kref_get(&info->refcount);
...@@ -349,17 +287,17 @@ static void send_list_add(struct bat_priv *bat_priv, struct vis_info *info) ...@@ -349,17 +287,17 @@ static void send_list_add(struct bat_priv *bat_priv, struct vis_info *info)
/* delete the info packet from the send list, if it was /* delete the info packet from the send list, if it was
* linked in. * linked in.
*/ */
static void send_list_del(struct vis_info *info) static void batadv_send_list_del(struct vis_info *info)
{ {
if (!list_empty(&info->send_list)) { if (!list_empty(&info->send_list)) {
list_del_init(&info->send_list); list_del_init(&info->send_list);
kref_put(&info->refcount, free_info); kref_put(&info->refcount, batadv_free_info);
} }
} }
/* tries to add one entry to the receive list. */ /* tries to add one entry to the receive list. */
static void recv_list_add(struct bat_priv *bat_priv, static void batadv_recv_list_add(struct bat_priv *bat_priv,
struct list_head *recv_list, const char *mac) struct list_head *recv_list, const char *mac)
{ {
struct recvlist_node *entry; struct recvlist_node *entry;
...@@ -374,8 +312,9 @@ static void recv_list_add(struct bat_priv *bat_priv, ...@@ -374,8 +312,9 @@ static void recv_list_add(struct bat_priv *bat_priv,
} }
/* returns 1 if this mac is in the recv_list */ /* returns 1 if this mac is in the recv_list */
static int recv_list_is_in(struct bat_priv *bat_priv, static int batadv_recv_list_is_in(struct bat_priv *bat_priv,
const struct list_head *recv_list, const char *mac) const struct list_head *recv_list,
const char *mac)
{ {
const struct recvlist_node *entry; const struct recvlist_node *entry;
...@@ -394,10 +333,10 @@ static int recv_list_is_in(struct bat_priv *bat_priv, ...@@ -394,10 +333,10 @@ static int recv_list_is_in(struct bat_priv *bat_priv,
* broken.. ). vis hash must be locked outside. is_new is set when the packet * broken.. ). vis hash must be locked outside. is_new is set when the packet
* is newer than old entries in the hash. * is newer than old entries in the hash.
*/ */
static struct vis_info *add_packet(struct bat_priv *bat_priv, static struct vis_info *batadv_add_packet(struct bat_priv *bat_priv,
struct vis_packet *vis_packet, struct vis_packet *vis_packet,
int vis_info_len, int *is_new, int vis_info_len, int *is_new,
int make_broadcast) int make_broadcast)
{ {
struct vis_info *info, *old_info; struct vis_info *info, *old_info;
struct vis_packet *search_packet, *old_packet; struct vis_packet *search_packet, *old_packet;
...@@ -418,16 +357,17 @@ static struct vis_info *add_packet(struct bat_priv *bat_priv, ...@@ -418,16 +357,17 @@ static struct vis_info *add_packet(struct bat_priv *bat_priv,
sizeof(*search_packet)); sizeof(*search_packet));
memcpy(search_packet->vis_orig, vis_packet->vis_orig, ETH_ALEN); memcpy(search_packet->vis_orig, vis_packet->vis_orig, ETH_ALEN);
old_info = vis_hash_find(bat_priv, &search_elem); old_info = batadv_vis_hash_find(bat_priv, &search_elem);
kfree_skb(search_elem.skb_packet); kfree_skb(search_elem.skb_packet);
if (old_info) { if (old_info) {
old_packet = (struct vis_packet *)old_info->skb_packet->data; old_packet = (struct vis_packet *)old_info->skb_packet->data;
if (!seq_after(ntohl(vis_packet->seqno), if (!batadv_seq_after(ntohl(vis_packet->seqno),
ntohl(old_packet->seqno))) { ntohl(old_packet->seqno))) {
if (old_packet->seqno == vis_packet->seqno) { if (old_packet->seqno == vis_packet->seqno) {
recv_list_add(bat_priv, &old_info->recv_list, batadv_recv_list_add(bat_priv,
vis_packet->sender_orig); &old_info->recv_list,
vis_packet->sender_orig);
return old_info; return old_info;
} else { } else {
/* newer packet is already in hash. */ /* newer packet is already in hash. */
...@@ -435,10 +375,10 @@ static struct vis_info *add_packet(struct bat_priv *bat_priv, ...@@ -435,10 +375,10 @@ static struct vis_info *add_packet(struct bat_priv *bat_priv,
} }
} }
/* remove old entry */ /* remove old entry */
batadv_hash_remove(bat_priv->vis_hash, vis_info_cmp, batadv_hash_remove(bat_priv->vis_hash, batadv_vis_info_cmp,
vis_info_choose, old_info); batadv_vis_info_choose, old_info);
send_list_del(old_info); batadv_send_list_del(old_info);
kref_put(&old_info->refcount, free_info); kref_put(&old_info->refcount, batadv_free_info);
} }
info = kmalloc(sizeof(*info), GFP_ATOMIC); info = kmalloc(sizeof(*info), GFP_ATOMIC);
...@@ -473,14 +413,15 @@ static struct vis_info *add_packet(struct bat_priv *bat_priv, ...@@ -473,14 +413,15 @@ static struct vis_info *add_packet(struct bat_priv *bat_priv,
if (packet->entries * sizeof(struct vis_info_entry) > vis_info_len) if (packet->entries * sizeof(struct vis_info_entry) > vis_info_len)
packet->entries = vis_info_len / sizeof(struct vis_info_entry); packet->entries = vis_info_len / sizeof(struct vis_info_entry);
recv_list_add(bat_priv, &info->recv_list, packet->sender_orig); batadv_recv_list_add(bat_priv, &info->recv_list, packet->sender_orig);
/* try to add it */ /* try to add it */
hash_added = batadv_hash_add(bat_priv->vis_hash, vis_info_cmp, hash_added = batadv_hash_add(bat_priv->vis_hash, batadv_vis_info_cmp,
vis_info_choose, info, &info->hash_entry); batadv_vis_info_choose, info,
&info->hash_entry);
if (hash_added != 0) { if (hash_added != 0) {
/* did not work (for some reason) */ /* did not work (for some reason) */
kref_put(&info->refcount, free_info); kref_put(&info->refcount, batadv_free_info);
info = NULL; info = NULL;
} }
...@@ -499,8 +440,8 @@ void batadv_receive_server_sync_packet(struct bat_priv *bat_priv, ...@@ -499,8 +440,8 @@ void batadv_receive_server_sync_packet(struct bat_priv *bat_priv,
make_broadcast = (vis_server == VIS_TYPE_SERVER_SYNC); make_broadcast = (vis_server == VIS_TYPE_SERVER_SYNC);
spin_lock_bh(&bat_priv->vis_hash_lock); spin_lock_bh(&bat_priv->vis_hash_lock);
info = add_packet(bat_priv, vis_packet, vis_info_len, info = batadv_add_packet(bat_priv, vis_packet, vis_info_len,
&is_new, make_broadcast); &is_new, make_broadcast);
if (!info) if (!info)
goto end; goto end;
...@@ -508,7 +449,7 @@ void batadv_receive_server_sync_packet(struct bat_priv *bat_priv, ...@@ -508,7 +449,7 @@ void batadv_receive_server_sync_packet(struct bat_priv *bat_priv,
* hash. * hash.
*/ */
if (vis_server == VIS_TYPE_SERVER_SYNC && is_new) if (vis_server == VIS_TYPE_SERVER_SYNC && is_new)
send_list_add(bat_priv, info); batadv_send_list_add(bat_priv, info);
end: end:
spin_unlock_bh(&bat_priv->vis_hash_lock); spin_unlock_bh(&bat_priv->vis_hash_lock);
} }
...@@ -534,8 +475,8 @@ void batadv_receive_client_update_packet(struct bat_priv *bat_priv, ...@@ -534,8 +475,8 @@ void batadv_receive_client_update_packet(struct bat_priv *bat_priv,
are_target = 1; are_target = 1;
spin_lock_bh(&bat_priv->vis_hash_lock); spin_lock_bh(&bat_priv->vis_hash_lock);
info = add_packet(bat_priv, vis_packet, vis_info_len, info = batadv_add_packet(bat_priv, vis_packet, vis_info_len,
&is_new, are_target); &is_new, are_target);
if (!info) if (!info)
goto end; goto end;
...@@ -546,11 +487,11 @@ void batadv_receive_client_update_packet(struct bat_priv *bat_priv, ...@@ -546,11 +487,11 @@ void batadv_receive_client_update_packet(struct bat_priv *bat_priv,
/* send only if we're the target server or ... */ /* send only if we're the target server or ... */
if (are_target && is_new) { if (are_target && is_new) {
packet->vis_type = VIS_TYPE_SERVER_SYNC; /* upgrade! */ packet->vis_type = VIS_TYPE_SERVER_SYNC; /* upgrade! */
send_list_add(bat_priv, info); batadv_send_list_add(bat_priv, info);
/* ... we're not the recipient (and thus need to forward). */ /* ... we're not the recipient (and thus need to forward). */
} else if (!batadv_is_my_mac(packet->target_orig)) { } else if (!batadv_is_my_mac(packet->target_orig)) {
send_list_add(bat_priv, info); batadv_send_list_add(bat_priv, info);
} }
end: end:
...@@ -562,8 +503,8 @@ void batadv_receive_client_update_packet(struct bat_priv *bat_priv, ...@@ -562,8 +503,8 @@ void batadv_receive_client_update_packet(struct bat_priv *bat_priv,
* *
* Must be called with the originator hash locked * Must be called with the originator hash locked
*/ */
static int find_best_vis_server(struct bat_priv *bat_priv, static int batadv_find_best_vis_server(struct bat_priv *bat_priv,
struct vis_info *info) struct vis_info *info)
{ {
struct hashtable_t *hash = bat_priv->orig_hash; struct hashtable_t *hash = bat_priv->orig_hash;
struct neigh_node *router; struct neigh_node *router;
...@@ -600,13 +541,15 @@ static int find_best_vis_server(struct bat_priv *bat_priv, ...@@ -600,13 +541,15 @@ static int find_best_vis_server(struct bat_priv *bat_priv,
} }
/* Return true if the vis packet is full. */ /* Return true if the vis packet is full. */
static bool vis_packet_full(const struct vis_info *info) static bool batadv_vis_packet_full(const struct vis_info *info)
{ {
const struct vis_packet *packet; const struct vis_packet *packet;
size_t num_items;
packet = (struct vis_packet *)info->skb_packet->data; packet = (struct vis_packet *)info->skb_packet->data;
num_items = BATADV_MAX_VIS_PACKET_SIZE / sizeof(struct vis_info_entry);
if (MAX_VIS_PACKET_SIZE / sizeof(struct vis_info_entry) if (num_items < packet->entries + 1)
< packet->entries + 1)
return true; return true;
return false; return false;
} }
...@@ -614,7 +557,7 @@ static bool vis_packet_full(const struct vis_info *info) ...@@ -614,7 +557,7 @@ static bool vis_packet_full(const struct vis_info *info)
/* generates a packet of own vis data, /* generates a packet of own vis data,
* returns 0 on success, -1 if no packet could be generated * returns 0 on success, -1 if no packet could be generated
*/ */
static int generate_vis_packet(struct bat_priv *bat_priv) static int batadv_generate_vis_packet(struct bat_priv *bat_priv)
{ {
struct hashtable_t *hash = bat_priv->orig_hash; struct hashtable_t *hash = bat_priv->orig_hash;
struct hlist_node *node; struct hlist_node *node;
...@@ -632,13 +575,13 @@ static int generate_vis_packet(struct bat_priv *bat_priv) ...@@ -632,13 +575,13 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
packet->vis_type = atomic_read(&bat_priv->vis_mode); packet->vis_type = atomic_read(&bat_priv->vis_mode);
memcpy(packet->target_orig, batadv_broadcast_addr, ETH_ALEN); memcpy(packet->target_orig, batadv_broadcast_addr, ETH_ALEN);
packet->header.ttl = TTL; packet->header.ttl = BATADV_TTL;
packet->seqno = htonl(ntohl(packet->seqno) + 1); packet->seqno = htonl(ntohl(packet->seqno) + 1);
packet->entries = 0; packet->entries = 0;
skb_trim(info->skb_packet, sizeof(*packet)); skb_trim(info->skb_packet, sizeof(*packet));
if (packet->vis_type == VIS_TYPE_CLIENT_UPDATE) { if (packet->vis_type == VIS_TYPE_CLIENT_UPDATE) {
best_tq = find_best_vis_server(bat_priv, info); best_tq = batadv_find_best_vis_server(bat_priv, info);
if (best_tq < 0) if (best_tq < 0)
return best_tq; return best_tq;
...@@ -675,7 +618,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv) ...@@ -675,7 +618,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
next: next:
batadv_neigh_node_free_ref(router); batadv_neigh_node_free_ref(router);
if (vis_packet_full(info)) if (batadv_vis_packet_full(info))
goto unlock; goto unlock;
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -697,7 +640,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv) ...@@ -697,7 +640,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
entry->quality = 0; /* 0 means TT */ entry->quality = 0; /* 0 means TT */
packet->entries++; packet->entries++;
if (vis_packet_full(info)) if (batadv_vis_packet_full(info))
goto unlock; goto unlock;
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -713,7 +656,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv) ...@@ -713,7 +656,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
/* free old vis packets. Must be called with this vis_hash_lock /* free old vis packets. Must be called with this vis_hash_lock
* held * held
*/ */
static void purge_vis_packets(struct bat_priv *bat_priv) static void batadv_purge_vis_packets(struct bat_priv *bat_priv)
{ {
uint32_t i; uint32_t i;
struct hashtable_t *hash = bat_priv->vis_hash; struct hashtable_t *hash = bat_priv->vis_hash;
...@@ -731,17 +674,17 @@ static void purge_vis_packets(struct bat_priv *bat_priv) ...@@ -731,17 +674,17 @@ static void purge_vis_packets(struct bat_priv *bat_priv)
continue; continue;
if (batadv_has_timed_out(info->first_seen, if (batadv_has_timed_out(info->first_seen,
VIS_TIMEOUT)) { BATADV_VIS_TIMEOUT)) {
hlist_del(node); hlist_del(node);
send_list_del(info); batadv_send_list_del(info);
kref_put(&info->refcount, free_info); kref_put(&info->refcount, batadv_free_info);
} }
} }
} }
} }
static void broadcast_vis_packet(struct bat_priv *bat_priv, static void batadv_broadcast_vis_packet(struct bat_priv *bat_priv,
struct vis_info *info) struct vis_info *info)
{ {
struct neigh_node *router; struct neigh_node *router;
struct hashtable_t *hash = bat_priv->orig_hash; struct hashtable_t *hash = bat_priv->orig_hash;
...@@ -774,8 +717,8 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv, ...@@ -774,8 +717,8 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv,
/* don't send it if we already received the packet from /* don't send it if we already received the packet from
* this node. * this node.
*/ */
if (recv_list_is_in(bat_priv, &info->recv_list, if (batadv_recv_list_is_in(bat_priv, &info->recv_list,
orig_node->orig)) { orig_node->orig)) {
batadv_neigh_node_free_ref(router); batadv_neigh_node_free_ref(router);
continue; continue;
} }
...@@ -796,8 +739,8 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv, ...@@ -796,8 +739,8 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv,
} }
} }
static void unicast_vis_packet(struct bat_priv *bat_priv, static void batadv_unicast_vis_packet(struct bat_priv *bat_priv,
struct vis_info *info) struct vis_info *info)
{ {
struct orig_node *orig_node; struct orig_node *orig_node;
struct neigh_node *router = NULL; struct neigh_node *router = NULL;
...@@ -825,8 +768,9 @@ static void unicast_vis_packet(struct bat_priv *bat_priv, ...@@ -825,8 +768,9 @@ static void unicast_vis_packet(struct bat_priv *bat_priv,
batadv_orig_node_free_ref(orig_node); batadv_orig_node_free_ref(orig_node);
} }
/* only send one vis packet. called from send_vis_packets() */ /* only send one vis packet. called from batadv_send_vis_packets() */
static void send_vis_packet(struct bat_priv *bat_priv, struct vis_info *info) static void batadv_send_vis_packet(struct bat_priv *bat_priv,
struct vis_info *info)
{ {
struct hard_iface *primary_if; struct hard_iface *primary_if;
struct vis_packet *packet; struct vis_packet *packet;
...@@ -845,9 +789,9 @@ static void send_vis_packet(struct bat_priv *bat_priv, struct vis_info *info) ...@@ -845,9 +789,9 @@ static void send_vis_packet(struct bat_priv *bat_priv, struct vis_info *info)
packet->header.ttl--; packet->header.ttl--;
if (is_broadcast_ether_addr(packet->target_orig)) if (is_broadcast_ether_addr(packet->target_orig))
broadcast_vis_packet(bat_priv, info); batadv_broadcast_vis_packet(bat_priv, info);
else else
unicast_vis_packet(bat_priv, info); batadv_unicast_vis_packet(bat_priv, info);
packet->header.ttl++; /* restore TTL */ packet->header.ttl++; /* restore TTL */
out: out:
...@@ -856,7 +800,7 @@ static void send_vis_packet(struct bat_priv *bat_priv, struct vis_info *info) ...@@ -856,7 +800,7 @@ static void send_vis_packet(struct bat_priv *bat_priv, struct vis_info *info)
} }
/* called from timer; send (and maybe generate) vis packet. */ /* called from timer; send (and maybe generate) vis packet. */
static void send_vis_packets(struct work_struct *work) static void batadv_send_vis_packets(struct work_struct *work)
{ {
struct delayed_work *delayed_work = struct delayed_work *delayed_work =
container_of(work, struct delayed_work, work); container_of(work, struct delayed_work, work);
...@@ -865,11 +809,11 @@ static void send_vis_packets(struct work_struct *work) ...@@ -865,11 +809,11 @@ static void send_vis_packets(struct work_struct *work)
struct vis_info *info; struct vis_info *info;
spin_lock_bh(&bat_priv->vis_hash_lock); spin_lock_bh(&bat_priv->vis_hash_lock);
purge_vis_packets(bat_priv); batadv_purge_vis_packets(bat_priv);
if (generate_vis_packet(bat_priv) == 0) { if (batadv_generate_vis_packet(bat_priv) == 0) {
/* schedule if generation was successful */ /* schedule if generation was successful */
send_list_add(bat_priv, bat_priv->my_vis_info); batadv_send_list_add(bat_priv, bat_priv->my_vis_info);
} }
while (!list_empty(&bat_priv->vis_send_list)) { while (!list_empty(&bat_priv->vis_send_list)) {
...@@ -879,14 +823,14 @@ static void send_vis_packets(struct work_struct *work) ...@@ -879,14 +823,14 @@ static void send_vis_packets(struct work_struct *work)
kref_get(&info->refcount); kref_get(&info->refcount);
spin_unlock_bh(&bat_priv->vis_hash_lock); spin_unlock_bh(&bat_priv->vis_hash_lock);
send_vis_packet(bat_priv, info); batadv_send_vis_packet(bat_priv, info);
spin_lock_bh(&bat_priv->vis_hash_lock); spin_lock_bh(&bat_priv->vis_hash_lock);
send_list_del(info); batadv_send_list_del(info);
kref_put(&info->refcount, free_info); kref_put(&info->refcount, batadv_free_info);
} }
spin_unlock_bh(&bat_priv->vis_hash_lock); spin_unlock_bh(&bat_priv->vis_hash_lock);
start_vis_timer(bat_priv); batadv_start_vis_timer(bat_priv);
} }
/* init the vis server. this may only be called when if_list is already /* init the vis server. this may only be called when if_list is already
...@@ -896,6 +840,8 @@ int batadv_vis_init(struct bat_priv *bat_priv) ...@@ -896,6 +840,8 @@ int batadv_vis_init(struct bat_priv *bat_priv)
{ {
struct vis_packet *packet; struct vis_packet *packet;
int hash_added; int hash_added;
unsigned int len;
unsigned long first_seen;
if (bat_priv->vis_hash) if (bat_priv->vis_hash)
return 0; return 0;
...@@ -908,13 +854,12 @@ int batadv_vis_init(struct bat_priv *bat_priv) ...@@ -908,13 +854,12 @@ int batadv_vis_init(struct bat_priv *bat_priv)
goto err; goto err;
} }
bat_priv->my_vis_info = kmalloc(MAX_VIS_PACKET_SIZE, GFP_ATOMIC); bat_priv->my_vis_info = kmalloc(BATADV_MAX_VIS_PACKET_SIZE, GFP_ATOMIC);
if (!bat_priv->my_vis_info) if (!bat_priv->my_vis_info)
goto err; goto err;
bat_priv->my_vis_info->skb_packet = dev_alloc_skb(sizeof(*packet) + len = sizeof(*packet) + BATADV_MAX_VIS_PACKET_SIZE + ETH_HLEN;
MAX_VIS_PACKET_SIZE + bat_priv->my_vis_info->skb_packet = dev_alloc_skb(len);
ETH_HLEN);
if (!bat_priv->my_vis_info->skb_packet) if (!bat_priv->my_vis_info->skb_packet)
goto free_info; goto free_info;
...@@ -923,32 +868,33 @@ int batadv_vis_init(struct bat_priv *bat_priv) ...@@ -923,32 +868,33 @@ int batadv_vis_init(struct bat_priv *bat_priv)
sizeof(*packet)); sizeof(*packet));
/* prefill the vis info */ /* prefill the vis info */
bat_priv->my_vis_info->first_seen = jiffies - first_seen = jiffies - msecs_to_jiffies(BATADV_VIS_INTERVAL);
msecs_to_jiffies(VIS_INTERVAL); bat_priv->my_vis_info->first_seen = first_seen;
INIT_LIST_HEAD(&bat_priv->my_vis_info->recv_list); INIT_LIST_HEAD(&bat_priv->my_vis_info->recv_list);
INIT_LIST_HEAD(&bat_priv->my_vis_info->send_list); INIT_LIST_HEAD(&bat_priv->my_vis_info->send_list);
kref_init(&bat_priv->my_vis_info->refcount); kref_init(&bat_priv->my_vis_info->refcount);
bat_priv->my_vis_info->bat_priv = bat_priv; bat_priv->my_vis_info->bat_priv = bat_priv;
packet->header.version = COMPAT_VERSION; packet->header.version = BATADV_COMPAT_VERSION;
packet->header.packet_type = BAT_VIS; packet->header.packet_type = BAT_VIS;
packet->header.ttl = TTL; packet->header.ttl = BATADV_TTL;
packet->seqno = 0; packet->seqno = 0;
packet->entries = 0; packet->entries = 0;
INIT_LIST_HEAD(&bat_priv->vis_send_list); INIT_LIST_HEAD(&bat_priv->vis_send_list);
hash_added = batadv_hash_add(bat_priv->vis_hash, vis_info_cmp, hash_added = batadv_hash_add(bat_priv->vis_hash, batadv_vis_info_cmp,
vis_info_choose, bat_priv->my_vis_info, batadv_vis_info_choose,
bat_priv->my_vis_info,
&bat_priv->my_vis_info->hash_entry); &bat_priv->my_vis_info->hash_entry);
if (hash_added != 0) { if (hash_added != 0) {
pr_err("Can't add own vis packet into hash\n"); pr_err("Can't add own vis packet into hash\n");
/* not in hash, need to remove it manually. */ /* not in hash, need to remove it manually. */
kref_put(&bat_priv->my_vis_info->refcount, free_info); kref_put(&bat_priv->my_vis_info->refcount, batadv_free_info);
goto err; goto err;
} }
spin_unlock_bh(&bat_priv->vis_hash_lock); spin_unlock_bh(&bat_priv->vis_hash_lock);
start_vis_timer(bat_priv); batadv_start_vis_timer(bat_priv);
return 0; return 0;
free_info: free_info:
...@@ -961,13 +907,13 @@ int batadv_vis_init(struct bat_priv *bat_priv) ...@@ -961,13 +907,13 @@ int batadv_vis_init(struct bat_priv *bat_priv)
} }
/* Decrease the reference count on a hash item info */ /* Decrease the reference count on a hash item info */
static void free_info_ref(struct hlist_node *node, void *arg) static void batadv_free_info_ref(struct hlist_node *node, void *arg)
{ {
struct vis_info *info; struct vis_info *info;
info = container_of(node, struct vis_info, hash_entry); info = container_of(node, struct vis_info, hash_entry);
send_list_del(info); batadv_send_list_del(info);
kref_put(&info->refcount, free_info); kref_put(&info->refcount, batadv_free_info);
} }
/* shutdown vis-server */ /* shutdown vis-server */
...@@ -980,16 +926,16 @@ void batadv_vis_quit(struct bat_priv *bat_priv) ...@@ -980,16 +926,16 @@ void batadv_vis_quit(struct bat_priv *bat_priv)
spin_lock_bh(&bat_priv->vis_hash_lock); spin_lock_bh(&bat_priv->vis_hash_lock);
/* properly remove, kill timers ... */ /* properly remove, kill timers ... */
batadv_hash_delete(bat_priv->vis_hash, free_info_ref, NULL); batadv_hash_delete(bat_priv->vis_hash, batadv_free_info_ref, NULL);
bat_priv->vis_hash = NULL; bat_priv->vis_hash = NULL;
bat_priv->my_vis_info = NULL; bat_priv->my_vis_info = NULL;
spin_unlock_bh(&bat_priv->vis_hash_lock); spin_unlock_bh(&bat_priv->vis_hash_lock);
} }
/* schedule packets for (re)transmission */ /* schedule packets for (re)transmission */
static void start_vis_timer(struct bat_priv *bat_priv) static void batadv_start_vis_timer(struct bat_priv *bat_priv)
{ {
INIT_DELAYED_WORK(&bat_priv->vis_work, send_vis_packets); INIT_DELAYED_WORK(&bat_priv->vis_work, batadv_send_vis_packets);
queue_delayed_work(batadv_event_workqueue, &bat_priv->vis_work, queue_delayed_work(batadv_event_workqueue, &bat_priv->vis_work,
msecs_to_jiffies(VIS_INTERVAL)); msecs_to_jiffies(BATADV_VIS_INTERVAL));
} }
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#define _NET_BATMAN_ADV_VIS_H_ #define _NET_BATMAN_ADV_VIS_H_
/* timeout of vis packets in miliseconds */ /* timeout of vis packets in miliseconds */
#define VIS_TIMEOUT 200000 #define BATADV_VIS_TIMEOUT 200000
int batadv_vis_seq_print_text(struct seq_file *seq, void *offset); int batadv_vis_seq_print_text(struct seq_file *seq, void *offset);
void batadv_receive_server_sync_packet(struct bat_priv *bat_priv, void batadv_receive_server_sync_packet(struct bat_priv *bat_priv,
......
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