root/net/hsr/hsr_main.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. get_hsr_tag_path
  2. get_hsr_tag_LSDU_size
  3. set_hsr_tag_path
  4. set_hsr_tag_LSDU_size
  5. get_hsr_stag_path
  6. get_hsr_stag_HSR_ver
  7. set_hsr_stag_path
  8. set_hsr_stag_HSR_ver
  9. hsr_get_skb_sequence_nr
  10. hsr_debugfs_rename
  11. hsr_debugfs_init
  12. hsr_debugfs_term
  13. hsr_debugfs_create_root
  14. hsr_debugfs_remove_root

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /* Copyright 2011-2014 Autronica Fire and Security AS
   3  *
   4  * Author(s):
   5  *      2011-2014 Arvid Brodin, arvid.brodin@alten.se
   6  */
   7 
   8 #ifndef __HSR_PRIVATE_H
   9 #define __HSR_PRIVATE_H
  10 
  11 #include <linux/netdevice.h>
  12 #include <linux/list.h>
  13 
  14 /* Time constants as specified in the HSR specification (IEC-62439-3 2010)
  15  * Table 8.
  16  * All values in milliseconds.
  17  */
  18 #define HSR_LIFE_CHECK_INTERVAL          2000 /* ms */
  19 #define HSR_NODE_FORGET_TIME            60000 /* ms */
  20 #define HSR_ANNOUNCE_INTERVAL             100 /* ms */
  21 
  22 /* By how much may slave1 and slave2 timestamps of latest received frame from
  23  * each node differ before we notify of communication problem?
  24  */
  25 #define MAX_SLAVE_DIFF                   3000 /* ms */
  26 #define HSR_SEQNR_START                 (USHRT_MAX - 1024)
  27 #define HSR_SUP_SEQNR_START             (HSR_SEQNR_START / 2)
  28 
  29 /* How often shall we check for broken ring and remove node entries older than
  30  * HSR_NODE_FORGET_TIME?
  31  */
  32 #define PRUNE_PERIOD                     3000 /* ms */
  33 
  34 #define HSR_TLV_ANNOUNCE                   22
  35 #define HSR_TLV_LIFE_CHECK                 23
  36 
  37 /* HSR Tag.
  38  * As defined in IEC-62439-3:2010, the HSR tag is really { ethertype = 0x88FB,
  39  * path, LSDU_size, sequence Nr }. But we let eth_header() create { h_dest,
  40  * h_source, h_proto = 0x88FB }, and add { path, LSDU_size, sequence Nr,
  41  * encapsulated protocol } instead.
  42  *
  43  * Field names as defined in the IEC:2010 standard for HSR.
  44  */
  45 struct hsr_tag {
  46         __be16          path_and_LSDU_size;
  47         __be16          sequence_nr;
  48         __be16          encap_proto;
  49 } __packed;
  50 
  51 #define HSR_HLEN        6
  52 
  53 #define HSR_V1_SUP_LSDUSIZE             52
  54 
  55 /* The helper functions below assumes that 'path' occupies the 4 most
  56  * significant bits of the 16-bit field shared by 'path' and 'LSDU_size' (or
  57  * equivalently, the 4 most significant bits of HSR tag byte 14).
  58  *
  59  * This is unclear in the IEC specification; its definition of MAC addresses
  60  * indicates the spec is written with the least significant bit first (to the
  61  * left). This, however, would mean that the LSDU field would be split in two
  62  * with the path field in-between, which seems strange. I'm guessing the MAC
  63  * address definition is in error.
  64  */
  65 static inline u16 get_hsr_tag_path(struct hsr_tag *ht)
  66 {
  67         return ntohs(ht->path_and_LSDU_size) >> 12;
  68 }
  69 
  70 static inline u16 get_hsr_tag_LSDU_size(struct hsr_tag *ht)
  71 {
  72         return ntohs(ht->path_and_LSDU_size) & 0x0FFF;
  73 }
  74 
  75 static inline void set_hsr_tag_path(struct hsr_tag *ht, u16 path)
  76 {
  77         ht->path_and_LSDU_size =
  78                 htons((ntohs(ht->path_and_LSDU_size) & 0x0FFF) | (path << 12));
  79 }
  80 
  81 static inline void set_hsr_tag_LSDU_size(struct hsr_tag *ht, u16 LSDU_size)
  82 {
  83         ht->path_and_LSDU_size = htons((ntohs(ht->path_and_LSDU_size) &
  84                                        0xF000) | (LSDU_size & 0x0FFF));
  85 }
  86 
  87 struct hsr_ethhdr {
  88         struct ethhdr   ethhdr;
  89         struct hsr_tag  hsr_tag;
  90 } __packed;
  91 
  92 /* HSR Supervision Frame data types.
  93  * Field names as defined in the IEC:2010 standard for HSR.
  94  */
  95 struct hsr_sup_tag {
  96         __be16          path_and_HSR_ver;
  97         __be16          sequence_nr;
  98         __u8            HSR_TLV_type;
  99         __u8            HSR_TLV_length;
 100 } __packed;
 101 
 102 struct hsr_sup_payload {
 103         unsigned char   macaddress_A[ETH_ALEN];
 104 } __packed;
 105 
 106 static inline u16 get_hsr_stag_path(struct hsr_sup_tag *hst)
 107 {
 108         return get_hsr_tag_path((struct hsr_tag *)hst);
 109 }
 110 
 111 static inline u16 get_hsr_stag_HSR_ver(struct hsr_sup_tag *hst)
 112 {
 113         return get_hsr_tag_LSDU_size((struct hsr_tag *)hst);
 114 }
 115 
 116 static inline void set_hsr_stag_path(struct hsr_sup_tag *hst, u16 path)
 117 {
 118         set_hsr_tag_path((struct hsr_tag *)hst, path);
 119 }
 120 
 121 static inline void set_hsr_stag_HSR_ver(struct hsr_sup_tag *hst, u16 HSR_ver)
 122 {
 123         set_hsr_tag_LSDU_size((struct hsr_tag *)hst, HSR_ver);
 124 }
 125 
 126 struct hsrv0_ethhdr_sp {
 127         struct ethhdr           ethhdr;
 128         struct hsr_sup_tag      hsr_sup;
 129 } __packed;
 130 
 131 struct hsrv1_ethhdr_sp {
 132         struct ethhdr           ethhdr;
 133         struct hsr_tag          hsr;
 134         struct hsr_sup_tag      hsr_sup;
 135 } __packed;
 136 
 137 enum hsr_port_type {
 138         HSR_PT_NONE = 0,        /* Must be 0, used by framereg */
 139         HSR_PT_SLAVE_A,
 140         HSR_PT_SLAVE_B,
 141         HSR_PT_INTERLINK,
 142         HSR_PT_MASTER,
 143         HSR_PT_PORTS,   /* This must be the last item in the enum */
 144 };
 145 
 146 struct hsr_port {
 147         struct list_head        port_list;
 148         struct net_device       *dev;
 149         struct hsr_priv         *hsr;
 150         enum hsr_port_type      type;
 151 };
 152 
 153 struct hsr_priv {
 154         struct rcu_head         rcu_head;
 155         struct list_head        ports;
 156         struct list_head        node_db;        /* Known HSR nodes */
 157         struct list_head        self_node_db;   /* MACs of slaves */
 158         struct timer_list       announce_timer; /* Supervision frame dispatch */
 159         struct timer_list       prune_timer;
 160         int announce_count;
 161         u16 sequence_nr;
 162         u16 sup_sequence_nr;    /* For HSRv1 separate seq_nr for supervision */
 163         u8 prot_version;        /* Indicate if HSRv0 or HSRv1. */
 164         spinlock_t seqnr_lock;  /* locking for sequence_nr */
 165         spinlock_t list_lock;   /* locking for node list */
 166         unsigned char           sup_multicast_addr[ETH_ALEN];
 167 #ifdef  CONFIG_DEBUG_FS
 168         struct dentry *node_tbl_root;
 169         struct dentry *node_tbl_file;
 170 #endif
 171 };
 172 
 173 #define hsr_for_each_port(hsr, port) \
 174         list_for_each_entry_rcu((port), &(hsr)->ports, port_list)
 175 
 176 struct hsr_port *hsr_port_get_hsr(struct hsr_priv *hsr, enum hsr_port_type pt);
 177 
 178 /* Caller must ensure skb is a valid HSR frame */
 179 static inline u16 hsr_get_skb_sequence_nr(struct sk_buff *skb)
 180 {
 181         struct hsr_ethhdr *hsr_ethhdr;
 182 
 183         hsr_ethhdr = (struct hsr_ethhdr *)skb_mac_header(skb);
 184         return ntohs(hsr_ethhdr->hsr_tag.sequence_nr);
 185 }
 186 
 187 #if IS_ENABLED(CONFIG_DEBUG_FS)
 188 void hsr_debugfs_rename(struct net_device *dev);
 189 void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev);
 190 void hsr_debugfs_term(struct hsr_priv *priv);
 191 void hsr_debugfs_create_root(void);
 192 void hsr_debugfs_remove_root(void);
 193 #else
 194 static inline void hsr_debugfs_rename(struct net_device *dev)
 195 {
 196 }
 197 static inline void hsr_debugfs_init(struct hsr_priv *priv,
 198                                     struct net_device *hsr_dev)
 199 {}
 200 static inline void hsr_debugfs_term(struct hsr_priv *priv)
 201 {}
 202 static inline void hsr_debugfs_create_root(void)
 203 {}
 204 static inline void hsr_debugfs_remove_root(void)
 205 {}
 206 #endif
 207 
 208 #endif /*  __HSR_PRIVATE_H */

/* [<][>][^][v][top][bottom][index][help] */