Commit 03b96742 authored by David S. Miller's avatar David S. Miller

Merge tag 'batadv-next-for-davem-20190213' of git://git.open-mesh.org/linux-merge

Simon Wunderlich says:

====================
This feature/cleanup patchset includes the following patches:

 - fix memory leak in in batadv_dat_put_dhcp, by Martin Weinelt

 - fix typo, by Sven Eckelmann

 - netlink restructuring patch series (part 2), by Sven Eckelmann
   (19 patches)
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents e7c2e3b5 7e6f461e
...@@ -229,7 +229,7 @@ struct batadv_ogm_packet { ...@@ -229,7 +229,7 @@ struct batadv_ogm_packet {
* @packet_type: batman-adv packet type, part of the general header * @packet_type: batman-adv packet type, part of the general header
* @version: batman-adv protocol version, part of the general header * @version: batman-adv protocol version, part of the general header
* @ttl: time to live for this packet, part of the general header * @ttl: time to live for this packet, part of the general header
* @flags: reseved for routing relevant flags - currently always 0 * @flags: reserved for routing relevant flags - currently always 0
* @seqno: sequence number * @seqno: sequence number
* @orig: originator mac address * @orig: originator mac address
* @tvlv_len: length of the appended tvlv buffer (in bytes) * @tvlv_len: length of the appended tvlv buffer (in bytes)
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#define BATADV_NL_NAME "batadv" #define BATADV_NL_NAME "batadv"
#define BATADV_NL_MCAST_GROUP_CONFIG "config"
#define BATADV_NL_MCAST_GROUP_TPMETER "tpmeter" #define BATADV_NL_MCAST_GROUP_TPMETER "tpmeter"
/** /**
...@@ -138,6 +139,20 @@ enum batadv_mcast_flags_priv { ...@@ -138,6 +139,20 @@ enum batadv_mcast_flags_priv {
BATADV_MCAST_FLAGS_QUERIER_IPV6_SHADOWING = (1 << 4), BATADV_MCAST_FLAGS_QUERIER_IPV6_SHADOWING = (1 << 4),
}; };
/**
* enum batadv_gw_modes - gateway mode of node
*/
enum batadv_gw_modes {
/** @BATADV_GW_MODE_OFF: gw mode disabled */
BATADV_GW_MODE_OFF,
/** @BATADV_GW_MODE_CLIENT: send DHCP requests to gw servers */
BATADV_GW_MODE_CLIENT,
/** @BATADV_GW_MODE_SERVER: announce itself as gatway server */
BATADV_GW_MODE_SERVER,
};
/** /**
* enum batadv_nl_attrs - batman-adv netlink attributes * enum batadv_nl_attrs - batman-adv netlink attributes
*/ */
...@@ -344,6 +359,138 @@ enum batadv_nl_attrs { ...@@ -344,6 +359,138 @@ enum batadv_nl_attrs {
*/ */
BATADV_ATTR_MCAST_FLAGS_PRIV, BATADV_ATTR_MCAST_FLAGS_PRIV,
/**
* @BATADV_ATTR_VLANID: VLAN id on top of soft interface
*/
BATADV_ATTR_VLANID,
/**
* @BATADV_ATTR_AGGREGATED_OGMS_ENABLED: whether the batman protocol
* messages of the mesh interface shall be aggregated or not.
*/
BATADV_ATTR_AGGREGATED_OGMS_ENABLED,
/**
* @BATADV_ATTR_AP_ISOLATION_ENABLED: whether the data traffic going
* from a wireless client to another wireless client will be silently
* dropped.
*/
BATADV_ATTR_AP_ISOLATION_ENABLED,
/**
* @BATADV_ATTR_ISOLATION_MARK: the isolation mark which is used to
* classify clients as "isolated" by the Extended Isolation feature.
*/
BATADV_ATTR_ISOLATION_MARK,
/**
* @BATADV_ATTR_ISOLATION_MASK: the isolation (bit)mask which is used to
* classify clients as "isolated" by the Extended Isolation feature.
*/
BATADV_ATTR_ISOLATION_MASK,
/**
* @BATADV_ATTR_BONDING_ENABLED: whether the data traffic going through
* the mesh will be sent using multiple interfaces at the same time.
*/
BATADV_ATTR_BONDING_ENABLED,
/**
* @BATADV_ATTR_BRIDGE_LOOP_AVOIDANCE_ENABLED: whether the bridge loop
* avoidance feature is enabled. This feature detects and avoids loops
* between the mesh and devices bridged with the soft interface
*/
BATADV_ATTR_BRIDGE_LOOP_AVOIDANCE_ENABLED,
/**
* @BATADV_ATTR_DISTRIBUTED_ARP_TABLE_ENABLED: whether the distributed
* arp table feature is enabled. This feature uses a distributed hash
* table to answer ARP requests without flooding the request through
* the whole mesh.
*/
BATADV_ATTR_DISTRIBUTED_ARP_TABLE_ENABLED,
/**
* @BATADV_ATTR_FRAGMENTATION_ENABLED: whether the data traffic going
* through the mesh will be fragmented or silently discarded if the
* packet size exceeds the outgoing interface MTU.
*/
BATADV_ATTR_FRAGMENTATION_ENABLED,
/**
* @BATADV_ATTR_GW_BANDWIDTH_DOWN: defines the download bandwidth which
* is propagated by this node if %BATADV_ATTR_GW_BANDWIDTH_MODE was set
* to 'server'.
*/
BATADV_ATTR_GW_BANDWIDTH_DOWN,
/**
* @BATADV_ATTR_GW_BANDWIDTH_UP: defines the upload bandwidth which
* is propagated by this node if %BATADV_ATTR_GW_BANDWIDTH_MODE was set
* to 'server'.
*/
BATADV_ATTR_GW_BANDWIDTH_UP,
/**
* @BATADV_ATTR_GW_MODE: defines the state of the gateway features.
* Possible values are specified in enum batadv_gw_modes
*/
BATADV_ATTR_GW_MODE,
/**
* @BATADV_ATTR_GW_SEL_CLASS: defines the selection criteria this node
* will use to choose a gateway if gw_mode was set to 'client'.
*/
BATADV_ATTR_GW_SEL_CLASS,
/**
* @BATADV_ATTR_HOP_PENALTY: defines the penalty which will be applied
* to an originator message's tq-field on every hop.
*/
BATADV_ATTR_HOP_PENALTY,
/**
* @BATADV_ATTR_LOG_LEVEL: bitmask with to define which debug messages
* should be send to the debug log/trace ring buffer
*/
BATADV_ATTR_LOG_LEVEL,
/**
* @BATADV_ATTR_MULTICAST_FORCEFLOOD_ENABLED: whether multicast
* optimizations should be replaced by simple broadcast-like flooding
* of multicast packets. If set to non-zero then all nodes in the mesh
* are going to use classic flooding for any multicast packet with no
* optimizations.
*/
BATADV_ATTR_MULTICAST_FORCEFLOOD_ENABLED,
/**
* @BATADV_ATTR_NETWORK_CODING_ENABLED: whether Network Coding (using
* some magic to send fewer wifi packets but still the same content) is
* enabled or not.
*/
BATADV_ATTR_NETWORK_CODING_ENABLED,
/**
* @BATADV_ATTR_ORIG_INTERVAL: defines the interval in milliseconds in
* which batman sends its protocol messages.
*/
BATADV_ATTR_ORIG_INTERVAL,
/**
* @BATADV_ATTR_ELP_INTERVAL: defines the interval in milliseconds in
* which batman emits probing packets for neighbor sensing (ELP).
*/
BATADV_ATTR_ELP_INTERVAL,
/**
* @BATADV_ATTR_THROUGHPUT_OVERRIDE: defines the throughput value to be
* used by B.A.T.M.A.N. V when estimating the link throughput using
* this interface. If the value is set to 0 then batman-adv will try to
* estimate the throughput by itself.
*/
BATADV_ATTR_THROUGHPUT_OVERRIDE,
/* add attributes above here, update the policy in netlink.c */ /* add attributes above here, update the policy in netlink.c */
/** /**
...@@ -372,10 +519,14 @@ enum batadv_nl_commands { ...@@ -372,10 +519,14 @@ enum batadv_nl_commands {
BATADV_CMD_UNSPEC, BATADV_CMD_UNSPEC,
/** /**
* @BATADV_CMD_GET_MESH_INFO: Query basic information about batman-adv * @BATADV_CMD_GET_MESH: Get attributes from softif/mesh
* device */
BATADV_CMD_GET_MESH,
/**
* @BATADV_CMD_GET_MESH_INFO: Alias for @BATADV_CMD_GET_MESH
*/ */
BATADV_CMD_GET_MESH_INFO, BATADV_CMD_GET_MESH_INFO = BATADV_CMD_GET_MESH,
/** /**
* @BATADV_CMD_TP_METER: Start a tp meter session * @BATADV_CMD_TP_METER: Start a tp meter session
...@@ -393,9 +544,15 @@ enum batadv_nl_commands { ...@@ -393,9 +544,15 @@ enum batadv_nl_commands {
BATADV_CMD_GET_ROUTING_ALGOS, BATADV_CMD_GET_ROUTING_ALGOS,
/** /**
* @BATADV_CMD_GET_HARDIFS: Query list of hard interfaces * @BATADV_CMD_GET_HARDIF: Get attributes from a hardif of the
* current softif
*/ */
BATADV_CMD_GET_HARDIFS, BATADV_CMD_GET_HARDIF,
/**
* @BATADV_CMD_GET_HARDIFS: Alias for @BATADV_CMD_GET_HARDIF
*/
BATADV_CMD_GET_HARDIFS = BATADV_CMD_GET_HARDIF,
/** /**
* @BATADV_CMD_GET_TRANSTABLE_LOCAL: Query list of local translations * @BATADV_CMD_GET_TRANSTABLE_LOCAL: Query list of local translations
...@@ -443,6 +600,29 @@ enum batadv_nl_commands { ...@@ -443,6 +600,29 @@ enum batadv_nl_commands {
*/ */
BATADV_CMD_GET_MCAST_FLAGS, BATADV_CMD_GET_MCAST_FLAGS,
/**
* @BATADV_CMD_SET_MESH: Set attributes for softif/mesh
*/
BATADV_CMD_SET_MESH,
/**
* @BATADV_CMD_SET_HARDIF: Set attributes for hardif of the
* current softif
*/
BATADV_CMD_SET_HARDIF,
/**
* @BATADV_CMD_GET_VLAN: Get attributes from a VLAN of the
* current softif
*/
BATADV_CMD_GET_VLAN,
/**
* @BATADV_CMD_SET_VLAN: Set attributes for VLAN of the
* current softif
*/
BATADV_CMD_SET_VLAN,
/* add new commands above here */ /* add new commands above here */
/** /**
......
...@@ -1711,6 +1711,8 @@ static void batadv_dat_put_dhcp(struct batadv_priv *bat_priv, u8 *chaddr, ...@@ -1711,6 +1711,8 @@ static void batadv_dat_put_dhcp(struct batadv_priv *bat_priv, u8 *chaddr,
batadv_dat_send_data(bat_priv, skb, yiaddr, vid, BATADV_P_DAT_DHT_PUT); batadv_dat_send_data(bat_priv, skb, yiaddr, vid, BATADV_P_DAT_DHT_PUT);
batadv_dat_send_data(bat_priv, skb, ip_dst, vid, BATADV_P_DAT_DHT_PUT); batadv_dat_send_data(bat_priv, skb, ip_dst, vid, BATADV_P_DAT_DHT_PUT);
consume_skb(skb);
batadv_dbg(BATADV_DBG_DAT, bat_priv, batadv_dbg(BATADV_DBG_DAT, bat_priv,
"Snooped from outgoing DHCPACK (server address): %pI4, %pM (vid: %i)\n", "Snooped from outgoing DHCPACK (server address): %pI4, %pM (vid: %i)\n",
&ip_dst, hw_dst, batadv_print_vid(vid)); &ip_dst, hw_dst, batadv_print_vid(vid));
......
...@@ -47,7 +47,6 @@ ...@@ -47,7 +47,6 @@
#include <uapi/linux/batadv_packet.h> #include <uapi/linux/batadv_packet.h>
#include <uapi/linux/batman_adv.h> #include <uapi/linux/batman_adv.h>
#include "gateway_common.h"
#include "hard-interface.h" #include "hard-interface.h"
#include "log.h" #include "log.h"
#include "netlink.h" #include "netlink.h"
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/string.h> #include <linux/string.h>
#include <uapi/linux/batadv_packet.h> #include <uapi/linux/batadv_packet.h>
#include <uapi/linux/batman_adv.h>
#include "gateway_client.h" #include "gateway_client.h"
#include "log.h" #include "log.h"
......
...@@ -25,12 +25,6 @@ ...@@ -25,12 +25,6 @@
struct net_device; struct net_device;
enum batadv_gw_modes {
BATADV_GW_MODE_OFF,
BATADV_GW_MODE_CLIENT,
BATADV_GW_MODE_SERVER,
};
/** /**
* enum batadv_bandwidth_units - bandwidth unit types * enum batadv_bandwidth_units - bandwidth unit types
*/ */
......
This diff is collapsed.
...@@ -34,6 +34,12 @@ int batadv_netlink_tpmeter_notify(struct batadv_priv *bat_priv, const u8 *dst, ...@@ -34,6 +34,12 @@ int batadv_netlink_tpmeter_notify(struct batadv_priv *bat_priv, const u8 *dst,
u8 result, u32 test_time, u64 total_bytes, u8 result, u32 test_time, u64 total_bytes,
u32 cookie); u32 cookie);
int batadv_netlink_notify_mesh(struct batadv_priv *bat_priv);
int batadv_netlink_notify_hardif(struct batadv_priv *bat_priv,
struct batadv_hard_iface *hard_iface);
int batadv_netlink_notify_vlan(struct batadv_priv *bat_priv,
struct batadv_softif_vlan *vlan);
extern struct genl_family batadv_netlink_family; extern struct genl_family batadv_netlink_family;
#endif /* _NET_BATMAN_ADV_NETLINK_H_ */ #endif /* _NET_BATMAN_ADV_NETLINK_H_ */
...@@ -50,13 +50,13 @@ ...@@ -50,13 +50,13 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/types.h> #include <linux/types.h>
#include <uapi/linux/batadv_packet.h> #include <uapi/linux/batadv_packet.h>
#include <uapi/linux/batman_adv.h>
#include "bat_algo.h" #include "bat_algo.h"
#include "bridge_loop_avoidance.h" #include "bridge_loop_avoidance.h"
#include "debugfs.h" #include "debugfs.h"
#include "distributed-arp-table.h" #include "distributed-arp-table.h"
#include "gateway_client.h" #include "gateway_client.h"
#include "gateway_common.h"
#include "hard-interface.h" #include "hard-interface.h"
#include "multicast.h" #include "multicast.h"
#include "network-coding.h" #include "network-coding.h"
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <linux/stringify.h> #include <linux/stringify.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <uapi/linux/batadv_packet.h> #include <uapi/linux/batadv_packet.h>
#include <uapi/linux/batman_adv.h>
#include "bridge_loop_avoidance.h" #include "bridge_loop_avoidance.h"
#include "distributed-arp-table.h" #include "distributed-arp-table.h"
...@@ -47,6 +48,7 @@ ...@@ -47,6 +48,7 @@
#include "gateway_common.h" #include "gateway_common.h"
#include "hard-interface.h" #include "hard-interface.h"
#include "log.h" #include "log.h"
#include "netlink.h"
#include "network-coding.h" #include "network-coding.h"
#include "soft-interface.h" #include "soft-interface.h"
...@@ -153,9 +155,14 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \ ...@@ -153,9 +155,14 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
{ \ { \
struct net_device *net_dev = batadv_kobj_to_netdev(kobj); \ struct net_device *net_dev = batadv_kobj_to_netdev(kobj); \
struct batadv_priv *bat_priv = netdev_priv(net_dev); \ struct batadv_priv *bat_priv = netdev_priv(net_dev); \
ssize_t length; \
\ \
return __batadv_store_bool_attr(buff, count, _post_func, attr, \ length = __batadv_store_bool_attr(buff, count, _post_func, attr,\
&bat_priv->_name, net_dev); \ &bat_priv->_name, net_dev); \
\
batadv_netlink_notify_mesh(bat_priv); \
\
return length; \
} }
#define BATADV_ATTR_SIF_SHOW_BOOL(_name) \ #define BATADV_ATTR_SIF_SHOW_BOOL(_name) \
...@@ -185,11 +192,16 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \ ...@@ -185,11 +192,16 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
{ \ { \
struct net_device *net_dev = batadv_kobj_to_netdev(kobj); \ struct net_device *net_dev = batadv_kobj_to_netdev(kobj); \
struct batadv_priv *bat_priv = netdev_priv(net_dev); \ struct batadv_priv *bat_priv = netdev_priv(net_dev); \
ssize_t length; \
\ \
return __batadv_store_uint_attr(buff, count, _min, _max, \ length = __batadv_store_uint_attr(buff, count, _min, _max, \
_post_func, attr, \ _post_func, attr, \
&bat_priv->_var, net_dev, \ &bat_priv->_var, net_dev, \
NULL); \ NULL); \
\
batadv_netlink_notify_mesh(bat_priv); \
\
return length; \
} }
#define BATADV_ATTR_SIF_SHOW_UINT(_name, _var) \ #define BATADV_ATTR_SIF_SHOW_UINT(_name, _var) \
...@@ -222,6 +234,11 @@ ssize_t batadv_store_vlan_##_name(struct kobject *kobj, \ ...@@ -222,6 +234,11 @@ ssize_t batadv_store_vlan_##_name(struct kobject *kobj, \
attr, &vlan->_name, \ attr, &vlan->_name, \
bat_priv->soft_iface); \ bat_priv->soft_iface); \
\ \
if (vlan->vid) \
batadv_netlink_notify_vlan(bat_priv, vlan); \
else \
batadv_netlink_notify_mesh(bat_priv); \
\
batadv_softif_vlan_put(vlan); \ batadv_softif_vlan_put(vlan); \
return res; \ return res; \
} }
...@@ -255,6 +272,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \ ...@@ -255,6 +272,7 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
{ \ { \
struct net_device *net_dev = batadv_kobj_to_netdev(kobj); \ struct net_device *net_dev = batadv_kobj_to_netdev(kobj); \
struct batadv_hard_iface *hard_iface; \ struct batadv_hard_iface *hard_iface; \
struct batadv_priv *bat_priv; \
ssize_t length; \ ssize_t length; \
\ \
hard_iface = batadv_hardif_get_by_netdev(net_dev); \ hard_iface = batadv_hardif_get_by_netdev(net_dev); \
...@@ -267,6 +285,11 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \ ...@@ -267,6 +285,11 @@ ssize_t batadv_store_##_name(struct kobject *kobj, \
hard_iface->soft_iface, \ hard_iface->soft_iface, \
net_dev); \ net_dev); \
\ \
if (hard_iface->soft_iface) { \
bat_priv = netdev_priv(hard_iface->soft_iface); \
batadv_netlink_notify_hardif(bat_priv, hard_iface); \
} \
\
batadv_hardif_put(hard_iface); \ batadv_hardif_put(hard_iface); \
return length; \ return length; \
} }
...@@ -536,6 +559,9 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj, ...@@ -536,6 +559,9 @@ static ssize_t batadv_store_gw_mode(struct kobject *kobj,
batadv_gw_check_client_stop(bat_priv); batadv_gw_check_client_stop(bat_priv);
atomic_set(&bat_priv->gw.mode, (unsigned int)gw_mode_tmp); atomic_set(&bat_priv->gw.mode, (unsigned int)gw_mode_tmp);
batadv_gw_tvlv_container_update(bat_priv); batadv_gw_tvlv_container_update(bat_priv);
batadv_netlink_notify_mesh(bat_priv);
return count; return count;
} }
...@@ -562,6 +588,7 @@ static ssize_t batadv_store_gw_sel_class(struct kobject *kobj, ...@@ -562,6 +588,7 @@ static ssize_t batadv_store_gw_sel_class(struct kobject *kobj,
size_t count) size_t count)
{ {
struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj); struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
ssize_t length;
/* setting the GW selection class is allowed only if the routing /* setting the GW selection class is allowed only if the routing
* algorithm in use implements the GW API * algorithm in use implements the GW API
...@@ -577,10 +604,14 @@ static ssize_t batadv_store_gw_sel_class(struct kobject *kobj, ...@@ -577,10 +604,14 @@ static ssize_t batadv_store_gw_sel_class(struct kobject *kobj,
return bat_priv->algo_ops->gw.store_sel_class(bat_priv, buff, return bat_priv->algo_ops->gw.store_sel_class(bat_priv, buff,
count); count);
return __batadv_store_uint_attr(buff, count, 1, BATADV_TQ_MAX_VALUE, length = __batadv_store_uint_attr(buff, count, 1, BATADV_TQ_MAX_VALUE,
batadv_post_gw_reselect, attr, batadv_post_gw_reselect, attr,
&bat_priv->gw.sel_class, &bat_priv->gw.sel_class,
bat_priv->soft_iface, NULL); bat_priv->soft_iface, NULL);
batadv_netlink_notify_mesh(bat_priv);
return length;
} }
static ssize_t batadv_show_gw_bwidth(struct kobject *kobj, static ssize_t batadv_show_gw_bwidth(struct kobject *kobj,
...@@ -600,12 +631,18 @@ static ssize_t batadv_store_gw_bwidth(struct kobject *kobj, ...@@ -600,12 +631,18 @@ static ssize_t batadv_store_gw_bwidth(struct kobject *kobj,
struct attribute *attr, char *buff, struct attribute *attr, char *buff,
size_t count) size_t count)
{ {
struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
struct net_device *net_dev = batadv_kobj_to_netdev(kobj); struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
ssize_t length;
if (buff[count - 1] == '\n') if (buff[count - 1] == '\n')
buff[count - 1] = '\0'; buff[count - 1] = '\0';
return batadv_gw_bandwidth_set(net_dev, buff, count); length = batadv_gw_bandwidth_set(net_dev, buff, count);
batadv_netlink_notify_mesh(bat_priv);
return length;
} }
/** /**
...@@ -673,6 +710,8 @@ static ssize_t batadv_store_isolation_mark(struct kobject *kobj, ...@@ -673,6 +710,8 @@ static ssize_t batadv_store_isolation_mark(struct kobject *kobj,
"New skb mark for extended isolation: %#.8x/%#.8x\n", "New skb mark for extended isolation: %#.8x/%#.8x\n",
bat_priv->isolation_mark, bat_priv->isolation_mark_mask); bat_priv->isolation_mark, bat_priv->isolation_mark_mask);
batadv_netlink_notify_mesh(bat_priv);
return count; return count;
} }
...@@ -1077,6 +1116,7 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj, ...@@ -1077,6 +1116,7 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
struct attribute *attr, struct attribute *attr,
char *buff, size_t count) char *buff, size_t count)
{ {
struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
struct net_device *net_dev = batadv_kobj_to_netdev(kobj); struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
struct batadv_hard_iface *hard_iface; struct batadv_hard_iface *hard_iface;
u32 tp_override; u32 tp_override;
...@@ -1107,6 +1147,8 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj, ...@@ -1107,6 +1147,8 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
atomic_set(&hard_iface->bat_v.throughput_override, tp_override); atomic_set(&hard_iface->bat_v.throughput_override, tp_override);
batadv_netlink_notify_hardif(bat_priv, hard_iface);
out: out:
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
return count; return count;
......
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