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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iEYEABECAAYFAk/r/yQACgkQpGgxIkP9cwefRwCgmLPvqF1y720Bs33vIxIExcY1 tZAAn24dNaVX7niTIF35FS/FuSsswW/J =6YOn -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
82aee5d7c0
|
@ -35,14 +35,14 @@
|
|||
static struct dentry *batadv_debugfs;
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_DEBUG
|
||||
#define LOG_BUFF_MASK (batadv_log_buff_len - 1)
|
||||
#define LOG_BUFF(idx) (debug_log->log_buff[(idx) & LOG_BUFF_MASK])
|
||||
#define BATADV_LOG_BUFF_MASK (batadv_log_buff_len - 1)
|
||||
#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)
|
||||
{
|
||||
LOG_BUFF(debug_log->log_end) = c;
|
||||
BATADV_LOG_BUFF(debug_log->log_end) = c;
|
||||
debug_log->log_end++;
|
||||
|
||||
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,
|
|||
|
||||
while ((!error) && (i < count) &&
|
||||
(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++;
|
||||
|
||||
|
@ -270,7 +270,7 @@ struct bat_debuginfo {
|
|||
const struct file_operations fops;
|
||||
};
|
||||
|
||||
#define BAT_DEBUGINFO(_name, _mode, _open) \
|
||||
#define BATADV_DEBUGINFO(_name, _mode, _open) \
|
||||
struct bat_debuginfo batadv_debuginfo_##_name = { \
|
||||
.attr = { .name = __stringify(_name), \
|
||||
.mode = _mode, }, \
|
||||
|
@ -282,15 +282,17 @@ struct bat_debuginfo batadv_debuginfo_##_name = { \
|
|||
} \
|
||||
};
|
||||
|
||||
static BAT_DEBUGINFO(routing_algos, S_IRUGO, batadv_algorithms_open);
|
||||
static BAT_DEBUGINFO(originators, S_IRUGO, batadv_originators_open);
|
||||
static BAT_DEBUGINFO(gateways, S_IRUGO, batadv_gateways_open);
|
||||
static BAT_DEBUGINFO(transtable_global, S_IRUGO, batadv_transtable_global_open);
|
||||
static BATADV_DEBUGINFO(routing_algos, S_IRUGO, batadv_algorithms_open);
|
||||
static BATADV_DEBUGINFO(originators, S_IRUGO, batadv_originators_open);
|
||||
static BATADV_DEBUGINFO(gateways, S_IRUGO, batadv_gateways_open);
|
||||
static BATADV_DEBUGINFO(transtable_global, S_IRUGO,
|
||||
batadv_transtable_global_open);
|
||||
#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
|
||||
static BAT_DEBUGINFO(transtable_local, S_IRUGO, batadv_transtable_local_open);
|
||||
static BAT_DEBUGINFO(vis_data, S_IRUGO, batadv_vis_data_open);
|
||||
static BATADV_DEBUGINFO(transtable_local, S_IRUGO,
|
||||
batadv_transtable_local_open);
|
||||
static BATADV_DEBUGINFO(vis_data, S_IRUGO, batadv_vis_data_open);
|
||||
|
||||
static struct bat_debuginfo *batadv_mesh_debuginfos[] = {
|
||||
&batadv_debuginfo_originators,
|
||||
|
@ -309,7 +311,7 @@ void batadv_debugfs_init(void)
|
|||
struct bat_debuginfo *bat_debug;
|
||||
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))
|
||||
batadv_debugfs = NULL;
|
||||
|
||||
|
@ -360,8 +362,8 @@ int batadv_debugfs_add_meshif(struct net_device *dev)
|
|||
bat_priv->debug_dir,
|
||||
dev, &(*bat_debug)->fops);
|
||||
if (!file) {
|
||||
bat_err(dev, "Can't add debugfs file: %s/%s\n",
|
||||
dev->name, ((*bat_debug)->attr).name);
|
||||
batadv_err(dev, "Can't add debugfs file: %s/%s\n",
|
||||
dev->name, ((*bat_debug)->attr).name);
|
||||
goto rem_attr;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#ifndef _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_destroy(void);
|
||||
|
|
|
@ -64,7 +64,7 @@ static int batadv_iv_ogm_iface_enable(struct hard_iface *hard_iface)
|
|||
get_random_bytes(&random_seqno, sizeof(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);
|
||||
|
||||
if (!hard_iface->packet_buff)
|
||||
|
@ -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->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->flags = NO_FLAGS;
|
||||
batman_ogm_packet->tq = TQ_MAX_VALUE;
|
||||
batman_ogm_packet->flags = BATADV_NO_FLAGS;
|
||||
batman_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
|
||||
batman_ogm_packet->tt_num_changes = 0;
|
||||
batman_ogm_packet->ttvn = 0;
|
||||
|
||||
|
@ -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->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 */
|
||||
static unsigned long
|
||||
batadv_iv_ogm_emit_send_time(const struct bat_priv *bat_priv)
|
||||
{
|
||||
return jiffies + msecs_to_jiffies(
|
||||
atomic_read(&bat_priv->orig_interval) -
|
||||
JITTER + (random32() % 2*JITTER));
|
||||
unsigned int msecs;
|
||||
|
||||
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 */
|
||||
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 */
|
||||
static uint8_t batadv_hop_penalty(uint8_t tq, const struct bat_priv *bat_priv)
|
||||
{
|
||||
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? */
|
||||
|
@ -139,11 +147,11 @@ static int batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
|
|||
{
|
||||
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);
|
||||
|
||||
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 */
|
||||
|
@ -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,
|
||||
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);
|
||||
packet_num++;
|
||||
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,
|
|||
int aggregated_bytes = forw_packet->packet_len + packet_len;
|
||||
struct hard_iface *primary_if = NULL;
|
||||
bool res = false;
|
||||
unsigned long aggregation_end_time;
|
||||
|
||||
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
|
||||
* if:
|
||||
|
@ -301,9 +312,8 @@ batadv_iv_ogm_can_aggregate(const struct batman_ogm_packet *new_bat_ogm_packet,
|
|||
* MAX_AGGREGATION_BYTES
|
||||
*/
|
||||
if (time_before(send_time, forw_packet->send_time) &&
|
||||
time_after_eq(send_time + msecs_to_jiffies(MAX_AGGREGATION_MS),
|
||||
forw_packet->send_time) &&
|
||||
(aggregated_bytes <= MAX_AGGREGATION_BYTES)) {
|
||||
time_after_eq(aggregation_end_time, forw_packet->send_time) &&
|
||||
(aggregated_bytes <= BATADV_MAX_AGGREGATION_BYTES)) {
|
||||
|
||||
/* check aggregation compatibility
|
||||
* -> direct link packets are broadcasted on
|
||||
|
@ -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 forw_packet *forw_packet_aggr;
|
||||
unsigned char *skb_buff;
|
||||
unsigned int skb_size;
|
||||
|
||||
if (!atomic_inc_not_zero(&if_incoming->refcount))
|
||||
return;
|
||||
|
||||
/* own packet should always be scheduled */
|
||||
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,
|
||||
"batman packet queue full\n");
|
||||
goto out;
|
||||
|
@ -388,12 +399,12 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
|
|||
}
|
||||
|
||||
if ((atomic_read(&bat_priv->aggregated_ogms)) &&
|
||||
(packet_len < MAX_AGGREGATION_BYTES))
|
||||
forw_packet_aggr->skb = dev_alloc_skb(MAX_AGGREGATION_BYTES +
|
||||
ETH_HLEN);
|
||||
(packet_len < BATADV_MAX_AGGREGATION_BYTES))
|
||||
skb_size = BATADV_MAX_AGGREGATION_BYTES + ETH_HLEN;
|
||||
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 (!own_packet)
|
||||
atomic_inc(&bat_priv->batman_queue_left);
|
||||
|
@ -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->if_incoming = if_incoming;
|
||||
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;
|
||||
|
||||
/* save packet direct link flag status */
|
||||
|
@ -466,9 +477,11 @@ static void batadv_iv_ogm_queue_add(struct bat_priv *bat_priv,
|
|||
struct hlist_node *tmp_node;
|
||||
struct batman_ogm_packet *batman_ogm_packet;
|
||||
bool direct_link;
|
||||
unsigned long max_aggregation_jiffies;
|
||||
|
||||
batman_ogm_packet = (struct batman_ogm_packet *)packet_buff;
|
||||
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 */
|
||||
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,
|
|||
* we hold it back for a while, so that it might be aggregated
|
||||
* later on
|
||||
*/
|
||||
if ((!own_packet) &&
|
||||
(atomic_read(&bat_priv->aggregated_ogms)))
|
||||
send_time += msecs_to_jiffies(MAX_AGGREGATION_MS);
|
||||
if (!own_packet && atomic_read(&bat_priv->aggregated_ogms))
|
||||
send_time += max_aggregation_jiffies;
|
||||
|
||||
batadv_iv_ogm_aggregate_new(packet_buff, packet_len,
|
||||
send_time, direct_link,
|
||||
|
@ -561,7 +573,7 @@ static void batadv_iv_ogm_forward(struct orig_node *orig_node,
|
|||
batman_ogm_packet->flags &= ~DIRECTLINK;
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
|
@ -579,7 +591,7 @@ static void batadv_iv_ogm_schedule(struct hard_iface *hard_iface)
|
|||
tt_num_changes = batadv_tt_append_diff(bat_priv,
|
||||
&hard_iface->packet_buff,
|
||||
&hard_iface->packet_len,
|
||||
BATMAN_OGM_HLEN);
|
||||
BATADV_OGM_HLEN);
|
||||
|
||||
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)
|
|||
batman_ogm_packet->gw_flags =
|
||||
(uint8_t)atomic_read(&bat_priv->gw_bandwidth);
|
||||
else
|
||||
batman_ogm_packet->gw_flags = NO_FLAGS;
|
||||
batman_ogm_packet->gw_flags = BATADV_NO_FLAGS;
|
||||
|
||||
batadv_slide_own_bcast_window(hard_iface);
|
||||
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,
|
|||
struct neigh_node *neigh_node = NULL, *tmp_neigh_node;
|
||||
struct hlist_node *node;
|
||||
uint8_t total_count;
|
||||
uint8_t orig_eq_count, neigh_rq_count, tq_own;
|
||||
int tq_asym_penalty, ret = 0;
|
||||
uint8_t orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own;
|
||||
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 */
|
||||
rcu_read_lock();
|
||||
|
@ -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 receive too few packets it is not considered bidirectional
|
||||
*/
|
||||
if ((total_count < TQ_LOCAL_BIDRECT_SEND_MINIMUM) ||
|
||||
(neigh_rq_count < TQ_LOCAL_BIDRECT_RECV_MINIMUM))
|
||||
if (total_count < BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM ||
|
||||
neigh_rq_count < BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM)
|
||||
tq_own = 0;
|
||||
else
|
||||
/* neigh_node->real_packet_count is never zero as we
|
||||
* only purge old information when getting new
|
||||
* 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
|
||||
* affect the nearly-symmetric links only a little, but
|
||||
* punishes asymmetric links more. This will give a value
|
||||
* between 0 and TQ_MAX_VALUE
|
||||
*/
|
||||
tq_asym_penalty = TQ_MAX_VALUE - (TQ_MAX_VALUE *
|
||||
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count) *
|
||||
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count) *
|
||||
(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count)) /
|
||||
(TQ_LOCAL_WINDOW_SIZE *
|
||||
TQ_LOCAL_WINDOW_SIZE *
|
||||
TQ_LOCAL_WINDOW_SIZE);
|
||||
neigh_rq_inv = BATADV_TQ_LOCAL_WINDOW_SIZE - neigh_rq_count;
|
||||
neigh_rq_inv_cube = neigh_rq_inv * neigh_rq_inv * neigh_rq_inv;
|
||||
neigh_rq_max_cube = BATADV_TQ_LOCAL_WINDOW_SIZE *
|
||||
BATADV_TQ_LOCAL_WINDOW_SIZE *
|
||||
BATADV_TQ_LOCAL_WINDOW_SIZE;
|
||||
inv_asym_penalty = BATADV_TQ_MAX_VALUE * neigh_rq_inv_cube;
|
||||
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) /
|
||||
(TQ_MAX_VALUE * TQ_MAX_VALUE));
|
||||
combined_tq = batman_ogm_packet->tq * tq_own * tq_asym_penalty;
|
||||
combined_tq /= BATADV_TQ_MAX_VALUE * BATADV_TQ_MAX_VALUE;
|
||||
batman_ogm_packet->tq = combined_tq;
|
||||
|
||||
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",
|
||||
|
@ -860,7 +875,7 @@ static int batadv_iv_ogm_calc_tq(struct orig_node *orig_node,
|
|||
/* if link has the minimum required transmission quality
|
||||
* consider it bidirectional
|
||||
*/
|
||||
if (batman_ogm_packet->tq >= TQ_TOTAL_BIDRECT_LIMIT)
|
||||
if (batman_ogm_packet->tq >= BATADV_TQ_TOTAL_BIDRECT_LIMIT)
|
||||
ret = 1;
|
||||
|
||||
out:
|
||||
|
@ -928,7 +943,7 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
|
|||
|
||||
tmp_neigh_node->real_packet_count =
|
||||
bitmap_weight(tmp_neigh_node->real_bits,
|
||||
TQ_LOCAL_WINDOW_SIZE);
|
||||
BATADV_TQ_LOCAL_WINDOW_SIZE);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
|
@ -1025,7 +1040,7 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
|
|||
}
|
||||
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,
|
||||
"Drop packet: incompatible batman version (%i)\n",
|
||||
batman_ogm_packet->header.version);
|
||||
|
@ -1050,6 +1065,8 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
|
|||
unsigned long *word;
|
||||
int offset;
|
||||
int32_t bit_pos;
|
||||
int16_t if_num;
|
||||
uint8_t *weight;
|
||||
|
||||
orig_neigh_node = batadv_get_orig_node(bat_priv,
|
||||
ethhdr->h_source);
|
||||
|
@ -1063,15 +1080,17 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
|
|||
if (has_directlink_flag &&
|
||||
batadv_compare_eth(if_incoming->net_dev->dev_addr,
|
||||
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);
|
||||
word = &(orig_neigh_node->bcast_own[offset]);
|
||||
bit_pos = if_incoming_seqno - 2;
|
||||
bit_pos -= ntohl(batman_ogm_packet->seqno);
|
||||
batadv_set_bit(word, bit_pos);
|
||||
orig_neigh_node->bcast_own_sum[if_incoming->if_num] =
|
||||
bitmap_weight(word, TQ_LOCAL_WINDOW_SIZE);
|
||||
weight = &orig_neigh_node->bcast_own_sum[if_num];
|
||||
*weight = bitmap_weight(word,
|
||||
BATADV_TQ_LOCAL_WINDOW_SIZE);
|
||||
spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock);
|
||||
}
|
||||
|
||||
|
@ -1227,7 +1246,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
|
|||
unsigned char *tt_buff, *packet_buff;
|
||||
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)
|
||||
return NET_RX_DROP;
|
||||
|
||||
|
@ -1248,12 +1267,12 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
|
|||
|
||||
/* unpack the aggregated packets and process them one by one */
|
||||
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,
|
||||
if_incoming);
|
||||
|
||||
buff_pos += BATMAN_OGM_HLEN;
|
||||
buff_pos += BATADV_OGM_HLEN;
|
||||
buff_pos += batadv_tt_len(batman_ogm_packet->tt_num_changes);
|
||||
|
||||
batman_ogm_packet = (struct batman_ogm_packet *)
|
||||
|
|
|
@ -38,9 +38,9 @@ static struct bat_priv *batadv_kobj_to_batpriv(struct kobject *obj)
|
|||
return netdev_priv(net_dev);
|
||||
}
|
||||
|
||||
#define UEV_TYPE_VAR "BATTYPE="
|
||||
#define UEV_ACTION_VAR "BATACTION="
|
||||
#define UEV_DATA_VAR "BATDATA="
|
||||
#define BATADV_UEV_TYPE_VAR "BATTYPE="
|
||||
#define BATADV_UEV_ACTION_VAR "BATACTION="
|
||||
#define BATADV_UEV_DATA_VAR "BATDATA="
|
||||
|
||||
static char *batadv_uev_action_str[] = {
|
||||
"add",
|
||||
|
@ -53,15 +53,15 @@ static char *batadv_uev_type_str[] = {
|
|||
};
|
||||
|
||||
/* Use this, if you have customized show and store functions */
|
||||
#define BAT_ATTR(_name, _mode, _show, _store) \
|
||||
struct bat_attribute batadv_attr_##_name = { \
|
||||
.attr = {.name = __stringify(_name), \
|
||||
.mode = _mode }, \
|
||||
.show = _show, \
|
||||
.store = _store, \
|
||||
#define BATADV_ATTR(_name, _mode, _show, _store) \
|
||||
struct bat_attribute batadv_attr_##_name = { \
|
||||
.attr = {.name = __stringify(_name), \
|
||||
.mode = _mode }, \
|
||||
.show = _show, \
|
||||
.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, \
|
||||
struct attribute *attr, char *buff, \
|
||||
size_t count) \
|
||||
|
@ -72,7 +72,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
|
|||
&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, \
|
||||
struct attribute *attr, char *buff) \
|
||||
{ \
|
||||
|
@ -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
|
||||
* (bat_priv) on or off
|
||||
*/
|
||||
#define BAT_ATTR_SIF_BOOL(_name, _mode, _post_func) \
|
||||
static BAT_ATTR_SIF_STORE_BOOL(_name, _post_func) \
|
||||
static BAT_ATTR_SIF_SHOW_BOOL(_name) \
|
||||
static BAT_ATTR(_name, _mode, batadv_show_##_name, \
|
||||
batadv_store_##_name)
|
||||
#define BATADV_ATTR_SIF_BOOL(_name, _mode, _post_func) \
|
||||
static BATADV_ATTR_SIF_STORE_BOOL(_name, _post_func) \
|
||||
static BATADV_ATTR_SIF_SHOW_BOOL(_name) \
|
||||
static BATADV_ATTR(_name, _mode, batadv_show_##_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, \
|
||||
struct attribute *attr, char *buff, \
|
||||
size_t count) \
|
||||
|
@ -104,7 +104,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
|
|||
&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, \
|
||||
struct attribute *attr, char *buff) \
|
||||
{ \
|
||||
|
@ -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
|
||||
* (bat_priv) to an unsigned integer value
|
||||
*/
|
||||
#define BAT_ATTR_SIF_UINT(_name, _mode, _min, _max, _post_func) \
|
||||
static BAT_ATTR_SIF_STORE_UINT(_name, _min, _max, _post_func) \
|
||||
static BAT_ATTR_SIF_SHOW_UINT(_name) \
|
||||
static BAT_ATTR(_name, _mode, batadv_show_##_name, \
|
||||
batadv_store_##_name)
|
||||
#define BATADV_ATTR_SIF_UINT(_name, _mode, _min, _max, _post_func) \
|
||||
static BATADV_ATTR_SIF_STORE_UINT(_name, _min, _max, _post_func)\
|
||||
static BATADV_ATTR_SIF_SHOW_UINT(_name) \
|
||||
static BATADV_ATTR(_name, _mode, batadv_show_##_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, \
|
||||
struct attribute *attr, char *buff, \
|
||||
size_t count) \
|
||||
|
@ -143,7 +143,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
|
|||
return length; \
|
||||
}
|
||||
|
||||
#define BAT_ATTR_HIF_SHOW_UINT(_name) \
|
||||
#define BATADV_ATTR_HIF_SHOW_UINT(_name) \
|
||||
ssize_t batadv_show_##_name(struct kobject *kobj, \
|
||||
struct attribute *attr, char *buff) \
|
||||
{ \
|
||||
|
@ -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
|
||||
* unsigned integer value
|
||||
*/
|
||||
#define BAT_ATTR_HIF_UINT(_name, _mode, _min, _max, _post_func) \
|
||||
static BAT_ATTR_HIF_STORE_UINT(_name, _min, _max, _post_func) \
|
||||
static BAT_ATTR_HIF_SHOW_UINT(_name) \
|
||||
static BAT_ATTR(_name, _mode, batadv_show_##_name, \
|
||||
batadv_store_##_name)
|
||||
#define BATADV_ATTR_HIF_UINT(_name, _mode, _min, _max, _post_func) \
|
||||
static BATADV_ATTR_HIF_STORE_UINT(_name, _min, _max, _post_func)\
|
||||
static BATADV_ATTR_HIF_SHOW_UINT(_name) \
|
||||
static BATADV_ATTR(_name, _mode, batadv_show_##_name, \
|
||||
batadv_store_##_name)
|
||||
|
||||
|
||||
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;
|
||||
|
||||
if (enabled < 0) {
|
||||
bat_info(net_dev,
|
||||
"%s: Invalid parameter received: %s\n",
|
||||
attr_name, buff);
|
||||
batadv_info(net_dev, "%s: Invalid parameter received: %s\n",
|
||||
attr_name, buff);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (atomic_read(attr) == enabled)
|
||||
return count;
|
||||
|
||||
bat_info(net_dev, "%s: Changing from: %s to: %s\n", attr_name,
|
||||
atomic_read(attr) == 1 ? "enabled" : "disabled",
|
||||
enabled == 1 ? "enabled" : "disabled");
|
||||
batadv_info(net_dev, "%s: Changing from: %s to: %s\n", attr_name,
|
||||
atomic_read(attr) == 1 ? "enabled" : "disabled",
|
||||
enabled == 1 ? "enabled" : "disabled");
|
||||
|
||||
atomic_set(attr, (unsigned int)enabled);
|
||||
return count;
|
||||
|
@ -235,29 +234,28 @@ static int batadv_store_uint_attr(const char *buff, size_t count,
|
|||
|
||||
ret = kstrtoul(buff, 10, &uint_val);
|
||||
if (ret) {
|
||||
bat_info(net_dev,
|
||||
"%s: Invalid parameter received: %s\n",
|
||||
attr_name, buff);
|
||||
batadv_info(net_dev, "%s: Invalid parameter received: %s\n",
|
||||
attr_name, buff);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (uint_val < min) {
|
||||
bat_info(net_dev, "%s: Value is too small: %lu min: %u\n",
|
||||
attr_name, uint_val, min);
|
||||
batadv_info(net_dev, "%s: Value is too small: %lu min: %u\n",
|
||||
attr_name, uint_val, min);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (uint_val > max) {
|
||||
bat_info(net_dev, "%s: Value is too big: %lu max: %u\n",
|
||||
attr_name, uint_val, max);
|
||||
batadv_info(net_dev, "%s: Value is too big: %lu max: %u\n",
|
||||
attr_name, uint_val, max);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (atomic_read(attr) == uint_val)
|
||||
return count;
|
||||
|
||||
bat_info(net_dev, "%s: Changing from: %i to: %lu\n",
|
||||
attr_name, atomic_read(attr), uint_val);
|
||||
batadv_info(net_dev, "%s: Changing from: %i to: %lu\n",
|
||||
attr_name, atomic_read(attr), uint_val);
|
||||
|
||||
atomic_set(attr, uint_val);
|
||||
return count;
|
||||
|
@ -299,6 +297,7 @@ static ssize_t batadv_store_vis_mode(struct kobject *kobj,
|
|||
struct bat_priv *bat_priv = netdev_priv(net_dev);
|
||||
unsigned long val;
|
||||
int ret, vis_mode_tmp = -1;
|
||||
const char *old_mode, *new_mode;
|
||||
|
||||
ret = kstrtoul(buff, 10, &val);
|
||||
|
||||
|
@ -315,19 +314,27 @@ static ssize_t batadv_store_vis_mode(struct kobject *kobj,
|
|||
if (buff[count - 1] == '\n')
|
||||
buff[count - 1] = '\0';
|
||||
|
||||
bat_info(net_dev,
|
||||
"Invalid parameter for 'vis mode' setting received: %s\n",
|
||||
buff);
|
||||
batadv_info(net_dev,
|
||||
"Invalid parameter for 'vis mode' setting received: %s\n",
|
||||
buff);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (atomic_read(&bat_priv->vis_mode) == vis_mode_tmp)
|
||||
return count;
|
||||
|
||||
bat_info(net_dev, "Changing vis mode from: %s to: %s\n",
|
||||
atomic_read(&bat_priv->vis_mode) == VIS_TYPE_CLIENT_UPDATE ?
|
||||
"client" : "server", vis_mode_tmp == VIS_TYPE_CLIENT_UPDATE ?
|
||||
"client" : "server");
|
||||
if (atomic_read(&bat_priv->vis_mode) == VIS_TYPE_CLIENT_UPDATE)
|
||||
old_mode = "client";
|
||||
else
|
||||
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);
|
||||
return count;
|
||||
|
@ -354,13 +361,16 @@ static ssize_t batadv_show_gw_mode(struct kobject *kobj, struct attribute *attr,
|
|||
|
||||
switch (atomic_read(&bat_priv->gw_mode)) {
|
||||
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;
|
||||
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;
|
||||
default:
|
||||
bytes_written = sprintf(buff, "%s\n", GW_MODE_OFF_NAME);
|
||||
bytes_written = sprintf(buff, "%s\n",
|
||||
BATADV_GW_MODE_OFF_NAME);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -379,21 +389,22 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj,
|
|||
if (buff[count - 1] == '\n')
|
||||
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;
|
||||
|
||||
if (strncmp(buff, GW_MODE_CLIENT_NAME,
|
||||
strlen(GW_MODE_CLIENT_NAME)) == 0)
|
||||
if (strncmp(buff, BATADV_GW_MODE_CLIENT_NAME,
|
||||
strlen(BATADV_GW_MODE_CLIENT_NAME)) == 0)
|
||||
gw_mode_tmp = GW_MODE_CLIENT;
|
||||
|
||||
if (strncmp(buff, GW_MODE_SERVER_NAME,
|
||||
strlen(GW_MODE_SERVER_NAME)) == 0)
|
||||
if (strncmp(buff, BATADV_GW_MODE_SERVER_NAME,
|
||||
strlen(BATADV_GW_MODE_SERVER_NAME)) == 0)
|
||||
gw_mode_tmp = GW_MODE_SERVER;
|
||||
|
||||
if (gw_mode_tmp < 0) {
|
||||
bat_info(net_dev,
|
||||
"Invalid parameter for 'gw mode' setting received: %s\n",
|
||||
buff);
|
||||
batadv_info(net_dev,
|
||||
"Invalid parameter for 'gw mode' setting received: %s\n",
|
||||
buff);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -402,18 +413,18 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj,
|
|||
|
||||
switch (atomic_read(&bat_priv->gw_mode)) {
|
||||
case GW_MODE_CLIENT:
|
||||
curr_gw_mode_str = GW_MODE_CLIENT_NAME;
|
||||
curr_gw_mode_str = BATADV_GW_MODE_CLIENT_NAME;
|
||||
break;
|
||||
case GW_MODE_SERVER:
|
||||
curr_gw_mode_str = GW_MODE_SERVER_NAME;
|
||||
curr_gw_mode_str = BATADV_GW_MODE_SERVER_NAME;
|
||||
break;
|
||||
default:
|
||||
curr_gw_mode_str = GW_MODE_OFF_NAME;
|
||||
curr_gw_mode_str = BATADV_GW_MODE_OFF_NAME;
|
||||
break;
|
||||
}
|
||||
|
||||
bat_info(net_dev, "Changing gw mode from: %s to: %s\n",
|
||||
curr_gw_mode_str, buff);
|
||||
batadv_info(net_dev, "Changing gw mode from: %s to: %s\n",
|
||||
curr_gw_mode_str, buff);
|
||||
|
||||
batadv_gw_deselect(bat_priv);
|
||||
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,
|
|||
return batadv_gw_bandwidth_set(net_dev, buff, count);
|
||||
}
|
||||
|
||||
BAT_ATTR_SIF_BOOL(aggregated_ogms, S_IRUGO | S_IWUSR, NULL);
|
||||
BAT_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
|
||||
BATADV_ATTR_SIF_BOOL(aggregated_ogms, S_IRUGO | S_IWUSR, NULL);
|
||||
BATADV_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
|
||||
#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
|
||||
BAT_ATTR_SIF_BOOL(fragmentation, S_IRUGO | S_IWUSR, batadv_update_min_mtu);
|
||||
BAT_ATTR_SIF_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
|
||||
static BAT_ATTR(vis_mode, S_IRUGO | S_IWUSR, batadv_show_vis_mode,
|
||||
batadv_store_vis_mode);
|
||||
static BAT_ATTR(routing_algo, S_IRUGO, batadv_show_bat_algo, NULL);
|
||||
static BAT_ATTR(gw_mode, S_IRUGO | S_IWUSR, batadv_show_gw_mode,
|
||||
batadv_store_gw_mode);
|
||||
BAT_ATTR_SIF_UINT(orig_interval, S_IRUGO | S_IWUSR, 2 * JITTER, INT_MAX, NULL);
|
||||
BAT_ATTR_SIF_UINT(hop_penalty, S_IRUGO | S_IWUSR, 0, TQ_MAX_VALUE, NULL);
|
||||
BAT_ATTR_SIF_UINT(gw_sel_class, S_IRUGO | S_IWUSR, 1, TQ_MAX_VALUE,
|
||||
batadv_post_gw_deselect);
|
||||
static BAT_ATTR(gw_bandwidth, S_IRUGO | S_IWUSR, batadv_show_gw_bwidth,
|
||||
batadv_store_gw_bwidth);
|
||||
BATADV_ATTR_SIF_BOOL(fragmentation, S_IRUGO | S_IWUSR, batadv_update_min_mtu);
|
||||
BATADV_ATTR_SIF_BOOL(ap_isolation, S_IRUGO | S_IWUSR, NULL);
|
||||
static BATADV_ATTR(vis_mode, S_IRUGO | S_IWUSR, batadv_show_vis_mode,
|
||||
batadv_store_vis_mode);
|
||||
static BATADV_ATTR(routing_algo, S_IRUGO, batadv_show_bat_algo, NULL);
|
||||
static BATADV_ATTR(gw_mode, S_IRUGO | S_IWUSR, batadv_show_gw_mode,
|
||||
batadv_store_gw_mode);
|
||||
BATADV_ATTR_SIF_UINT(orig_interval, S_IRUGO | S_IWUSR, 2 * BATADV_JITTER,
|
||||
INT_MAX, NULL);
|
||||
BATADV_ATTR_SIF_UINT(hop_penalty, S_IRUGO | S_IWUSR, 0, BATADV_TQ_MAX_VALUE,
|
||||
NULL);
|
||||
BATADV_ATTR_SIF_UINT(gw_sel_class, S_IRUGO | S_IWUSR, 1, BATADV_TQ_MAX_VALUE,
|
||||
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
|
||||
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
|
||||
|
||||
static struct bat_attribute *batadv_mesh_attrs[] = {
|
||||
|
@ -497,11 +510,11 @@ int batadv_sysfs_add_meshif(struct net_device *dev)
|
|||
struct bat_attribute **bat_attr;
|
||||
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);
|
||||
if (!bat_priv->mesh_obj) {
|
||||
bat_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
|
||||
SYSFS_IF_MESH_SUBDIR);
|
||||
batadv_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
|
||||
BATADV_SYSFS_IF_MESH_SUBDIR);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -509,9 +522,9 @@ int batadv_sysfs_add_meshif(struct net_device *dev)
|
|||
err = sysfs_create_file(bat_priv->mesh_obj,
|
||||
&((*bat_attr)->attr));
|
||||
if (err) {
|
||||
bat_err(dev, "Can't add sysfs file: %s/%s/%s\n",
|
||||
dev->name, SYSFS_IF_MESH_SUBDIR,
|
||||
((*bat_attr)->attr).name);
|
||||
batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
|
||||
dev->name, BATADV_SYSFS_IF_MESH_SUBDIR,
|
||||
((*bat_attr)->attr).name);
|
||||
goto rem_attr;
|
||||
}
|
||||
}
|
||||
|
@ -649,9 +662,9 @@ static ssize_t batadv_show_iface_status(struct kobject *kobj,
|
|||
return length;
|
||||
}
|
||||
|
||||
static BAT_ATTR(mesh_iface, S_IRUGO | S_IWUSR,
|
||||
batadv_show_mesh_iface, batadv_store_mesh_iface);
|
||||
static BAT_ATTR(iface_status, S_IRUGO, batadv_show_iface_status, NULL);
|
||||
static BATADV_ATTR(mesh_iface, S_IRUGO | S_IWUSR, batadv_show_mesh_iface,
|
||||
batadv_store_mesh_iface);
|
||||
static BATADV_ATTR(iface_status, S_IRUGO, batadv_show_iface_status, NULL);
|
||||
|
||||
static struct bat_attribute *batadv_batman_attrs[] = {
|
||||
&batadv_attr_mesh_iface,
|
||||
|
@ -665,21 +678,21 @@ int batadv_sysfs_add_hardif(struct kobject **hardif_obj, struct net_device *dev)
|
|||
struct bat_attribute **bat_attr;
|
||||
int err;
|
||||
|
||||
*hardif_obj = kobject_create_and_add(SYSFS_IF_BAT_SUBDIR,
|
||||
hardif_kobject);
|
||||
*hardif_obj = kobject_create_and_add(BATADV_SYSFS_IF_BAT_SUBDIR,
|
||||
hardif_kobject);
|
||||
|
||||
if (!*hardif_obj) {
|
||||
bat_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
|
||||
SYSFS_IF_BAT_SUBDIR);
|
||||
batadv_err(dev, "Can't add sysfs directory: %s/%s\n", dev->name,
|
||||
BATADV_SYSFS_IF_BAT_SUBDIR);
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (bat_attr = batadv_batman_attrs; *bat_attr; ++bat_attr) {
|
||||
err = sysfs_create_file(*hardif_obj, &((*bat_attr)->attr));
|
||||
if (err) {
|
||||
bat_err(dev, "Can't add sysfs file: %s/%s/%s\n",
|
||||
dev->name, SYSFS_IF_BAT_SUBDIR,
|
||||
((*bat_attr)->attr).name);
|
||||
batadv_err(dev, "Can't add sysfs file: %s/%s/%s\n",
|
||||
dev->name, BATADV_SYSFS_IF_BAT_SUBDIR,
|
||||
((*bat_attr)->attr).name);
|
||||
goto rem_attr;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
uevent_env[0] = kmalloc(strlen(UEV_TYPE_VAR) +
|
||||
uevent_env[0] = kmalloc(strlen(BATADV_UEV_TYPE_VAR) +
|
||||
strlen(batadv_uev_type_str[type]) + 1,
|
||||
GFP_ATOMIC);
|
||||
if (!uevent_env[0])
|
||||
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,
|
||||
GFP_ATOMIC);
|
||||
if (!uevent_env[1])
|
||||
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]);
|
||||
|
||||
/* If the event is DEL, ignore the data field */
|
||||
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);
|
||||
if (!uevent_env[2])
|
||||
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);
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
#ifndef _NET_BATMAN_ADV_SYSFS_H_
|
||||
#define _NET_BATMAN_ADV_SYSFS_H_
|
||||
|
||||
#define SYSFS_IF_MESH_SUBDIR "mesh"
|
||||
#define SYSFS_IF_BAT_SUBDIR "batman_adv"
|
||||
#define BATADV_SYSFS_IF_MESH_SUBDIR "mesh"
|
||||
#define BATADV_SYSFS_IF_BAT_SUBDIR "batman_adv"
|
||||
|
||||
struct bat_attribute {
|
||||
struct attribute attr;
|
||||
|
|
|
@ -25,10 +25,10 @@
|
|||
/* shift the packet array by n places. */
|
||||
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;
|
||||
|
||||
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,
|
|||
/* sequence number is slightly older. We already got a sequence number
|
||||
* 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)
|
||||
batadv_set_bit(seq_bits, -seq_num_diff);
|
||||
return 0;
|
||||
|
@ -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
|
||||
* 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);
|
||||
|
||||
if (set_mark)
|
||||
|
@ -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 */
|
||||
if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE) &&
|
||||
(seq_num_diff < EXPECTED_SEQNO_RANGE)) {
|
||||
if (seq_num_diff >= BATADV_TQ_LOCAL_WINDOW_SIZE &&
|
||||
seq_num_diff < BATADV_EXPECTED_SEQNO_RANGE) {
|
||||
batadv_dbg(DBG_BATMAN, bat_priv,
|
||||
"We missed a lot of packets (%i) !\n",
|
||||
seq_num_diff - 1);
|
||||
bitmap_zero(seq_bits, TQ_LOCAL_WINDOW_SIZE);
|
||||
bitmap_zero(seq_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
|
||||
if (set_mark)
|
||||
batadv_set_bit(seq_bits, 0);
|
||||
return 1;
|
||||
|
@ -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
|
||||
* seqno window is protected.
|
||||
*/
|
||||
if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) ||
|
||||
(seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
|
||||
if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
|
||||
seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
|
||||
|
||||
batadv_dbg(DBG_BATMAN, bat_priv,
|
||||
"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)
|
||||
batadv_set_bit(seq_bits, 0);
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ static inline int batadv_test_bit(const unsigned long *seq_bits,
|
|||
int32_t diff;
|
||||
|
||||
diff = last_seqno - curr_seqno;
|
||||
if (diff < 0 || diff >= TQ_LOCAL_WINDOW_SIZE)
|
||||
if (diff < 0 || diff >= BATADV_TQ_LOCAL_WINDOW_SIZE)
|
||||
return 0;
|
||||
else
|
||||
return test_bit(diff, 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)
|
||||
{
|
||||
/* if too old, just drop it */
|
||||
if (n < 0 || n >= TQ_LOCAL_WINDOW_SIZE)
|
||||
if (n < 0 || n >= BATADV_TQ_LOCAL_WINDOW_SIZE)
|
||||
return;
|
||||
|
||||
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)
|
|||
}
|
||||
|
||||
/* 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
|
||||
|
@ -375,7 +375,7 @@ static struct backbone_gw *batadv_bla_get_backbone_gw(struct bat_priv *bat_priv,
|
|||
|
||||
entry->vid = vid;
|
||||
entry->lasttime = jiffies;
|
||||
entry->crc = BLA_CRC_INIT;
|
||||
entry->crc = BATADV_BLA_CRC_INIT;
|
||||
entry->bat_priv = bat_priv;
|
||||
atomic_set(&entry->request_sent, 0);
|
||||
memcpy(entry->orig, orig, ETH_ALEN);
|
||||
|
@ -949,7 +949,7 @@ static void batadv_bla_purge_backbone_gw(struct bat_priv *bat_priv, int now)
|
|||
if (now)
|
||||
goto purge_now;
|
||||
if (!batadv_has_timed_out(backbone_gw->lasttime,
|
||||
BLA_BACKBONE_TIMEOUT))
|
||||
BATADV_BLA_BACKBONE_TIMEOUT))
|
||||
continue;
|
||||
|
||||
batadv_dbg(DBG_BLA, backbone_gw->bat_priv,
|
||||
|
@ -1001,7 +1001,7 @@ static void batadv_bla_purge_claims(struct bat_priv *bat_priv,
|
|||
primary_if->net_dev->dev_addr))
|
||||
continue;
|
||||
if (!batadv_has_timed_out(claim->lasttime,
|
||||
BLA_CLAIM_TIMEOUT))
|
||||
BATADV_BLA_CLAIM_TIMEOUT))
|
||||
continue;
|
||||
|
||||
batadv_dbg(DBG_BLA, 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);
|
||||
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:
|
||||
|
@ -1162,9 +1162,9 @@ int batadv_bla_init(struct bat_priv *bat_priv)
|
|||
}
|
||||
|
||||
/* 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 =
|
||||
jiffies - msecs_to_jiffies(DUPLIST_TIMEOUT);
|
||||
jiffies - msecs_to_jiffies(BATADV_DUPLIST_TIMEOUT);
|
||||
bat_priv->bcast_duplist_curr = 0;
|
||||
|
||||
if (bat_priv->claim_hash)
|
||||
|
@ -1216,14 +1216,15 @@ int batadv_bla_check_bcast_duplist(struct bat_priv *bat_priv,
|
|||
/* calculate the crc ... */
|
||||
crc = crc16(0, content, length);
|
||||
|
||||
for (i = 0 ; i < DUPLIST_SIZE; i++) {
|
||||
curr = (bat_priv->bcast_duplist_curr + i) % DUPLIST_SIZE;
|
||||
for (i = 0; i < BATADV_DUPLIST_SIZE; i++) {
|
||||
curr = (bat_priv->bcast_duplist_curr + i) % BATADV_DUPLIST_SIZE;
|
||||
entry = &bat_priv->bcast_duplist[curr];
|
||||
|
||||
/* we can stop searching if the entry is too old ;
|
||||
* 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;
|
||||
|
||||
if (entry->crc != crc)
|
||||
|
@ -1238,7 +1239,8 @@ int batadv_bla_check_bcast_duplist(struct bat_priv *bat_priv,
|
|||
return 1;
|
||||
}
|
||||
/* 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->crc = crc;
|
||||
entry->entrytime = jiffies;
|
||||
|
|
|
@ -36,7 +36,7 @@ void batadv_bla_update_orig_address(struct bat_priv *bat_priv,
|
|||
int batadv_bla_init(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 */
|
||||
|
||||
static inline int batadv_bla_rx(struct bat_priv *bat_priv, struct sk_buff *skb,
|
||||
|
|
|
@ -33,8 +33,8 @@
|
|||
/* This is the offset of the options field in a dhcp packet starting at
|
||||
* the beginning of the dhcp header
|
||||
*/
|
||||
#define DHCP_OPTIONS_OFFSET 240
|
||||
#define DHCP_REQUEST 3
|
||||
#define BATADV_DHCP_OPTIONS_OFFSET 240
|
||||
#define BATADV_DHCP_REQUEST 3
|
||||
|
||||
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)
|
|||
|
||||
tmp_gw_factor = (router->tq_avg * router->tq_avg *
|
||||
down * 100 * 100) /
|
||||
(TQ_LOCAL_WINDOW_SIZE *
|
||||
TQ_LOCAL_WINDOW_SIZE * 64);
|
||||
(BATADV_TQ_LOCAL_WINDOW_SIZE *
|
||||
BATADV_TQ_LOCAL_WINDOW_SIZE * 64);
|
||||
|
||||
if ((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)
|
|||
if (atomic_read(&bat_priv->gw_mode) != GW_MODE_CLIENT)
|
||||
goto out;
|
||||
|
||||
if (!atomic_dec_not_zero(&bat_priv->gw_reselect))
|
||||
if (!batadv_atomic_dec_not_zero(&bat_priv->gw_reselect))
|
||||
goto out;
|
||||
|
||||
curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
|
||||
|
@ -354,7 +354,7 @@ void batadv_gw_node_update(struct bat_priv *bat_priv,
|
|||
|
||||
gw_node->deleted = 0;
|
||||
|
||||
if (new_gwflags == NO_FLAGS) {
|
||||
if (new_gwflags == BATADV_NO_FLAGS) {
|
||||
gw_node->deleted = jiffies;
|
||||
batadv_dbg(DBG_BATMAN, bat_priv,
|
||||
"Gateway %pM removed from gateway list\n",
|
||||
|
@ -367,7 +367,7 @@ void batadv_gw_node_update(struct bat_priv *bat_priv,
|
|||
goto unlock;
|
||||
}
|
||||
|
||||
if (new_gwflags == NO_FLAGS)
|
||||
if (new_gwflags == BATADV_NO_FLAGS)
|
||||
goto unlock;
|
||||
|
||||
batadv_gw_node_add(bat_priv, orig_node, new_gwflags);
|
||||
|
@ -392,7 +392,7 @@ void batadv_gw_node_purge(struct bat_priv *bat_priv)
|
|||
{
|
||||
struct gw_node *gw_node, *curr_gw;
|
||||
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;
|
||||
|
||||
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)
|
|||
|
||||
seq_printf(seq,
|
||||
" %-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",
|
||||
SOURCE_VERSION, primary_if->net_dev->name,
|
||||
"Gateway", "#", BATADV_TQ_MAX_VALUE, "Nexthop", "outgoingIF",
|
||||
BATADV_SOURCE_VERSION, primary_if->net_dev->name,
|
||||
primary_if->net_dev->dev_addr, net_dev->name);
|
||||
|
||||
rcu_read_lock();
|
||||
|
@ -521,11 +521,11 @@ static bool batadv_is_type_dhcprequest(struct sk_buff *skb, int header_len)
|
|||
|
||||
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;
|
||||
|
||||
p = skb->data + header_len + DHCP_OPTIONS_OFFSET;
|
||||
pkt_len -= header_len + DHCP_OPTIONS_OFFSET + 1;
|
||||
p = skb->data + header_len + BATADV_DHCP_OPTIONS_OFFSET;
|
||||
pkt_len -= header_len + BATADV_DHCP_OPTIONS_OFFSET + 1;
|
||||
|
||||
/* Access the dhcp option lists. Each entry is made up by:
|
||||
* - octet 1: option type
|
||||
|
@ -543,7 +543,7 @@ static bool batadv_is_type_dhcprequest(struct sk_buff *skb, int header_len)
|
|||
p += 2;
|
||||
|
||||
/* check if the message type is what we need */
|
||||
if (*p == DHCP_REQUEST)
|
||||
if (*p == BATADV_DHCP_REQUEST)
|
||||
ret = true;
|
||||
break;
|
||||
} else if (*p == 0) {
|
||||
|
@ -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
|
||||
* set the tq towards ourself as the maximum value
|
||||
*/
|
||||
curr_tq_avg = TQ_MAX_VALUE;
|
||||
curr_tq_avg = BATADV_TQ_MAX_VALUE;
|
||||
break;
|
||||
case GW_MODE_CLIENT:
|
||||
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,
|
|||
if (!neigh_old)
|
||||
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:
|
||||
|
|
|
@ -97,9 +97,9 @@ static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
|
|||
|
||||
ret = kstrtol(buff, 10, &ldown);
|
||||
if (ret) {
|
||||
bat_err(net_dev,
|
||||
"Download speed of gateway mode invalid: %s\n",
|
||||
buff);
|
||||
batadv_err(net_dev,
|
||||
"Download speed of gateway mode invalid: %s\n",
|
||||
buff);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -122,9 +122,9 @@ static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
|
|||
|
||||
ret = kstrtol(slash_ptr + 1, 10, &lup);
|
||||
if (ret) {
|
||||
bat_err(net_dev,
|
||||
"Upload speed of gateway mode invalid: %s\n",
|
||||
slash_ptr + 1);
|
||||
batadv_err(net_dev,
|
||||
"Upload speed of gateway mode invalid: %s\n",
|
||||
slash_ptr + 1);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -164,13 +164,13 @@ ssize_t batadv_gw_bandwidth_set(struct net_device *net_dev, char *buff,
|
|||
return count;
|
||||
|
||||
batadv_gw_deselect(bat_priv);
|
||||
bat_info(net_dev,
|
||||
"Changing gateway bandwidth from: '%i' to: '%ld' (propagating: %d%s/%d%s)\n",
|
||||
atomic_read(&bat_priv->gw_bandwidth), gw_bandwidth_tmp,
|
||||
(down > 2048 ? down / 1024 : down),
|
||||
(down > 2048 ? "MBit" : "KBit"),
|
||||
(up > 2048 ? up / 1024 : up),
|
||||
(up > 2048 ? "MBit" : "KBit"));
|
||||
batadv_info(net_dev,
|
||||
"Changing gateway bandwidth from: '%i' to: '%ld' (propagating: %d%s/%d%s)\n",
|
||||
atomic_read(&bat_priv->gw_bandwidth), gw_bandwidth_tmp,
|
||||
(down > 2048 ? down / 1024 : down),
|
||||
(down > 2048 ? "MBit" : "KBit"),
|
||||
(up > 2048 ? up / 1024 : up),
|
||||
(up > 2048 ? "MBit" : "KBit"));
|
||||
|
||||
atomic_set(&bat_priv->gw_bandwidth, gw_bandwidth_tmp);
|
||||
|
||||
|
|
|
@ -26,9 +26,9 @@ enum gw_modes {
|
|||
GW_MODE_SERVER,
|
||||
};
|
||||
|
||||
#define GW_MODE_OFF_NAME "off"
|
||||
#define GW_MODE_CLIENT_NAME "client"
|
||||
#define GW_MODE_SERVER_NAME "server"
|
||||
#define BATADV_GW_MODE_OFF_NAME "off"
|
||||
#define BATADV_GW_MODE_CLIENT_NAME "client"
|
||||
#define BATADV_GW_MODE_SERVER_NAME "server"
|
||||
|
||||
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,
|
||||
|
|
|
@ -196,7 +196,8 @@ int batadv_hardif_min_mtu(struct net_device *soft_iface)
|
|||
if (hard_iface->soft_iface != soft_iface)
|
||||
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);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
@ -234,8 +235,8 @@ static void batadv_hardif_activate_interface(struct hard_iface *hard_iface)
|
|||
if (!primary_if)
|
||||
batadv_primary_if_select(bat_priv, hard_iface);
|
||||
|
||||
bat_info(hard_iface->soft_iface, "Interface activated: %s\n",
|
||||
hard_iface->net_dev->name);
|
||||
batadv_info(hard_iface->soft_iface, "Interface activated: %s\n",
|
||||
hard_iface->net_dev->name);
|
||||
|
||||
batadv_update_min_mtu(hard_iface->soft_iface);
|
||||
|
||||
|
@ -252,8 +253,8 @@ static void batadv_hardif_deactivate_interface(struct hard_iface *hard_iface)
|
|||
|
||||
hard_iface->if_status = IF_INACTIVE;
|
||||
|
||||
bat_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
|
||||
hard_iface->net_dev->name);
|
||||
batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
|
||||
hard_iface->net_dev->name);
|
||||
|
||||
batadv_update_min_mtu(hard_iface->soft_iface);
|
||||
}
|
||||
|
@ -263,6 +264,7 @@ int batadv_hardif_enable_interface(struct hard_iface *hard_iface,
|
|||
{
|
||||
struct bat_priv *bat_priv;
|
||||
struct net_device *soft_iface;
|
||||
__be16 ethertype = __constant_htons(BATADV_ETH_P_BATMAN);
|
||||
int ret;
|
||||
|
||||
if (hard_iface->if_status != IF_NOT_IN_USE)
|
||||
|
@ -309,35 +311,35 @@ int batadv_hardif_enable_interface(struct hard_iface *hard_iface,
|
|||
hard_iface->if_status = IF_INACTIVE;
|
||||
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.dev = hard_iface->net_dev;
|
||||
dev_add_pack(&hard_iface->batman_adv_ptype);
|
||||
|
||||
atomic_set(&hard_iface->frag_seqno, 1);
|
||||
bat_info(hard_iface->soft_iface, "Adding interface: %s\n",
|
||||
hard_iface->net_dev->name);
|
||||
batadv_info(hard_iface->soft_iface, "Adding interface: %s\n",
|
||||
hard_iface->net_dev->name);
|
||||
|
||||
if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
|
||||
ETH_DATA_LEN + BAT_HEADER_LEN)
|
||||
bat_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",
|
||||
hard_iface->net_dev->name, hard_iface->net_dev->mtu,
|
||||
ETH_DATA_LEN + BAT_HEADER_LEN);
|
||||
ETH_DATA_LEN + BATADV_HEADER_LEN)
|
||||
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",
|
||||
hard_iface->net_dev->name, hard_iface->net_dev->mtu,
|
||||
ETH_DATA_LEN + BATADV_HEADER_LEN);
|
||||
|
||||
if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
|
||||
ETH_DATA_LEN + BAT_HEADER_LEN)
|
||||
bat_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",
|
||||
hard_iface->net_dev->name, hard_iface->net_dev->mtu,
|
||||
ETH_DATA_LEN + BAT_HEADER_LEN);
|
||||
ETH_DATA_LEN + BATADV_HEADER_LEN)
|
||||
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",
|
||||
hard_iface->net_dev->name, hard_iface->net_dev->mtu,
|
||||
ETH_DATA_LEN + BATADV_HEADER_LEN);
|
||||
|
||||
if (batadv_hardif_is_iface_up(hard_iface))
|
||||
batadv_hardif_activate_interface(hard_iface);
|
||||
else
|
||||
bat_err(hard_iface->soft_iface,
|
||||
"Not using interface %s (retrying later): interface not active\n",
|
||||
hard_iface->net_dev->name);
|
||||
batadv_err(hard_iface->soft_iface,
|
||||
"Not using interface %s (retrying later): interface not active\n",
|
||||
hard_iface->net_dev->name);
|
||||
|
||||
/* begin scheduling originator messages on that interface */
|
||||
batadv_schedule_bat_ogm(hard_iface);
|
||||
|
@ -363,8 +365,8 @@ void batadv_hardif_disable_interface(struct hard_iface *hard_iface)
|
|||
if (hard_iface->if_status != IF_INACTIVE)
|
||||
goto out;
|
||||
|
||||
bat_info(hard_iface->soft_iface, "Removing interface: %s\n",
|
||||
hard_iface->net_dev->name);
|
||||
batadv_info(hard_iface->soft_iface, "Removing interface: %s\n",
|
||||
hard_iface->net_dev->name);
|
||||
dev_remove_pack(&hard_iface->batman_adv_ptype);
|
||||
|
||||
bat_priv->num_ifaces--;
|
||||
|
@ -546,7 +548,7 @@ bool batadv_is_wifi_iface(int ifindex)
|
|||
struct net_device *net_device = NULL;
|
||||
bool ret = false;
|
||||
|
||||
if (ifindex == NULL_IFINDEX)
|
||||
if (ifindex == BATADV_NULL_IFINDEX)
|
||||
goto out;
|
||||
|
||||
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,
|
|||
|
||||
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->header.version = COMPAT_VERSION;
|
||||
icmp_packet->header.version = BATADV_COMPAT_VERSION;
|
||||
batadv_socket_add_packet(socket_client, icmp_packet,
|
||||
packet_len);
|
||||
goto free_skb;
|
||||
|
@ -282,7 +282,7 @@ int batadv_socket_setup(struct bat_priv *bat_priv)
|
|||
if (!bat_priv->debug_dir)
|
||||
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);
|
||||
if (!d)
|
||||
goto err;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#ifndef _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);
|
||||
int batadv_socket_setup(struct bat_priv *bat_priv);
|
||||
|
|
|
@ -38,22 +38,23 @@
|
|||
* list traversals just rcu-locked
|
||||
*/
|
||||
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";
|
||||
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};
|
||||
|
||||
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_HLIST_HEAD(&bat_algo_list);
|
||||
INIT_HLIST_HEAD(&batadv_algo_list);
|
||||
|
||||
recv_handler_init();
|
||||
batadv_recv_handler_init();
|
||||
|
||||
batadv_iv_init();
|
||||
|
||||
|
@ -71,12 +72,12 @@ static int __init batman_init(void)
|
|||
register_netdevice_notifier(&batadv_hard_if_notifier);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static void __exit batman_exit(void)
|
||||
static void __exit batadv_exit(void)
|
||||
{
|
||||
batadv_debugfs_destroy();
|
||||
unregister_netdevice_notifier(&batadv_hard_if_notifier);
|
||||
|
@ -119,7 +120,8 @@ int batadv_mesh_init(struct net_device *soft_iface)
|
|||
if (ret < 0)
|
||||
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);
|
||||
if (ret < 0)
|
||||
|
@ -189,8 +191,8 @@ int batadv_is_my_mac(const uint8_t *addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int recv_unhandled_packet(struct sk_buff *skb,
|
||||
struct hard_iface *recv_if)
|
||||
static int batadv_recv_unhandled_packet(struct sk_buff *skb,
|
||||
struct hard_iface *recv_if)
|
||||
{
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
if (batman_ogm_packet->header.version != COMPAT_VERSION) {
|
||||
if (batman_ogm_packet->header.version != BATADV_COMPAT_VERSION) {
|
||||
batadv_dbg(DBG_BATMAN, bat_priv,
|
||||
"Drop packet: incompatible batman version (%i)\n",
|
||||
batman_ogm_packet->header.version);
|
||||
|
@ -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.
|
||||
*/
|
||||
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)
|
||||
kfree_skb(skb);
|
||||
|
@ -265,51 +267,51 @@ err_out:
|
|||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
static void recv_handler_init(void)
|
||||
static void batadv_recv_handler_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(recv_packet_handler); i++)
|
||||
recv_packet_handler[i] = recv_unhandled_packet;
|
||||
for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++)
|
||||
batadv_rx_handler[i] = batadv_recv_unhandled_packet;
|
||||
|
||||
/* batman icmp packet */
|
||||
recv_packet_handler[BAT_ICMP] = batadv_recv_icmp_packet;
|
||||
batadv_rx_handler[BAT_ICMP] = batadv_recv_icmp_packet;
|
||||
/* unicast packet */
|
||||
recv_packet_handler[BAT_UNICAST] = batadv_recv_unicast_packet;
|
||||
batadv_rx_handler[BAT_UNICAST] = batadv_recv_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 */
|
||||
recv_packet_handler[BAT_BCAST] = batadv_recv_bcast_packet;
|
||||
batadv_rx_handler[BAT_BCAST] = batadv_recv_bcast_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) */
|
||||
recv_packet_handler[BAT_TT_QUERY] = batadv_recv_tt_query;
|
||||
batadv_rx_handler[BAT_TT_QUERY] = batadv_recv_tt_query;
|
||||
/* 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 (*recv_handler)(struct sk_buff *,
|
||||
struct hard_iface *))
|
||||
{
|
||||
if (recv_packet_handler[packet_type] != &recv_unhandled_packet)
|
||||
if (batadv_rx_handler[packet_type] != &batadv_recv_unhandled_packet)
|
||||
return -EBUSY;
|
||||
|
||||
recv_packet_handler[packet_type] = recv_handler;
|
||||
batadv_rx_handler[packet_type] = recv_handler;
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 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)
|
||||
continue;
|
||||
|
||||
|
@ -325,7 +327,7 @@ int batadv_algo_register(struct bat_algo_ops *bat_algo_ops)
|
|||
struct bat_algo_ops *bat_algo_ops_tmp;
|
||||
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) {
|
||||
pr_info("Trying to register already registered routing algorithm: %s\n",
|
||||
bat_algo_ops->name);
|
||||
|
@ -347,7 +349,7 @@ int batadv_algo_register(struct bat_algo_ops *bat_algo_ops)
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
out:
|
||||
|
@ -359,7 +361,7 @@ int batadv_algo_select(struct bat_priv *bat_priv, char *name)
|
|||
struct bat_algo_ops *bat_algo_ops;
|
||||
int ret = -EINVAL;
|
||||
|
||||
bat_algo_ops = bat_algo_get(name);
|
||||
bat_algo_ops = batadv_algo_get(name);
|
||||
if (!bat_algo_ops)
|
||||
goto out;
|
||||
|
||||
|
@ -377,14 +379,14 @@ int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
char *algo_name = (char *)val;
|
||||
|
@ -393,7 +395,7 @@ static int param_set_ra(const char *val, const struct kernel_param *kp)
|
|||
if (algo_name[name_len - 1] == '\n')
|
||||
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) {
|
||||
pr_err("Routing algorithm '%s' is not supported\n", algo_name);
|
||||
return -EINVAL;
|
||||
|
@ -402,23 +404,24 @@ static int param_set_ra(const char *val, const struct kernel_param *kp)
|
|||
return param_set_copystring(algo_name, kp);
|
||||
}
|
||||
|
||||
static const struct kernel_param_ops param_ops_ra = {
|
||||
.set = param_set_ra,
|
||||
static const struct kernel_param_ops batadv_param_ops_ra = {
|
||||
.set = batadv_param_set_ra,
|
||||
.get = param_get_string,
|
||||
};
|
||||
|
||||
static struct kparam_string __param_string_ra = {
|
||||
static struct kparam_string batadv_param_string_ra = {
|
||||
.maxlen = sizeof(batadv_routing_algo),
|
||||
.string = batadv_routing_algo,
|
||||
};
|
||||
|
||||
module_param_cb(routing_algo, ¶m_ops_ra, &__param_string_ra, 0644);
|
||||
module_init(batman_init);
|
||||
module_exit(batman_exit);
|
||||
module_param_cb(routing_algo, &batadv_param_ops_ra, &batadv_param_string_ra,
|
||||
0644);
|
||||
module_init(batadv_init);
|
||||
module_exit(batadv_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_SUPPORTED_DEVICE(DRIVER_DEVICE);
|
||||
MODULE_VERSION(SOURCE_VERSION);
|
||||
MODULE_AUTHOR(BATADV_DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(BATADV_DRIVER_DESC);
|
||||
MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE);
|
||||
MODULE_VERSION(BATADV_SOURCE_VERSION);
|
||||
|
|
|
@ -20,79 +20,80 @@
|
|||
#ifndef _NET_BATMAN_ADV_MAIN_H_
|
||||
#define _NET_BATMAN_ADV_MAIN_H_
|
||||
|
||||
#define DRIVER_AUTHOR "Marek Lindner <lindner_marek@yahoo.de>, " \
|
||||
"Simon Wunderlich <siwu@hrz.tu-chemnitz.de>"
|
||||
#define DRIVER_DESC "B.A.T.M.A.N. advanced"
|
||||
#define DRIVER_DEVICE "batman-adv"
|
||||
#define BATADV_DRIVER_AUTHOR "Marek Lindner <lindner_marek@yahoo.de>, " \
|
||||
"Simon Wunderlich <siwu@hrz.tu-chemnitz.de>"
|
||||
#define BATADV_DRIVER_DESC "B.A.T.M.A.N. advanced"
|
||||
#define BATADV_DRIVER_DEVICE "batman-adv"
|
||||
|
||||
#ifndef SOURCE_VERSION
|
||||
#define SOURCE_VERSION "2012.3.0"
|
||||
#ifndef BATADV_SOURCE_VERSION
|
||||
#define BATADV_SOURCE_VERSION "2012.3.0"
|
||||
#endif
|
||||
|
||||
/* B.A.T.M.A.N. parameters */
|
||||
|
||||
#define TQ_MAX_VALUE 255
|
||||
#define JITTER 20
|
||||
#define BATADV_TQ_MAX_VALUE 255
|
||||
#define BATADV_JITTER 20
|
||||
|
||||
/* 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
|
||||
* -> TODO: check influence on TQ_LOCAL_WINDOW_SIZE
|
||||
* -> TODO: check influence on BATADV_TQ_LOCAL_WINDOW_SIZE
|
||||
*/
|
||||
#define PURGE_TIMEOUT 200000 /* 200 seconds */
|
||||
#define TT_LOCAL_TIMEOUT 3600000 /* in miliseconds */
|
||||
#define TT_CLIENT_ROAM_TIMEOUT 600000 /* in miliseconds */
|
||||
#define BATADV_PURGE_TIMEOUT 200000 /* 200 seconds */
|
||||
#define BATADV_TT_LOCAL_TIMEOUT 3600000 /* in miliseconds */
|
||||
#define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000 /* in miliseconds */
|
||||
/* sliding packet range of received originator messages in sequence numbers
|
||||
* (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 */
|
||||
#define TT_REQUEST_TIMEOUT 3000
|
||||
#define BATADV_TT_REQUEST_TIMEOUT 3000
|
||||
|
||||
#define TQ_GLOBAL_WINDOW_SIZE 5
|
||||
#define TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
|
||||
#define TQ_LOCAL_BIDRECT_RECV_MINIMUM 1
|
||||
#define TQ_TOTAL_BIDRECT_LIMIT 1
|
||||
#define BATADV_TQ_GLOBAL_WINDOW_SIZE 5
|
||||
#define BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
|
||||
#define BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM 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
|
||||
* miliseconds
|
||||
*/
|
||||
#define ROAMING_MAX_TIME 20000
|
||||
#define ROAMING_MAX_COUNT 5
|
||||
#define BATADV_ROAMING_MAX_TIME 20000
|
||||
#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
|
||||
* candidates
|
||||
*/
|
||||
#define BONDING_TQ_THRESHOLD 50
|
||||
#define BATADV_BONDING_TQ_THRESHOLD 50
|
||||
|
||||
/* should not be bigger than 512 bytes or change the size of
|
||||
* forw_packet->direct_link_flags
|
||||
*/
|
||||
#define MAX_AGGREGATION_BYTES 512
|
||||
#define MAX_AGGREGATION_MS 100
|
||||
#define BATADV_MAX_AGGREGATION_BYTES 512
|
||||
#define BATADV_MAX_AGGREGATION_MS 100
|
||||
|
||||
#define BLA_PERIOD_LENGTH 10000 /* 10 seconds */
|
||||
#define BLA_BACKBONE_TIMEOUT (BLA_PERIOD_LENGTH * 3)
|
||||
#define BLA_CLAIM_TIMEOUT (BLA_PERIOD_LENGTH * 10)
|
||||
#define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */
|
||||
#define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3)
|
||||
#define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10)
|
||||
|
||||
#define DUPLIST_SIZE 16
|
||||
#define DUPLIST_TIMEOUT 500 /* 500 ms */
|
||||
#define BATADV_DUPLIST_SIZE 16
|
||||
#define BATADV_DUPLIST_TIMEOUT 500 /* 500 ms */
|
||||
/* don't reset again within 30 seconds */
|
||||
#define RESET_PROTECTION_MS 30000
|
||||
#define EXPECTED_SEQNO_RANGE 65536
|
||||
#define BATADV_RESET_PROTECTION_MS 30000
|
||||
#define BATADV_EXPECTED_SEQNO_RANGE 65536
|
||||
|
||||
enum mesh_state {
|
||||
MESH_INACTIVE,
|
||||
|
@ -100,8 +101,8 @@ enum mesh_state {
|
|||
MESH_DEACTIVATING
|
||||
};
|
||||
|
||||
#define BCAST_QUEUE_LEN 256
|
||||
#define BATMAN_QUEUE_LEN 256
|
||||
#define BATADV_BCAST_QUEUE_LEN 256
|
||||
#define BATADV_BATMAN_QUEUE_LEN 256
|
||||
|
||||
enum uev_action {
|
||||
UEV_ADD = 0,
|
||||
|
@ -113,7 +114,7 @@ enum uev_type {
|
|||
UEV_GW = 0
|
||||
};
|
||||
|
||||
#define GW_THRESHOLD 50
|
||||
#define BATADV_GW_THRESHOLD 50
|
||||
|
||||
/* Debug Messages */
|
||||
#ifdef pr_fmt
|
||||
|
@ -190,14 +191,14 @@ static inline void batadv_dbg(int type __always_unused,
|
|||
}
|
||||
#endif
|
||||
|
||||
#define bat_info(net_dev, fmt, arg...) \
|
||||
#define batadv_info(net_dev, fmt, arg...) \
|
||||
do { \
|
||||
struct net_device *_netdev = (net_dev); \
|
||||
struct bat_priv *_batpriv = netdev_priv(_netdev); \
|
||||
batadv_dbg(DBG_ALL, _batpriv, fmt, ## arg); \
|
||||
pr_info("%s: " fmt, _netdev->name, ## arg); \
|
||||
} while (0)
|
||||
#define bat_err(net_dev, fmt, arg...) \
|
||||
#define batadv_err(net_dev, fmt, arg...) \
|
||||
do { \
|
||||
struct net_device *_netdev = (net_dev); \
|
||||
struct bat_priv *_batpriv = netdev_priv(_netdev); \
|
||||
|
@ -226,10 +227,10 @@ static inline bool batadv_has_timed_out(unsigned long timestamp,
|
|||
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 */
|
||||
#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.
|
||||
* they handle overflows/underflows and can correctly check for a
|
||||
|
@ -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,
|
||||
* - after adding more than 127 to the starting value - it is a successor
|
||||
*/
|
||||
#define seq_before(x, y) ({typeof(x) _d1 = (x); \
|
||||
typeof(y) _d2 = (y); \
|
||||
typeof(x) _dummy = (_d1 - _d2); \
|
||||
(void) (&_d1 == &_d2); \
|
||||
_dummy > smallest_signed_int(_dummy); })
|
||||
#define seq_after(x, y) seq_before(y, x)
|
||||
#define batadv_seq_before(x, y) ({typeof(x) _d1 = (x); \
|
||||
typeof(y) _d2 = (y); \
|
||||
typeof(x) _dummy = (_d1 - _d2); \
|
||||
(void) (&_d1 == &_d2); \
|
||||
_dummy > batadv_smallest_signed_int(_dummy); })
|
||||
#define batadv_seq_after(x, y) batadv_seq_before(y, x)
|
||||
|
||||
/* Stop preemption on local cpu while incrementing the counter */
|
||||
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,
|
|||
struct orig_node *orig_node;
|
||||
int size;
|
||||
int hash_added;
|
||||
unsigned long reset_time;
|
||||
|
||||
orig_node = batadv_orig_hash_find(bat_priv, addr);
|
||||
if (orig_node)
|
||||
|
@ -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_len = 0;
|
||||
atomic_set(&orig_node->tt_size, 0);
|
||||
orig_node->bcast_seqno_reset = jiffies - 1
|
||||
- msecs_to_jiffies(RESET_PROTECTION_MS);
|
||||
orig_node->batman_seqno_reset = jiffies - 1
|
||||
- msecs_to_jiffies(RESET_PROTECTION_MS);
|
||||
reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);
|
||||
orig_node->bcast_seqno_reset = reset_time;
|
||||
orig_node->batman_seqno_reset = reset_time;
|
||||
|
||||
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);
|
||||
if (!orig_node->bcast_own)
|
||||
|
@ -285,7 +285,7 @@ static bool batadv_purge_orig_neighbors(struct bat_priv *bat_priv,
|
|||
last_seen = neigh_node->last_seen;
|
||||
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_NOT_IN_USE) ||
|
||||
(if_incoming->if_status == IF_TO_BE_REMOVED)) {
|
||||
|
@ -324,7 +324,8 @@ static bool batadv_purge_orig_node(struct bat_priv *bat_priv,
|
|||
{
|
||||
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,
|
||||
"Originator timeout: originator %pM, last_seen %u\n",
|
||||
orig_node->orig,
|
||||
|
@ -370,7 +371,7 @@ static void _batadv_purge_orig(struct bat_priv *bat_priv)
|
|||
}
|
||||
|
||||
if (batadv_has_timed_out(orig_node->last_frag_packet,
|
||||
FRAG_TIMEOUT))
|
||||
BATADV_FRAG_TIMEOUT))
|
||||
batadv_frag_list_free(&orig_node->frag_list);
|
||||
}
|
||||
spin_unlock_bh(list_lock);
|
||||
|
@ -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",
|
||||
SOURCE_VERSION, primary_if->net_dev->name,
|
||||
BATADV_SOURCE_VERSION, primary_if->net_dev->name,
|
||||
primary_if->net_dev->dev_addr, net_dev->name);
|
||||
seq_printf(seq, " %-15s %s (%s/%i) %17s [%10s]: %20s ...\n",
|
||||
"Originator", "last-seen", "#", TQ_MAX_VALUE, "Nexthop",
|
||||
"outgoingIF", "Potential nexthops");
|
||||
"Originator", "last-seen", "#", BATADV_TQ_MAX_VALUE,
|
||||
"Nexthop", "outgoingIF", "Potential nexthops");
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
@ -486,14 +487,15 @@ out:
|
|||
static int batadv_orig_node_add_if(struct orig_node *orig_node, int max_if_num)
|
||||
{
|
||||
void *data_ptr;
|
||||
size_t data_size, old_size;
|
||||
|
||||
data_ptr = kmalloc(max_if_num * sizeof(unsigned long) * NUM_WORDS,
|
||||
GFP_ATOMIC);
|
||||
data_size = max_if_num * sizeof(unsigned long) * BATADV_NUM_WORDS;
|
||||
old_size = (max_if_num - 1) * sizeof(unsigned long) * BATADV_NUM_WORDS;
|
||||
data_ptr = kmalloc(data_size, GFP_ATOMIC);
|
||||
if (!data_ptr)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(data_ptr, orig_node->bcast_own,
|
||||
(max_if_num - 1) * sizeof(unsigned long) * NUM_WORDS);
|
||||
memcpy(data_ptr, orig_node->bcast_own, old_size);
|
||||
kfree(orig_node->bcast_own);
|
||||
orig_node->bcast_own = data_ptr;
|
||||
|
||||
|
@ -554,7 +556,7 @@ static int batadv_orig_node_del_if(struct orig_node *orig_node,
|
|||
if (max_if_num == 0)
|
||||
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);
|
||||
if (!data_ptr)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#ifndef _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 {
|
||||
BAT_IV_OGM = 0x01,
|
||||
|
@ -34,7 +34,7 @@ enum bat_packettype {
|
|||
};
|
||||
|
||||
/* this file is included by batctl which needs these defines */
|
||||
#define COMPAT_VERSION 14
|
||||
#define BATADV_COMPAT_VERSION 14
|
||||
|
||||
enum batman_iv_flags {
|
||||
NOT_BEST_NEXT_HOP = 1 << 3,
|
||||
|
@ -65,7 +65,7 @@ enum unicast_frag_flags {
|
|||
};
|
||||
|
||||
/* TT_QUERY subtypes */
|
||||
#define TT_QUERY_TYPE_MASK 0x3
|
||||
#define BATADV_TT_QUERY_TYPE_MASK 0x3
|
||||
|
||||
enum tt_query_packettype {
|
||||
TT_REQUEST = 0,
|
||||
|
@ -126,7 +126,7 @@ struct batman_ogm_packet {
|
|||
__be16 tt_crc;
|
||||
} __packed;
|
||||
|
||||
#define BATMAN_OGM_HLEN sizeof(struct batman_ogm_packet)
|
||||
#define BATADV_OGM_HLEN sizeof(struct batman_ogm_packet)
|
||||
|
||||
struct icmp_packet {
|
||||
struct batman_header header;
|
||||
|
@ -138,7 +138,7 @@ struct icmp_packet {
|
|||
uint8_t reserved;
|
||||
} __packed;
|
||||
|
||||
#define BAT_RR_LEN 16
|
||||
#define BATADV_RR_LEN 16
|
||||
|
||||
/* icmp_packet_rr must start with all fields from imcp_packet
|
||||
* as this is assumed by code that handles ICMP packets
|
||||
|
@ -151,7 +151,7 @@ struct icmp_packet_rr {
|
|||
__be16 seqno;
|
||||
uint8_t uid;
|
||||
uint8_t rr_cur;
|
||||
uint8_t rr[BAT_RR_LEN][ETH_ALEN];
|
||||
uint8_t rr[BATADV_RR_LEN][ETH_ALEN];
|
||||
} __packed;
|
||||
|
||||
struct unicast_packet {
|
||||
|
|
|
@ -24,7 +24,7 @@ void batadv_ring_buffer_set(uint8_t lq_recv[], uint8_t *lq_index,
|
|||
uint8_t 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[])
|
||||
|
@ -34,7 +34,7 @@ uint8_t batadv_ring_buffer_avg(const uint8_t lq_recv[])
|
|||
|
||||
ptr = lq_recv;
|
||||
|
||||
while (i < TQ_GLOBAL_WINDOW_SIZE) {
|
||||
while (i < BATADV_TQ_GLOBAL_WINDOW_SIZE) {
|
||||
if (*ptr != 0) {
|
||||
count++;
|
||||
sum += *ptr;
|
||||
|
|
|
@ -42,6 +42,7 @@ void batadv_slide_own_bcast_window(struct hard_iface *hard_iface)
|
|||
unsigned long *word;
|
||||
uint32_t i;
|
||||
size_t word_index;
|
||||
uint8_t *w;
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
|
@ -49,12 +50,12 @@ void batadv_slide_own_bcast_window(struct hard_iface *hard_iface)
|
|||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(orig_node, node, head, hash_entry) {
|
||||
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]);
|
||||
|
||||
batadv_bit_get_packet(bat_priv, word, 1, 0);
|
||||
orig_node->bcast_own_sum[hard_iface->if_num] =
|
||||
bitmap_weight(word, TQ_LOCAL_WINDOW_SIZE);
|
||||
w = &orig_node->bcast_own_sum[hard_iface->if_num];
|
||||
*w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
|
||||
spin_unlock_bh(&orig_node->ogm_cnt_lock);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
@ -160,7 +161,7 @@ void batadv_bonding_candidate_add(struct orig_node *orig_node,
|
|||
goto candidate_del;
|
||||
|
||||
/* ... 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;
|
||||
|
||||
/* 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,
|
|||
int batadv_window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
|
||||
unsigned long *last_reset)
|
||||
{
|
||||
if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) ||
|
||||
(seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
|
||||
if (!batadv_has_timed_out(*last_reset, RESET_PROTECTION_MS))
|
||||
if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
|
||||
seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
|
||||
if (!batadv_has_timed_out(*last_reset,
|
||||
BATADV_RESET_PROTECTION_MS))
|
||||
return 1;
|
||||
|
||||
*last_reset = jiffies;
|
||||
|
@ -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->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
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);
|
||||
ret = NET_RX_SUCCESS;
|
||||
|
@ -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->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
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);
|
||||
ret = NET_RX_SUCCESS;
|
||||
|
@ -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 */
|
||||
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]),
|
||||
ethhdr->h_dest, ETH_ALEN);
|
||||
icmp_packet->rr_cur++;
|
||||
|
@ -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;
|
||||
|
||||
switch (tt_query->flags & TT_QUERY_TYPE_MASK) {
|
||||
switch (tt_query->flags & BATADV_TT_QUERY_TYPE_MASK) {
|
||||
case TT_REQUEST:
|
||||
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)
|
|||
roam_adv_packet->src, roam_adv_packet->client);
|
||||
|
||||
batadv_tt_global_add(bat_priv, orig_node, roam_adv_packet->client,
|
||||
atomic_read(&orig_node->last_ttvn) + 1, true,
|
||||
false);
|
||||
TT_CLIENT_ROAM,
|
||||
atomic_read(&orig_node->last_ttvn) + 1);
|
||||
|
||||
/* Roaming phase starts: I have new information but the ttvn has not
|
||||
* 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,
|
|||
struct hard_iface *primary_if;
|
||||
struct unicast_packet *unicast_packet;
|
||||
bool tt_poss_change;
|
||||
int is_old_ttvn;
|
||||
|
||||
/* I could need to modify it */
|
||||
if (skb_cow(skb, sizeof(struct unicast_packet)) < 0)
|
||||
|
@ -945,7 +948,8 @@ static int batadv_check_unicast_ttvn(struct bat_priv *bat_priv,
|
|||
}
|
||||
|
||||
/* 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 */
|
||||
if (pskb_may_pull(skb, sizeof(struct unicast_packet) +
|
||||
ETH_HLEN) < 0)
|
||||
|
|
|
@ -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);
|
||||
memcpy(ethhdr->h_source, hard_iface->net_dev->dev_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->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;
|
||||
|
||||
|
@ -141,7 +141,7 @@ int batadv_add_bcast_packet_to_list(struct bat_priv *bat_priv,
|
|||
struct bcast_packet *bcast_packet;
|
||||
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");
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
batadv_tt_local_remove(bat_priv, dev->dev_addr,
|
||||
"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);
|
||||
|
@ -135,6 +135,7 @@ static int batadv_interface_tx(struct sk_buff *skb,
|
|||
struct hard_iface *primary_if = NULL;
|
||||
struct bcast_packet *bcast_packet;
|
||||
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,
|
||||
0x00};
|
||||
unsigned int header_len = 0;
|
||||
|
@ -152,11 +153,11 @@ static int batadv_interface_tx(struct sk_buff *skb,
|
|||
vhdr = (struct vlan_ethhdr *)skb->data;
|
||||
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;
|
||||
|
||||
/* fall through */
|
||||
case ETH_P_BATMAN:
|
||||
case BATADV_ETH_P_BATMAN:
|
||||
goto dropped;
|
||||
}
|
||||
|
||||
|
@ -208,8 +209,8 @@ static int batadv_interface_tx(struct sk_buff *skb,
|
|||
goto dropped;
|
||||
|
||||
bcast_packet = (struct bcast_packet *)skb->data;
|
||||
bcast_packet->header.version = COMPAT_VERSION;
|
||||
bcast_packet->header.ttl = TTL;
|
||||
bcast_packet->header.version = BATADV_COMPAT_VERSION;
|
||||
bcast_packet->header.ttl = BATADV_TTL;
|
||||
|
||||
/* batman packet type: broadcast */
|
||||
bcast_packet->header.packet_type = BAT_BCAST;
|
||||
|
@ -266,6 +267,7 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
|||
struct ethhdr *ethhdr;
|
||||
struct vlan_ethhdr *vhdr;
|
||||
short vid __maybe_unused = -1;
|
||||
__be16 ethertype = __constant_htons(BATADV_ETH_P_BATMAN);
|
||||
|
||||
/* check if enough space is available for pulling, and pull */
|
||||
if (!pskb_may_pull(skb, hdr_size))
|
||||
|
@ -281,11 +283,11 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
|||
vhdr = (struct vlan_ethhdr *)skb->data;
|
||||
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;
|
||||
|
||||
/* fall through */
|
||||
case ETH_P_BATMAN:
|
||||
case BATADV_ETH_P_BATMAN:
|
||||
goto dropped;
|
||||
}
|
||||
|
||||
|
@ -349,7 +351,7 @@ static void batadv_interface_setup(struct net_device *dev)
|
|||
*/
|
||||
dev->mtu = ETH_DATA_LEN;
|
||||
/* 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 */
|
||||
eth_hw_addr_random(dev);
|
||||
|
@ -392,8 +394,8 @@ struct net_device *batadv_softif_create(const char *name)
|
|||
atomic_set(&bat_priv->hop_penalty, 30);
|
||||
atomic_set(&bat_priv->log_level, 0);
|
||||
atomic_set(&bat_priv->fragmentation, 1);
|
||||
atomic_set(&bat_priv->bcast_queue_left, BCAST_QUEUE_LEN);
|
||||
atomic_set(&bat_priv->batman_queue_left, BATMAN_QUEUE_LEN);
|
||||
atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_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->bcast_seqno, 1);
|
||||
|
@ -485,7 +487,7 @@ static void batadv_get_drvinfo(struct net_device *dev,
|
|||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
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->bus_info, "batman");
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
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);
|
||||
|
||||
|
@ -167,13 +169,45 @@ static void batadv_tt_local_event(struct bat_priv *bat_priv,
|
|||
tt_change_node->change.flags = flags;
|
||||
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);
|
||||
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 */
|
||||
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);
|
||||
|
||||
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)
|
||||
|
@ -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));
|
||||
|
||||
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))
|
||||
tt_local_entry->common.flags |= TT_CLIENT_WIFI;
|
||||
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,
|
|||
const char *message, bool roaming)
|
||||
{
|
||||
struct tt_local_entry *tt_local_entry = NULL;
|
||||
uint16_t flags;
|
||||
|
||||
tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr);
|
||||
if (!tt_local_entry)
|
||||
goto out;
|
||||
|
||||
batadv_tt_local_set_pending(bat_priv, tt_local_entry, TT_CLIENT_DEL |
|
||||
(roaming ? TT_CLIENT_ROAM : NO_FLAGS),
|
||||
message);
|
||||
flags = TT_CLIENT_DEL;
|
||||
if (roaming)
|
||||
flags |= TT_CLIENT_ROAM;
|
||||
|
||||
batadv_tt_local_set_pending(bat_priv, tt_local_entry, flags, message);
|
||||
out:
|
||||
if (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)
|
|||
continue;
|
||||
|
||||
if (!batadv_has_timed_out(tt_local_entry->last_seen,
|
||||
TT_LOCAL_TIMEOUT))
|
||||
BATADV_TT_LOCAL_TIMEOUT))
|
||||
continue;
|
||||
|
||||
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,
|
|||
|
||||
/* caller must hold orig_node refcount */
|
||||
int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
|
||||
const unsigned char *tt_addr, uint8_t ttvn,
|
||||
bool roaming, bool wifi)
|
||||
const unsigned char *tt_addr, uint8_t flags,
|
||||
uint8_t ttvn)
|
||||
{
|
||||
struct tt_global_entry *tt_global_entry = NULL;
|
||||
int ret = 0;
|
||||
|
@ -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);
|
||||
|
||||
if (!tt_global_entry) {
|
||||
tt_global_entry = kzalloc(sizeof(*tt_global_entry),
|
||||
GFP_ATOMIC);
|
||||
tt_global_entry = kzalloc(sizeof(*tt_global_entry), GFP_ATOMIC);
|
||||
if (!tt_global_entry)
|
||||
goto out;
|
||||
|
||||
common = &tt_global_entry->common;
|
||||
memcpy(common->addr, tt_addr, ETH_ALEN);
|
||||
|
||||
common->flags = NO_FLAGS;
|
||||
common->flags = flags;
|
||||
tt_global_entry->roam_at = 0;
|
||||
atomic_set(&common->refcount, 2);
|
||||
|
||||
|
@ -684,9 +720,6 @@ int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
|
|||
orig_node, ttvn);
|
||||
}
|
||||
|
||||
if (wifi)
|
||||
tt_global_entry->common.flags |= TT_CLIENT_WIFI;
|
||||
|
||||
batadv_dbg(DBG_TT, bat_priv,
|
||||
"Creating new global tt entry: %pM (via %pM)\n",
|
||||
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,
|
|||
out_remove:
|
||||
/* remove address from local hash if present */
|
||||
batadv_tt_local_remove(bat_priv, tt_global_entry->common.addr,
|
||||
"global tt received", roaming);
|
||||
"global tt received", flags & TT_CLIENT_ROAM);
|
||||
ret = 1;
|
||||
out:
|
||||
if (tt_global_entry)
|
||||
|
@ -978,12 +1011,35 @@ void batadv_tt_global_del_orig(struct bat_priv *bat_priv,
|
|||
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_global_entry *tt_global_entry;
|
||||
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;
|
||||
spinlock_t *list_lock; /* protects write access to the hash lists */
|
||||
uint32_t i;
|
||||
|
@ -993,24 +1049,7 @@ static void batadv_tt_global_roam_purge(struct bat_priv *bat_priv)
|
|||
list_lock = &hash->list_locks[i];
|
||||
|
||||
spin_lock_bh(list_lock);
|
||||
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,
|
||||
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);
|
||||
}
|
||||
batadv_tt_global_roam_purge_list(bat_priv, head);
|
||||
spin_unlock_bh(list_lock);
|
||||
}
|
||||
|
||||
|
@ -1248,7 +1287,8 @@ static void batadv_tt_req_purge(struct bat_priv *bat_priv)
|
|||
|
||||
spin_lock_bh(&bat_priv->tt_req_list_lock);
|
||||
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);
|
||||
kfree(node);
|
||||
}
|
||||
|
@ -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) {
|
||||
if (batadv_compare_eth(tt_req_node_tmp, orig_node) &&
|
||||
!batadv_has_timed_out(tt_req_node_tmp->issued_at,
|
||||
TT_REQUEST_TIMEOUT))
|
||||
BATADV_TT_REQUEST_TIMEOUT))
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
|
@ -1361,7 +1401,7 @@ batadv_tt_response_fill_table(uint16_t tt_len, uint8_t ttvn,
|
|||
|
||||
memcpy(tt_change->addr, tt_common_entry->addr,
|
||||
ETH_ALEN);
|
||||
tt_change->flags = NO_FLAGS;
|
||||
tt_change->flags = BATADV_NO_FLAGS;
|
||||
|
||||
tt_count++;
|
||||
tt_change++;
|
||||
|
@ -1411,10 +1451,10 @@ static int batadv_send_tt_request(struct bat_priv *bat_priv,
|
|||
sizeof(struct tt_query_packet));
|
||||
|
||||
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->dst, dst_orig_node->orig, ETH_ALEN);
|
||||
tt_request->header.ttl = TTL;
|
||||
tt_request->header.ttl = BATADV_TTL;
|
||||
tt_request->ttvn = ttvn;
|
||||
tt_request->tt_data = htons(tt_crc);
|
||||
tt_request->flags = TT_REQUEST;
|
||||
|
@ -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.version = COMPAT_VERSION;
|
||||
tt_response->header.ttl = TTL;
|
||||
tt_response->header.version = BATADV_COMPAT_VERSION;
|
||||
tt_response->header.ttl = BATADV_TTL;
|
||||
memcpy(tt_response->src, req_dst_orig_node->orig, ETH_ALEN);
|
||||
memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
|
||||
tt_response->flags = TT_RESPONSE;
|
||||
|
@ -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.version = COMPAT_VERSION;
|
||||
tt_response->header.ttl = TTL;
|
||||
tt_response->header.version = BATADV_COMPAT_VERSION;
|
||||
tt_response->header.ttl = BATADV_TTL;
|
||||
memcpy(tt_response->src, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
|
||||
tt_response->flags = TT_RESPONSE;
|
||||
|
@ -1721,7 +1761,6 @@ static void _batadv_tt_update_changes(struct bat_priv *bat_priv,
|
|||
uint16_t tt_num_changes, uint8_t ttvn)
|
||||
{
|
||||
int i;
|
||||
int is_wifi;
|
||||
int roams;
|
||||
|
||||
for (i = 0; i < tt_num_changes; i++) {
|
||||
|
@ -1729,13 +1768,12 @@ static void _batadv_tt_update_changes(struct bat_priv *bat_priv,
|
|||
roams = (tt_change + i)->flags & TT_CLIENT_ROAM;
|
||||
batadv_tt_global_del(bat_priv, orig_node,
|
||||
(tt_change + i)->addr,
|
||||
"tt removed by changes",
|
||||
roams);
|
||||
"tt removed by changes",
|
||||
roams);
|
||||
} else {
|
||||
is_wifi = (tt_change + i)->flags & TT_CLIENT_WIFI;
|
||||
if (!batadv_tt_global_add(bat_priv, orig_node,
|
||||
(tt_change + i)->addr, ttvn,
|
||||
false, is_wifi))
|
||||
(tt_change + i)->addr,
|
||||
(tt_change + i)->flags, ttvn))
|
||||
/* In case of problem while storing a
|
||||
* global_entry, we stop the updating
|
||||
* procedure without committing the
|
||||
|
@ -1897,7 +1935,8 @@ static void batadv_tt_roam_purge(struct bat_priv *bat_priv)
|
|||
|
||||
spin_lock_bh(&bat_priv->tt_roam_list_lock);
|
||||
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;
|
||||
|
||||
list_del(&node->list);
|
||||
|
@ -1927,10 +1966,10 @@ static bool batadv_tt_check_roam_count(struct bat_priv *bat_priv,
|
|||
continue;
|
||||
|
||||
if (batadv_has_timed_out(tt_roam_node->first_time,
|
||||
ROAMING_MAX_TIME))
|
||||
BATADV_ROAMING_MAX_TIME))
|
||||
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! */
|
||||
goto unlock;
|
||||
ret = true;
|
||||
|
@ -1943,7 +1982,8 @@ static bool batadv_tt_check_roam_count(struct bat_priv *bat_priv,
|
|||
goto unlock;
|
||||
|
||||
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);
|
||||
|
||||
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,
|
|||
sizeof(struct roam_adv_packet));
|
||||
|
||||
roam_adv_packet->header.packet_type = BAT_ROAM_ADV;
|
||||
roam_adv_packet->header.version = COMPAT_VERSION;
|
||||
roam_adv_packet->header.ttl = TTL;
|
||||
roam_adv_packet->header.version = BATADV_COMPAT_VERSION;
|
||||
roam_adv_packet->header.ttl = BATADV_TTL;
|
||||
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
if (!primary_if)
|
||||
goto out;
|
||||
|
@ -2142,7 +2182,7 @@ static int batadv_tt_commit_changes(struct bat_priv *bat_priv,
|
|||
bat_priv->tt_poss_change = false;
|
||||
|
||||
/* 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,
|
||||
packet_buff_len, packet_min_len);
|
||||
|
@ -2162,7 +2202,7 @@ int batadv_tt_append_diff(struct bat_priv *bat_priv,
|
|||
|
||||
/* if the changes have been sent often enough */
|
||||
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,
|
||||
packet_min_len, packet_min_len);
|
||||
tt_num_changes = 0;
|
||||
|
@ -2220,7 +2260,8 @@ void batadv_tt_update_orig(struct bat_priv *bat_priv,
|
|||
if ((!orig_node->tt_initialised && ttvn == 1) ||
|
||||
ttvn - orig_ttvn == 1) {
|
||||
/* 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
|
||||
*/
|
||||
if (!tt_num_changes) {
|
||||
|
|
|
@ -32,8 +32,8 @@ void batadv_tt_global_add_orig(struct bat_priv *bat_priv,
|
|||
struct orig_node *orig_node,
|
||||
const unsigned char *tt_buff, int tt_buff_len);
|
||||
int batadv_tt_global_add(struct bat_priv *bat_priv, struct orig_node *orig_node,
|
||||
const unsigned char *addr, uint8_t ttvn, bool roaming,
|
||||
bool wifi);
|
||||
const unsigned char *addr, uint8_t flags,
|
||||
uint8_t ttvn);
|
||||
int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset);
|
||||
void batadv_tt_global_del_orig(struct bat_priv *bat_priv,
|
||||
struct orig_node *orig_node,
|
||||
|
|
|
@ -22,12 +22,11 @@
|
|||
|
||||
#include "packet.h"
|
||||
#include "bitarray.h"
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#define BAT_HEADER_LEN (ETH_HLEN + \
|
||||
((sizeof(struct unicast_packet) > sizeof(struct bcast_packet) ? \
|
||||
sizeof(struct unicast_packet) : \
|
||||
sizeof(struct bcast_packet))))
|
||||
|
||||
#define BATADV_HEADER_LEN \
|
||||
(ETH_HLEN + max(sizeof(struct unicast_packet), \
|
||||
sizeof(struct bcast_packet)))
|
||||
|
||||
struct hard_iface {
|
||||
struct list_head list;
|
||||
|
@ -86,7 +85,7 @@ struct orig_node {
|
|||
bool tt_poss_change;
|
||||
uint32_t last_real_seqno;
|
||||
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;
|
||||
struct hlist_head neigh_list;
|
||||
struct list_head frag_list;
|
||||
|
@ -122,13 +121,13 @@ struct neigh_node {
|
|||
struct hlist_node list;
|
||||
uint8_t addr[ETH_ALEN];
|
||||
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_avg;
|
||||
uint8_t last_ttl;
|
||||
struct list_head bonding_list;
|
||||
unsigned long last_seen;
|
||||
DECLARE_BITMAP(real_bits, TQ_LOCAL_WINDOW_SIZE);
|
||||
DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
|
||||
atomic_t refcount;
|
||||
struct rcu_head rcu;
|
||||
struct orig_node *orig_node;
|
||||
|
@ -210,7 +209,7 @@ struct bat_priv {
|
|||
struct list_head tt_roam_list;
|
||||
struct hashtable_t *vis_hash;
|
||||
#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;
|
||||
struct bla_claim_dst claim_dest;
|
||||
#endif
|
||||
|
@ -349,7 +348,7 @@ struct if_list_entry {
|
|||
};
|
||||
|
||||
struct debug_log {
|
||||
char log_buff[LOG_BUF_LEN];
|
||||
char log_buff[BATADV_LOG_BUF_LEN];
|
||||
unsigned long log_start;
|
||||
unsigned long log_end;
|
||||
spinlock_t lock; /* protects log_buff, log_start and log_end */
|
||||
|
|
|
@ -29,9 +29,10 @@
|
|||
#include "hard-interface.h"
|
||||
|
||||
|
||||
static struct sk_buff *frag_merge_packet(struct list_head *head,
|
||||
struct frag_packet_list_entry *tfp,
|
||||
struct sk_buff *skb)
|
||||
static struct sk_buff *
|
||||
batadv_frag_merge_packet(struct list_head *head,
|
||||
struct frag_packet_list_entry *tfp,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct unicast_frag_packet *up =
|
||||
(struct unicast_frag_packet *)skb->data;
|
||||
|
@ -75,7 +76,8 @@ err:
|
|||
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 unicast_frag_packet *up =
|
||||
|
@ -91,12 +93,12 @@ static void frag_create_entry(struct list_head *head, struct sk_buff *skb)
|
|||
return;
|
||||
}
|
||||
|
||||
static int frag_create_buffer(struct list_head *head)
|
||||
static int batadv_frag_create_buffer(struct list_head *head)
|
||||
{
|
||||
int i;
|
||||
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);
|
||||
if (!tfp) {
|
||||
batadv_frag_list_free(head);
|
||||
|
@ -111,8 +113,9 @@ static int frag_create_buffer(struct list_head *head)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct frag_packet_list_entry *frag_search_packet(struct list_head *head,
|
||||
const struct unicast_frag_packet *up)
|
||||
static struct frag_packet_list_entry *
|
||||
batadv_frag_search_packet(struct list_head *head,
|
||||
const struct unicast_frag_packet *up)
|
||||
{
|
||||
struct frag_packet_list_entry *tfp;
|
||||
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,
|
|||
orig_node->last_frag_packet = jiffies;
|
||||
|
||||
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");
|
||||
goto out;
|
||||
}
|
||||
|
||||
tmp_frag_entry = frag_search_packet(&orig_node->frag_list,
|
||||
unicast_packet);
|
||||
tmp_frag_entry = batadv_frag_search_packet(&orig_node->frag_list,
|
||||
unicast_packet);
|
||||
|
||||
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;
|
||||
goto out;
|
||||
}
|
||||
|
||||
*new_skb = frag_merge_packet(&orig_node->frag_list, tmp_frag_entry,
|
||||
skb);
|
||||
*new_skb = batadv_frag_merge_packet(&orig_node->frag_list,
|
||||
tmp_frag_entry, skb);
|
||||
/* if not, merge failed */
|
||||
if (*new_skb)
|
||||
ret = NET_RX_SUCCESS;
|
||||
|
@ -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));
|
||||
|
||||
frag1->header.ttl--;
|
||||
frag1->header.version = COMPAT_VERSION;
|
||||
frag1->header.version = BATADV_COMPAT_VERSION;
|
||||
frag1->header.packet_type = BAT_UNICAST_FRAG;
|
||||
|
||||
memcpy(frag1->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
|
@ -316,11 +319,11 @@ find_router:
|
|||
|
||||
unicast_packet = (struct unicast_packet *)skb->data;
|
||||
|
||||
unicast_packet->header.version = COMPAT_VERSION;
|
||||
unicast_packet->header.version = BATADV_COMPAT_VERSION;
|
||||
/* batman packet type: unicast */
|
||||
unicast_packet->header.packet_type = BAT_UNICAST;
|
||||
/* set unicast ttl */
|
||||
unicast_packet->header.ttl = TTL;
|
||||
unicast_packet->header.ttl = BATADV_TTL;
|
||||
/* copy the destination for faster routing */
|
||||
memcpy(unicast_packet->dest, orig_node->orig, ETH_ALEN);
|
||||
/* set the destination tt version number */
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
|
||||
#include "packet.h"
|
||||
|
||||
#define 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_TIMEOUT 10000 /* purge frag list entries after time in ms */
|
||||
#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,
|
||||
struct sk_buff **new_skb);
|
||||
|
|
|
@ -26,12 +26,12 @@
|
|||
#include "hash.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 */
|
||||
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 bat_priv *bat_priv = info->bat_priv;
|
||||
|
@ -50,7 +50,7 @@ static void free_info(struct kref *ref)
|
|||
}
|
||||
|
||||
/* 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_packet *p1, *p2;
|
||||
|
@ -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 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_packet *packet;
|
||||
|
@ -88,8 +88,8 @@ static uint32_t vis_info_choose(const void *data, uint32_t size)
|
|||
return hash % size;
|
||||
}
|
||||
|
||||
static struct vis_info *vis_hash_find(struct bat_priv *bat_priv,
|
||||
const void *data)
|
||||
static struct vis_info *batadv_vis_hash_find(struct bat_priv *bat_priv,
|
||||
const void *data)
|
||||
{
|
||||
struct hashtable_t *hash = bat_priv->vis_hash;
|
||||
struct hlist_head *head;
|
||||
|
@ -100,12 +100,12 @@ static struct vis_info *vis_hash_find(struct bat_priv *bat_priv,
|
|||
if (!hash)
|
||||
return NULL;
|
||||
|
||||
index = vis_info_choose(data, hash->size);
|
||||
index = batadv_vis_info_choose(data, hash->size);
|
||||
head = &hash->table[index];
|
||||
|
||||
rcu_read_lock();
|
||||
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;
|
||||
|
||||
vis_info_tmp = vis_info;
|
||||
|
@ -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
|
||||
* does not already exist in the list
|
||||
*/
|
||||
static void vis_data_insert_interface(const uint8_t *interface,
|
||||
struct hlist_head *if_list,
|
||||
bool primary)
|
||||
static void batadv_vis_data_insert_interface(const uint8_t *interface,
|
||||
struct hlist_head *if_list,
|
||||
bool primary)
|
||||
{
|
||||
struct if_list_entry *entry;
|
||||
struct hlist_node *pos;
|
||||
|
@ -140,73 +140,117 @@ static void vis_data_insert_interface(const uint8_t *interface,
|
|||
hlist_add_head(&entry->list, if_list);
|
||||
}
|
||||
|
||||
static ssize_t vis_data_read_prim_sec(char *buff,
|
||||
const struct hlist_head *if_list)
|
||||
static void batadv_vis_data_read_prim_sec(struct seq_file *seq,
|
||||
const struct hlist_head *if_list)
|
||||
{
|
||||
struct if_list_entry *entry;
|
||||
struct hlist_node *pos;
|
||||
size_t len = 0;
|
||||
|
||||
hlist_for_each_entry(entry, pos, if_list, list) {
|
||||
if (entry->primary)
|
||||
len += sprintf(buff + len, "PRIMARY, ");
|
||||
seq_printf(seq, "PRIMARY, ");
|
||||
else
|
||||
len += sprintf(buff + len, "SEC %pM, ", entry->addr);
|
||||
seq_printf(seq, "SEC %pM, ", entry->addr);
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static size_t vis_data_count_prim_sec(struct hlist_head *if_list)
|
||||
{
|
||||
struct if_list_entry *entry;
|
||||
struct hlist_node *pos;
|
||||
size_t count = 0;
|
||||
|
||||
hlist_for_each_entry(entry, pos, if_list, list) {
|
||||
if (entry->primary)
|
||||
count += 9;
|
||||
else
|
||||
count += 23;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* read an entry */
|
||||
static ssize_t vis_data_read_entry(char *buff,
|
||||
const struct vis_info_entry *entry,
|
||||
const uint8_t *src, bool primary)
|
||||
static ssize_t batadv_vis_data_read_entry(struct seq_file *seq,
|
||||
const struct vis_info_entry *entry,
|
||||
const uint8_t *src, bool primary)
|
||||
{
|
||||
/* maximal length: max(4+17+2, 3+17+1+3+2) == 26 */
|
||||
if (primary && entry->quality == 0)
|
||||
return sprintf(buff, "TT %pM, ", entry->dest);
|
||||
return seq_printf(seq, "TT %pM, ", entry->dest);
|
||||
else if (batadv_compare_eth(entry->src, src))
|
||||
return sprintf(buff, "TQ %pM %d, ", entry->dest,
|
||||
entry->quality);
|
||||
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;
|
||||
|
||||
batadv_vis_data_insert_interface(entries[i].src, list, false);
|
||||
}
|
||||
}
|
||||
|
||||
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 hlist_node *pos;
|
||||
|
||||
hlist_for_each_entry(entry, pos, list, list) {
|
||||
seq_printf(seq, "%pM,", entry->addr);
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
static void batadv_vis_seq_print_text_bucket(struct seq_file *seq,
|
||||
const struct hlist_head *head)
|
||||
{
|
||||
struct hlist_node *node;
|
||||
struct vis_info *info;
|
||||
struct vis_packet *packet;
|
||||
uint8_t *entries_pos;
|
||||
struct vis_info_entry *entries;
|
||||
struct if_list_entry *entry;
|
||||
struct hlist_node *pos, *n;
|
||||
|
||||
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)
|
||||
{
|
||||
struct hard_iface *primary_if;
|
||||
struct hlist_node *node;
|
||||
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 bat_priv *bat_priv = netdev_priv(net_dev);
|
||||
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;
|
||||
int j, ret = 0;
|
||||
int ret = 0;
|
||||
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);
|
||||
if (!primary_if)
|
||||
|
@ -215,120 +259,13 @@ int batadv_vis_seq_print_text(struct seq_file *seq, void *offset)
|
|||
if (vis_server == VIS_TYPE_CLIENT_UPDATE)
|
||||
goto out;
|
||||
|
||||
buf_size = 1;
|
||||
/* Estimate length */
|
||||
spin_lock_bh(&bat_priv->vis_hash_lock);
|
||||
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) {
|
||||
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();
|
||||
batadv_vis_seq_print_text_bucket(seq, head);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
seq_printf(seq, "%s", buff);
|
||||
kfree(buff);
|
||||
|
||||
out:
|
||||
if (primary_if)
|
||||
batadv_hardif_free_ref(primary_if);
|
||||
|
@ -338,7 +275,8 @@ out:
|
|||
/* add the info packet to the send list, if it was not
|
||||
* 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)) {
|
||||
kref_get(&info->refcount);
|
||||
|
@ -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
|
||||
* 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)) {
|
||||
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. */
|
||||
static void recv_list_add(struct bat_priv *bat_priv,
|
||||
struct list_head *recv_list, const char *mac)
|
||||
static void batadv_recv_list_add(struct bat_priv *bat_priv,
|
||||
struct list_head *recv_list, const char *mac)
|
||||
{
|
||||
struct recvlist_node *entry;
|
||||
|
||||
|
@ -374,8 +312,9 @@ static void recv_list_add(struct bat_priv *bat_priv,
|
|||
}
|
||||
|
||||
/* returns 1 if this mac is in the recv_list */
|
||||
static int recv_list_is_in(struct bat_priv *bat_priv,
|
||||
const struct list_head *recv_list, const char *mac)
|
||||
static int batadv_recv_list_is_in(struct bat_priv *bat_priv,
|
||||
const struct list_head *recv_list,
|
||||
const char *mac)
|
||||
{
|
||||
const struct recvlist_node *entry;
|
||||
|
||||
|
@ -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
|
||||
* is newer than old entries in the hash.
|
||||
*/
|
||||
static struct vis_info *add_packet(struct bat_priv *bat_priv,
|
||||
struct vis_packet *vis_packet,
|
||||
int vis_info_len, int *is_new,
|
||||
int make_broadcast)
|
||||
static struct vis_info *batadv_add_packet(struct bat_priv *bat_priv,
|
||||
struct vis_packet *vis_packet,
|
||||
int vis_info_len, int *is_new,
|
||||
int make_broadcast)
|
||||
{
|
||||
struct vis_info *info, *old_info;
|
||||
struct vis_packet *search_packet, *old_packet;
|
||||
|
@ -418,16 +357,17 @@ static struct vis_info *add_packet(struct bat_priv *bat_priv,
|
|||
sizeof(*search_packet));
|
||||
|
||||
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);
|
||||
|
||||
if (old_info) {
|
||||
old_packet = (struct vis_packet *)old_info->skb_packet->data;
|
||||
if (!seq_after(ntohl(vis_packet->seqno),
|
||||
ntohl(old_packet->seqno))) {
|
||||
if (!batadv_seq_after(ntohl(vis_packet->seqno),
|
||||
ntohl(old_packet->seqno))) {
|
||||
if (old_packet->seqno == vis_packet->seqno) {
|
||||
recv_list_add(bat_priv, &old_info->recv_list,
|
||||
vis_packet->sender_orig);
|
||||
batadv_recv_list_add(bat_priv,
|
||||
&old_info->recv_list,
|
||||
vis_packet->sender_orig);
|
||||
return old_info;
|
||||
} else {
|
||||
/* newer packet is already in hash. */
|
||||
|
@ -435,10 +375,10 @@ static struct vis_info *add_packet(struct bat_priv *bat_priv,
|
|||
}
|
||||
}
|
||||
/* remove old entry */
|
||||
batadv_hash_remove(bat_priv->vis_hash, vis_info_cmp,
|
||||
vis_info_choose, old_info);
|
||||
send_list_del(old_info);
|
||||
kref_put(&old_info->refcount, free_info);
|
||||
batadv_hash_remove(bat_priv->vis_hash, batadv_vis_info_cmp,
|
||||
batadv_vis_info_choose, old_info);
|
||||
batadv_send_list_del(old_info);
|
||||
kref_put(&old_info->refcount, batadv_free_info);
|
||||
}
|
||||
|
||||
info = kmalloc(sizeof(*info), GFP_ATOMIC);
|
||||
|
@ -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)
|
||||
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 */
|
||||
hash_added = batadv_hash_add(bat_priv->vis_hash, vis_info_cmp,
|
||||
vis_info_choose, info, &info->hash_entry);
|
||||
hash_added = batadv_hash_add(bat_priv->vis_hash, batadv_vis_info_cmp,
|
||||
batadv_vis_info_choose, info,
|
||||
&info->hash_entry);
|
||||
if (hash_added != 0) {
|
||||
/* did not work (for some reason) */
|
||||
kref_put(&info->refcount, free_info);
|
||||
kref_put(&info->refcount, batadv_free_info);
|
||||
info = NULL;
|
||||
}
|
||||
|
||||
|
@ -499,8 +440,8 @@ void batadv_receive_server_sync_packet(struct bat_priv *bat_priv,
|
|||
make_broadcast = (vis_server == VIS_TYPE_SERVER_SYNC);
|
||||
|
||||
spin_lock_bh(&bat_priv->vis_hash_lock);
|
||||
info = add_packet(bat_priv, vis_packet, vis_info_len,
|
||||
&is_new, make_broadcast);
|
||||
info = batadv_add_packet(bat_priv, vis_packet, vis_info_len,
|
||||
&is_new, make_broadcast);
|
||||
if (!info)
|
||||
goto end;
|
||||
|
||||
|
@ -508,7 +449,7 @@ void batadv_receive_server_sync_packet(struct bat_priv *bat_priv,
|
|||
* hash.
|
||||
*/
|
||||
if (vis_server == VIS_TYPE_SERVER_SYNC && is_new)
|
||||
send_list_add(bat_priv, info);
|
||||
batadv_send_list_add(bat_priv, info);
|
||||
end:
|
||||
spin_unlock_bh(&bat_priv->vis_hash_lock);
|
||||
}
|
||||
|
@ -534,8 +475,8 @@ void batadv_receive_client_update_packet(struct bat_priv *bat_priv,
|
|||
are_target = 1;
|
||||
|
||||
spin_lock_bh(&bat_priv->vis_hash_lock);
|
||||
info = add_packet(bat_priv, vis_packet, vis_info_len,
|
||||
&is_new, are_target);
|
||||
info = batadv_add_packet(bat_priv, vis_packet, vis_info_len,
|
||||
&is_new, are_target);
|
||||
|
||||
if (!info)
|
||||
goto end;
|
||||
|
@ -546,11 +487,11 @@ void batadv_receive_client_update_packet(struct bat_priv *bat_priv,
|
|||
/* send only if we're the target server or ... */
|
||||
if (are_target && is_new) {
|
||||
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). */
|
||||
} else if (!batadv_is_my_mac(packet->target_orig)) {
|
||||
send_list_add(bat_priv, info);
|
||||
batadv_send_list_add(bat_priv, info);
|
||||
}
|
||||
|
||||
end:
|
||||
|
@ -562,8 +503,8 @@ end:
|
|||
*
|
||||
* Must be called with the originator hash locked
|
||||
*/
|
||||
static int find_best_vis_server(struct bat_priv *bat_priv,
|
||||
struct vis_info *info)
|
||||
static int batadv_find_best_vis_server(struct bat_priv *bat_priv,
|
||||
struct vis_info *info)
|
||||
{
|
||||
struct hashtable_t *hash = bat_priv->orig_hash;
|
||||
struct neigh_node *router;
|
||||
|
@ -600,13 +541,15 @@ static int find_best_vis_server(struct bat_priv *bat_priv,
|
|||
}
|
||||
|
||||
/* 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;
|
||||
packet = (struct vis_packet *)info->skb_packet->data;
|
||||
size_t num_items;
|
||||
|
||||
if (MAX_VIS_PACKET_SIZE / sizeof(struct vis_info_entry)
|
||||
< packet->entries + 1)
|
||||
packet = (struct vis_packet *)info->skb_packet->data;
|
||||
num_items = BATADV_MAX_VIS_PACKET_SIZE / sizeof(struct vis_info_entry);
|
||||
|
||||
if (num_items < packet->entries + 1)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
@ -614,7 +557,7 @@ static bool vis_packet_full(const struct vis_info *info)
|
|||
/* generates a packet of own vis data,
|
||||
* 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 hlist_node *node;
|
||||
|
@ -632,13 +575,13 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
|
|||
packet->vis_type = atomic_read(&bat_priv->vis_mode);
|
||||
|
||||
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->entries = 0;
|
||||
skb_trim(info->skb_packet, sizeof(*packet));
|
||||
|
||||
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)
|
||||
return best_tq;
|
||||
|
@ -675,7 +618,7 @@ static int generate_vis_packet(struct bat_priv *bat_priv)
|
|||
next:
|
||||
batadv_neigh_node_free_ref(router);
|
||||
|
||||
if (vis_packet_full(info))
|
||||
if (batadv_vis_packet_full(info))
|
||||
goto unlock;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
@ -697,7 +640,7 @@ next:
|
|||
entry->quality = 0; /* 0 means TT */
|
||||
packet->entries++;
|
||||
|
||||
if (vis_packet_full(info))
|
||||
if (batadv_vis_packet_full(info))
|
||||
goto unlock;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
@ -713,7 +656,7 @@ unlock:
|
|||
/* free old vis packets. Must be called with this vis_hash_lock
|
||||
* 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;
|
||||
struct hashtable_t *hash = bat_priv->vis_hash;
|
||||
|
@ -731,17 +674,17 @@ static void purge_vis_packets(struct bat_priv *bat_priv)
|
|||
continue;
|
||||
|
||||
if (batadv_has_timed_out(info->first_seen,
|
||||
VIS_TIMEOUT)) {
|
||||
BATADV_VIS_TIMEOUT)) {
|
||||
hlist_del(node);
|
||||
send_list_del(info);
|
||||
kref_put(&info->refcount, free_info);
|
||||
batadv_send_list_del(info);
|
||||
kref_put(&info->refcount, batadv_free_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void broadcast_vis_packet(struct bat_priv *bat_priv,
|
||||
struct vis_info *info)
|
||||
static void batadv_broadcast_vis_packet(struct bat_priv *bat_priv,
|
||||
struct vis_info *info)
|
||||
{
|
||||
struct neigh_node *router;
|
||||
struct hashtable_t *hash = bat_priv->orig_hash;
|
||||
|
@ -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
|
||||
* this node.
|
||||
*/
|
||||
if (recv_list_is_in(bat_priv, &info->recv_list,
|
||||
orig_node->orig)) {
|
||||
if (batadv_recv_list_is_in(bat_priv, &info->recv_list,
|
||||
orig_node->orig)) {
|
||||
batadv_neigh_node_free_ref(router);
|
||||
continue;
|
||||
}
|
||||
|
@ -796,8 +739,8 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv,
|
|||
}
|
||||
}
|
||||
|
||||
static void unicast_vis_packet(struct bat_priv *bat_priv,
|
||||
struct vis_info *info)
|
||||
static void batadv_unicast_vis_packet(struct bat_priv *bat_priv,
|
||||
struct vis_info *info)
|
||||
{
|
||||
struct orig_node *orig_node;
|
||||
struct neigh_node *router = NULL;
|
||||
|
@ -825,8 +768,9 @@ out:
|
|||
batadv_orig_node_free_ref(orig_node);
|
||||
}
|
||||
|
||||
/* only send one vis packet. called from send_vis_packets() */
|
||||
static void send_vis_packet(struct bat_priv *bat_priv, struct vis_info *info)
|
||||
/* only send one vis packet. called from batadv_send_vis_packets() */
|
||||
static void batadv_send_vis_packet(struct bat_priv *bat_priv,
|
||||
struct vis_info *info)
|
||||
{
|
||||
struct hard_iface *primary_if;
|
||||
struct vis_packet *packet;
|
||||
|
@ -845,9 +789,9 @@ static void send_vis_packet(struct bat_priv *bat_priv, struct vis_info *info)
|
|||
packet->header.ttl--;
|
||||
|
||||
if (is_broadcast_ether_addr(packet->target_orig))
|
||||
broadcast_vis_packet(bat_priv, info);
|
||||
batadv_broadcast_vis_packet(bat_priv, info);
|
||||
else
|
||||
unicast_vis_packet(bat_priv, info);
|
||||
batadv_unicast_vis_packet(bat_priv, info);
|
||||
packet->header.ttl++; /* restore TTL */
|
||||
|
||||
out:
|
||||
|
@ -856,7 +800,7 @@ out:
|
|||
}
|
||||
|
||||
/* 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 =
|
||||
container_of(work, struct delayed_work, work);
|
||||
|
@ -865,11 +809,11 @@ static void send_vis_packets(struct work_struct *work)
|
|||
struct vis_info *info;
|
||||
|
||||
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 */
|
||||
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)) {
|
||||
|
@ -879,14 +823,14 @@ static void send_vis_packets(struct work_struct *work)
|
|||
kref_get(&info->refcount);
|
||||
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);
|
||||
send_list_del(info);
|
||||
kref_put(&info->refcount, free_info);
|
||||
batadv_send_list_del(info);
|
||||
kref_put(&info->refcount, batadv_free_info);
|
||||
}
|
||||
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
|
||||
|
@ -896,6 +840,8 @@ int batadv_vis_init(struct bat_priv *bat_priv)
|
|||
{
|
||||
struct vis_packet *packet;
|
||||
int hash_added;
|
||||
unsigned int len;
|
||||
unsigned long first_seen;
|
||||
|
||||
if (bat_priv->vis_hash)
|
||||
return 0;
|
||||
|
@ -908,13 +854,12 @@ int batadv_vis_init(struct bat_priv *bat_priv)
|
|||
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)
|
||||
goto err;
|
||||
|
||||
bat_priv->my_vis_info->skb_packet = dev_alloc_skb(sizeof(*packet) +
|
||||
MAX_VIS_PACKET_SIZE +
|
||||
ETH_HLEN);
|
||||
len = sizeof(*packet) + BATADV_MAX_VIS_PACKET_SIZE + ETH_HLEN;
|
||||
bat_priv->my_vis_info->skb_packet = dev_alloc_skb(len);
|
||||
if (!bat_priv->my_vis_info->skb_packet)
|
||||
goto free_info;
|
||||
|
||||
|
@ -923,32 +868,33 @@ int batadv_vis_init(struct bat_priv *bat_priv)
|
|||
sizeof(*packet));
|
||||
|
||||
/* prefill the vis info */
|
||||
bat_priv->my_vis_info->first_seen = jiffies -
|
||||
msecs_to_jiffies(VIS_INTERVAL);
|
||||
first_seen = jiffies - msecs_to_jiffies(BATADV_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->send_list);
|
||||
kref_init(&bat_priv->my_vis_info->refcount);
|
||||
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.ttl = TTL;
|
||||
packet->header.ttl = BATADV_TTL;
|
||||
packet->seqno = 0;
|
||||
packet->entries = 0;
|
||||
|
||||
INIT_LIST_HEAD(&bat_priv->vis_send_list);
|
||||
|
||||
hash_added = batadv_hash_add(bat_priv->vis_hash, vis_info_cmp,
|
||||
vis_info_choose, bat_priv->my_vis_info,
|
||||
hash_added = batadv_hash_add(bat_priv->vis_hash, batadv_vis_info_cmp,
|
||||
batadv_vis_info_choose,
|
||||
bat_priv->my_vis_info,
|
||||
&bat_priv->my_vis_info->hash_entry);
|
||||
if (hash_added != 0) {
|
||||
pr_err("Can't add own vis packet into hash\n");
|
||||
/* 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;
|
||||
}
|
||||
|
||||
spin_unlock_bh(&bat_priv->vis_hash_lock);
|
||||
start_vis_timer(bat_priv);
|
||||
batadv_start_vis_timer(bat_priv);
|
||||
return 0;
|
||||
|
||||
free_info:
|
||||
|
@ -961,13 +907,13 @@ err:
|
|||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
info = container_of(node, struct vis_info, hash_entry);
|
||||
send_list_del(info);
|
||||
kref_put(&info->refcount, free_info);
|
||||
batadv_send_list_del(info);
|
||||
kref_put(&info->refcount, batadv_free_info);
|
||||
}
|
||||
|
||||
/* shutdown vis-server */
|
||||
|
@ -980,16 +926,16 @@ void batadv_vis_quit(struct bat_priv *bat_priv)
|
|||
|
||||
spin_lock_bh(&bat_priv->vis_hash_lock);
|
||||
/* 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->my_vis_info = NULL;
|
||||
spin_unlock_bh(&bat_priv->vis_hash_lock);
|
||||
}
|
||||
|
||||
/* 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,
|
||||
msecs_to_jiffies(VIS_INTERVAL));
|
||||
msecs_to_jiffies(BATADV_VIS_INTERVAL));
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#define _NET_BATMAN_ADV_VIS_H_
|
||||
|
||||
/* 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);
|
||||
void batadv_receive_server_sync_packet(struct bat_priv *bat_priv,
|
||||
|
|
Loading…
Reference in New Issue