mirror of https://gitee.com/openkylin/linux.git
Included changes:
- increase internal module version - increase BLA wait periods to 6 - purge BLA backbone table when it is disabled - make sure post function is invoked only if sysfs value is changed - simplify code by removing useless NULL checks - various corrections to existing kerneldoc - minor cleanups -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJWkQVBAAoJENpFlCjNi1MRpPwP/2VrRpogpVsqTqLmidvmMqOQ r7MOy3/W5hqXF6Iq9omVZ0jagdDzta35/QZCab8tE1YFQhW+4jIIMUNApXSJZ+Yc dopXpLQNN/QSGFrQJFN897aYnXz+ABt834VyOhtLzktxYRBEdI4yKBoj3l39vXjL d+O9MGfJkxos1cHr+ueGohr36Fk3+dnAQFVEYf5dq/G3HwRqVRdzR8ITiMPy8zCX gRVFbzpg37r6nvYY93jW5VLGGFkmzuUG4SMzkQqQEp7eaUrIgrcukKF4oQahSfC9 C0wwg8SqwX56lh9fdo1n3MkuiwYDaW7wt4QRIgpiolWhebNJqBa8ExPZgfxl9QwF WjkRUnGV65qY6M4AGENzIJ7JGESx66k95OnUGDpF9ZmBRWi2t/4gcwpwCjemka0A MZ+lDgB060ksIVcsbXnGY2TOpiMRjo1nMinixFb3HueUA9mpr5edDwJpnFy5FvhN lv2csEazQacmUj8KzM/5GXAvS0a8iABPSknwKOaTWX3SglGBc/H4mKYcggeD8XPG 9zfFgOyi2dW6S5d5qxHLNwVyw6O0rkfOj2BxE3Ew/FHGb5/00hVJVeqhXVxFBb6s EOlZz8LrxA4DIxItFDHhiUzddqqsiTqbp7Q9JmtpEn11YZ/tQ3kTK5ilWdgkM8Vj 4z9wQN55BTrhYcTgsCp7 =eJvF -----END PGP SIGNATURE----- Merge tag 'batman-adv-for-davem' of git://git.open-mesh.org/linux-merge Antonio Quartulli says: ==================== Included changes: - increase internal module version - increase BLA wait periods to 6 - purge BLA backbone table when it is disabled - make sure post function is invoked only if sysfs value is changed - simplify code by removing useless NULL checks - various corrections to existing kerneldoc - minor cleanups ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
c9c99311b5
|
@ -115,14 +115,17 @@ The "bat0" interface can be used like any other regular inter-
|
||||||
face. It needs an IP address which can be either statically con-
|
face. It needs an IP address which can be either statically con-
|
||||||
figured or dynamically (by using DHCP or similar services):
|
figured or dynamically (by using DHCP or similar services):
|
||||||
|
|
||||||
# NodeA: ifconfig bat0 192.168.0.1
|
# NodeA: ip link set up dev bat0
|
||||||
# NodeB: ifconfig bat0 192.168.0.2
|
# NodeA: ip addr add 192.168.0.1/24 dev bat0
|
||||||
|
|
||||||
|
# NodeB: ip link set up dev bat0
|
||||||
|
# NodeB: ip addr add 192.168.0.2/24 dev bat0
|
||||||
# NodeB: ping 192.168.0.1
|
# NodeB: ping 192.168.0.1
|
||||||
|
|
||||||
Note: In order to avoid problems remove all IP addresses previ-
|
Note: In order to avoid problems remove all IP addresses previ-
|
||||||
ously assigned to interfaces now used by batman advanced, e.g.
|
ously assigned to interfaces now used by batman advanced, e.g.
|
||||||
|
|
||||||
# ifconfig eth0 0.0.0.0
|
# ip addr flush dev eth0
|
||||||
|
|
||||||
|
|
||||||
LOGGING/DEBUGGING
|
LOGGING/DEBUGGING
|
||||||
|
|
|
@ -361,7 +361,6 @@ batadv_iv_ogm_primary_iface_set(struct batadv_hard_iface *hard_iface)
|
||||||
unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
|
unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
|
||||||
|
|
||||||
batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
|
batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
|
||||||
batadv_ogm_packet->flags = BATADV_PRIMARIES_FIRST_HOP;
|
|
||||||
batadv_ogm_packet->ttl = BATADV_TTL;
|
batadv_ogm_packet->ttl = BATADV_TTL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -842,8 +841,6 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
|
||||||
"Forwarding packet: tq: %i, ttl: %i\n",
|
"Forwarding packet: tq: %i, ttl: %i\n",
|
||||||
batadv_ogm_packet->tq, batadv_ogm_packet->ttl);
|
batadv_ogm_packet->tq, batadv_ogm_packet->ttl);
|
||||||
|
|
||||||
/* switch of primaries first hop flag when forwarding */
|
|
||||||
batadv_ogm_packet->flags &= ~BATADV_PRIMARIES_FIRST_HOP;
|
|
||||||
if (is_single_hop_neigh)
|
if (is_single_hop_neigh)
|
||||||
batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
|
batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
|
||||||
else
|
else
|
||||||
|
|
|
@ -1168,6 +1168,26 @@ void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* batadv_bla_status_update - purge bla interfaces if necessary
|
||||||
|
* @net_dev: the soft interface net device
|
||||||
|
*/
|
||||||
|
void batadv_bla_status_update(struct net_device *net_dev)
|
||||||
|
{
|
||||||
|
struct batadv_priv *bat_priv = netdev_priv(net_dev);
|
||||||
|
struct batadv_hard_iface *primary_if;
|
||||||
|
|
||||||
|
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||||
|
if (!primary_if)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* this function already purges everything when bla is disabled,
|
||||||
|
* so just call that one.
|
||||||
|
*/
|
||||||
|
batadv_bla_update_orig_address(bat_priv, primary_if, primary_if);
|
||||||
|
batadv_hardif_free_ref(primary_if);
|
||||||
|
}
|
||||||
|
|
||||||
/* periodic work to do:
|
/* periodic work to do:
|
||||||
* * purge structures when they are too old
|
* * purge structures when they are too old
|
||||||
* * send announcements
|
* * send announcements
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
struct net_device;
|
||||||
struct seq_file;
|
struct seq_file;
|
||||||
struct sk_buff;
|
struct sk_buff;
|
||||||
|
|
||||||
|
@ -42,6 +43,7 @@ int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
|
||||||
void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
|
void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
|
||||||
struct batadv_hard_iface *primary_if,
|
struct batadv_hard_iface *primary_if,
|
||||||
struct batadv_hard_iface *oldif);
|
struct batadv_hard_iface *oldif);
|
||||||
|
void batadv_bla_status_update(struct net_device *net_dev);
|
||||||
int batadv_bla_init(struct batadv_priv *bat_priv);
|
int batadv_bla_init(struct batadv_priv *bat_priv);
|
||||||
void batadv_bla_free(struct batadv_priv *bat_priv);
|
void batadv_bla_free(struct batadv_priv *bat_priv);
|
||||||
|
|
||||||
|
|
|
@ -31,27 +31,23 @@
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* batadv_parse_gw_bandwidth - parse supplied string buffer to extract download
|
* batadv_parse_throughput - parse supplied string buffer to extract throughput
|
||||||
* and upload bandwidth information
|
* information
|
||||||
* @net_dev: the soft interface net device
|
* @net_dev: the soft interface net device
|
||||||
* @buff: string buffer to parse
|
* @buff: string buffer to parse
|
||||||
* @down: pointer holding the returned download bandwidth information
|
* @description: text shown when throughput string cannot be parsed
|
||||||
* @up: pointer holding the returned upload bandwidth information
|
* @throughput: pointer holding the returned throughput information
|
||||||
*
|
*
|
||||||
* Returns false on parse error and true otherwise.
|
* Returns false on parse error and true otherwise.
|
||||||
*/
|
*/
|
||||||
static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
|
static bool batadv_parse_throughput(struct net_device *net_dev, char *buff,
|
||||||
u32 *down, u32 *up)
|
const char *description, u32 *throughput)
|
||||||
{
|
{
|
||||||
enum batadv_bandwidth_units bw_unit_type = BATADV_BW_UNIT_KBIT;
|
enum batadv_bandwidth_units bw_unit_type = BATADV_BW_UNIT_KBIT;
|
||||||
char *slash_ptr, *tmp_ptr;
|
u64 lthroughput;
|
||||||
u64 ldown, lup;
|
char *tmp_ptr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
slash_ptr = strchr(buff, '/');
|
|
||||||
if (slash_ptr)
|
|
||||||
*slash_ptr = 0;
|
|
||||||
|
|
||||||
if (strlen(buff) > 4) {
|
if (strlen(buff) > 4) {
|
||||||
tmp_ptr = buff + strlen(buff) - 4;
|
tmp_ptr = buff + strlen(buff) - 4;
|
||||||
|
|
||||||
|
@ -63,90 +59,75 @@ static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
|
||||||
*tmp_ptr = '\0';
|
*tmp_ptr = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = kstrtou64(buff, 10, &ldown);
|
ret = kstrtou64(buff, 10, <hroughput);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
batadv_err(net_dev,
|
batadv_err(net_dev,
|
||||||
"Download speed of gateway mode invalid: %s\n",
|
"Invalid throughput speed for %s: %s\n",
|
||||||
buff);
|
description, buff);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (bw_unit_type) {
|
switch (bw_unit_type) {
|
||||||
case BATADV_BW_UNIT_MBIT:
|
case BATADV_BW_UNIT_MBIT:
|
||||||
/* prevent overflow */
|
/* prevent overflow */
|
||||||
if (U64_MAX / 10 < ldown) {
|
if (U64_MAX / 10 < lthroughput) {
|
||||||
batadv_err(net_dev,
|
batadv_err(net_dev,
|
||||||
"Download speed of gateway mode too large: %s\n",
|
"Throughput speed for %s too large: %s\n",
|
||||||
buff);
|
description, buff);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ldown *= 10;
|
lthroughput *= 10;
|
||||||
break;
|
break;
|
||||||
case BATADV_BW_UNIT_KBIT:
|
case BATADV_BW_UNIT_KBIT:
|
||||||
default:
|
default:
|
||||||
ldown = div_u64(ldown, 100);
|
lthroughput = div_u64(lthroughput, 100);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (U32_MAX < ldown) {
|
if (lthroughput > U32_MAX) {
|
||||||
batadv_err(net_dev,
|
batadv_err(net_dev,
|
||||||
"Download speed of gateway mode too large: %s\n",
|
"Throughput speed for %s too large: %s\n",
|
||||||
buff);
|
description, buff);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*down = ldown;
|
*throughput = lthroughput;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* batadv_parse_gw_bandwidth - parse supplied string buffer to extract download
|
||||||
|
* and upload bandwidth information
|
||||||
|
* @net_dev: the soft interface net device
|
||||||
|
* @buff: string buffer to parse
|
||||||
|
* @down: pointer holding the returned download bandwidth information
|
||||||
|
* @up: pointer holding the returned upload bandwidth information
|
||||||
|
*
|
||||||
|
* Return: false on parse error and true otherwise.
|
||||||
|
*/
|
||||||
|
static bool batadv_parse_gw_bandwidth(struct net_device *net_dev, char *buff,
|
||||||
|
u32 *down, u32 *up)
|
||||||
|
{
|
||||||
|
char *slash_ptr;
|
||||||
|
bool ret;
|
||||||
|
|
||||||
|
slash_ptr = strchr(buff, '/');
|
||||||
|
if (slash_ptr)
|
||||||
|
*slash_ptr = 0;
|
||||||
|
|
||||||
|
ret = batadv_parse_throughput(net_dev, buff, "download gateway speed",
|
||||||
|
down);
|
||||||
|
if (!ret)
|
||||||
|
return false;
|
||||||
|
|
||||||
/* we also got some upload info */
|
/* we also got some upload info */
|
||||||
if (slash_ptr) {
|
if (slash_ptr) {
|
||||||
bw_unit_type = BATADV_BW_UNIT_KBIT;
|
ret = batadv_parse_throughput(net_dev, slash_ptr + 1,
|
||||||
|
"upload gateway speed", up);
|
||||||
if (strlen(slash_ptr + 1) > 4) {
|
if (!ret)
|
||||||
tmp_ptr = slash_ptr + 1 - 4 + strlen(slash_ptr + 1);
|
|
||||||
|
|
||||||
if (strncasecmp(tmp_ptr, "mbit", 4) == 0)
|
|
||||||
bw_unit_type = BATADV_BW_UNIT_MBIT;
|
|
||||||
|
|
||||||
if ((strncasecmp(tmp_ptr, "kbit", 4) == 0) ||
|
|
||||||
(bw_unit_type == BATADV_BW_UNIT_MBIT))
|
|
||||||
*tmp_ptr = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = kstrtou64(slash_ptr + 1, 10, &lup);
|
|
||||||
if (ret) {
|
|
||||||
batadv_err(net_dev,
|
|
||||||
"Upload speed of gateway mode invalid: %s\n",
|
|
||||||
slash_ptr + 1);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
switch (bw_unit_type) {
|
|
||||||
case BATADV_BW_UNIT_MBIT:
|
|
||||||
/* prevent overflow */
|
|
||||||
if (U64_MAX / 10 < lup) {
|
|
||||||
batadv_err(net_dev,
|
|
||||||
"Upload speed of gateway mode too large: %s\n",
|
|
||||||
slash_ptr + 1);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
lup *= 10;
|
|
||||||
break;
|
|
||||||
case BATADV_BW_UNIT_KBIT:
|
|
||||||
default:
|
|
||||||
lup = div_u64(lup, 100);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (U32_MAX < lup) {
|
|
||||||
batadv_err(net_dev,
|
|
||||||
"Upload speed of gateway mode too large: %s\n",
|
|
||||||
slash_ptr + 1);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
*up = lup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -747,7 +747,7 @@ static u16 batadv_tvlv_container_list_size(struct batadv_priv *bat_priv)
|
||||||
static void batadv_tvlv_container_remove(struct batadv_priv *bat_priv,
|
static void batadv_tvlv_container_remove(struct batadv_priv *bat_priv,
|
||||||
struct batadv_tvlv_container *tvlv)
|
struct batadv_tvlv_container *tvlv)
|
||||||
{
|
{
|
||||||
lockdep_assert_held(&bat_priv->tvlv.handler_list_lock);
|
lockdep_assert_held(&bat_priv->tvlv.container_list_lock);
|
||||||
|
|
||||||
if (!tvlv)
|
if (!tvlv)
|
||||||
return;
|
return;
|
||||||
|
@ -1143,15 +1143,14 @@ void batadv_tvlv_unicast_send(struct batadv_priv *bat_priv, u8 *src,
|
||||||
struct batadv_unicast_tvlv_packet *unicast_tvlv_packet;
|
struct batadv_unicast_tvlv_packet *unicast_tvlv_packet;
|
||||||
struct batadv_tvlv_hdr *tvlv_hdr;
|
struct batadv_tvlv_hdr *tvlv_hdr;
|
||||||
struct batadv_orig_node *orig_node;
|
struct batadv_orig_node *orig_node;
|
||||||
struct sk_buff *skb = NULL;
|
struct sk_buff *skb;
|
||||||
unsigned char *tvlv_buff;
|
unsigned char *tvlv_buff;
|
||||||
unsigned int tvlv_len;
|
unsigned int tvlv_len;
|
||||||
ssize_t hdr_len = sizeof(*unicast_tvlv_packet);
|
ssize_t hdr_len = sizeof(*unicast_tvlv_packet);
|
||||||
bool ret = false;
|
|
||||||
|
|
||||||
orig_node = batadv_orig_hash_find(bat_priv, dst);
|
orig_node = batadv_orig_hash_find(bat_priv, dst);
|
||||||
if (!orig_node)
|
if (!orig_node)
|
||||||
goto out;
|
return;
|
||||||
|
|
||||||
tvlv_len = sizeof(*tvlv_hdr) + tvlv_value_len;
|
tvlv_len = sizeof(*tvlv_hdr) + tvlv_value_len;
|
||||||
|
|
||||||
|
@ -1180,14 +1179,10 @@ void batadv_tvlv_unicast_send(struct batadv_priv *bat_priv, u8 *src,
|
||||||
tvlv_buff += sizeof(*tvlv_hdr);
|
tvlv_buff += sizeof(*tvlv_hdr);
|
||||||
memcpy(tvlv_buff, tvlv_value, tvlv_value_len);
|
memcpy(tvlv_buff, tvlv_value, tvlv_value_len);
|
||||||
|
|
||||||
if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
|
if (batadv_send_skb_to_orig(skb, orig_node, NULL) == NET_XMIT_DROP)
|
||||||
ret = true;
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (skb && !ret)
|
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
if (orig_node)
|
out:
|
||||||
batadv_orig_node_free_ref(orig_node);
|
batadv_orig_node_free_ref(orig_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#define BATADV_DRIVER_DEVICE "batman-adv"
|
#define BATADV_DRIVER_DEVICE "batman-adv"
|
||||||
|
|
||||||
#ifndef BATADV_SOURCE_VERSION
|
#ifndef BATADV_SOURCE_VERSION
|
||||||
#define BATADV_SOURCE_VERSION "2015.2"
|
#define BATADV_SOURCE_VERSION "2016.0"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* B.A.T.M.A.N. parameters */
|
/* B.A.T.M.A.N. parameters */
|
||||||
|
@ -109,7 +109,7 @@
|
||||||
#define BATADV_MAX_AGGREGATION_MS 100
|
#define BATADV_MAX_AGGREGATION_MS 100
|
||||||
|
|
||||||
#define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */
|
#define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */
|
||||||
#define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3)
|
#define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 6)
|
||||||
#define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10)
|
#define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10)
|
||||||
#define BATADV_BLA_WAIT_PERIODS 3
|
#define BATADV_BLA_WAIT_PERIODS 3
|
||||||
|
|
||||||
|
|
|
@ -244,9 +244,7 @@ static void batadv_nc_path_free_ref(struct batadv_nc_path *nc_path)
|
||||||
*/
|
*/
|
||||||
static void batadv_nc_packet_free(struct batadv_nc_packet *nc_packet)
|
static void batadv_nc_packet_free(struct batadv_nc_packet *nc_packet)
|
||||||
{
|
{
|
||||||
if (nc_packet->skb)
|
kfree_skb(nc_packet->skb);
|
||||||
kfree_skb(nc_packet->skb);
|
|
||||||
|
|
||||||
batadv_nc_path_free_ref(nc_packet->nc_path);
|
batadv_nc_path_free_ref(nc_packet->nc_path);
|
||||||
kfree(nc_packet);
|
kfree(nc_packet);
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,8 +72,7 @@ enum batadv_subtype {
|
||||||
* enum batadv_iv_flags - flags used in B.A.T.M.A.N. IV OGM packets
|
* enum batadv_iv_flags - flags used in B.A.T.M.A.N. IV OGM packets
|
||||||
* @BATADV_NOT_BEST_NEXT_HOP: flag is set when ogm packet is forwarded and was
|
* @BATADV_NOT_BEST_NEXT_HOP: flag is set when ogm packet is forwarded and was
|
||||||
* previously received from someone else than the best neighbor.
|
* previously received from someone else than the best neighbor.
|
||||||
* @BATADV_PRIMARIES_FIRST_HOP: flag is set when the primary interface address
|
* @BATADV_PRIMARIES_FIRST_HOP: flag unused.
|
||||||
* is used, and the packet travels its first hop.
|
|
||||||
* @BATADV_DIRECTLINK: flag is for the first hop or if rebroadcasted from a
|
* @BATADV_DIRECTLINK: flag is for the first hop or if rebroadcasted from a
|
||||||
* one hop neighbor on the interface where it was originally received.
|
* one hop neighbor on the interface where it was originally received.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -407,8 +407,7 @@ void batadv_schedule_bat_ogm(struct batadv_hard_iface *hard_iface)
|
||||||
|
|
||||||
static void batadv_forw_packet_free(struct batadv_forw_packet *forw_packet)
|
static void batadv_forw_packet_free(struct batadv_forw_packet *forw_packet)
|
||||||
{
|
{
|
||||||
if (forw_packet->skb)
|
kfree_skb(forw_packet->skb);
|
||||||
kfree_skb(forw_packet->skb);
|
|
||||||
if (forw_packet->if_incoming)
|
if (forw_packet->if_incoming)
|
||||||
batadv_hardif_free_ref(forw_packet->if_incoming);
|
batadv_hardif_free_ref(forw_packet->if_incoming);
|
||||||
if (forw_packet->if_outgoing)
|
if (forw_packet->if_outgoing)
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "distributed-arp-table.h"
|
#include "distributed-arp-table.h"
|
||||||
#include "gateway_client.h"
|
#include "gateway_client.h"
|
||||||
#include "gateway_common.h"
|
#include "gateway_common.h"
|
||||||
|
#include "bridge_loop_avoidance.h"
|
||||||
#include "hard-interface.h"
|
#include "hard-interface.h"
|
||||||
#include "network-coding.h"
|
#include "network-coding.h"
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
@ -241,10 +242,13 @@ ssize_t batadv_show_vlan_##_name(struct kobject *kobj, \
|
||||||
|
|
||||||
static int batadv_store_bool_attr(char *buff, size_t count,
|
static int batadv_store_bool_attr(char *buff, size_t count,
|
||||||
struct net_device *net_dev,
|
struct net_device *net_dev,
|
||||||
const char *attr_name, atomic_t *attr)
|
const char *attr_name, atomic_t *attr,
|
||||||
|
bool *changed)
|
||||||
{
|
{
|
||||||
int enabled = -1;
|
int enabled = -1;
|
||||||
|
|
||||||
|
*changed = false;
|
||||||
|
|
||||||
if (buff[count - 1] == '\n')
|
if (buff[count - 1] == '\n')
|
||||||
buff[count - 1] = '\0';
|
buff[count - 1] = '\0';
|
||||||
|
|
||||||
|
@ -271,6 +275,8 @@ static int batadv_store_bool_attr(char *buff, size_t count,
|
||||||
atomic_read(attr) == 1 ? "enabled" : "disabled",
|
atomic_read(attr) == 1 ? "enabled" : "disabled",
|
||||||
enabled == 1 ? "enabled" : "disabled");
|
enabled == 1 ? "enabled" : "disabled");
|
||||||
|
|
||||||
|
*changed = true;
|
||||||
|
|
||||||
atomic_set(attr, (unsigned int)enabled);
|
atomic_set(attr, (unsigned int)enabled);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -281,11 +287,12 @@ __batadv_store_bool_attr(char *buff, size_t count,
|
||||||
struct attribute *attr,
|
struct attribute *attr,
|
||||||
atomic_t *attr_store, struct net_device *net_dev)
|
atomic_t *attr_store, struct net_device *net_dev)
|
||||||
{
|
{
|
||||||
|
bool changed;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = batadv_store_bool_attr(buff, count, net_dev, attr->name,
|
ret = batadv_store_bool_attr(buff, count, net_dev, attr->name,
|
||||||
attr_store);
|
attr_store, &changed);
|
||||||
if (post_func && ret)
|
if (post_func && changed)
|
||||||
post_func(net_dev);
|
post_func(net_dev);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -549,7 +556,8 @@ static ssize_t batadv_store_isolation_mark(struct kobject *kobj,
|
||||||
BATADV_ATTR_SIF_BOOL(aggregated_ogms, 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);
|
BATADV_ATTR_SIF_BOOL(bonding, S_IRUGO | S_IWUSR, NULL);
|
||||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
BATADV_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR, NULL);
|
BATADV_ATTR_SIF_BOOL(bridge_loop_avoidance, S_IRUGO | S_IWUSR,
|
||||||
|
batadv_bla_status_update);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_BATMAN_ADV_DAT
|
#ifdef CONFIG_BATMAN_ADV_DAT
|
||||||
BATADV_ATTR_SIF_BOOL(distributed_arp_table, S_IRUGO | S_IWUSR,
|
BATADV_ATTR_SIF_BOOL(distributed_arp_table, S_IRUGO | S_IWUSR,
|
||||||
|
|
|
@ -3339,7 +3339,10 @@ bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, u8 *src, u8 *dst,
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
vlan = batadv_softif_vlan_get(bat_priv, vid);
|
vlan = batadv_softif_vlan_get(bat_priv, vid);
|
||||||
if (!vlan || !atomic_read(&vlan->ap_isolation))
|
if (!vlan)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!atomic_read(&vlan->ap_isolation))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
tt_local_entry = batadv_tt_local_hash_find(bat_priv, dst, vid);
|
tt_local_entry = batadv_tt_local_hash_find(bat_priv, dst, vid);
|
||||||
|
@ -3356,8 +3359,7 @@ bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, u8 *src, u8 *dst,
|
||||||
ret = true;
|
ret = true;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (vlan)
|
batadv_softif_vlan_free_ref(vlan);
|
||||||
batadv_softif_vlan_free_ref(vlan);
|
|
||||||
if (tt_global_entry)
|
if (tt_global_entry)
|
||||||
batadv_tt_global_entry_free_ref(tt_global_entry);
|
batadv_tt_global_entry_free_ref(tt_global_entry);
|
||||||
if (tt_local_entry)
|
if (tt_local_entry)
|
||||||
|
|
|
@ -223,12 +223,12 @@ struct batadv_orig_bat_iv {
|
||||||
* @orig: originator ethernet address
|
* @orig: originator ethernet address
|
||||||
* @ifinfo_list: list for routers per outgoing interface
|
* @ifinfo_list: list for routers per outgoing interface
|
||||||
* @last_bonding_candidate: pointer to last ifinfo of last used router
|
* @last_bonding_candidate: pointer to last ifinfo of last used router
|
||||||
* @batadv_dat_addr_t: address of the orig node in the distributed hash
|
* @dat_addr: address of the orig node in the distributed hash
|
||||||
* @last_seen: time when last packet from this node was received
|
* @last_seen: time when last packet from this node was received
|
||||||
* @bcast_seqno_reset: time when the broadcast seqno window was reset
|
* @bcast_seqno_reset: time when the broadcast seqno window was reset
|
||||||
* @mcast_handler_lock: synchronizes mcast-capability and -flag changes
|
* @mcast_handler_lock: synchronizes mcast-capability and -flag changes
|
||||||
* @mcast_flags: multicast flags announced by the orig node
|
* @mcast_flags: multicast flags announced by the orig node
|
||||||
* @mcast_want_all_unsnoop_node: a list node for the
|
* @mcast_want_all_unsnoopables_node: a list node for the
|
||||||
* mcast.want_all_unsnoopables list
|
* mcast.want_all_unsnoopables list
|
||||||
* @mcast_want_all_ipv4_node: a list node for the mcast.want_all_ipv4 list
|
* @mcast_want_all_ipv4_node: a list node for the mcast.want_all_ipv4 list
|
||||||
* @mcast_want_all_ipv6_node: a list node for the mcast.want_all_ipv6 list
|
* @mcast_want_all_ipv6_node: a list node for the mcast.want_all_ipv6 list
|
||||||
|
@ -371,9 +371,8 @@ struct batadv_hardif_neigh_node {
|
||||||
* @ifinfo_lock: lock protecting private ifinfo members and list
|
* @ifinfo_lock: lock protecting private ifinfo members and list
|
||||||
* @if_incoming: pointer to incoming hard interface
|
* @if_incoming: pointer to incoming hard interface
|
||||||
* @last_seen: when last packet via this neighbor was received
|
* @last_seen: when last packet via this neighbor was received
|
||||||
* @last_ttl: last received ttl from this neigh node
|
* @refcount: number of contexts the object is used
|
||||||
* @rcu: struct used for freeing in an RCU-safe manner
|
* @rcu: struct used for freeing in an RCU-safe manner
|
||||||
* @bat_iv: B.A.T.M.A.N. IV private structure
|
|
||||||
*/
|
*/
|
||||||
struct batadv_neigh_node {
|
struct batadv_neigh_node {
|
||||||
struct hlist_node list;
|
struct hlist_node list;
|
||||||
|
@ -423,13 +422,14 @@ struct batadv_neigh_ifinfo {
|
||||||
struct rcu_head rcu;
|
struct rcu_head rcu;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression
|
* struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression
|
||||||
* @orig[ETH_ALEN]: mac address of orig node orginating the broadcast
|
* @orig: mac address of orig node orginating the broadcast
|
||||||
* @crc: crc32 checksum of broadcast payload
|
* @crc: crc32 checksum of broadcast payload
|
||||||
* @entrytime: time when the broadcast packet was received
|
* @entrytime: time when the broadcast packet was received
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
|
||||||
struct batadv_bcast_duplist_entry {
|
struct batadv_bcast_duplist_entry {
|
||||||
u8 orig[ETH_ALEN];
|
u8 orig[ETH_ALEN];
|
||||||
__be32 crc;
|
__be32 crc;
|
||||||
|
@ -571,9 +571,11 @@ struct batadv_priv_tt {
|
||||||
struct delayed_work work;
|
struct delayed_work work;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct batadv_priv_bla - per mesh interface bridge loope avoidance data
|
* struct batadv_priv_bla - per mesh interface bridge loope avoidance data
|
||||||
* @num_requests; number of bla requests in flight
|
* @num_requests: number of bla requests in flight
|
||||||
* @claim_hash: hash table containing mesh nodes this host has claimed
|
* @claim_hash: hash table containing mesh nodes this host has claimed
|
||||||
* @backbone_hash: hash table containing all detected backbone gateways
|
* @backbone_hash: hash table containing all detected backbone gateways
|
||||||
* @bcast_duplist: recently received broadcast packets array (for broadcast
|
* @bcast_duplist: recently received broadcast packets array (for broadcast
|
||||||
|
@ -583,7 +585,6 @@ struct batadv_priv_tt {
|
||||||
* @claim_dest: local claim data (e.g. claim group)
|
* @claim_dest: local claim data (e.g. claim group)
|
||||||
* @work: work queue callback item for cleanups & bla announcements
|
* @work: work queue callback item for cleanups & bla announcements
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
|
||||||
struct batadv_priv_bla {
|
struct batadv_priv_bla {
|
||||||
atomic_t num_requests;
|
atomic_t num_requests;
|
||||||
struct batadv_hashtable *claim_hash;
|
struct batadv_hashtable *claim_hash;
|
||||||
|
@ -597,6 +598,8 @@ struct batadv_priv_bla {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_DEBUG
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct batadv_priv_debug_log - debug logging data
|
* struct batadv_priv_debug_log - debug logging data
|
||||||
* @log_buff: buffer holding the logs (ring bufer)
|
* @log_buff: buffer holding the logs (ring bufer)
|
||||||
|
@ -605,7 +608,6 @@ struct batadv_priv_bla {
|
||||||
* @lock: lock protecting log_buff, log_start & log_end
|
* @lock: lock protecting log_buff, log_start & log_end
|
||||||
* @queue_wait: log reader's wait queue
|
* @queue_wait: log reader's wait queue
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_BATMAN_ADV_DEBUG
|
|
||||||
struct batadv_priv_debug_log {
|
struct batadv_priv_debug_log {
|
||||||
char log_buff[BATADV_LOG_BUF_LEN];
|
char log_buff[BATADV_LOG_BUF_LEN];
|
||||||
unsigned long log_start;
|
unsigned long log_start;
|
||||||
|
@ -647,13 +649,14 @@ struct batadv_priv_tvlv {
|
||||||
spinlock_t handler_list_lock; /* protects handler_list */
|
spinlock_t handler_list_lock; /* protects handler_list */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_DAT
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct batadv_priv_dat - per mesh interface DAT private data
|
* struct batadv_priv_dat - per mesh interface DAT private data
|
||||||
* @addr: node DAT address
|
* @addr: node DAT address
|
||||||
* @hash: hashtable representing the local ARP cache
|
* @hash: hashtable representing the local ARP cache
|
||||||
* @work: work queue callback item for cache purging
|
* @work: work queue callback item for cache purging
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_BATMAN_ADV_DAT
|
|
||||||
struct batadv_priv_dat {
|
struct batadv_priv_dat {
|
||||||
batadv_dat_addr_t addr;
|
batadv_dat_addr_t addr;
|
||||||
struct batadv_hashtable *hash;
|
struct batadv_hashtable *hash;
|
||||||
|
@ -795,7 +798,7 @@ struct batadv_softif_vlan {
|
||||||
* @dat: distributed arp table data
|
* @dat: distributed arp table data
|
||||||
* @mcast: multicast data
|
* @mcast: multicast data
|
||||||
* @network_coding: bool indicating whether network coding is enabled
|
* @network_coding: bool indicating whether network coding is enabled
|
||||||
* @batadv_priv_nc: network coding data
|
* @nc: network coding data
|
||||||
*/
|
*/
|
||||||
struct batadv_priv {
|
struct batadv_priv {
|
||||||
atomic_t mesh_state;
|
atomic_t mesh_state;
|
||||||
|
@ -893,6 +896,8 @@ struct batadv_socket_packet {
|
||||||
u8 icmp_packet[BATADV_ICMP_MAX_PACKET_SIZE];
|
u8 icmp_packet[BATADV_ICMP_MAX_PACKET_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN
|
* struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN
|
||||||
* @orig: originator address of backbone node (mac address of primary iface)
|
* @orig: originator address of backbone node (mac address of primary iface)
|
||||||
|
@ -910,7 +915,6 @@ struct batadv_socket_packet {
|
||||||
* @refcount: number of contexts the object is used
|
* @refcount: number of contexts the object is used
|
||||||
* @rcu: struct used for freeing in an RCU-safe manner
|
* @rcu: struct used for freeing in an RCU-safe manner
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
|
||||||
struct batadv_bla_backbone_gw {
|
struct batadv_bla_backbone_gw {
|
||||||
u8 orig[ETH_ALEN];
|
u8 orig[ETH_ALEN];
|
||||||
unsigned short vid;
|
unsigned short vid;
|
||||||
|
@ -929,7 +933,7 @@ struct batadv_bla_backbone_gw {
|
||||||
* struct batadv_bla_claim - claimed non-mesh client structure
|
* struct batadv_bla_claim - claimed non-mesh client structure
|
||||||
* @addr: mac address of claimed non-mesh client
|
* @addr: mac address of claimed non-mesh client
|
||||||
* @vid: vlan id this client was detected on
|
* @vid: vlan id this client was detected on
|
||||||
* @batadv_bla_backbone_gw: pointer to backbone gw claiming this client
|
* @backbone_gw: pointer to backbone gw claiming this client
|
||||||
* @lasttime: last time we heard of claim (locals only)
|
* @lasttime: last time we heard of claim (locals only)
|
||||||
* @hash_entry: hlist node for batadv_priv_bla::claim_hash
|
* @hash_entry: hlist node for batadv_priv_bla::claim_hash
|
||||||
* @refcount: number of contexts the object is used
|
* @refcount: number of contexts the object is used
|
||||||
|
@ -1252,8 +1256,6 @@ struct batadv_dat_candidate {
|
||||||
* struct batadv_tvlv_container - container for tvlv appended to OGMs
|
* struct batadv_tvlv_container - container for tvlv appended to OGMs
|
||||||
* @list: hlist node for batadv_priv_tvlv::container_list
|
* @list: hlist node for batadv_priv_tvlv::container_list
|
||||||
* @tvlv_hdr: tvlv header information needed to construct the tvlv
|
* @tvlv_hdr: tvlv header information needed to construct the tvlv
|
||||||
* @value_len: length of the buffer following this struct which contains
|
|
||||||
* the actual tvlv payload
|
|
||||||
* @refcount: number of contexts the object is used
|
* @refcount: number of contexts the object is used
|
||||||
*/
|
*/
|
||||||
struct batadv_tvlv_container {
|
struct batadv_tvlv_container {
|
||||||
|
|
Loading…
Reference in New Issue