2021-02-10 09:02:11 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef _LINUX_IF_HSR_H_
|
|
|
|
#define _LINUX_IF_HSR_H_
|
|
|
|
|
2022-07-27 05:56:52 +08:00
|
|
|
#include <linux/types.h>
|
|
|
|
|
|
|
|
struct net_device;
|
|
|
|
|
2021-02-10 09:02:11 +08:00
|
|
|
/* used to differentiate various protocols */
|
|
|
|
enum hsr_version {
|
|
|
|
HSR_V0 = 0,
|
|
|
|
HSR_V1,
|
|
|
|
PRP_V1,
|
|
|
|
};
|
|
|
|
|
2022-03-01 03:58:56 +08:00
|
|
|
/* HSR Tag.
|
|
|
|
* As defined in IEC-62439-3:2010, the HSR tag is really { ethertype = 0x88FB,
|
|
|
|
* path, LSDU_size, sequence Nr }. But we let eth_header() create { h_dest,
|
|
|
|
* h_source, h_proto = 0x88FB }, and add { path, LSDU_size, sequence Nr,
|
|
|
|
* encapsulated protocol } instead.
|
|
|
|
*
|
|
|
|
* Field names as defined in the IEC:2010 standard for HSR.
|
|
|
|
*/
|
|
|
|
struct hsr_tag {
|
|
|
|
__be16 path_and_LSDU_size;
|
|
|
|
__be16 sequence_nr;
|
|
|
|
__be16 encap_proto;
|
|
|
|
} __packed;
|
|
|
|
|
|
|
|
#define HSR_HLEN 6
|
|
|
|
|
2021-02-10 09:02:11 +08:00
|
|
|
#if IS_ENABLED(CONFIG_HSR)
|
|
|
|
extern bool is_hsr_master(struct net_device *dev);
|
|
|
|
extern int hsr_get_version(struct net_device *dev, enum hsr_version *ver);
|
|
|
|
#else
|
|
|
|
static inline bool is_hsr_master(struct net_device *dev)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
static inline int hsr_get_version(struct net_device *dev,
|
|
|
|
enum hsr_version *ver)
|
|
|
|
{
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
#endif /* CONFIG_HSR */
|
|
|
|
|
|
|
|
#endif /*_LINUX_IF_HSR_H_*/
|