0001
0002
0003
0004
0005
0006
0007
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
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
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