Skip to content

Commit

Permalink
hsr: remove hsr interface if all slaves are removed
Browse files Browse the repository at this point in the history
When all hsr slave interfaces are removed, hsr interface doesn't work.
At that moment, it's fine to remove an unused hsr interface automatically
for saving resources.
That's a common behavior of virtual interfaces.

Signed-off-by: Taehee Yoo <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
TaeheeYoo authored and davem330 committed Apr 30, 2020
1 parent 1b2e788 commit 34a9c36
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions net/hsr/hsr_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,23 @@
#include "hsr_framereg.h"
#include "hsr_slave.h"

static bool hsr_slave_empty(struct hsr_priv *hsr)
{
struct hsr_port *port;

hsr_for_each_port(hsr, port)
if (port->type != HSR_PT_MASTER)
return false;
return true;
}

static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
void *ptr)
{
struct net_device *dev;
struct hsr_port *port, *master;
struct net_device *dev;
struct hsr_priv *hsr;
LIST_HEAD(list_kill);
int mtu_max;
int res;

Expand Down Expand Up @@ -85,8 +96,15 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
master->dev->mtu = mtu_max;
break;
case NETDEV_UNREGISTER:
if (!is_hsr_master(dev))
if (!is_hsr_master(dev)) {
master = hsr_port_get_hsr(port->hsr, HSR_PT_MASTER);
hsr_del_port(port);
if (hsr_slave_empty(master->hsr)) {
unregister_netdevice_queue(master->dev,
&list_kill);
unregister_netdevice_many(&list_kill);
}
}
break;
case NETDEV_PRE_TYPE_CHANGE:
/* HSR works only on Ethernet devices. Refuse slave to change
Expand Down

0 comments on commit 34a9c36

Please sign in to comment.