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