162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __NET_GENEVE_H
362306a36Sopenharmony_ci#define __NET_GENEVE_H  1
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <net/udp_tunnel.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define GENEVE_UDP_PORT		6081
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/* Geneve Header:
1062306a36Sopenharmony_ci *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1162306a36Sopenharmony_ci *  |Ver|  Opt Len  |O|C|    Rsvd.  |          Protocol Type        |
1262306a36Sopenharmony_ci *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1362306a36Sopenharmony_ci *  |        Virtual Network Identifier (VNI)       |    Reserved   |
1462306a36Sopenharmony_ci *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1562306a36Sopenharmony_ci *  |                    Variable Length Options                    |
1662306a36Sopenharmony_ci *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1762306a36Sopenharmony_ci *
1862306a36Sopenharmony_ci * Option Header:
1962306a36Sopenharmony_ci *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2062306a36Sopenharmony_ci *  |          Option Class         |      Type     |R|R|R| Length  |
2162306a36Sopenharmony_ci *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2262306a36Sopenharmony_ci *  |                      Variable Option Data                     |
2362306a36Sopenharmony_ci *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct geneve_opt {
2762306a36Sopenharmony_ci	__be16	opt_class;
2862306a36Sopenharmony_ci	u8	type;
2962306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN_BITFIELD
3062306a36Sopenharmony_ci	u8	length:5;
3162306a36Sopenharmony_ci	u8	r3:1;
3262306a36Sopenharmony_ci	u8	r2:1;
3362306a36Sopenharmony_ci	u8	r1:1;
3462306a36Sopenharmony_ci#else
3562306a36Sopenharmony_ci	u8	r1:1;
3662306a36Sopenharmony_ci	u8	r2:1;
3762306a36Sopenharmony_ci	u8	r3:1;
3862306a36Sopenharmony_ci	u8	length:5;
3962306a36Sopenharmony_ci#endif
4062306a36Sopenharmony_ci	u8	opt_data[];
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define GENEVE_CRIT_OPT_TYPE (1 << 7)
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct genevehdr {
4662306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN_BITFIELD
4762306a36Sopenharmony_ci	u8 opt_len:6;
4862306a36Sopenharmony_ci	u8 ver:2;
4962306a36Sopenharmony_ci	u8 rsvd1:6;
5062306a36Sopenharmony_ci	u8 critical:1;
5162306a36Sopenharmony_ci	u8 oam:1;
5262306a36Sopenharmony_ci#else
5362306a36Sopenharmony_ci	u8 ver:2;
5462306a36Sopenharmony_ci	u8 opt_len:6;
5562306a36Sopenharmony_ci	u8 oam:1;
5662306a36Sopenharmony_ci	u8 critical:1;
5762306a36Sopenharmony_ci	u8 rsvd1:6;
5862306a36Sopenharmony_ci#endif
5962306a36Sopenharmony_ci	__be16 proto_type;
6062306a36Sopenharmony_ci	u8 vni[3];
6162306a36Sopenharmony_ci	u8 rsvd2;
6262306a36Sopenharmony_ci	u8 options[];
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic inline bool netif_is_geneve(const struct net_device *dev)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	return dev->rtnl_link_ops &&
6862306a36Sopenharmony_ci	       !strcmp(dev->rtnl_link_ops->kind, "geneve");
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#ifdef CONFIG_INET
7262306a36Sopenharmony_cistruct net_device *geneve_dev_create_fb(struct net *net, const char *name,
7362306a36Sopenharmony_ci					u8 name_assign_type, u16 dst_port);
7462306a36Sopenharmony_ci#endif /*ifdef CONFIG_INET */
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#endif /*ifdef__NET_GENEVE_H */
77