xfrm_state_linux.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package nl
  2. import (
  3. "unsafe"
  4. )
  5. const (
  6. SizeofXfrmUsersaId = 0x18
  7. SizeofXfrmStats = 0x0c
  8. SizeofXfrmUsersaInfo = 0xe0
  9. SizeofXfrmAlgo = 0x44
  10. SizeofXfrmAlgoAuth = 0x48
  11. SizeofXfrmAlgoAEAD = 0x48
  12. SizeofXfrmEncapTmpl = 0x18
  13. SizeofXfrmUsersaFlush = 0x8
  14. )
  15. // struct xfrm_usersa_id {
  16. // xfrm_address_t daddr;
  17. // __be32 spi;
  18. // __u16 family;
  19. // __u8 proto;
  20. // };
  21. type XfrmUsersaId struct {
  22. Daddr XfrmAddress
  23. Spi uint32 // big endian
  24. Family uint16
  25. Proto uint8
  26. Pad byte
  27. }
  28. func (msg *XfrmUsersaId) Len() int {
  29. return SizeofXfrmUsersaId
  30. }
  31. func DeserializeXfrmUsersaId(b []byte) *XfrmUsersaId {
  32. return (*XfrmUsersaId)(unsafe.Pointer(&b[0:SizeofXfrmUsersaId][0]))
  33. }
  34. func (msg *XfrmUsersaId) Serialize() []byte {
  35. return (*(*[SizeofXfrmUsersaId]byte)(unsafe.Pointer(msg)))[:]
  36. }
  37. // struct xfrm_stats {
  38. // __u32 replay_window;
  39. // __u32 replay;
  40. // __u32 integrity_failed;
  41. // };
  42. type XfrmStats struct {
  43. ReplayWindow uint32
  44. Replay uint32
  45. IntegrityFailed uint32
  46. }
  47. func (msg *XfrmStats) Len() int {
  48. return SizeofXfrmStats
  49. }
  50. func DeserializeXfrmStats(b []byte) *XfrmStats {
  51. return (*XfrmStats)(unsafe.Pointer(&b[0:SizeofXfrmStats][0]))
  52. }
  53. func (msg *XfrmStats) Serialize() []byte {
  54. return (*(*[SizeofXfrmStats]byte)(unsafe.Pointer(msg)))[:]
  55. }
  56. // struct xfrm_usersa_info {
  57. // struct xfrm_selector sel;
  58. // struct xfrm_id id;
  59. // xfrm_address_t saddr;
  60. // struct xfrm_lifetime_cfg lft;
  61. // struct xfrm_lifetime_cur curlft;
  62. // struct xfrm_stats stats;
  63. // __u32 seq;
  64. // __u32 reqid;
  65. // __u16 family;
  66. // __u8 mode; /* XFRM_MODE_xxx */
  67. // __u8 replay_window;
  68. // __u8 flags;
  69. // #define XFRM_STATE_NOECN 1
  70. // #define XFRM_STATE_DECAP_DSCP 2
  71. // #define XFRM_STATE_NOPMTUDISC 4
  72. // #define XFRM_STATE_WILDRECV 8
  73. // #define XFRM_STATE_ICMP 16
  74. // #define XFRM_STATE_AF_UNSPEC 32
  75. // #define XFRM_STATE_ALIGN4 64
  76. // #define XFRM_STATE_ESN 128
  77. // };
  78. //
  79. // #define XFRM_SA_XFLAG_DONT_ENCAP_DSCP 1
  80. //
  81. type XfrmUsersaInfo struct {
  82. Sel XfrmSelector
  83. Id XfrmId
  84. Saddr XfrmAddress
  85. Lft XfrmLifetimeCfg
  86. Curlft XfrmLifetimeCur
  87. Stats XfrmStats
  88. Seq uint32
  89. Reqid uint32
  90. Family uint16
  91. Mode uint8
  92. ReplayWindow uint8
  93. Flags uint8
  94. Pad [7]byte
  95. }
  96. func (msg *XfrmUsersaInfo) Len() int {
  97. return SizeofXfrmUsersaInfo
  98. }
  99. func DeserializeXfrmUsersaInfo(b []byte) *XfrmUsersaInfo {
  100. return (*XfrmUsersaInfo)(unsafe.Pointer(&b[0:SizeofXfrmUsersaInfo][0]))
  101. }
  102. func (msg *XfrmUsersaInfo) Serialize() []byte {
  103. return (*(*[SizeofXfrmUsersaInfo]byte)(unsafe.Pointer(msg)))[:]
  104. }
  105. // struct xfrm_algo {
  106. // char alg_name[64];
  107. // unsigned int alg_key_len; /* in bits */
  108. // char alg_key[0];
  109. // };
  110. type XfrmAlgo struct {
  111. AlgName [64]byte
  112. AlgKeyLen uint32
  113. AlgKey []byte
  114. }
  115. func (msg *XfrmAlgo) Len() int {
  116. return SizeofXfrmAlgo + int(msg.AlgKeyLen/8)
  117. }
  118. func DeserializeXfrmAlgo(b []byte) *XfrmAlgo {
  119. ret := XfrmAlgo{}
  120. copy(ret.AlgName[:], b[0:64])
  121. ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64]))
  122. ret.AlgKey = b[68:ret.Len()]
  123. return &ret
  124. }
  125. func (msg *XfrmAlgo) Serialize() []byte {
  126. b := make([]byte, msg.Len())
  127. copy(b[0:64], msg.AlgName[:])
  128. copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:])
  129. copy(b[68:msg.Len()], msg.AlgKey[:])
  130. return b
  131. }
  132. // struct xfrm_algo_auth {
  133. // char alg_name[64];
  134. // unsigned int alg_key_len; /* in bits */
  135. // unsigned int alg_trunc_len; /* in bits */
  136. // char alg_key[0];
  137. // };
  138. type XfrmAlgoAuth struct {
  139. AlgName [64]byte
  140. AlgKeyLen uint32
  141. AlgTruncLen uint32
  142. AlgKey []byte
  143. }
  144. func (msg *XfrmAlgoAuth) Len() int {
  145. return SizeofXfrmAlgoAuth + int(msg.AlgKeyLen/8)
  146. }
  147. func DeserializeXfrmAlgoAuth(b []byte) *XfrmAlgoAuth {
  148. ret := XfrmAlgoAuth{}
  149. copy(ret.AlgName[:], b[0:64])
  150. ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64]))
  151. ret.AlgTruncLen = *(*uint32)(unsafe.Pointer(&b[68]))
  152. ret.AlgKey = b[72:ret.Len()]
  153. return &ret
  154. }
  155. func (msg *XfrmAlgoAuth) Serialize() []byte {
  156. b := make([]byte, msg.Len())
  157. copy(b[0:64], msg.AlgName[:])
  158. copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:])
  159. copy(b[68:72], (*(*[4]byte)(unsafe.Pointer(&msg.AlgTruncLen)))[:])
  160. copy(b[72:msg.Len()], msg.AlgKey[:])
  161. return b
  162. }
  163. // struct xfrm_algo_aead {
  164. // char alg_name[64];
  165. // unsigned int alg_key_len; /* in bits */
  166. // unsigned int alg_icv_len; /* in bits */
  167. // char alg_key[0];
  168. // }
  169. type XfrmAlgoAEAD struct {
  170. AlgName [64]byte
  171. AlgKeyLen uint32
  172. AlgICVLen uint32
  173. AlgKey []byte
  174. }
  175. func (msg *XfrmAlgoAEAD) Len() int {
  176. return SizeofXfrmAlgoAEAD + int(msg.AlgKeyLen/8)
  177. }
  178. func DeserializeXfrmAlgoAEAD(b []byte) *XfrmAlgoAEAD {
  179. ret := XfrmAlgoAEAD{}
  180. copy(ret.AlgName[:], b[0:64])
  181. ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64]))
  182. ret.AlgICVLen = *(*uint32)(unsafe.Pointer(&b[68]))
  183. ret.AlgKey = b[72:ret.Len()]
  184. return &ret
  185. }
  186. func (msg *XfrmAlgoAEAD) Serialize() []byte {
  187. b := make([]byte, msg.Len())
  188. copy(b[0:64], msg.AlgName[:])
  189. copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:])
  190. copy(b[68:72], (*(*[4]byte)(unsafe.Pointer(&msg.AlgICVLen)))[:])
  191. copy(b[72:msg.Len()], msg.AlgKey[:])
  192. return b
  193. }
  194. // struct xfrm_encap_tmpl {
  195. // __u16 encap_type;
  196. // __be16 encap_sport;
  197. // __be16 encap_dport;
  198. // xfrm_address_t encap_oa;
  199. // };
  200. type XfrmEncapTmpl struct {
  201. EncapType uint16
  202. EncapSport uint16 // big endian
  203. EncapDport uint16 // big endian
  204. Pad [2]byte
  205. EncapOa XfrmAddress
  206. }
  207. func (msg *XfrmEncapTmpl) Len() int {
  208. return SizeofXfrmEncapTmpl
  209. }
  210. func DeserializeXfrmEncapTmpl(b []byte) *XfrmEncapTmpl {
  211. return (*XfrmEncapTmpl)(unsafe.Pointer(&b[0:SizeofXfrmEncapTmpl][0]))
  212. }
  213. func (msg *XfrmEncapTmpl) Serialize() []byte {
  214. return (*(*[SizeofXfrmEncapTmpl]byte)(unsafe.Pointer(msg)))[:]
  215. }
  216. // struct xfrm_usersa_flush {
  217. // __u8 proto;
  218. // };
  219. type XfrmUsersaFlush struct {
  220. Proto uint8
  221. }
  222. func (msg *XfrmUsersaFlush) Len() int {
  223. return SizeofXfrmUsersaFlush
  224. }
  225. func DeserializeXfrmUsersaFlush(b []byte) *XfrmUsersaFlush {
  226. return (*XfrmUsersaFlush)(unsafe.Pointer(&b[0:SizeofXfrmUsersaFlush][0]))
  227. }
  228. func (msg *XfrmUsersaFlush) Serialize() []byte {
  229. return (*(*[SizeofXfrmUsersaFlush]byte)(unsafe.Pointer(msg)))[:]
  230. }