2019-04-05 20:31:34 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
2014-07-05 01:34:38 +04:00
/* Copyright 2011-2014 Autronica Fire and Security AS
2013-10-31 00:10:47 +04:00
*
* Author ( s ) :
2014-07-05 01:34:38 +04:00
* 2011 - 2014 Arvid Brodin , arvid . brodin @ alten . se
2020-07-22 17:40:16 +03:00
*
* include file for HSR and PRP .
2013-10-31 00:10:47 +04:00
*/
2014-07-05 01:34:38 +04:00
# ifndef __HSR_FRAMEREG_H
# define __HSR_FRAMEREG_H
2013-10-31 00:10:47 +04:00
# include "hsr_main.h"
2014-07-05 01:34:38 +04:00
struct hsr_node ;
2013-10-31 00:10:47 +04:00
2020-07-22 17:40:21 +03:00
struct hsr_frame_info {
struct sk_buff * skb_std ;
struct sk_buff * skb_hsr ;
struct sk_buff * skb_prp ;
struct hsr_port * port_rcv ;
struct hsr_node * node_src ;
u16 sequence_nr ;
bool is_supervision ;
bool is_vlan ;
bool is_local_dest ;
bool is_local_exclusive ;
bool is_from_san ;
} ;
2019-12-22 14:26:54 +03:00
void hsr_del_self_node ( struct hsr_priv * hsr ) ;
2022-11-29 19:48:08 +03:00
void hsr_del_nodes ( struct list_head * node_db ) ;
struct hsr_node * hsr_get_node ( struct hsr_port * port , struct list_head * node_db ,
2020-07-22 17:40:21 +03:00
struct sk_buff * skb , bool is_sup ,
enum hsr_port_type rx_port ) ;
void hsr_handle_sup_frame ( struct hsr_frame_info * frame ) ;
2014-07-05 01:41:03 +04:00
bool hsr_addr_is_self ( struct hsr_priv * hsr , unsigned char * addr ) ;
void hsr_addr_subst_source ( struct hsr_node * node , struct sk_buff * skb ) ;
void hsr_addr_subst_dest ( struct hsr_node * node_src , struct sk_buff * skb ,
2014-07-05 01:38:05 +04:00
struct hsr_port * port ) ;
2013-10-31 00:10:47 +04:00
2014-07-05 01:41:03 +04:00
void hsr_register_frame_in ( struct hsr_node * node , struct hsr_port * port ,
u16 sequence_nr ) ;
int hsr_register_frame_out ( struct hsr_port * port , struct hsr_node * node ,
u16 sequence_nr ) ;
2013-10-31 00:10:47 +04:00
2017-10-24 11:46:16 +03:00
void hsr_prune_nodes ( struct timer_list * t ) ;
2013-10-31 00:10:47 +04:00
2019-12-22 14:26:54 +03:00
int hsr_create_self_node ( struct hsr_priv * hsr ,
2021-10-23 02:21:00 +03:00
const unsigned char addr_a [ ETH_ALEN ] ,
const unsigned char addr_b [ ETH_ALEN ] ) ;
2013-10-31 00:10:47 +04:00
2014-07-05 01:34:38 +04:00
void * hsr_get_next_node ( struct hsr_priv * hsr , void * _pos ,
2013-10-31 00:10:47 +04:00
unsigned char addr [ ETH_ALEN ] ) ;
2014-07-05 01:34:38 +04:00
int hsr_get_node_data ( struct hsr_priv * hsr ,
2013-10-31 00:10:47 +04:00
const unsigned char * addr ,
unsigned char addr_b [ ETH_ALEN ] ,
unsigned int * addr_b_ifindex ,
int * if1_age ,
u16 * if1_seq ,
int * if2_age ,
u16 * if2_seq ) ;
2020-07-22 17:40:21 +03:00
void prp_handle_san_frame ( bool san , enum hsr_port_type port ,
struct hsr_node * node ) ;
void prp_update_san_info ( struct hsr_node * node , bool is_sup ) ;
2019-04-05 20:31:35 +03:00
struct hsr_node {
2022-11-29 19:48:08 +03:00
struct list_head mac_list ;
2022-11-29 19:48:13 +03:00
/* Protect R/W access to seq_out */
spinlock_t seq_out_lock ;
2019-04-05 20:31:35 +03:00
unsigned char macaddress_A [ ETH_ALEN ] ;
unsigned char macaddress_B [ ETH_ALEN ] ;
/* Local slave through which AddrB frames are received from this node */
enum hsr_port_type addr_B_port ;
unsigned long time_in [ HSR_PT_PORTS ] ;
bool time_in_stale [ HSR_PT_PORTS ] ;
2021-02-24 12:46:49 +03:00
unsigned long time_out [ HSR_PT_PORTS ] ;
2020-07-22 17:40:21 +03:00
/* if the node is a SAN */
bool san_a ;
bool san_b ;
2019-04-05 20:31:35 +03:00
u16 seq_out [ HSR_PT_PORTS ] ;
2022-11-29 19:48:10 +03:00
bool removed ;
2019-04-05 20:31:35 +03:00
struct rcu_head rcu_head ;
} ;
2014-07-05 01:34:38 +04:00
# endif /* __HSR_FRAMEREG_H */