Commit 9640ccce authored by David S. Miller's avatar David S. Miller

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

Simon Wunderlich says:

====================
Here are some batman-adv fixes:

 - Fix gateway refcounting in BATMAN IV and V, by Sven Eckelmann (2 patches)

 - Fix debugfs paths when renaming interfaces, by Sven Eckelmann (2 patches)

 - Fix TT flag issues, by Linus Luessing (2 patches)
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 53189183 a44ebeff
...@@ -2732,7 +2732,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -2732,7 +2732,7 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
{ {
struct batadv_neigh_ifinfo *router_ifinfo = NULL; struct batadv_neigh_ifinfo *router_ifinfo = NULL;
struct batadv_neigh_node *router; struct batadv_neigh_node *router;
struct batadv_gw_node *curr_gw; struct batadv_gw_node *curr_gw = NULL;
int ret = 0; int ret = 0;
void *hdr; void *hdr;
...@@ -2780,6 +2780,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -2780,6 +2780,8 @@ static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
ret = 0; ret = 0;
out: out:
if (curr_gw)
batadv_gw_node_put(curr_gw);
if (router_ifinfo) if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
if (router) if (router)
......
...@@ -927,7 +927,7 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -927,7 +927,7 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
{ {
struct batadv_neigh_ifinfo *router_ifinfo = NULL; struct batadv_neigh_ifinfo *router_ifinfo = NULL;
struct batadv_neigh_node *router; struct batadv_neigh_node *router;
struct batadv_gw_node *curr_gw; struct batadv_gw_node *curr_gw = NULL;
int ret = 0; int ret = 0;
void *hdr; void *hdr;
...@@ -995,6 +995,8 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq, ...@@ -995,6 +995,8 @@ static int batadv_v_gw_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
ret = 0; ret = 0;
out: out:
if (curr_gw)
batadv_gw_node_put(curr_gw);
if (router_ifinfo) if (router_ifinfo)
batadv_neigh_ifinfo_put(router_ifinfo); batadv_neigh_ifinfo_put(router_ifinfo);
if (router) if (router)
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "debugfs.h" #include "debugfs.h"
#include "main.h" #include "main.h"
#include <linux/dcache.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/errno.h> #include <linux/errno.h>
...@@ -343,6 +344,25 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface) ...@@ -343,6 +344,25 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
return -ENOMEM; return -ENOMEM;
} }
/**
* batadv_debugfs_rename_hardif() - Fix debugfs path for renamed hardif
* @hard_iface: hard interface which was renamed
*/
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
{
const char *name = hard_iface->net_dev->name;
struct dentry *dir;
struct dentry *d;
dir = hard_iface->debug_dir;
if (!dir)
return;
d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
if (!d)
pr_err("Can't rename debugfs dir to %s\n", name);
}
/** /**
* batadv_debugfs_del_hardif() - delete the base directory for a hard interface * batadv_debugfs_del_hardif() - delete the base directory for a hard interface
* in debugfs. * in debugfs.
...@@ -413,6 +433,26 @@ int batadv_debugfs_add_meshif(struct net_device *dev) ...@@ -413,6 +433,26 @@ int batadv_debugfs_add_meshif(struct net_device *dev)
return -ENOMEM; return -ENOMEM;
} }
/**
* batadv_debugfs_rename_meshif() - Fix debugfs path for renamed softif
* @dev: net_device which was renamed
*/
void batadv_debugfs_rename_meshif(struct net_device *dev)
{
struct batadv_priv *bat_priv = netdev_priv(dev);
const char *name = dev->name;
struct dentry *dir;
struct dentry *d;
dir = bat_priv->debug_dir;
if (!dir)
return;
d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name);
if (!d)
pr_err("Can't rename debugfs dir to %s\n", name);
}
/** /**
* batadv_debugfs_del_meshif() - Remove interface dependent debugfs entries * batadv_debugfs_del_meshif() - Remove interface dependent debugfs entries
* @dev: netdev struct of the soft interface * @dev: netdev struct of the soft interface
......
...@@ -30,8 +30,10 @@ struct net_device; ...@@ -30,8 +30,10 @@ struct net_device;
void batadv_debugfs_init(void); void batadv_debugfs_init(void);
void batadv_debugfs_destroy(void); void batadv_debugfs_destroy(void);
int batadv_debugfs_add_meshif(struct net_device *dev); int batadv_debugfs_add_meshif(struct net_device *dev);
void batadv_debugfs_rename_meshif(struct net_device *dev);
void batadv_debugfs_del_meshif(struct net_device *dev); void batadv_debugfs_del_meshif(struct net_device *dev);
int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface); int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface);
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface);
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface); void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface);
#else #else
...@@ -49,6 +51,10 @@ static inline int batadv_debugfs_add_meshif(struct net_device *dev) ...@@ -49,6 +51,10 @@ static inline int batadv_debugfs_add_meshif(struct net_device *dev)
return 0; return 0;
} }
static inline void batadv_debugfs_rename_meshif(struct net_device *dev)
{
}
static inline void batadv_debugfs_del_meshif(struct net_device *dev) static inline void batadv_debugfs_del_meshif(struct net_device *dev)
{ {
} }
...@@ -59,6 +65,11 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface) ...@@ -59,6 +65,11 @@ int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface)
return 0; return 0;
} }
static inline
void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface)
{
}
static inline static inline
void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface) void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface)
{ {
......
...@@ -989,6 +989,32 @@ void batadv_hardif_remove_interfaces(void) ...@@ -989,6 +989,32 @@ void batadv_hardif_remove_interfaces(void)
rtnl_unlock(); rtnl_unlock();
} }
/**
* batadv_hard_if_event_softif() - Handle events for soft interfaces
* @event: NETDEV_* event to handle
* @net_dev: net_device which generated an event
*
* Return: NOTIFY_* result
*/
static int batadv_hard_if_event_softif(unsigned long event,
struct net_device *net_dev)
{
struct batadv_priv *bat_priv;
switch (event) {
case NETDEV_REGISTER:
batadv_sysfs_add_meshif(net_dev);
bat_priv = netdev_priv(net_dev);
batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
break;
case NETDEV_CHANGENAME:
batadv_debugfs_rename_meshif(net_dev);
break;
}
return NOTIFY_DONE;
}
static int batadv_hard_if_event(struct notifier_block *this, static int batadv_hard_if_event(struct notifier_block *this,
unsigned long event, void *ptr) unsigned long event, void *ptr)
{ {
...@@ -997,12 +1023,8 @@ static int batadv_hard_if_event(struct notifier_block *this, ...@@ -997,12 +1023,8 @@ static int batadv_hard_if_event(struct notifier_block *this,
struct batadv_hard_iface *primary_if = NULL; struct batadv_hard_iface *primary_if = NULL;
struct batadv_priv *bat_priv; struct batadv_priv *bat_priv;
if (batadv_softif_is_valid(net_dev) && event == NETDEV_REGISTER) { if (batadv_softif_is_valid(net_dev))
batadv_sysfs_add_meshif(net_dev); return batadv_hard_if_event_softif(event, net_dev);
bat_priv = netdev_priv(net_dev);
batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
return NOTIFY_DONE;
}
hard_iface = batadv_hardif_get_by_netdev(net_dev); hard_iface = batadv_hardif_get_by_netdev(net_dev);
if (!hard_iface && (event == NETDEV_REGISTER || if (!hard_iface && (event == NETDEV_REGISTER ||
...@@ -1051,6 +1073,9 @@ static int batadv_hard_if_event(struct notifier_block *this, ...@@ -1051,6 +1073,9 @@ static int batadv_hard_if_event(struct notifier_block *this,
if (batadv_is_wifi_hardif(hard_iface)) if (batadv_is_wifi_hardif(hard_iface))
hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
break; break;
case NETDEV_CHANGENAME:
batadv_debugfs_rename_hardif(hard_iface);
break;
default: default:
break; break;
} }
......
...@@ -1705,7 +1705,9 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv, ...@@ -1705,7 +1705,9 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
ether_addr_copy(common->addr, tt_addr); ether_addr_copy(common->addr, tt_addr);
common->vid = vid; common->vid = vid;
common->flags = flags; if (!is_multicast_ether_addr(common->addr))
common->flags = flags & (~BATADV_TT_SYNC_MASK);
tt_global_entry->roam_at = 0; tt_global_entry->roam_at = 0;
/* node must store current time in case of roaming. This is /* node must store current time in case of roaming. This is
* needed to purge this entry out on timeout (if nobody claims * needed to purge this entry out on timeout (if nobody claims
...@@ -1768,6 +1770,7 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv, ...@@ -1768,6 +1770,7 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
* TT_CLIENT_TEMP, therefore they have to be copied in the * TT_CLIENT_TEMP, therefore they have to be copied in the
* client entry * client entry
*/ */
if (!is_multicast_ether_addr(common->addr))
common->flags |= flags & (~BATADV_TT_SYNC_MASK); common->flags |= flags & (~BATADV_TT_SYNC_MASK);
/* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
......
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