batman-adv: Trigger genl notification on sysfs config change
The generic netlink code is expected to trigger notification messages when configuration might have been changed. But the configuration of batman-adv is most of the time still done using sysfs. So the sysfs interface should also trigger the corresponding netlink messages via the "config" multicast group. Signed-off-by: Sven Eckelmann <sven@narfation.org> Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
This commit is contained in:
parent
9a182242f1
commit
7e6f461efe
|
@ -385,7 +385,7 @@ nla_put_failure:
|
||||||
*
|
*
|
||||||
* Return: 0 on success, < 0 on error
|
* Return: 0 on success, < 0 on error
|
||||||
*/
|
*/
|
||||||
static int batadv_netlink_notify_mesh(struct batadv_priv *bat_priv)
|
int batadv_netlink_notify_mesh(struct batadv_priv *bat_priv)
|
||||||
{
|
{
|
||||||
struct sk_buff *msg;
|
struct sk_buff *msg;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -852,8 +852,8 @@ nla_put_failure:
|
||||||
*
|
*
|
||||||
* Return: 0 on success, < 0 on error
|
* Return: 0 on success, < 0 on error
|
||||||
*/
|
*/
|
||||||
static int batadv_netlink_notify_hardif(struct batadv_priv *bat_priv,
|
int batadv_netlink_notify_hardif(struct batadv_priv *bat_priv,
|
||||||
struct batadv_hard_iface *hard_iface)
|
struct batadv_hard_iface *hard_iface)
|
||||||
{
|
{
|
||||||
struct sk_buff *msg;
|
struct sk_buff *msg;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1057,8 +1057,8 @@ nla_put_failure:
|
||||||
*
|
*
|
||||||
* Return: 0 on success, < 0 on error
|
* Return: 0 on success, < 0 on error
|
||||||
*/
|
*/
|
||||||
static int batadv_netlink_notify_vlan(struct batadv_priv *bat_priv,
|
int batadv_netlink_notify_vlan(struct batadv_priv *bat_priv,
|
||||||
struct batadv_softif_vlan *vlan)
|
struct batadv_softif_vlan *vlan)
|
||||||
{
|
{
|
||||||
struct sk_buff *msg;
|
struct sk_buff *msg;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
|
@ -48,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"
|
||||||
|
|
||||||
|
@ -154,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) \
|
||||||
|
@ -186,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) \
|
||||||
|
@ -223,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; \
|
||||||
}
|
}
|
||||||
|
@ -256,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); \
|
||||||
|
@ -268,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; \
|
||||||
}
|
}
|
||||||
|
@ -537,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,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
|
||||||
|
@ -578,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,
|
||||||
|
@ -601,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -674,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1078,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;
|
||||||
|
@ -1108,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;
|
||||||
|
|
Loading…
Reference in New Issue