1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 20b5e8b8eSAndy Zhou #ifndef __NET_GENEVE_H 30b5e8b8eSAndy Zhou #define __NET_GENEVE_H 1 40b5e8b8eSAndy Zhou 50b5e8b8eSAndy Zhou #include <net/udp_tunnel.h> 60b5e8b8eSAndy Zhou 7974eff2bSMoshe Shemesh #define GENEVE_UDP_PORT 6081 8974eff2bSMoshe Shemesh 90b5e8b8eSAndy Zhou /* Geneve Header: 100b5e8b8eSAndy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 110b5e8b8eSAndy Zhou * |Ver| Opt Len |O|C| Rsvd. | Protocol Type | 120b5e8b8eSAndy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 130b5e8b8eSAndy Zhou * | Virtual Network Identifier (VNI) | Reserved | 140b5e8b8eSAndy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 150b5e8b8eSAndy Zhou * | Variable Length Options | 160b5e8b8eSAndy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 170b5e8b8eSAndy Zhou * 180b5e8b8eSAndy Zhou * Option Header: 190b5e8b8eSAndy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 200b5e8b8eSAndy Zhou * | Option Class | Type |R|R|R| Length | 210b5e8b8eSAndy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 220b5e8b8eSAndy Zhou * | Variable Option Data | 230b5e8b8eSAndy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 240b5e8b8eSAndy Zhou */ 250b5e8b8eSAndy Zhou 260b5e8b8eSAndy Zhou struct geneve_opt { 270b5e8b8eSAndy Zhou __be16 opt_class; 280b5e8b8eSAndy Zhou u8 type; 290b5e8b8eSAndy Zhou #ifdef __LITTLE_ENDIAN_BITFIELD 300b5e8b8eSAndy Zhou u8 length:5; 310b5e8b8eSAndy Zhou u8 r3:1; 320b5e8b8eSAndy Zhou u8 r2:1; 330b5e8b8eSAndy Zhou u8 r1:1; 340b5e8b8eSAndy Zhou #else 350b5e8b8eSAndy Zhou u8 r1:1; 360b5e8b8eSAndy Zhou u8 r2:1; 370b5e8b8eSAndy Zhou u8 r3:1; 380b5e8b8eSAndy Zhou u8 length:5; 390b5e8b8eSAndy Zhou #endif 400b5e8b8eSAndy Zhou u8 opt_data[]; 410b5e8b8eSAndy Zhou }; 420b5e8b8eSAndy Zhou 430b5e8b8eSAndy Zhou #define GENEVE_CRIT_OPT_TYPE (1 << 7) 440b5e8b8eSAndy Zhou 450b5e8b8eSAndy Zhou struct genevehdr { 460b5e8b8eSAndy Zhou #ifdef __LITTLE_ENDIAN_BITFIELD 470b5e8b8eSAndy Zhou u8 opt_len:6; 480b5e8b8eSAndy Zhou u8 ver:2; 490b5e8b8eSAndy Zhou u8 rsvd1:6; 500b5e8b8eSAndy Zhou u8 critical:1; 510b5e8b8eSAndy Zhou u8 oam:1; 520b5e8b8eSAndy Zhou #else 530b5e8b8eSAndy Zhou u8 ver:2; 540b5e8b8eSAndy Zhou u8 opt_len:6; 550b5e8b8eSAndy Zhou u8 oam:1; 560b5e8b8eSAndy Zhou u8 critical:1; 570b5e8b8eSAndy Zhou u8 rsvd1:6; 580b5e8b8eSAndy Zhou #endif 590b5e8b8eSAndy Zhou __be16 proto_type; 600b5e8b8eSAndy Zhou u8 vni[3]; 610b5e8b8eSAndy Zhou u8 rsvd2; 62*8c2a535eSJakub Kicinski u8 options[]; 630b5e8b8eSAndy Zhou }; 640b5e8b8eSAndy Zhou netif_is_geneve(const struct net_device * dev)651d10bd16SJohn Hurleystatic inline bool netif_is_geneve(const struct net_device *dev) 661d10bd16SJohn Hurley { 671d10bd16SJohn Hurley return dev->rtnl_link_ops && 681d10bd16SJohn Hurley !strcmp(dev->rtnl_link_ops->kind, "geneve"); 691d10bd16SJohn Hurley } 701d10bd16SJohn Hurley 717c5df8faSAndy Zhou #ifdef CONFIG_INET 72e305ac6cSPravin B Shelar struct net_device *geneve_dev_create_fb(struct net *net, const char *name, 73e305ac6cSPravin B Shelar u8 name_assign_type, u16 dst_port); 747c5df8faSAndy Zhou #endif /*ifdef CONFIG_INET */ 757c5df8faSAndy Zhou 767c5df8faSAndy Zhou #endif /*ifdef__NET_GENEVE_H */ 77