lwtunnel.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #ifndef __NET_LWTUNNEL_H
  2. #define __NET_LWTUNNEL_H 1
  3. #include <linux/lwtunnel.h>
  4. #include <linux/netdevice.h>
  5. #include <linux/skbuff.h>
  6. #include <linux/types.h>
  7. #include <net/route.h>
  8. #define LWTUNNEL_HASH_BITS 7
  9. #define LWTUNNEL_HASH_SIZE (1 << LWTUNNEL_HASH_BITS)
  10. /* lw tunnel state flags */
  11. #define LWTUNNEL_STATE_OUTPUT_REDIRECT 0x1
  12. struct lwtunnel_state {
  13. __u16 type;
  14. __u16 flags;
  15. atomic_t refcnt;
  16. int len;
  17. __u8 data[0];
  18. };
  19. struct lwtunnel_encap_ops {
  20. int (*build_state)(struct net_device *dev, struct nlattr *encap,
  21. struct lwtunnel_state **ts);
  22. int (*output)(struct sock *sk, struct sk_buff *skb);
  23. int (*fill_encap)(struct sk_buff *skb,
  24. struct lwtunnel_state *lwtstate);
  25. int (*get_encap_size)(struct lwtunnel_state *lwtstate);
  26. int (*cmp_encap)(struct lwtunnel_state *a, struct lwtunnel_state *b);
  27. };
  28. #ifdef CONFIG_LWTUNNEL
  29. static inline struct lwtunnel_state *
  30. lwtstate_get(struct lwtunnel_state *lws)
  31. {
  32. if (lws)
  33. atomic_inc(&lws->refcnt);
  34. return lws;
  35. }
  36. static inline void lwtstate_put(struct lwtunnel_state *lws)
  37. {
  38. if (!lws)
  39. return;
  40. if (atomic_dec_and_test(&lws->refcnt))
  41. kfree(lws);
  42. }
  43. static inline bool lwtunnel_output_redirect(struct lwtunnel_state *lwtstate)
  44. {
  45. if (lwtstate && (lwtstate->flags & LWTUNNEL_STATE_OUTPUT_REDIRECT))
  46. return true;
  47. return false;
  48. }
  49. int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op,
  50. unsigned int num);
  51. int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op,
  52. unsigned int num);
  53. int lwtunnel_build_state(struct net_device *dev, u16 encap_type,
  54. struct nlattr *encap,
  55. struct lwtunnel_state **lws);
  56. int lwtunnel_fill_encap(struct sk_buff *skb,
  57. struct lwtunnel_state *lwtstate);
  58. int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate);
  59. struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len);
  60. int lwtunnel_cmp_encap(struct lwtunnel_state *a, struct lwtunnel_state *b);
  61. int lwtunnel_output(struct sock *sk, struct sk_buff *skb);
  62. int lwtunnel_output6(struct sock *sk, struct sk_buff *skb);
  63. #else
  64. static inline struct lwtunnel_state *
  65. lwtstate_get(struct lwtunnel_state *lws)
  66. {
  67. return lws;
  68. }
  69. static inline void lwtstate_put(struct lwtunnel_state *lws)
  70. {
  71. }
  72. static inline bool lwtunnel_output_redirect(struct lwtunnel_state *lwtstate)
  73. {
  74. return false;
  75. }
  76. static inline int lwtunnel_encap_add_ops(const struct lwtunnel_encap_ops *op,
  77. unsigned int num)
  78. {
  79. return -EOPNOTSUPP;
  80. }
  81. static inline int lwtunnel_encap_del_ops(const struct lwtunnel_encap_ops *op,
  82. unsigned int num)
  83. {
  84. return -EOPNOTSUPP;
  85. }
  86. static inline int lwtunnel_build_state(struct net_device *dev, u16 encap_type,
  87. struct nlattr *encap,
  88. struct lwtunnel_state **lws)
  89. {
  90. return -EOPNOTSUPP;
  91. }
  92. static inline int lwtunnel_fill_encap(struct sk_buff *skb,
  93. struct lwtunnel_state *lwtstate)
  94. {
  95. return 0;
  96. }
  97. static inline int lwtunnel_get_encap_size(struct lwtunnel_state *lwtstate)
  98. {
  99. return 0;
  100. }
  101. static inline struct lwtunnel_state *lwtunnel_state_alloc(int hdr_len)
  102. {
  103. return NULL;
  104. }
  105. static inline int lwtunnel_cmp_encap(struct lwtunnel_state *a,
  106. struct lwtunnel_state *b)
  107. {
  108. return 0;
  109. }
  110. static inline int lwtunnel_output(struct sock *sk, struct sk_buff *skb)
  111. {
  112. return -EOPNOTSUPP;
  113. }
  114. static inline int lwtunnel_output6(struct sock *sk, struct sk_buff *skb)
  115. {
  116. return -EOPNOTSUPP;
  117. }
  118. #endif
  119. #endif /* __NET_LWTUNNEL_H */