geneve.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #ifndef __NET_GENEVE_H
  2. #define __NET_GENEVE_H 1
  3. #ifdef CONFIG_INET
  4. #include <net/udp_tunnel.h>
  5. #endif
  6. /* Geneve Header:
  7. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. * |Ver| Opt Len |O|C| Rsvd. | Protocol Type |
  9. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  10. * | Virtual Network Identifier (VNI) | Reserved |
  11. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  12. * | Variable Length Options |
  13. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  14. *
  15. * Option Header:
  16. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  17. * | Option Class | Type |R|R|R| Length |
  18. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  19. * | Variable Option Data |
  20. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  21. */
  22. struct geneve_opt {
  23. __be16 opt_class;
  24. u8 type;
  25. #ifdef __LITTLE_ENDIAN_BITFIELD
  26. u8 length:5;
  27. u8 r3:1;
  28. u8 r2:1;
  29. u8 r1:1;
  30. #else
  31. u8 r1:1;
  32. u8 r2:1;
  33. u8 r3:1;
  34. u8 length:5;
  35. #endif
  36. u8 opt_data[];
  37. };
  38. #define GENEVE_CRIT_OPT_TYPE (1 << 7)
  39. struct genevehdr {
  40. #ifdef __LITTLE_ENDIAN_BITFIELD
  41. u8 opt_len:6;
  42. u8 ver:2;
  43. u8 rsvd1:6;
  44. u8 critical:1;
  45. u8 oam:1;
  46. #else
  47. u8 ver:2;
  48. u8 opt_len:6;
  49. u8 oam:1;
  50. u8 critical:1;
  51. u8 rsvd1:6;
  52. #endif
  53. __be16 proto_type;
  54. u8 vni[3];
  55. u8 rsvd2;
  56. struct geneve_opt options[];
  57. };
  58. static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb)
  59. {
  60. return (struct genevehdr *)(udp_hdr(skb) + 1);
  61. }
  62. #ifdef CONFIG_INET
  63. struct geneve_sock;
  64. typedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb);
  65. struct geneve_sock {
  66. struct list_head list;
  67. geneve_rcv_t *rcv;
  68. void *rcv_data;
  69. struct socket *sock;
  70. struct rcu_head rcu;
  71. int refcnt;
  72. struct udp_offload udp_offloads;
  73. };
  74. #define GENEVE_VER 0
  75. #define GENEVE_BASE_HLEN (sizeof(struct udphdr) + sizeof(struct genevehdr))
  76. struct geneve_sock *geneve_sock_add(struct net *net, __be16 port,
  77. geneve_rcv_t *rcv, void *data,
  78. bool no_share, bool ipv6);
  79. void geneve_sock_release(struct geneve_sock *vs);
  80. int geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt,
  81. struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos,
  82. __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port,
  83. __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt,
  84. bool csum, bool xnet);
  85. #endif /*ifdef CONFIG_INET */
  86. #endif /*ifdef__NET_GENEVE_H */