xfrm_state_linux.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package nl
  2. import (
  3. "unsafe"
  4. )
  5. const (
  6. SizeofXfrmUsersaId = 0x18
  7. SizeofXfrmStats = 0x0c
  8. SizeofXfrmUsersaInfo = 0xe0
  9. SizeofXfrmUserSpiInfo = 0xe8
  10. SizeofXfrmAlgo = 0x44
  11. SizeofXfrmAlgoAuth = 0x48
  12. SizeofXfrmAlgoAEAD = 0x48
  13. SizeofXfrmEncapTmpl = 0x18
  14. SizeofXfrmUsersaFlush = 0x1
  15. SizeofXfrmReplayStateEsn = 0x18
  16. SizeofXfrmReplayState = 0x0c
  17. )
  18. const (
  19. XFRM_STATE_NOECN = 1
  20. XFRM_STATE_DECAP_DSCP = 2
  21. XFRM_STATE_NOPMTUDISC = 4
  22. XFRM_STATE_WILDRECV = 8
  23. XFRM_STATE_ICMP = 16
  24. XFRM_STATE_AF_UNSPEC = 32
  25. XFRM_STATE_ALIGN4 = 64
  26. XFRM_STATE_ESN = 128
  27. )
  28. const (
  29. XFRM_SA_XFLAG_DONT_ENCAP_DSCP = 1
  30. XFRM_SA_XFLAG_OSEQ_MAY_WRAP = 2
  31. )
  32. // struct xfrm_usersa_id {
  33. // xfrm_address_t daddr;
  34. // __be32 spi;
  35. // __u16 family;
  36. // __u8 proto;
  37. // };
  38. type XfrmUsersaId struct {
  39. Daddr XfrmAddress
  40. Spi uint32 // big endian
  41. Family uint16
  42. Proto uint8
  43. Pad byte
  44. }
  45. func (msg *XfrmUsersaId) Len() int {
  46. return SizeofXfrmUsersaId
  47. }
  48. func DeserializeXfrmUsersaId(b []byte) *XfrmUsersaId {
  49. return (*XfrmUsersaId)(unsafe.Pointer(&b[0:SizeofXfrmUsersaId][0]))
  50. }
  51. func (msg *XfrmUsersaId) Serialize() []byte {
  52. return (*(*[SizeofXfrmUsersaId]byte)(unsafe.Pointer(msg)))[:]
  53. }
  54. // struct xfrm_stats {
  55. // __u32 replay_window;
  56. // __u32 replay;
  57. // __u32 integrity_failed;
  58. // };
  59. type XfrmStats struct {
  60. ReplayWindow uint32
  61. Replay uint32
  62. IntegrityFailed uint32
  63. }
  64. func (msg *XfrmStats) Len() int {
  65. return SizeofXfrmStats
  66. }
  67. func DeserializeXfrmStats(b []byte) *XfrmStats {
  68. return (*XfrmStats)(unsafe.Pointer(&b[0:SizeofXfrmStats][0]))
  69. }
  70. func (msg *XfrmStats) Serialize() []byte {
  71. return (*(*[SizeofXfrmStats]byte)(unsafe.Pointer(msg)))[:]
  72. }
  73. // struct xfrm_usersa_info {
  74. // struct xfrm_selector sel;
  75. // struct xfrm_id id;
  76. // xfrm_address_t saddr;
  77. // struct xfrm_lifetime_cfg lft;
  78. // struct xfrm_lifetime_cur curlft;
  79. // struct xfrm_stats stats;
  80. // __u32 seq;
  81. // __u32 reqid;
  82. // __u16 family;
  83. // __u8 mode; /* XFRM_MODE_xxx */
  84. // __u8 replay_window;
  85. // __u8 flags;
  86. // #define XFRM_STATE_NOECN 1
  87. // #define XFRM_STATE_DECAP_DSCP 2
  88. // #define XFRM_STATE_NOPMTUDISC 4
  89. // #define XFRM_STATE_WILDRECV 8
  90. // #define XFRM_STATE_ICMP 16
  91. // #define XFRM_STATE_AF_UNSPEC 32
  92. // #define XFRM_STATE_ALIGN4 64
  93. // #define XFRM_STATE_ESN 128
  94. // };
  95. //
  96. // #define XFRM_SA_XFLAG_DONT_ENCAP_DSCP 1
  97. // #define XFRM_SA_XFLAG_OSEQ_MAY_WRAP 2
  98. //
  99. type XfrmUsersaInfo struct {
  100. Sel XfrmSelector
  101. Id XfrmId
  102. Saddr XfrmAddress
  103. Lft XfrmLifetimeCfg
  104. Curlft XfrmLifetimeCur
  105. Stats XfrmStats
  106. Seq uint32
  107. Reqid uint32
  108. Family uint16
  109. Mode uint8
  110. ReplayWindow uint8
  111. Flags uint8
  112. Pad [7]byte
  113. }
  114. func (msg *XfrmUsersaInfo) Len() int {
  115. return SizeofXfrmUsersaInfo
  116. }
  117. func DeserializeXfrmUsersaInfo(b []byte) *XfrmUsersaInfo {
  118. return (*XfrmUsersaInfo)(unsafe.Pointer(&b[0:SizeofXfrmUsersaInfo][0]))
  119. }
  120. func (msg *XfrmUsersaInfo) Serialize() []byte {
  121. return (*(*[SizeofXfrmUsersaInfo]byte)(unsafe.Pointer(msg)))[:]
  122. }
  123. // struct xfrm_userspi_info {
  124. // struct xfrm_usersa_info info;
  125. // __u32 min;
  126. // __u32 max;
  127. // };
  128. type XfrmUserSpiInfo struct {
  129. XfrmUsersaInfo XfrmUsersaInfo
  130. Min uint32
  131. Max uint32
  132. }
  133. func (msg *XfrmUserSpiInfo) Len() int {
  134. return SizeofXfrmUserSpiInfo
  135. }
  136. func DeserializeXfrmUserSpiInfo(b []byte) *XfrmUserSpiInfo {
  137. return (*XfrmUserSpiInfo)(unsafe.Pointer(&b[0:SizeofXfrmUserSpiInfo][0]))
  138. }
  139. func (msg *XfrmUserSpiInfo) Serialize() []byte {
  140. return (*(*[SizeofXfrmUserSpiInfo]byte)(unsafe.Pointer(msg)))[:]
  141. }
  142. // struct xfrm_algo {
  143. // char alg_name[64];
  144. // unsigned int alg_key_len; /* in bits */
  145. // char alg_key[0];
  146. // };
  147. type XfrmAlgo struct {
  148. AlgName [64]byte
  149. AlgKeyLen uint32
  150. AlgKey []byte
  151. }
  152. func (msg *XfrmAlgo) Len() int {
  153. return SizeofXfrmAlgo + int(msg.AlgKeyLen/8)
  154. }
  155. func DeserializeXfrmAlgo(b []byte) *XfrmAlgo {
  156. ret := XfrmAlgo{}
  157. copy(ret.AlgName[:], b[0:64])
  158. ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64]))
  159. ret.AlgKey = b[68:ret.Len()]
  160. return &ret
  161. }
  162. func (msg *XfrmAlgo) Serialize() []byte {
  163. b := make([]byte, msg.Len())
  164. copy(b[0:64], msg.AlgName[:])
  165. copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:])
  166. copy(b[68:msg.Len()], msg.AlgKey[:])
  167. return b
  168. }
  169. // struct xfrm_algo_auth {
  170. // char alg_name[64];
  171. // unsigned int alg_key_len; /* in bits */
  172. // unsigned int alg_trunc_len; /* in bits */
  173. // char alg_key[0];
  174. // };
  175. type XfrmAlgoAuth struct {
  176. AlgName [64]byte
  177. AlgKeyLen uint32
  178. AlgTruncLen uint32
  179. AlgKey []byte
  180. }
  181. func (msg *XfrmAlgoAuth) Len() int {
  182. return SizeofXfrmAlgoAuth + int(msg.AlgKeyLen/8)
  183. }
  184. func DeserializeXfrmAlgoAuth(b []byte) *XfrmAlgoAuth {
  185. ret := XfrmAlgoAuth{}
  186. copy(ret.AlgName[:], b[0:64])
  187. ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64]))
  188. ret.AlgTruncLen = *(*uint32)(unsafe.Pointer(&b[68]))
  189. ret.AlgKey = b[72:ret.Len()]
  190. return &ret
  191. }
  192. func (msg *XfrmAlgoAuth) Serialize() []byte {
  193. b := make([]byte, msg.Len())
  194. copy(b[0:64], msg.AlgName[:])
  195. copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:])
  196. copy(b[68:72], (*(*[4]byte)(unsafe.Pointer(&msg.AlgTruncLen)))[:])
  197. copy(b[72:msg.Len()], msg.AlgKey[:])
  198. return b
  199. }
  200. // struct xfrm_algo_aead {
  201. // char alg_name[64];
  202. // unsigned int alg_key_len; /* in bits */
  203. // unsigned int alg_icv_len; /* in bits */
  204. // char alg_key[0];
  205. // }
  206. type XfrmAlgoAEAD struct {
  207. AlgName [64]byte
  208. AlgKeyLen uint32
  209. AlgICVLen uint32
  210. AlgKey []byte
  211. }
  212. func (msg *XfrmAlgoAEAD) Len() int {
  213. return SizeofXfrmAlgoAEAD + int(msg.AlgKeyLen/8)
  214. }
  215. func DeserializeXfrmAlgoAEAD(b []byte) *XfrmAlgoAEAD {
  216. ret := XfrmAlgoAEAD{}
  217. copy(ret.AlgName[:], b[0:64])
  218. ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64]))
  219. ret.AlgICVLen = *(*uint32)(unsafe.Pointer(&b[68]))
  220. ret.AlgKey = b[72:ret.Len()]
  221. return &ret
  222. }
  223. func (msg *XfrmAlgoAEAD) Serialize() []byte {
  224. b := make([]byte, msg.Len())
  225. copy(b[0:64], msg.AlgName[:])
  226. copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:])
  227. copy(b[68:72], (*(*[4]byte)(unsafe.Pointer(&msg.AlgICVLen)))[:])
  228. copy(b[72:msg.Len()], msg.AlgKey[:])
  229. return b
  230. }
  231. // struct xfrm_encap_tmpl {
  232. // __u16 encap_type;
  233. // __be16 encap_sport;
  234. // __be16 encap_dport;
  235. // xfrm_address_t encap_oa;
  236. // };
  237. type XfrmEncapTmpl struct {
  238. EncapType uint16
  239. EncapSport uint16 // big endian
  240. EncapDport uint16 // big endian
  241. Pad [2]byte
  242. EncapOa XfrmAddress
  243. }
  244. func (msg *XfrmEncapTmpl) Len() int {
  245. return SizeofXfrmEncapTmpl
  246. }
  247. func DeserializeXfrmEncapTmpl(b []byte) *XfrmEncapTmpl {
  248. return (*XfrmEncapTmpl)(unsafe.Pointer(&b[0:SizeofXfrmEncapTmpl][0]))
  249. }
  250. func (msg *XfrmEncapTmpl) Serialize() []byte {
  251. return (*(*[SizeofXfrmEncapTmpl]byte)(unsafe.Pointer(msg)))[:]
  252. }
  253. // struct xfrm_usersa_flush {
  254. // __u8 proto;
  255. // };
  256. type XfrmUsersaFlush struct {
  257. Proto uint8
  258. }
  259. func (msg *XfrmUsersaFlush) Len() int {
  260. return SizeofXfrmUsersaFlush
  261. }
  262. func DeserializeXfrmUsersaFlush(b []byte) *XfrmUsersaFlush {
  263. return (*XfrmUsersaFlush)(unsafe.Pointer(&b[0:SizeofXfrmUsersaFlush][0]))
  264. }
  265. func (msg *XfrmUsersaFlush) Serialize() []byte {
  266. return (*(*[SizeofXfrmUsersaFlush]byte)(unsafe.Pointer(msg)))[:]
  267. }
  268. // struct xfrm_replay_state_esn {
  269. // unsigned int bmp_len;
  270. // __u32 oseq;
  271. // __u32 seq;
  272. // __u32 oseq_hi;
  273. // __u32 seq_hi;
  274. // __u32 replay_window;
  275. // __u32 bmp[0];
  276. // };
  277. type XfrmReplayStateEsn struct {
  278. BmpLen uint32
  279. OSeq uint32
  280. Seq uint32
  281. OSeqHi uint32
  282. SeqHi uint32
  283. ReplayWindow uint32
  284. Bmp []uint32
  285. }
  286. func (msg *XfrmReplayStateEsn) Serialize() []byte {
  287. // We deliberately do not pass Bmp, as it gets set by the kernel.
  288. return (*(*[SizeofXfrmReplayStateEsn]byte)(unsafe.Pointer(msg)))[:]
  289. }
  290. // struct xfrm_replay_state {
  291. // __u32 oseq;
  292. // __u32 seq;
  293. // __u32 bitmap;
  294. // };
  295. type XfrmReplayState struct {
  296. OSeq uint32
  297. Seq uint32
  298. BitMap uint32
  299. }
  300. func DeserializeXfrmReplayState(b []byte) *XfrmReplayState {
  301. return (*XfrmReplayState)(unsafe.Pointer(&b[0:SizeofXfrmReplayState][0]))
  302. }
  303. func (msg *XfrmReplayState) Serialize() []byte {
  304. return (*(*[SizeofXfrmReplayState]byte)(unsafe.Pointer(msg)))[:]
  305. }