ipsec_offload.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /*-
  2. * Copyright (c) 2021,2022 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS `AS IS' AND
  14. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  16. * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
  17. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  19. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  20. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23. * SUCH DAMAGE.
  24. */
  25. #ifndef _NETIPSEC_IPSEC_OFFLOAD_H_
  26. #define _NETIPSEC_IPSEC_OFFLOAD_H_
  27. #ifdef _KERNEL
  28. #include <sys/errno.h>
  29. #include <net/if.h>
  30. #include <net/if_var.h>
  31. struct secpolicy;
  32. struct secasvar;
  33. struct inpcb;
  34. struct ipsec_accel_out_tag {
  35. struct m_tag tag;
  36. uint16_t drv_spi;
  37. };
  38. struct ipsec_accel_in_tag {
  39. struct m_tag tag;
  40. uint16_t drv_spi;
  41. };
  42. #define IPSEC_ACCEL_DRV_SPI_BYPASS 2
  43. #define IPSEC_ACCEL_DRV_SPI_MIN 3
  44. #define IPSEC_ACCEL_DRV_SPI_MAX 0xffff
  45. extern void (*ipsec_accel_sa_newkey_p)(struct secasvar *sav);
  46. extern void (*ipsec_accel_sa_install_input_p)(struct secasvar *sav,
  47. const union sockaddr_union *dst_address, int sproto, uint32_t spi);
  48. extern void (*ipsec_accel_forget_sav_p)(struct secasvar *sav);
  49. extern void (*ipsec_accel_spdadd_p)(struct secpolicy *sp, struct inpcb *inp);
  50. extern void (*ipsec_accel_spddel_p)(struct secpolicy *sp);
  51. extern int (*ipsec_accel_sa_lifetime_op_p)(struct secasvar *sav,
  52. struct seclifetime *lft_c, if_t ifp, enum IF_SA_CNT_WHICH op,
  53. struct rm_priotracker *sahtree_trackerp);
  54. extern void (*ipsec_accel_sync_p)(void);
  55. extern bool (*ipsec_accel_is_accel_sav_p)(struct secasvar *sav);
  56. extern struct mbuf *(*ipsec_accel_key_setaccelif_p)(struct secasvar *sav);
  57. #ifdef IPSEC_OFFLOAD
  58. /*
  59. * Have to use ipsec_accel_sa_install_input_p indirection because
  60. * key.c is unconditionally included into the static kernel.
  61. */
  62. static inline void
  63. ipsec_accel_sa_newkey(struct secasvar *sav)
  64. {
  65. void (*p)(struct secasvar *sav);
  66. p = atomic_load_ptr(&ipsec_accel_sa_newkey_p);
  67. if (p != NULL)
  68. p(sav);
  69. }
  70. static inline void
  71. ipsec_accel_forget_sav(struct secasvar *sav)
  72. {
  73. void (*p)(struct secasvar *sav);
  74. p = atomic_load_ptr(&ipsec_accel_forget_sav_p);
  75. if (p != NULL)
  76. p(sav);
  77. }
  78. static inline void
  79. ipsec_accel_spdadd(struct secpolicy *sp, struct inpcb *inp)
  80. {
  81. void (*p)(struct secpolicy *sp, struct inpcb *inp);
  82. p = atomic_load_ptr(&ipsec_accel_spdadd_p);
  83. if (p != NULL)
  84. p(sp, inp);
  85. }
  86. static inline void
  87. ipsec_accel_spddel(struct secpolicy *sp)
  88. {
  89. void (*p)(struct secpolicy *sp);
  90. p = atomic_load_ptr(&ipsec_accel_spddel_p);
  91. if (p != NULL)
  92. p(sp);
  93. }
  94. static inline int
  95. ipsec_accel_sa_lifetime_op(struct secasvar *sav,
  96. struct seclifetime *lft_c, if_t ifp, enum IF_SA_CNT_WHICH op,
  97. struct rm_priotracker *sahtree_trackerp)
  98. {
  99. int (*p)(struct secasvar *sav, struct seclifetime *lft_c, if_t ifp,
  100. enum IF_SA_CNT_WHICH op, struct rm_priotracker *sahtree_trackerp);
  101. p = atomic_load_ptr(&ipsec_accel_sa_lifetime_op_p);
  102. if (p != NULL)
  103. return (p(sav, lft_c, ifp, op, sahtree_trackerp));
  104. return (ENOTSUP);
  105. }
  106. static inline void
  107. ipsec_accel_sync(void)
  108. {
  109. void (*p)(void);
  110. p = atomic_load_ptr(&ipsec_accel_sync_p);
  111. if (p != NULL)
  112. p();
  113. }
  114. static inline bool
  115. ipsec_accel_is_accel_sav(struct secasvar *sav)
  116. {
  117. bool (*p)(struct secasvar *sav);
  118. p = atomic_load_ptr(&ipsec_accel_is_accel_sav_p);
  119. if (p != NULL)
  120. return (p(sav));
  121. return (false);
  122. }
  123. static inline struct mbuf *
  124. ipsec_accel_key_setaccelif(struct secasvar *sav)
  125. {
  126. struct mbuf *(*p)(struct secasvar *sav);
  127. p = atomic_load_ptr(&ipsec_accel_key_setaccelif_p);
  128. if (p != NULL)
  129. return (p(sav));
  130. return (NULL);
  131. }
  132. #else
  133. #define ipsec_accel_sa_newkey(a)
  134. #define ipsec_accel_forget_sav(a)
  135. #define ipsec_accel_spdadd(a, b)
  136. #define ipsec_accel_spddel(a)
  137. #define ipsec_accel_sa_lifetime_op(a, b, c, d, e)
  138. #define ipsec_accel_sync()
  139. #define ipsec_accel_is_accel_sav(a)
  140. #define ipsec_accel_key_setaccelif(a)
  141. #endif
  142. void ipsec_accel_forget_sav_impl(struct secasvar *sav);
  143. void ipsec_accel_spdadd_impl(struct secpolicy *sp, struct inpcb *inp);
  144. void ipsec_accel_spddel_impl(struct secpolicy *sp);
  145. #ifdef IPSEC_OFFLOAD
  146. int ipsec_accel_input(struct mbuf *m, int offset, int proto);
  147. bool ipsec_accel_output(struct ifnet *ifp, struct mbuf *m,
  148. struct inpcb *inp, struct secpolicy *sp, struct secasvar *sav, int af,
  149. int mtu, int *hwassist);
  150. void ipsec_accel_forget_sav(struct secasvar *sav);
  151. #else
  152. #define ipsec_accel_input(a, b, c) (ENXIO)
  153. #define ipsec_accel_output(a, b, c, d, e, f, g, h) ({ \
  154. *h = 0; \
  155. false; \
  156. })
  157. #define ipsec_accel_forget_sav(a)
  158. #endif
  159. struct ipsec_accel_in_tag *ipsec_accel_input_tag_lookup(const struct mbuf *);
  160. void ipsec_accel_on_ifdown(struct ifnet *ifp);
  161. void ipsec_accel_drv_sa_lifetime_update(struct secasvar *sav, if_t ifp,
  162. u_int drv_spi, uint64_t octets, uint64_t allocs);
  163. #endif /* _KERNEL */
  164. #endif /* _NETIPSEC_IPSEC_OFFLOAD_H_ */