xref: /linux/include/linux/if_hsr.h (revision 5f10376b)
1dcf0cd1cSGeorge McCollister /* SPDX-License-Identifier: GPL-2.0 */
2dcf0cd1cSGeorge McCollister #ifndef _LINUX_IF_HSR_H_
3dcf0cd1cSGeorge McCollister #define _LINUX_IF_HSR_H_
4dcf0cd1cSGeorge McCollister 
5*5f10376bSJakub Kicinski #include <linux/types.h>
6*5f10376bSJakub Kicinski 
7*5f10376bSJakub Kicinski struct net_device;
8*5f10376bSJakub Kicinski 
9dcf0cd1cSGeorge McCollister /* used to differentiate various protocols */
10dcf0cd1cSGeorge McCollister enum hsr_version {
11dcf0cd1cSGeorge McCollister 	HSR_V0 = 0,
12dcf0cd1cSGeorge McCollister 	HSR_V1,
13dcf0cd1cSGeorge McCollister 	PRP_V1,
14dcf0cd1cSGeorge McCollister };
15dcf0cd1cSGeorge McCollister 
16bf08824aSKurt Kanzenbach /* HSR Tag.
17bf08824aSKurt Kanzenbach  * As defined in IEC-62439-3:2010, the HSR tag is really { ethertype = 0x88FB,
18bf08824aSKurt Kanzenbach  * path, LSDU_size, sequence Nr }. But we let eth_header() create { h_dest,
19bf08824aSKurt Kanzenbach  * h_source, h_proto = 0x88FB }, and add { path, LSDU_size, sequence Nr,
20bf08824aSKurt Kanzenbach  * encapsulated protocol } instead.
21bf08824aSKurt Kanzenbach  *
22bf08824aSKurt Kanzenbach  * Field names as defined in the IEC:2010 standard for HSR.
23bf08824aSKurt Kanzenbach  */
24bf08824aSKurt Kanzenbach struct hsr_tag {
25bf08824aSKurt Kanzenbach 	__be16		path_and_LSDU_size;
26bf08824aSKurt Kanzenbach 	__be16		sequence_nr;
27bf08824aSKurt Kanzenbach 	__be16		encap_proto;
28bf08824aSKurt Kanzenbach } __packed;
29bf08824aSKurt Kanzenbach 
30bf08824aSKurt Kanzenbach #define HSR_HLEN	6
31bf08824aSKurt Kanzenbach 
32dcf0cd1cSGeorge McCollister #if IS_ENABLED(CONFIG_HSR)
33dcf0cd1cSGeorge McCollister extern bool is_hsr_master(struct net_device *dev);
34dcf0cd1cSGeorge McCollister extern int hsr_get_version(struct net_device *dev, enum hsr_version *ver);
35dcf0cd1cSGeorge McCollister #else
is_hsr_master(struct net_device * dev)36dcf0cd1cSGeorge McCollister static inline bool is_hsr_master(struct net_device *dev)
37dcf0cd1cSGeorge McCollister {
38dcf0cd1cSGeorge McCollister 	return false;
39dcf0cd1cSGeorge McCollister }
hsr_get_version(struct net_device * dev,enum hsr_version * ver)40dcf0cd1cSGeorge McCollister static inline int hsr_get_version(struct net_device *dev,
41dcf0cd1cSGeorge McCollister 				  enum hsr_version *ver)
42dcf0cd1cSGeorge McCollister {
43dcf0cd1cSGeorge McCollister 	return -EINVAL;
44dcf0cd1cSGeorge McCollister }
45dcf0cd1cSGeorge McCollister #endif /* CONFIG_HSR */
46dcf0cd1cSGeorge McCollister 
47dcf0cd1cSGeorge McCollister #endif /*_LINUX_IF_HSR_H_*/
48