Lines Matching +full:frame +full:- +full:master
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright 2011-2014 Autronica Fire and Security AS
5 * 2011-2014 Arvid Brodin, arvid.brodin@alten.se
23 return dev && (dev->flags & IFF_UP); in is_admin_up()
34 if (dev->operstate != transition) { in __hsr_set_operstate()
35 dev->operstate = transition; in __hsr_set_operstate()
43 static void hsr_set_operstate(struct hsr_port *master, bool has_carrier) in hsr_set_operstate() argument
45 if (!is_admin_up(master->dev)) { in hsr_set_operstate()
46 __hsr_set_operstate(master->dev, IF_OPER_DOWN); in hsr_set_operstate()
51 __hsr_set_operstate(master->dev, IF_OPER_UP); in hsr_set_operstate()
53 __hsr_set_operstate(master->dev, IF_OPER_LOWERLAYERDOWN); in hsr_set_operstate()
56 static bool hsr_check_carrier(struct hsr_port *master) in hsr_check_carrier() argument
62 hsr_for_each_port(master->hsr, port) { in hsr_check_carrier()
63 if (port->type != HSR_PT_MASTER && is_slave_up(port->dev)) { in hsr_check_carrier()
64 netif_carrier_on(master->dev); in hsr_check_carrier()
69 netif_carrier_off(master->dev); in hsr_check_carrier()
81 if (hsr_dev->operstate == IF_OPER_UP && old_operstate != IF_OPER_UP) { in hsr_check_announce()
83 hsr->announce_count = 0; in hsr_check_announce()
84 mod_timer(&hsr->announce_timer, in hsr_check_announce()
88 if (hsr_dev->operstate != IF_OPER_UP && old_operstate == IF_OPER_UP) in hsr_check_announce()
90 del_timer(&hsr->announce_timer); in hsr_check_announce()
95 struct hsr_port *master; in hsr_check_carrier_and_operstate() local
99 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); in hsr_check_carrier_and_operstate()
103 old_operstate = master->dev->operstate; in hsr_check_carrier_and_operstate()
104 has_carrier = hsr_check_carrier(master); in hsr_check_carrier_and_operstate()
105 hsr_set_operstate(master, has_carrier); in hsr_check_carrier_and_operstate()
106 hsr_check_announce(master->dev, old_operstate); in hsr_check_carrier_and_operstate()
116 if (port->type != HSR_PT_MASTER) in hsr_get_max_mtu()
117 mtu_max = min(port->dev->mtu, mtu_max); in hsr_get_max_mtu()
121 return mtu_max - HSR_HLEN; in hsr_get_max_mtu()
131 …netdev_info(dev, "A HSR master's MTU cannot be greater than the smallest MTU of its slaves minus t… in hsr_dev_change_mtu()
133 return -EINVAL; in hsr_dev_change_mtu()
136 dev->mtu = new_mtu; in hsr_dev_change_mtu()
151 if (port->type == HSR_PT_MASTER) in hsr_dev_open()
153 switch (port->type) { in hsr_dev_open()
163 if (!is_slave_up(port->dev)) in hsr_dev_open()
165 designation, port->dev->name); in hsr_dev_open()
191 * Anything that's off in mask will not be enabled - so only things in hsr_features_recompute()
198 port->dev->features, in hsr_features_recompute()
215 struct hsr_port *master; in hsr_dev_xmit() local
217 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); in hsr_dev_xmit()
218 if (master) { in hsr_dev_xmit()
219 skb->dev = master->dev; in hsr_dev_xmit()
222 hsr_forward_skb(skb, master); in hsr_dev_xmit()
224 atomic_long_inc(&dev->tx_dropped); in hsr_dev_xmit()
235 static struct sk_buff *hsr_init_skb(struct hsr_port *master, u16 proto) in hsr_init_skb() argument
237 struct hsr_priv *hsr = master->hsr; in hsr_init_skb()
241 hlen = LL_RESERVED_SPACE(master->dev); in hsr_init_skb()
242 tlen = master->dev->needed_tailroom; in hsr_init_skb()
255 skb->dev = master->dev; in hsr_init_skb()
256 skb->protocol = htons(proto); in hsr_init_skb()
257 skb->priority = TC_PRIO_CONTROL; in hsr_init_skb()
259 if (dev_hard_header(skb, skb->dev, proto, in hsr_init_skb()
260 hsr->sup_multicast_addr, in hsr_init_skb()
261 skb->dev->dev_addr, skb->len) <= 0) in hsr_init_skb()
276 static void send_hsr_supervision_frame(struct hsr_port *master, in send_hsr_supervision_frame() argument
279 struct hsr_priv *hsr = master->hsr; in send_hsr_supervision_frame()
289 if (hsr->announce_count < 3 && hsr->prot_version == 0) { in send_hsr_supervision_frame()
292 hsr->announce_count++; in send_hsr_supervision_frame()
295 if (!hsr->prot_version) in send_hsr_supervision_frame()
300 skb = hsr_init_skb(master, proto); in send_hsr_supervision_frame()
302 WARN_ONCE(1, "HSR: Could not send supervision frame\n"); in send_hsr_supervision_frame()
306 if (hsr->prot_version > 0) { in send_hsr_supervision_frame()
308 hsr_tag->encap_proto = htons(ETH_P_PRP); in send_hsr_supervision_frame()
313 set_hsr_stag_path(hsr_stag, (hsr->prot_version ? 0x0 : 0xf)); in send_hsr_supervision_frame()
314 set_hsr_stag_HSR_ver(hsr_stag, hsr->prot_version); in send_hsr_supervision_frame()
317 spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags); in send_hsr_supervision_frame()
318 if (hsr->prot_version > 0) { in send_hsr_supervision_frame()
319 hsr_stag->sequence_nr = htons(hsr->sup_sequence_nr); in send_hsr_supervision_frame()
320 hsr->sup_sequence_nr++; in send_hsr_supervision_frame()
321 hsr_tag->sequence_nr = htons(hsr->sequence_nr); in send_hsr_supervision_frame()
322 hsr->sequence_nr++; in send_hsr_supervision_frame()
324 hsr_stag->sequence_nr = htons(hsr->sequence_nr); in send_hsr_supervision_frame()
325 hsr->sequence_nr++; in send_hsr_supervision_frame()
327 spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags); in send_hsr_supervision_frame()
329 hsr_stag->HSR_TLV_type = type; in send_hsr_supervision_frame()
331 hsr_stag->HSR_TLV_length = hsr->prot_version ? in send_hsr_supervision_frame()
336 ether_addr_copy(hsr_sp->macaddress_A, master->dev->dev_addr); in send_hsr_supervision_frame()
341 hsr_forward_skb(skb, master); in send_hsr_supervision_frame()
346 static void send_prp_supervision_frame(struct hsr_port *master, in send_prp_supervision_frame() argument
349 struct hsr_priv *hsr = master->hsr; in send_prp_supervision_frame()
357 skb = hsr_init_skb(master, ETH_P_PRP); in send_prp_supervision_frame()
359 WARN_ONCE(1, "PRP: Could not send supervision frame\n"); in send_prp_supervision_frame()
365 set_hsr_stag_path(hsr_stag, (hsr->prot_version ? 0x0 : 0xf)); in send_prp_supervision_frame()
366 set_hsr_stag_HSR_ver(hsr_stag, (hsr->prot_version ? 1 : 0)); in send_prp_supervision_frame()
369 spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags); in send_prp_supervision_frame()
370 hsr_stag->sequence_nr = htons(hsr->sup_sequence_nr); in send_prp_supervision_frame()
371 hsr->sup_sequence_nr++; in send_prp_supervision_frame()
372 hsr_stag->HSR_TLV_type = PRP_TLV_LIFE_CHECK_DD; in send_prp_supervision_frame()
373 hsr_stag->HSR_TLV_length = sizeof(struct hsr_sup_payload); in send_prp_supervision_frame()
377 ether_addr_copy(hsr_sp->macaddress_A, master->dev->dev_addr); in send_prp_supervision_frame()
380 spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags); in send_prp_supervision_frame()
384 tail = skb_tail_pointer(skb) - HSR_HLEN; in send_prp_supervision_frame()
386 rct->PRP_suffix = htons(ETH_P_PRP); in send_prp_supervision_frame()
388 rct->sequence_nr = htons(hsr->sequence_nr); in send_prp_supervision_frame()
389 hsr->sequence_nr++; in send_prp_supervision_frame()
390 spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags); in send_prp_supervision_frame()
392 hsr_forward_skb(skb, master); in send_prp_supervision_frame()
395 /* Announce (supervision frame) timer function
400 struct hsr_port *master; in hsr_announce() local
406 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); in hsr_announce()
407 hsr->proto_ops->send_sv_frame(master, &interval); in hsr_announce()
409 if (is_admin_up(master->dev)) in hsr_announce()
410 mod_timer(&hsr->announce_timer, jiffies + interval); in hsr_announce()
467 dev->min_mtu = 0; in hsr_dev_setup()
468 dev->header_ops = &hsr_header_ops; in hsr_dev_setup()
469 dev->netdev_ops = &hsr_device_ops; in hsr_dev_setup()
471 dev->priv_flags |= IFF_NO_QUEUE; in hsr_dev_setup()
473 dev->needs_free_netdev = true; in hsr_dev_setup()
475 dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | in hsr_dev_setup()
479 dev->features = dev->hw_features; in hsr_dev_setup()
482 dev->features |= NETIF_F_LLTX; in hsr_dev_setup()
486 dev->features |= NETIF_F_VLAN_CHALLENGED; in hsr_dev_setup()
490 dev->features |= NETIF_F_NETNS_LOCAL; in hsr_dev_setup()
493 /* Return true if dev is a HSR master; return false otherwise.
497 return (dev->netdev_ops->ndo_start_xmit == hsr_dev_xmit); in is_hsr_master()
514 INIT_LIST_HEAD(&hsr->ports); in hsr_dev_finalize()
515 INIT_LIST_HEAD(&hsr->node_db); in hsr_dev_finalize()
516 INIT_LIST_HEAD(&hsr->self_node_db); in hsr_dev_finalize()
517 spin_lock_init(&hsr->list_lock); in hsr_dev_finalize()
519 ether_addr_copy(hsr_dev->dev_addr, slave[0]->dev_addr); in hsr_dev_finalize()
526 hsr->net_id = PRP_LAN_ID << 1; in hsr_dev_finalize()
527 hsr->proto_ops = &prp_ops; in hsr_dev_finalize()
529 hsr->proto_ops = &hsr_ops; in hsr_dev_finalize()
533 res = hsr_create_self_node(hsr, hsr_dev->dev_addr, in hsr_dev_finalize()
534 slave[1]->dev_addr); in hsr_dev_finalize()
538 spin_lock_init(&hsr->seqnr_lock); in hsr_dev_finalize()
540 hsr->sequence_nr = HSR_SEQNR_START; in hsr_dev_finalize()
541 hsr->sup_sequence_nr = HSR_SUP_SEQNR_START; in hsr_dev_finalize()
543 timer_setup(&hsr->announce_timer, hsr_announce, 0); in hsr_dev_finalize()
544 timer_setup(&hsr->prune_timer, hsr_prune_nodes, 0); in hsr_dev_finalize()
546 ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr); in hsr_dev_finalize()
547 hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec; in hsr_dev_finalize()
549 hsr->prot_version = protocol_version; in hsr_dev_finalize()
553 * - hsr_dev->flags - i.e. in hsr_dev_finalize()
555 * - hsr_dev->priv_flags - i.e. in hsr_dev_finalize()
583 mod_timer(&hsr->prune_timer, jiffies + msecs_to_jiffies(PRUNE_PERIOD)); in hsr_dev_finalize()