/* Announce (supervision frame) timer function */ static void hsr_announce(unsigned long data) { struct hsr_priv *hsr; struct hsr_port *master; hsr = (struct hsr_priv *) data; rcu_read_lock(); master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); if (hsr->announce_count < 3 && hsr->protVersion == 0) { send_hsr_supervision_frame(master, HSR_TLV_ANNOUNCE, hsr->protVersion); hsr->announce_count++; hsr->announce_timer.expires = jiffies + msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL); } else { send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK, hsr->protVersion); hsr->announce_timer.expires = jiffies + msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL); } if (is_admin_up(master->dev)) add_timer(&hsr->announce_timer); rcu_read_unlock(); }
static void hsr_set_operstate(struct hsr_port *master, bool has_carrier) { if (!is_admin_up(master->dev)) { __hsr_set_operstate(master->dev, IF_OPER_DOWN); return; } if (has_carrier) __hsr_set_operstate(master->dev, IF_OPER_UP); else __hsr_set_operstate(master->dev, IF_OPER_LOWERLAYERDOWN); }
void hsr_set_operstate(struct net_device *hsr_dev, struct net_device *slave1, struct net_device *slave2) { if (!is_admin_up(hsr_dev)) { __hsr_set_operstate(hsr_dev, IF_OPER_DOWN); return; } if (is_slave_up(slave1) || is_slave_up(slave2)) __hsr_set_operstate(hsr_dev, IF_OPER_UP); else __hsr_set_operstate(hsr_dev, IF_OPER_LOWERLAYERDOWN); }
/* Announce (supervision frame) timer function */ static void hsr_announce(unsigned long data) { struct hsr_priv *hsr_priv; hsr_priv = (struct hsr_priv *) data; if (hsr_priv->announce_count < 3) { send_hsr_supervision_frame(hsr_priv->dev, HSR_TLV_ANNOUNCE); hsr_priv->announce_count++; } else { send_hsr_supervision_frame(hsr_priv->dev, HSR_TLV_LIFE_CHECK); } if (hsr_priv->announce_count < 3) hsr_priv->announce_timer.expires = jiffies + msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL); else hsr_priv->announce_timer.expires = jiffies + msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL); if (is_admin_up(hsr_priv->dev)) add_timer(&hsr_priv->announce_timer); }
static bool is_slave_up(struct net_device *dev) { return dev && is_admin_up(dev) && netif_oper_up(dev); }