18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef __NET_GENEVE_H 38c2ecf20Sopenharmony_ci#define __NET_GENEVE_H 1 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <net/udp_tunnel.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#define GENEVE_UDP_PORT 6081 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* Geneve Header: 108c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 118c2ecf20Sopenharmony_ci * |Ver| Opt Len |O|C| Rsvd. | Protocol Type | 128c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 138c2ecf20Sopenharmony_ci * | Virtual Network Identifier (VNI) | Reserved | 148c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 158c2ecf20Sopenharmony_ci * | Variable Length Options | 168c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * Option Header: 198c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 208c2ecf20Sopenharmony_ci * | Option Class | Type |R|R|R| Length | 218c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 228c2ecf20Sopenharmony_ci * | Variable Option Data | 238c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 248c2ecf20Sopenharmony_ci */ 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_cistruct geneve_opt { 278c2ecf20Sopenharmony_ci __be16 opt_class; 288c2ecf20Sopenharmony_ci u8 type; 298c2ecf20Sopenharmony_ci#ifdef __LITTLE_ENDIAN_BITFIELD 308c2ecf20Sopenharmony_ci u8 length:5; 318c2ecf20Sopenharmony_ci u8 r3:1; 328c2ecf20Sopenharmony_ci u8 r2:1; 338c2ecf20Sopenharmony_ci u8 r1:1; 348c2ecf20Sopenharmony_ci#else 358c2ecf20Sopenharmony_ci u8 r1:1; 368c2ecf20Sopenharmony_ci u8 r2:1; 378c2ecf20Sopenharmony_ci u8 r3:1; 388c2ecf20Sopenharmony_ci u8 length:5; 398c2ecf20Sopenharmony_ci#endif 408c2ecf20Sopenharmony_ci u8 opt_data[]; 418c2ecf20Sopenharmony_ci}; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#define GENEVE_CRIT_OPT_TYPE (1 << 7) 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistruct genevehdr { 468c2ecf20Sopenharmony_ci#ifdef __LITTLE_ENDIAN_BITFIELD 478c2ecf20Sopenharmony_ci u8 opt_len:6; 488c2ecf20Sopenharmony_ci u8 ver:2; 498c2ecf20Sopenharmony_ci u8 rsvd1:6; 508c2ecf20Sopenharmony_ci u8 critical:1; 518c2ecf20Sopenharmony_ci u8 oam:1; 528c2ecf20Sopenharmony_ci#else 538c2ecf20Sopenharmony_ci u8 ver:2; 548c2ecf20Sopenharmony_ci u8 opt_len:6; 558c2ecf20Sopenharmony_ci u8 oam:1; 568c2ecf20Sopenharmony_ci u8 critical:1; 578c2ecf20Sopenharmony_ci u8 rsvd1:6; 588c2ecf20Sopenharmony_ci#endif 598c2ecf20Sopenharmony_ci __be16 proto_type; 608c2ecf20Sopenharmony_ci u8 vni[3]; 618c2ecf20Sopenharmony_ci u8 rsvd2; 628c2ecf20Sopenharmony_ci struct geneve_opt options[]; 638c2ecf20Sopenharmony_ci}; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic inline bool netif_is_geneve(const struct net_device *dev) 668c2ecf20Sopenharmony_ci{ 678c2ecf20Sopenharmony_ci return dev->rtnl_link_ops && 688c2ecf20Sopenharmony_ci !strcmp(dev->rtnl_link_ops->kind, "geneve"); 698c2ecf20Sopenharmony_ci} 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci#ifdef CONFIG_INET 728c2ecf20Sopenharmony_cistruct net_device *geneve_dev_create_fb(struct net *net, const char *name, 738c2ecf20Sopenharmony_ci u8 name_assign_type, u16 dst_port); 748c2ecf20Sopenharmony_ci#endif /*ifdef CONFIG_INET */ 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci#endif /*ifdef__NET_GENEVE_H */ 77