Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* Copyright 2011-2014 Autronica Fire and Security AS
0003  *
0004  * Author(s):
0005  *  2011-2014 Arvid Brodin, arvid.brodin@alten.se
0006  *
0007  * include file for HSR and PRP.
0008  */
0009 
0010 #ifndef __HSR_FRAMEREG_H
0011 #define __HSR_FRAMEREG_H
0012 
0013 #include "hsr_main.h"
0014 
0015 struct hsr_node;
0016 
0017 struct hsr_frame_info {
0018     struct sk_buff *skb_std;
0019     struct sk_buff *skb_hsr;
0020     struct sk_buff *skb_prp;
0021     struct hsr_port *port_rcv;
0022     struct hsr_node *node_src;
0023     u16 sequence_nr;
0024     bool is_supervision;
0025     bool is_vlan;
0026     bool is_local_dest;
0027     bool is_local_exclusive;
0028     bool is_from_san;
0029 };
0030 
0031 #ifdef CONFIG_LOCKDEP
0032 int lockdep_hsr_is_held(spinlock_t *lock);
0033 #else
0034 #define lockdep_hsr_is_held(lock)   1
0035 #endif
0036 
0037 u32 hsr_mac_hash(struct hsr_priv *hsr, const unsigned char *addr);
0038 struct hsr_node *hsr_node_get_first(struct hlist_head *head, spinlock_t *lock);
0039 void hsr_del_self_node(struct hsr_priv *hsr);
0040 void hsr_del_nodes(struct hlist_head *node_db);
0041 struct hsr_node *hsr_get_node(struct hsr_port *port, struct hlist_head *node_db,
0042                   struct sk_buff *skb, bool is_sup,
0043                   enum hsr_port_type rx_port);
0044 void hsr_handle_sup_frame(struct hsr_frame_info *frame);
0045 bool hsr_addr_is_self(struct hsr_priv *hsr, unsigned char *addr);
0046 
0047 void hsr_addr_subst_source(struct hsr_node *node, struct sk_buff *skb);
0048 void hsr_addr_subst_dest(struct hsr_node *node_src, struct sk_buff *skb,
0049              struct hsr_port *port);
0050 
0051 void hsr_register_frame_in(struct hsr_node *node, struct hsr_port *port,
0052                u16 sequence_nr);
0053 int hsr_register_frame_out(struct hsr_port *port, struct hsr_node *node,
0054                u16 sequence_nr);
0055 
0056 void hsr_prune_nodes(struct timer_list *t);
0057 
0058 int hsr_create_self_node(struct hsr_priv *hsr,
0059              const unsigned char addr_a[ETH_ALEN],
0060              const unsigned char addr_b[ETH_ALEN]);
0061 
0062 void *hsr_get_next_node(struct hsr_priv *hsr, void *_pos,
0063             unsigned char addr[ETH_ALEN]);
0064 
0065 int hsr_get_node_data(struct hsr_priv *hsr,
0066               const unsigned char *addr,
0067               unsigned char addr_b[ETH_ALEN],
0068               unsigned int *addr_b_ifindex,
0069               int *if1_age,
0070               u16 *if1_seq,
0071               int *if2_age,
0072               u16 *if2_seq);
0073 
0074 void prp_handle_san_frame(bool san, enum hsr_port_type port,
0075               struct hsr_node *node);
0076 void prp_update_san_info(struct hsr_node *node, bool is_sup);
0077 
0078 struct hsr_node {
0079     struct hlist_node   mac_list;
0080     unsigned char       macaddress_A[ETH_ALEN];
0081     unsigned char       macaddress_B[ETH_ALEN];
0082     /* Local slave through which AddrB frames are received from this node */
0083     enum hsr_port_type  addr_B_port;
0084     unsigned long       time_in[HSR_PT_PORTS];
0085     bool            time_in_stale[HSR_PT_PORTS];
0086     unsigned long       time_out[HSR_PT_PORTS];
0087     /* if the node is a SAN */
0088     bool            san_a;
0089     bool            san_b;
0090     u16         seq_out[HSR_PT_PORTS];
0091     struct rcu_head     rcu_head;
0092 };
0093 
0094 #endif /* __HSR_FRAMEREG_H */