10b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#ifndef __NET_GENEVE_H 20b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#define __NET_GENEVE_H 1 30b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 47c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou#ifdef CONFIG_INET 50b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#include <net/udp_tunnel.h> 67c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou#endif 70b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 80b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 90b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou/* Geneve Header: 100b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 110b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * |Ver| Opt Len |O|C| Rsvd. | Protocol Type | 120b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 130b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * | Virtual Network Identifier (VNI) | Reserved | 140b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 150b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * | Variable Length Options | 160b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 170b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * 180b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * Option Header: 190b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 200b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * | Option Class | Type |R|R|R| Length | 210b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 220b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * | Variable Option Data | 230b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 240b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou */ 250b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 260b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhoustruct geneve_opt { 270b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou __be16 opt_class; 280b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 type; 290b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#ifdef __LITTLE_ENDIAN_BITFIELD 300b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 length:5; 310b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 r3:1; 320b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 r2:1; 330b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 r1:1; 340b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#else 350b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 r1:1; 360b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 r2:1; 370b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 r3:1; 380b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 length:5; 390b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#endif 400b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 opt_data[]; 410b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou}; 420b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 430b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#define GENEVE_CRIT_OPT_TYPE (1 << 7) 440b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 450b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhoustruct genevehdr { 460b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#ifdef __LITTLE_ENDIAN_BITFIELD 470b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 opt_len:6; 480b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 ver:2; 490b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 rsvd1:6; 500b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 critical:1; 510b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 oam:1; 520b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#else 530b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 ver:2; 540b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 opt_len:6; 550b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 oam:1; 560b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 critical:1; 570b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 rsvd1:6; 580b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#endif 590b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou __be16 proto_type; 600b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 vni[3]; 610b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou u8 rsvd2; 620b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou struct geneve_opt options[]; 630b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou}; 640b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 657c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou#ifdef CONFIG_INET 667c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhoustruct geneve_sock; 677c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou 687c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhoutypedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb); 697c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou 707c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhoustruct geneve_sock { 717c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou struct hlist_node hlist; 727c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou geneve_rcv_t *rcv; 737c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou void *rcv_data; 747c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou struct work_struct del_work; 757c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou struct socket *sock; 767c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou struct rcu_head rcu; 777c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou atomic_t refcnt; 787c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou struct udp_offload udp_offloads; 797c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou}; 807c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou 810b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#define GENEVE_VER 0 820b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou#define GENEVE_BASE_HLEN (sizeof(struct udphdr) + sizeof(struct genevehdr)) 830b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 840b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhoustruct geneve_sock *geneve_sock_add(struct net *net, __be16 port, 850b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou geneve_rcv_t *rcv, void *data, 860b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou bool no_share, bool ipv6); 870b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 880b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhouvoid geneve_sock_release(struct geneve_sock *vs); 890b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou 900b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhouint geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt, 910b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos, 920b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, 930b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt, 940b5e8b8eeae40bae6ad7c7e91c97c3c0d0e57882Andy Zhou bool xnet); 957c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou#endif /*ifdef CONFIG_INET */ 967c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou 977c5df8fa1921450d2210db9928f43cf4f414982cAndy Zhou#endif /*ifdef__NET_GENEVE_H */ 98