xfrm_state.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package netlink
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. // XfrmStateAlgo represents the algorithm to use for the ipsec encryption.
  7. type XfrmStateAlgo struct {
  8. Name string
  9. Key []byte
  10. TruncateLen int // Auth only
  11. }
  12. func (a XfrmStateAlgo) String() string {
  13. return fmt.Sprintf("{Name: %s, Key: 0x%x, TruncateLen: %d}", a.Name, a.Key, a.TruncateLen)
  14. }
  15. // EncapType is an enum representing the optional packet encapsulation.
  16. type EncapType uint8
  17. const (
  18. XFRM_ENCAP_ESPINUDP_NONIKE EncapType = iota + 1
  19. XFRM_ENCAP_ESPINUDP
  20. )
  21. func (e EncapType) String() string {
  22. switch e {
  23. case XFRM_ENCAP_ESPINUDP_NONIKE:
  24. return "espinudp-non-ike"
  25. case XFRM_ENCAP_ESPINUDP:
  26. return "espinudp"
  27. }
  28. return "unknown"
  29. }
  30. // XfrmStateEncap represents the encapsulation to use for the ipsec encryption.
  31. type XfrmStateEncap struct {
  32. Type EncapType
  33. SrcPort int
  34. DstPort int
  35. OriginalAddress net.IP
  36. }
  37. func (e XfrmStateEncap) String() string {
  38. return fmt.Sprintf("{Type: %s, Srcport: %d, DstPort: %d, OriginalAddress: %v}",
  39. e.Type, e.SrcPort, e.DstPort, e.OriginalAddress)
  40. }
  41. // XfrmStateLimits represents the configured limits for the state.
  42. type XfrmStateLimits struct {
  43. ByteSoft uint64
  44. ByteHard uint64
  45. PacketSoft uint64
  46. PacketHard uint64
  47. TimeSoft uint64
  48. TimeHard uint64
  49. TimeUseSoft uint64
  50. TimeUseHard uint64
  51. }
  52. // XfrmState represents the state of an ipsec policy. It optionally
  53. // contains an XfrmStateAlgo for encryption and one for authentication.
  54. type XfrmState struct {
  55. Dst net.IP
  56. Src net.IP
  57. Proto Proto
  58. Mode Mode
  59. Spi int
  60. Reqid int
  61. ReplayWindow int
  62. Limits XfrmStateLimits
  63. Mark *XfrmMark
  64. Auth *XfrmStateAlgo
  65. Crypt *XfrmStateAlgo
  66. Encap *XfrmStateEncap
  67. }
  68. func (sa XfrmState) String() string {
  69. return fmt.Sprintf("Dst: %v, Src: %v, Proto: %s, Mode: %s, SPI: 0x%x, ReqID: 0x%x, ReplayWindow: %d, Mark: %v, Auth: %v, Crypt: %v, Encap: %v",
  70. sa.Dst, sa.Src, sa.Proto, sa.Mode, sa.Spi, sa.Reqid, sa.ReplayWindow, sa.Mark, sa.Auth, sa.Crypt, sa.Encap)
  71. }
  72. func (sa XfrmState) Print(stats bool) string {
  73. if !stats {
  74. return sa.String()
  75. }
  76. return fmt.Sprintf("%s, ByteSoft: %s, ByteHard: %s, PacketSoft: %s, PacketHard: %s, TimeSoft: %d, TimeHard: %d, TimeUseSoft: %d, TimeUseHard: %d",
  77. sa.String(), printLimit(sa.Limits.ByteSoft), printLimit(sa.Limits.ByteHard), printLimit(sa.Limits.PacketSoft), printLimit(sa.Limits.PacketHard),
  78. sa.Limits.TimeSoft, sa.Limits.TimeHard, sa.Limits.TimeUseSoft, sa.Limits.TimeUseHard)
  79. }
  80. func printLimit(lmt uint64) string {
  81. if lmt == ^uint64(0) {
  82. return "(INF)"
  83. }
  84. return fmt.Sprintf("%d", lmt)
  85. }