Commit 0695512a authored by David S. Miller's avatar David S. Miller

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

parents 5bd49735 7c64fd98
# #
# Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: # Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
# #
# Marek Lindner, Simon Wunderlich # Marek Lindner, Simon Wunderlich
# #
......
/* /*
* Copyright (C) 2011 B.A.T.M.A.N. contributors: * Copyright (C) 2011-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2010-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2010-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2010-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
...@@ -321,11 +321,11 @@ static ssize_t store_gw_mode(struct kobject *kobj, struct attribute *attr, ...@@ -321,11 +321,11 @@ static ssize_t store_gw_mode(struct kobject *kobj, struct attribute *attr,
gw_mode_tmp = GW_MODE_OFF; gw_mode_tmp = GW_MODE_OFF;
if (strncmp(buff, GW_MODE_CLIENT_NAME, if (strncmp(buff, GW_MODE_CLIENT_NAME,
strlen(GW_MODE_CLIENT_NAME)) == 0) strlen(GW_MODE_CLIENT_NAME)) == 0)
gw_mode_tmp = GW_MODE_CLIENT; gw_mode_tmp = GW_MODE_CLIENT;
if (strncmp(buff, GW_MODE_SERVER_NAME, if (strncmp(buff, GW_MODE_SERVER_NAME,
strlen(GW_MODE_SERVER_NAME)) == 0) strlen(GW_MODE_SERVER_NAME)) == 0)
gw_mode_tmp = GW_MODE_SERVER; gw_mode_tmp = GW_MODE_SERVER;
if (gw_mode_tmp < 0) { if (gw_mode_tmp < 0) {
......
/* /*
* Copyright (C) 2010-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2006-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
* *
* Simon Wunderlich, Marek Lindner * Simon Wunderlich, Marek Lindner
* *
...@@ -154,8 +154,8 @@ int bit_get_packet(void *priv, unsigned long *seq_bits, ...@@ -154,8 +154,8 @@ int bit_get_packet(void *priv, unsigned long *seq_bits,
/* sequence number is much newer, probably missed a lot of packets */ /* sequence number is much newer, probably missed a lot of packets */
if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE) if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE) &&
&& (seq_num_diff < EXPECTED_SEQNO_RANGE)) { (seq_num_diff < EXPECTED_SEQNO_RANGE)) {
bat_dbg(DBG_BATMAN, bat_priv, bat_dbg(DBG_BATMAN, bat_priv,
"We missed a lot of packets (%i) !\n", "We missed a lot of packets (%i) !\n",
seq_num_diff - 1); seq_num_diff - 1);
...@@ -170,8 +170,8 @@ int bit_get_packet(void *priv, unsigned long *seq_bits, ...@@ -170,8 +170,8 @@ int bit_get_packet(void *priv, unsigned long *seq_bits,
* packet should be dropped without calling this function if the * packet should be dropped without calling this function if the
* seqno window is protected. */ * seqno window is protected. */
if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) ||
|| (seq_num_diff >= EXPECTED_SEQNO_RANGE)) { (seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
bat_dbg(DBG_BATMAN, bat_priv, bat_dbg(DBG_BATMAN, bat_priv,
"Other host probably restarted!\n"); "Other host probably restarted!\n");
......
/* /*
* Copyright (C) 2006-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
* *
* Simon Wunderlich, Marek Lindner * Simon Wunderlich, Marek Lindner
* *
......
/* /*
* Copyright (C) 2009-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
...@@ -396,7 +396,7 @@ void gw_node_purge(struct bat_priv *bat_priv) ...@@ -396,7 +396,7 @@ void gw_node_purge(struct bat_priv *bat_priv)
{ {
struct gw_node *gw_node, *curr_gw; struct gw_node *gw_node, *curr_gw;
struct hlist_node *node, *node_tmp; struct hlist_node *node, *node_tmp;
unsigned long timeout = 2 * PURGE_TIMEOUT * HZ; unsigned long timeout = msecs_to_jiffies(2 * PURGE_TIMEOUT);
int do_deselect = 0; int do_deselect = 0;
curr_gw = gw_get_selected_gw_node(bat_priv); curr_gw = gw_get_selected_gw_node(bat_priv);
...@@ -629,7 +629,7 @@ bool gw_is_dhcp_target(struct sk_buff *skb, unsigned int *header_len) ...@@ -629,7 +629,7 @@ bool gw_is_dhcp_target(struct sk_buff *skb, unsigned int *header_len)
/* check for bootp port */ /* check for bootp port */
if ((ntohs(ethhdr->h_proto) == ETH_P_IP) && if ((ntohs(ethhdr->h_proto) == ETH_P_IP) &&
(ntohs(udphdr->dest) != 67)) (ntohs(udphdr->dest) != 67))
return false; return false;
if ((ntohs(ethhdr->h_proto) == ETH_P_IPV6) && if ((ntohs(ethhdr->h_proto) == ETH_P_IPV6) &&
......
/* /*
* Copyright (C) 2009-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2009-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
...@@ -93,7 +93,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff, ...@@ -93,7 +93,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff,
multi = 1024; multi = 1024;
if ((strnicmp(tmp_ptr, "kbit", 4) == 0) || if ((strnicmp(tmp_ptr, "kbit", 4) == 0) ||
(multi > 1)) (multi > 1))
*tmp_ptr = '\0'; *tmp_ptr = '\0';
} }
...@@ -118,7 +118,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff, ...@@ -118,7 +118,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff,
multi = 1024; multi = 1024;
if ((strnicmp(tmp_ptr, "kbit", 4) == 0) || if ((strnicmp(tmp_ptr, "kbit", 4) == 0) ||
(multi > 1)) (multi > 1))
*tmp_ptr = '\0'; *tmp_ptr = '\0';
} }
......
/* /*
* Copyright (C) 2009-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
...@@ -341,23 +341,23 @@ int hardif_enable_interface(struct hard_iface *hard_iface, ...@@ -341,23 +341,23 @@ int hardif_enable_interface(struct hard_iface *hard_iface,
if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu < if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
ETH_DATA_LEN + BAT_HEADER_LEN) ETH_DATA_LEN + BAT_HEADER_LEN)
bat_info(hard_iface->soft_iface, bat_info(hard_iface->soft_iface,
"The MTU of interface %s is too small (%i) to handle " "The MTU of interface %s is too small (%i) to handle "
"the transport of batman-adv packets. Packets going " "the transport of batman-adv packets. Packets going "
"over this interface will be fragmented on layer2 " "over this interface will be fragmented on layer2 "
"which could impact the performance. Setting the MTU " "which could impact the performance. Setting the MTU "
"to %zi would solve the problem.\n", "to %zi would solve the problem.\n",
hard_iface->net_dev->name, hard_iface->net_dev->mtu, hard_iface->net_dev->name, hard_iface->net_dev->mtu,
ETH_DATA_LEN + BAT_HEADER_LEN); ETH_DATA_LEN + BAT_HEADER_LEN);
if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu < if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu <
ETH_DATA_LEN + BAT_HEADER_LEN) ETH_DATA_LEN + BAT_HEADER_LEN)
bat_info(hard_iface->soft_iface, bat_info(hard_iface->soft_iface,
"The MTU of interface %s is too small (%i) to handle " "The MTU of interface %s is too small (%i) to handle "
"the transport of batman-adv packets. If you experience" "the transport of batman-adv packets. If you "
" problems getting traffic through try increasing the " "experience problems getting traffic through try "
"MTU to %zi.\n", "increasing the MTU to %zi.\n",
hard_iface->net_dev->name, hard_iface->net_dev->mtu, hard_iface->net_dev->name, hard_iface->net_dev->mtu,
ETH_DATA_LEN + BAT_HEADER_LEN); ETH_DATA_LEN + BAT_HEADER_LEN);
if (hardif_is_iface_up(hard_iface)) if (hardif_is_iface_up(hard_iface))
hardif_activate_interface(hard_iface); hardif_activate_interface(hard_iface);
...@@ -580,8 +580,8 @@ static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, ...@@ -580,8 +580,8 @@ static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
goto err_free; goto err_free;
/* expect a valid ethernet header here. */ /* expect a valid ethernet header here. */
if (unlikely(skb->mac_len != sizeof(struct ethhdr) if (unlikely(skb->mac_len != sizeof(struct ethhdr) ||
|| !skb_mac_header(skb))) !skb_mac_header(skb)))
goto err_free; goto err_free;
if (!hard_iface->soft_iface) if (!hard_iface->soft_iface)
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2006-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
* *
* Simon Wunderlich, Marek Lindner * Simon Wunderlich, Marek Lindner
* *
......
/* /*
* Copyright (C) 2006-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors:
* *
* Simon Wunderlich, Marek Lindner * Simon Wunderlich, Marek Lindner
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#define DRIVER_DEVICE "batman-adv" #define DRIVER_DEVICE "batman-adv"
#ifndef SOURCE_VERSION #ifndef SOURCE_VERSION
#define SOURCE_VERSION "2012.0.0" #define SOURCE_VERSION "2012.1.0"
#endif #endif
/* B.A.T.M.A.N. parameters */ /* B.A.T.M.A.N. parameters */
...@@ -41,13 +41,14 @@ ...@@ -41,13 +41,14 @@
/* purge originators after time in seconds if no valid packet comes in /* purge originators after time in seconds if no valid packet comes in
* -> TODO: check influence on TQ_LOCAL_WINDOW_SIZE */ * -> TODO: check influence on TQ_LOCAL_WINDOW_SIZE */
#define PURGE_TIMEOUT 200 #define PURGE_TIMEOUT 200000 /* 200 seconds */
#define TT_LOCAL_TIMEOUT 3600 /* in seconds */ #define TT_LOCAL_TIMEOUT 3600000 /* in miliseconds */
#define TT_CLIENT_ROAM_TIMEOUT 600 #define TT_CLIENT_ROAM_TIMEOUT 600000 /* in miliseconds */
/* sliding packet range of received originator messages in sequence numbers /* sliding packet range of received originator messages in sequence numbers
* (should be a multiple of our word size) */ * (should be a multiple of our word size) */
#define TQ_LOCAL_WINDOW_SIZE 64 #define TQ_LOCAL_WINDOW_SIZE 64
#define TT_REQUEST_TIMEOUT 3 /* seconds we have to keep pending tt_req */ #define TT_REQUEST_TIMEOUT 3000 /* miliseconds we have to keep
* pending tt_req */
#define TQ_GLOBAL_WINDOW_SIZE 5 #define TQ_GLOBAL_WINDOW_SIZE 5
#define TQ_LOCAL_BIDRECT_SEND_MINIMUM 1 #define TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
...@@ -56,8 +57,8 @@ ...@@ -56,8 +57,8 @@
#define TT_OGM_APPEND_MAX 3 /* number of OGMs sent with the last tt diff */ #define TT_OGM_APPEND_MAX 3 /* number of OGMs sent with the last tt diff */
#define ROAMING_MAX_TIME 20 /* Time in which a client can roam at most #define ROAMING_MAX_TIME 20000 /* Time in which a client can roam at most
* ROAMING_MAX_COUNT times */ * ROAMING_MAX_COUNT times in miliseconds*/
#define ROAMING_MAX_COUNT 5 #define ROAMING_MAX_COUNT 5
#define NO_FLAGS 0 #define NO_FLAGS 0
......
/* /*
* Copyright (C) 2009-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2009-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
...@@ -143,7 +143,7 @@ static void orig_node_free_rcu(struct rcu_head *rcu) ...@@ -143,7 +143,7 @@ static void orig_node_free_rcu(struct rcu_head *rcu)
frag_list_free(&orig_node->frag_list); frag_list_free(&orig_node->frag_list);
tt_global_del_orig(orig_node->bat_priv, orig_node, tt_global_del_orig(orig_node->bat_priv, orig_node,
"originator timed out"); "originator timed out");
kfree(orig_node->tt_buff); kfree(orig_node->tt_buff);
kfree(orig_node->bcast_own); kfree(orig_node->bcast_own);
...@@ -282,8 +282,7 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv, ...@@ -282,8 +282,7 @@ static bool purge_orig_neighbors(struct bat_priv *bat_priv,
hlist_for_each_entry_safe(neigh_node, node, node_tmp, hlist_for_each_entry_safe(neigh_node, node, node_tmp,
&orig_node->neigh_list, list) { &orig_node->neigh_list, list) {
if ((time_after(jiffies, if ((has_timed_out(neigh_node->last_valid, PURGE_TIMEOUT)) ||
neigh_node->last_valid + PURGE_TIMEOUT * HZ)) ||
(neigh_node->if_incoming->if_status == IF_INACTIVE) || (neigh_node->if_incoming->if_status == IF_INACTIVE) ||
(neigh_node->if_incoming->if_status == IF_NOT_IN_USE) || (neigh_node->if_incoming->if_status == IF_NOT_IN_USE) ||
(neigh_node->if_incoming->if_status == IF_TO_BE_REMOVED)) { (neigh_node->if_incoming->if_status == IF_TO_BE_REMOVED)) {
...@@ -327,18 +326,15 @@ static bool purge_orig_node(struct bat_priv *bat_priv, ...@@ -327,18 +326,15 @@ static bool purge_orig_node(struct bat_priv *bat_priv,
{ {
struct neigh_node *best_neigh_node; struct neigh_node *best_neigh_node;
if (time_after(jiffies, if (has_timed_out(orig_node->last_valid, 2 * PURGE_TIMEOUT)) {
orig_node->last_valid + 2 * PURGE_TIMEOUT * HZ)) {
bat_dbg(DBG_BATMAN, bat_priv, bat_dbg(DBG_BATMAN, bat_priv,
"Originator timeout: originator %pM, last_valid %lu\n", "Originator timeout: originator %pM, last_valid %lu\n",
orig_node->orig, (orig_node->last_valid / HZ)); orig_node->orig, (orig_node->last_valid / HZ));
return true; return true;
} else { } else {
if (purge_orig_neighbors(bat_priv, orig_node, if (purge_orig_neighbors(bat_priv, orig_node,
&best_neigh_node)) { &best_neigh_node))
update_route(bat_priv, orig_node, best_neigh_node); update_route(bat_priv, orig_node, best_neigh_node);
}
} }
return false; return false;
...@@ -372,8 +368,8 @@ static void _purge_orig(struct bat_priv *bat_priv) ...@@ -372,8 +368,8 @@ static void _purge_orig(struct bat_priv *bat_priv)
continue; continue;
} }
if (time_after(jiffies, orig_node->last_frag_packet + if (has_timed_out(orig_node->last_frag_packet,
msecs_to_jiffies(FRAG_TIMEOUT))) FRAG_TIMEOUT))
frag_list_free(&orig_node->frag_list); frag_list_free(&orig_node->frag_list);
} }
spin_unlock_bh(list_lock); spin_unlock_bh(list_lock);
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
...@@ -72,7 +72,7 @@ static void _update_route(struct bat_priv *bat_priv, ...@@ -72,7 +72,7 @@ static void _update_route(struct bat_priv *bat_priv,
bat_dbg(DBG_ROUTES, bat_priv, "Deleting route towards: %pM\n", bat_dbg(DBG_ROUTES, bat_priv, "Deleting route towards: %pM\n",
orig_node->orig); orig_node->orig);
tt_global_del_orig(bat_priv, orig_node, tt_global_del_orig(bat_priv, orig_node,
"Deleted route towards originator"); "Deleted route towards originator");
/* route added */ /* route added */
} else if ((!curr_router) && (neigh_node)) { } else if ((!curr_router) && (neigh_node)) {
...@@ -229,10 +229,9 @@ void bonding_save_primary(const struct orig_node *orig_node, ...@@ -229,10 +229,9 @@ void bonding_save_primary(const struct orig_node *orig_node,
int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff, int window_protected(struct bat_priv *bat_priv, int32_t seq_num_diff,
unsigned long *last_reset) unsigned long *last_reset)
{ {
if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) ||
|| (seq_num_diff >= EXPECTED_SEQNO_RANGE)) { (seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
if (time_after(jiffies, *last_reset + if (has_timed_out(*last_reset, RESET_PROTECTION_MS)) {
msecs_to_jiffies(RESET_PROTECTION_MS))) {
*last_reset = jiffies; *last_reset = jiffies;
bat_dbg(DBG_BATMAN, bat_priv, bat_dbg(DBG_BATMAN, bat_priv,
...@@ -430,7 +429,7 @@ int recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if) ...@@ -430,7 +429,7 @@ int recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if)
if ((hdr_size == sizeof(struct icmp_packet_rr)) && if ((hdr_size == sizeof(struct icmp_packet_rr)) &&
(icmp_packet->rr_cur < BAT_RR_LEN)) { (icmp_packet->rr_cur < BAT_RR_LEN)) {
memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]), memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
ethhdr->h_dest, ETH_ALEN); ethhdr->h_dest, ETH_ALEN);
icmp_packet->rr_cur++; icmp_packet->rr_cur++;
} }
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
...@@ -396,8 +396,8 @@ void softif_neigh_purge(struct bat_priv *bat_priv) ...@@ -396,8 +396,8 @@ void softif_neigh_purge(struct bat_priv *bat_priv)
hlist_for_each_entry_safe(softif_neigh, node_tmp, node_tmp2, hlist_for_each_entry_safe(softif_neigh, node_tmp, node_tmp2,
&softif_neigh_vid->softif_neigh_list, &softif_neigh_vid->softif_neigh_list,
list) { list) {
if ((!time_after(jiffies, softif_neigh->last_seen + if ((!has_timed_out(softif_neigh->last_seen,
msecs_to_jiffies(SOFTIF_NEIGH_TIMEOUT))) && SOFTIF_NEIGH_TIMEOUT)) &&
(atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE)) (atomic_read(&bat_priv->mesh_state) == MESH_ACTIVE))
continue; continue;
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner * Marek Lindner
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
...@@ -210,6 +210,11 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr, ...@@ -210,6 +210,11 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
if (compare_eth(addr, soft_iface->dev_addr)) if (compare_eth(addr, soft_iface->dev_addr))
tt_local_entry->common.flags |= TT_CLIENT_NOPURGE; tt_local_entry->common.flags |= TT_CLIENT_NOPURGE;
/* The local entry has to be marked as NEW to avoid to send it in
* a full table response going out before the next ttvn increment
* (consistency check) */
tt_local_entry->common.flags |= TT_CLIENT_NEW;
hash_added = hash_add(bat_priv->tt_local_hash, compare_tt, choose_orig, hash_added = hash_add(bat_priv->tt_local_hash, compare_tt, choose_orig,
&tt_local_entry->common, &tt_local_entry->common,
&tt_local_entry->common.hash_entry); &tt_local_entry->common.hash_entry);
...@@ -222,11 +227,6 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr, ...@@ -222,11 +227,6 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
tt_local_event(bat_priv, addr, tt_local_entry->common.flags); tt_local_event(bat_priv, addr, tt_local_entry->common.flags);
/* The local entry has to be marked as NEW to avoid to send it in
* a full table response going out before the next ttvn increment
* (consistency check) */
tt_local_entry->common.flags |= TT_CLIENT_NEW;
/* remove address from global hash if present */ /* remove address from global hash if present */
tt_global_entry = tt_global_hash_find(bat_priv, addr); tt_global_entry = tt_global_hash_find(bat_priv, addr);
...@@ -261,7 +261,7 @@ int tt_changes_fill_buffer(struct bat_priv *bat_priv, ...@@ -261,7 +261,7 @@ int tt_changes_fill_buffer(struct bat_priv *bat_priv,
atomic_set(&bat_priv->tt_local_changes, 0); atomic_set(&bat_priv->tt_local_changes, 0);
list_for_each_entry_safe(entry, safe, &bat_priv->tt_changes_list, list_for_each_entry_safe(entry, safe, &bat_priv->tt_changes_list,
list) { list) {
if (count < tot_changes) { if (count < tot_changes) {
memcpy(buff + tt_len(count), memcpy(buff + tt_len(count),
&entry->change, sizeof(struct tt_change)); &entry->change, sizeof(struct tt_change));
...@@ -333,17 +333,17 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset) ...@@ -333,17 +333,17 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)
hlist_for_each_entry_rcu(tt_common_entry, node, hlist_for_each_entry_rcu(tt_common_entry, node,
head, hash_entry) { head, hash_entry) {
seq_printf(seq, " * %pM [%c%c%c%c%c]\n", seq_printf(seq, " * %pM [%c%c%c%c%c]\n",
tt_common_entry->addr, tt_common_entry->addr,
(tt_common_entry->flags & (tt_common_entry->flags &
TT_CLIENT_ROAM ? 'R' : '.'), TT_CLIENT_ROAM ? 'R' : '.'),
(tt_common_entry->flags & (tt_common_entry->flags &
TT_CLIENT_NOPURGE ? 'P' : '.'), TT_CLIENT_NOPURGE ? 'P' : '.'),
(tt_common_entry->flags & (tt_common_entry->flags &
TT_CLIENT_NEW ? 'N' : '.'), TT_CLIENT_NEW ? 'N' : '.'),
(tt_common_entry->flags & (tt_common_entry->flags &
TT_CLIENT_PENDING ? 'X' : '.'), TT_CLIENT_PENDING ? 'X' : '.'),
(tt_common_entry->flags & (tt_common_entry->flags &
TT_CLIENT_WIFI ? 'W' : '.')); TT_CLIENT_WIFI ? 'W' : '.'));
} }
rcu_read_unlock(); rcu_read_unlock();
} }
...@@ -355,7 +355,7 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset) ...@@ -355,7 +355,7 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)
static void tt_local_set_pending(struct bat_priv *bat_priv, static void tt_local_set_pending(struct bat_priv *bat_priv,
struct tt_local_entry *tt_local_entry, struct tt_local_entry *tt_local_entry,
uint16_t flags) uint16_t flags, const char *message)
{ {
tt_local_event(bat_priv, tt_local_entry->common.addr, tt_local_event(bat_priv, tt_local_entry->common.addr,
tt_local_entry->common.flags | flags); tt_local_entry->common.flags | flags);
...@@ -364,6 +364,9 @@ static void tt_local_set_pending(struct bat_priv *bat_priv, ...@@ -364,6 +364,9 @@ static void tt_local_set_pending(struct bat_priv *bat_priv,
* to be kept in the table in order to send it in a full table * to be kept in the table in order to send it in a full table
* response issued before the net ttvn increment (consistency check) */ * response issued before the net ttvn increment (consistency check) */
tt_local_entry->common.flags |= TT_CLIENT_PENDING; tt_local_entry->common.flags |= TT_CLIENT_PENDING;
bat_dbg(DBG_TT, bat_priv, "Local tt entry (%pM) pending to be removed: "
"%s\n", tt_local_entry->common.addr, message);
} }
void tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr, void tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr,
...@@ -376,10 +379,7 @@ void tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr, ...@@ -376,10 +379,7 @@ void tt_local_remove(struct bat_priv *bat_priv, const uint8_t *addr,
goto out; goto out;
tt_local_set_pending(bat_priv, tt_local_entry, TT_CLIENT_DEL | tt_local_set_pending(bat_priv, tt_local_entry, TT_CLIENT_DEL |
(roaming ? TT_CLIENT_ROAM : NO_FLAGS)); (roaming ? TT_CLIENT_ROAM : NO_FLAGS), message);
bat_dbg(DBG_TT, bat_priv, "Local tt entry (%pM) pending to be removed: "
"%s\n", tt_local_entry->common.addr, message);
out: out:
if (tt_local_entry) if (tt_local_entry)
tt_local_entry_free_ref(tt_local_entry); tt_local_entry_free_ref(tt_local_entry);
...@@ -413,14 +413,11 @@ static void tt_local_purge(struct bat_priv *bat_priv) ...@@ -413,14 +413,11 @@ static void tt_local_purge(struct bat_priv *bat_priv)
continue; continue;
if (!has_timed_out(tt_local_entry->last_seen, if (!has_timed_out(tt_local_entry->last_seen,
TT_LOCAL_TIMEOUT * 1000)) TT_LOCAL_TIMEOUT))
continue; continue;
tt_local_set_pending(bat_priv, tt_local_entry, tt_local_set_pending(bat_priv, tt_local_entry,
TT_CLIENT_DEL); TT_CLIENT_DEL, "timed out");
bat_dbg(DBG_TT, bat_priv, "Local tt entry (%pM) "
"pending to be removed: timed out\n",
tt_local_entry->common.addr);
} }
spin_unlock_bh(list_lock); spin_unlock_bh(list_lock);
} }
...@@ -606,7 +603,7 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset) ...@@ -606,7 +603,7 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)
struct tt_global_entry, struct tt_global_entry,
common); common);
seq_printf(seq, " * %pM (%3u) via %pM (%3u) " seq_printf(seq, " * %pM (%3u) via %pM (%3u) "
"[%c%c%c]\n", "[%c%c]\n",
tt_global_entry->common.addr, tt_global_entry->common.addr,
tt_global_entry->ttvn, tt_global_entry->ttvn,
tt_global_entry->orig_node->orig, tt_global_entry->orig_node->orig,
...@@ -615,8 +612,6 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset) ...@@ -615,8 +612,6 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)
last_ttvn), last_ttvn),
(tt_global_entry->common.flags & (tt_global_entry->common.flags &
TT_CLIENT_ROAM ? 'R' : '.'), TT_CLIENT_ROAM ? 'R' : '.'),
(tt_global_entry->common.flags &
TT_CLIENT_PENDING ? 'X' : '.'),
(tt_global_entry->common.flags & (tt_global_entry->common.flags &
TT_CLIENT_WIFI ? 'W' : '.')); TT_CLIENT_WIFI ? 'W' : '.'));
} }
...@@ -657,29 +652,31 @@ void tt_global_del(struct bat_priv *bat_priv, ...@@ -657,29 +652,31 @@ void tt_global_del(struct bat_priv *bat_priv,
struct tt_local_entry *tt_local_entry = NULL; struct tt_local_entry *tt_local_entry = NULL;
tt_global_entry = tt_global_hash_find(bat_priv, addr); tt_global_entry = tt_global_hash_find(bat_priv, addr);
if (!tt_global_entry) if (!tt_global_entry || tt_global_entry->orig_node != orig_node)
goto out; goto out;
if (tt_global_entry->orig_node == orig_node) { if (!roaming)
if (roaming) { goto out_del;
/* if we are deleting a global entry due to a roam
* event, there are two possibilities: /* if we are deleting a global entry due to a roam
* 1) the client roamed from node A to node B => we mark * event, there are two possibilities:
* it with TT_CLIENT_ROAM, we start a timer and we * 1) the client roamed from node A to node B => we mark
* wait for node B to claim it. In case of timeout * it with TT_CLIENT_ROAM, we start a timer and we
* the entry is purged. * wait for node B to claim it. In case of timeout
* 2) the client roamed to us => we can directly delete * the entry is purged.
* the global entry, since it is useless now. */ * 2) the client roamed to us => we can directly delete
tt_local_entry = tt_local_hash_find(bat_priv, * the global entry, since it is useless now. */
tt_global_entry->common.addr); tt_local_entry = tt_local_hash_find(bat_priv,
if (!tt_local_entry) { tt_global_entry->common.addr);
tt_global_entry->common.flags |= TT_CLIENT_ROAM; if (!tt_local_entry) {
tt_global_entry->roam_at = jiffies; tt_global_entry->common.flags |= TT_CLIENT_ROAM;
goto out; tt_global_entry->roam_at = jiffies;
} goto out;
}
_tt_global_del(bat_priv, tt_global_entry, message);
} }
out_del:
_tt_global_del(bat_priv, tt_global_entry, message);
out: out:
if (tt_global_entry) if (tt_global_entry)
tt_global_entry_free_ref(tt_global_entry); tt_global_entry_free_ref(tt_global_entry);
...@@ -707,7 +704,7 @@ void tt_global_del_orig(struct bat_priv *bat_priv, ...@@ -707,7 +704,7 @@ void tt_global_del_orig(struct bat_priv *bat_priv,
spin_lock_bh(list_lock); spin_lock_bh(list_lock);
hlist_for_each_entry_safe(tt_common_entry, node, safe, hlist_for_each_entry_safe(tt_common_entry, node, safe,
head, hash_entry) { head, hash_entry) {
tt_global_entry = container_of(tt_common_entry, tt_global_entry = container_of(tt_common_entry,
struct tt_global_entry, struct tt_global_entry,
common); common);
...@@ -751,7 +748,7 @@ static void tt_global_roam_purge(struct bat_priv *bat_priv) ...@@ -751,7 +748,7 @@ static void tt_global_roam_purge(struct bat_priv *bat_priv)
if (!(tt_global_entry->common.flags & TT_CLIENT_ROAM)) if (!(tt_global_entry->common.flags & TT_CLIENT_ROAM))
continue; continue;
if (!has_timed_out(tt_global_entry->roam_at, if (!has_timed_out(tt_global_entry->roam_at,
TT_CLIENT_ROAM_TIMEOUT * 1000)) TT_CLIENT_ROAM_TIMEOUT))
continue; continue;
bat_dbg(DBG_TT, bat_priv, "Deleting global " bat_dbg(DBG_TT, bat_priv, "Deleting global "
...@@ -839,11 +836,6 @@ struct orig_node *transtable_search(struct bat_priv *bat_priv, ...@@ -839,11 +836,6 @@ struct orig_node *transtable_search(struct bat_priv *bat_priv,
if (!atomic_inc_not_zero(&tt_global_entry->orig_node->refcount)) if (!atomic_inc_not_zero(&tt_global_entry->orig_node->refcount))
goto out; goto out;
/* A global client marked as PENDING has already moved from that
* originator */
if (tt_global_entry->common.flags & TT_CLIENT_PENDING)
goto out;
orig_node = tt_global_entry->orig_node; orig_node = tt_global_entry->orig_node;
out: out:
...@@ -970,8 +962,7 @@ static void tt_req_purge(struct bat_priv *bat_priv) ...@@ -970,8 +962,7 @@ static void tt_req_purge(struct bat_priv *bat_priv)
spin_lock_bh(&bat_priv->tt_req_list_lock); spin_lock_bh(&bat_priv->tt_req_list_lock);
list_for_each_entry_safe(node, safe, &bat_priv->tt_req_list, list) { list_for_each_entry_safe(node, safe, &bat_priv->tt_req_list, list) {
if (has_timed_out(node->issued_at, if (has_timed_out(node->issued_at, TT_REQUEST_TIMEOUT)) {
TT_REQUEST_TIMEOUT * 1000)) {
list_del(&node->list); list_del(&node->list);
kfree(node); kfree(node);
} }
...@@ -990,7 +981,7 @@ static struct tt_req_node *new_tt_req_node(struct bat_priv *bat_priv, ...@@ -990,7 +981,7 @@ static struct tt_req_node *new_tt_req_node(struct bat_priv *bat_priv,
list_for_each_entry(tt_req_node_tmp, &bat_priv->tt_req_list, list) { list_for_each_entry(tt_req_node_tmp, &bat_priv->tt_req_list, list) {
if (compare_eth(tt_req_node_tmp, orig_node) && if (compare_eth(tt_req_node_tmp, orig_node) &&
!has_timed_out(tt_req_node_tmp->issued_at, !has_timed_out(tt_req_node_tmp->issued_at,
TT_REQUEST_TIMEOUT * 1000)) TT_REQUEST_TIMEOUT))
goto unlock; goto unlock;
} }
...@@ -1583,8 +1574,7 @@ static void tt_roam_purge(struct bat_priv *bat_priv) ...@@ -1583,8 +1574,7 @@ static void tt_roam_purge(struct bat_priv *bat_priv)
spin_lock_bh(&bat_priv->tt_roam_list_lock); spin_lock_bh(&bat_priv->tt_roam_list_lock);
list_for_each_entry_safe(node, safe, &bat_priv->tt_roam_list, list) { list_for_each_entry_safe(node, safe, &bat_priv->tt_roam_list, list) {
if (!has_timed_out(node->first_time, if (!has_timed_out(node->first_time, ROAMING_MAX_TIME))
ROAMING_MAX_TIME * 1000))
continue; continue;
list_del(&node->list); list_del(&node->list);
...@@ -1611,8 +1601,7 @@ static bool tt_check_roam_count(struct bat_priv *bat_priv, ...@@ -1611,8 +1601,7 @@ static bool tt_check_roam_count(struct bat_priv *bat_priv,
if (!compare_eth(tt_roam_node->addr, client)) if (!compare_eth(tt_roam_node->addr, client))
continue; continue;
if (has_timed_out(tt_roam_node->first_time, if (has_timed_out(tt_roam_node->first_time, ROAMING_MAX_TIME))
ROAMING_MAX_TIME * 1000))
continue; continue;
if (!atomic_dec_not_zero(&tt_roam_node->counter)) if (!atomic_dec_not_zero(&tt_roam_node->counter))
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
* *
* Marek Lindner, Simon Wunderlich * Marek Lindner, Simon Wunderlich
* *
......
/* /*
* Copyright (C) 2010-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
* *
* Andreas Langer * Andreas Langer
* *
......
/* /*
* Copyright (C) 2010-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2010-2012 B.A.T.M.A.N. contributors:
* *
* Andreas Langer * Andreas Langer
* *
......
/* /*
* Copyright (C) 2008-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2008-2012 B.A.T.M.A.N. contributors:
* *
* Simon Wunderlich * Simon Wunderlich
* *
...@@ -714,8 +714,7 @@ static void purge_vis_packets(struct bat_priv *bat_priv) ...@@ -714,8 +714,7 @@ static void purge_vis_packets(struct bat_priv *bat_priv)
if (info == bat_priv->my_vis_info) if (info == bat_priv->my_vis_info)
continue; continue;
if (time_after(jiffies, if (has_timed_out(info->first_seen, VIS_TIMEOUT)) {
info->first_seen + VIS_TIMEOUT * HZ)) {
hlist_del(node); hlist_del(node);
send_list_del(info); send_list_del(info);
kref_put(&info->refcount, free_info); kref_put(&info->refcount, free_info);
......
/* /*
* Copyright (C) 2008-2011 B.A.T.M.A.N. contributors: * Copyright (C) 2008-2012 B.A.T.M.A.N. contributors:
* *
* Simon Wunderlich, Marek Lindner * Simon Wunderlich, Marek Lindner
* *
...@@ -22,7 +22,8 @@ ...@@ -22,7 +22,8 @@
#ifndef _NET_BATMAN_ADV_VIS_H_ #ifndef _NET_BATMAN_ADV_VIS_H_
#define _NET_BATMAN_ADV_VIS_H_ #define _NET_BATMAN_ADV_VIS_H_
#define VIS_TIMEOUT 200 /* timeout of vis packets in seconds */ #define VIS_TIMEOUT 200000 /* timeout of vis packets
* in miliseconds */
int vis_seq_print_text(struct seq_file *seq, void *offset); int vis_seq_print_text(struct seq_file *seq, void *offset);
void receive_server_sync_packet(struct bat_priv *bat_priv, void receive_server_sync_packet(struct bat_priv *bat_priv,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment