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