net/hsr: Operstate handling cleanup.
Signed-off-by: Arvid Brodin <arvid.brodin@alten.se> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
abff716276
Коммит
e9aae56ea4
|
@ -46,31 +46,36 @@ static void __hsr_set_operstate(struct net_device *dev, int transition)
|
|||
}
|
||||
}
|
||||
|
||||
void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1,
|
||||
struct net_device *slave2)
|
||||
static void hsr_set_operstate(struct net_device *hsr_dev, bool has_carrier)
|
||||
{
|
||||
if (!is_admin_up(hsr_dev)) {
|
||||
__hsr_set_operstate(hsr_dev, IF_OPER_DOWN);
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_slave_up(slave1) || is_slave_up(slave2))
|
||||
if (has_carrier)
|
||||
__hsr_set_operstate(hsr_dev, IF_OPER_UP);
|
||||
else
|
||||
__hsr_set_operstate(hsr_dev, IF_OPER_LOWERLAYERDOWN);
|
||||
}
|
||||
|
||||
void hsr_set_carrier(struct net_device *hsr_dev, struct net_device *slave1,
|
||||
struct net_device *slave2)
|
||||
static bool hsr_check_carrier(struct hsr_priv *hsr)
|
||||
{
|
||||
if (is_slave_up(slave1) || is_slave_up(slave2))
|
||||
netif_carrier_on(hsr_dev);
|
||||
bool has_carrier;
|
||||
|
||||
has_carrier = (is_slave_up(hsr->slave[0]) || is_slave_up(hsr->slave[1]));
|
||||
|
||||
if (has_carrier)
|
||||
netif_carrier_on(hsr->dev);
|
||||
else
|
||||
netif_carrier_off(hsr_dev);
|
||||
netif_carrier_off(hsr->dev);
|
||||
|
||||
return has_carrier;
|
||||
}
|
||||
|
||||
|
||||
void hsr_check_announce(struct net_device *hsr_dev, int old_operstate)
|
||||
static void hsr_check_announce(struct net_device *hsr_dev,
|
||||
unsigned char old_operstate)
|
||||
{
|
||||
struct hsr_priv *hsr;
|
||||
|
||||
|
@ -89,6 +94,20 @@ void hsr_check_announce(struct net_device *hsr_dev, int old_operstate)
|
|||
del_timer(&hsr->announce_timer);
|
||||
}
|
||||
|
||||
void hsr_check_carrier_and_operstate(struct hsr_priv *hsr)
|
||||
{
|
||||
unsigned char old_operstate;
|
||||
bool has_carrier;
|
||||
|
||||
/* netif_stacked_transfer_operstate() cannot be used here since
|
||||
* it doesn't set IF_OPER_LOWERLAYERDOWN (?)
|
||||
*/
|
||||
old_operstate = hsr->dev->operstate;
|
||||
has_carrier = hsr_check_carrier(hsr);
|
||||
hsr_set_operstate(hsr->dev, has_carrier);
|
||||
hsr_check_announce(hsr->dev, old_operstate);
|
||||
}
|
||||
|
||||
|
||||
int hsr_get_max_mtu(struct hsr_priv *hsr)
|
||||
{
|
||||
|
|
|
@ -18,11 +18,7 @@
|
|||
void hsr_dev_setup(struct net_device *dev);
|
||||
int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
|
||||
unsigned char multicast_spec);
|
||||
void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1,
|
||||
struct net_device *slave2);
|
||||
void hsr_set_carrier(struct net_device *hsr_dev, struct net_device *slave1,
|
||||
struct net_device *slave2);
|
||||
void hsr_check_announce(struct net_device *hsr_dev, int old_operstate);
|
||||
void hsr_check_carrier_and_operstate(struct hsr_priv *hsr);
|
||||
bool is_hsr_master(struct net_device *dev);
|
||||
int hsr_get_max_mtu(struct hsr_priv *hsr);
|
||||
|
||||
|
|
|
@ -91,7 +91,6 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
|
|||
{
|
||||
struct net_device *slave, *other_slave;
|
||||
struct hsr_priv *hsr;
|
||||
int old_operstate;
|
||||
int mtu_max;
|
||||
int res;
|
||||
struct net_device *dev;
|
||||
|
@ -115,13 +114,7 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
|
|||
case NETDEV_UP: /* Administrative state DOWN */
|
||||
case NETDEV_DOWN: /* Administrative state UP */
|
||||
case NETDEV_CHANGE: /* Link (carrier) state changes */
|
||||
old_operstate = hsr->dev->operstate;
|
||||
hsr_set_carrier(hsr->dev, slave, other_slave);
|
||||
/* netif_stacked_transfer_operstate() cannot be used here since
|
||||
* it doesn't set IF_OPER_LOWERLAYERDOWN (?)
|
||||
*/
|
||||
hsr_set_operstate(hsr->dev, slave, other_slave);
|
||||
hsr_check_announce(hsr->dev, old_operstate);
|
||||
hsr_check_carrier_and_operstate(hsr);
|
||||
break;
|
||||
case NETDEV_CHANGEADDR:
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче