ipset_linux.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package nl
  2. import (
  3. "strconv"
  4. "golang.org/x/sys/unix"
  5. )
  6. const (
  7. /* The protocol version */
  8. IPSET_PROTOCOL = 6
  9. /* The max length of strings including NUL: set and type identifiers */
  10. IPSET_MAXNAMELEN = 32
  11. /* The maximum permissible comment length we will accept over netlink */
  12. IPSET_MAX_COMMENT_SIZE = 255
  13. )
  14. const (
  15. _ = iota
  16. IPSET_CMD_PROTOCOL /* 1: Return protocol version */
  17. IPSET_CMD_CREATE /* 2: Create a new (empty) set */
  18. IPSET_CMD_DESTROY /* 3: Destroy a (empty) set */
  19. IPSET_CMD_FLUSH /* 4: Remove all elements from a set */
  20. IPSET_CMD_RENAME /* 5: Rename a set */
  21. IPSET_CMD_SWAP /* 6: Swap two sets */
  22. IPSET_CMD_LIST /* 7: List sets */
  23. IPSET_CMD_SAVE /* 8: Save sets */
  24. IPSET_CMD_ADD /* 9: Add an element to a set */
  25. IPSET_CMD_DEL /* 10: Delete an element from a set */
  26. IPSET_CMD_TEST /* 11: Test an element in a set */
  27. IPSET_CMD_HEADER /* 12: Get set header data only */
  28. IPSET_CMD_TYPE /* 13: Get set type */
  29. )
  30. /* Attributes at command level */
  31. const (
  32. _ = iota
  33. IPSET_ATTR_PROTOCOL /* 1: Protocol version */
  34. IPSET_ATTR_SETNAME /* 2: Name of the set */
  35. IPSET_ATTR_TYPENAME /* 3: Typename */
  36. IPSET_ATTR_REVISION /* 4: Settype revision */
  37. IPSET_ATTR_FAMILY /* 5: Settype family */
  38. IPSET_ATTR_FLAGS /* 6: Flags at command level */
  39. IPSET_ATTR_DATA /* 7: Nested attributes */
  40. IPSET_ATTR_ADT /* 8: Multiple data containers */
  41. IPSET_ATTR_LINENO /* 9: Restore lineno */
  42. IPSET_ATTR_PROTOCOL_MIN /* 10: Minimal supported version number */
  43. IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME /* Setname at rename/swap */
  44. IPSET_ATTR_REVISION_MIN = IPSET_ATTR_PROTOCOL_MIN /* type rev min */
  45. )
  46. /* CADT specific attributes */
  47. const (
  48. IPSET_ATTR_IP = 1
  49. IPSET_ATTR_IP_FROM = 1
  50. IPSET_ATTR_IP_TO = 2
  51. IPSET_ATTR_CIDR = 3
  52. IPSET_ATTR_PORT = 4
  53. IPSET_ATTR_PORT_FROM = 4
  54. IPSET_ATTR_PORT_TO = 5
  55. IPSET_ATTR_TIMEOUT = 6
  56. IPSET_ATTR_PROTO = 7
  57. IPSET_ATTR_CADT_FLAGS = 8
  58. IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO /* 9 */
  59. IPSET_ATTR_MARK = 10
  60. IPSET_ATTR_MARKMASK = 11
  61. /* Reserve empty slots */
  62. IPSET_ATTR_CADT_MAX = 16
  63. /* Create-only specific attributes */
  64. IPSET_ATTR_GC = 3 + iota
  65. IPSET_ATTR_HASHSIZE
  66. IPSET_ATTR_MAXELEM
  67. IPSET_ATTR_NETMASK
  68. IPSET_ATTR_PROBES
  69. IPSET_ATTR_RESIZE
  70. IPSET_ATTR_SIZE
  71. /* Kernel-only */
  72. IPSET_ATTR_ELEMENTS
  73. IPSET_ATTR_REFERENCES
  74. IPSET_ATTR_MEMSIZE
  75. SET_ATTR_CREATE_MAX
  76. )
  77. /* ADT specific attributes */
  78. const (
  79. IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + iota + 1
  80. IPSET_ATTR_NAME
  81. IPSET_ATTR_NAMEREF
  82. IPSET_ATTR_IP2
  83. IPSET_ATTR_CIDR2
  84. IPSET_ATTR_IP2_TO
  85. IPSET_ATTR_IFACE
  86. IPSET_ATTR_BYTES
  87. IPSET_ATTR_PACKETS
  88. IPSET_ATTR_COMMENT
  89. IPSET_ATTR_SKBMARK
  90. IPSET_ATTR_SKBPRIO
  91. IPSET_ATTR_SKBQUEUE
  92. )
  93. /* Flags at CADT attribute level, upper half of cmdattrs */
  94. const (
  95. IPSET_FLAG_BIT_BEFORE = 0
  96. IPSET_FLAG_BEFORE = (1 << IPSET_FLAG_BIT_BEFORE)
  97. IPSET_FLAG_BIT_PHYSDEV = 1
  98. IPSET_FLAG_PHYSDEV = (1 << IPSET_FLAG_BIT_PHYSDEV)
  99. IPSET_FLAG_BIT_NOMATCH = 2
  100. IPSET_FLAG_NOMATCH = (1 << IPSET_FLAG_BIT_NOMATCH)
  101. IPSET_FLAG_BIT_WITH_COUNTERS = 3
  102. IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS)
  103. IPSET_FLAG_BIT_WITH_COMMENT = 4
  104. IPSET_FLAG_WITH_COMMENT = (1 << IPSET_FLAG_BIT_WITH_COMMENT)
  105. IPSET_FLAG_BIT_WITH_FORCEADD = 5
  106. IPSET_FLAG_WITH_FORCEADD = (1 << IPSET_FLAG_BIT_WITH_FORCEADD)
  107. IPSET_FLAG_BIT_WITH_SKBINFO = 6
  108. IPSET_FLAG_WITH_SKBINFO = (1 << IPSET_FLAG_BIT_WITH_SKBINFO)
  109. IPSET_FLAG_CADT_MAX = 15
  110. )
  111. const (
  112. IPSET_ERR_PRIVATE = 4096 + iota
  113. IPSET_ERR_PROTOCOL
  114. IPSET_ERR_FIND_TYPE
  115. IPSET_ERR_MAX_SETS
  116. IPSET_ERR_BUSY
  117. IPSET_ERR_EXIST_SETNAME2
  118. IPSET_ERR_TYPE_MISMATCH
  119. IPSET_ERR_EXIST
  120. IPSET_ERR_INVALID_CIDR
  121. IPSET_ERR_INVALID_NETMASK
  122. IPSET_ERR_INVALID_FAMILY
  123. IPSET_ERR_TIMEOUT
  124. IPSET_ERR_REFERENCED
  125. IPSET_ERR_IPADDR_IPV4
  126. IPSET_ERR_IPADDR_IPV6
  127. IPSET_ERR_COUNTER
  128. IPSET_ERR_COMMENT
  129. IPSET_ERR_INVALID_MARKMASK
  130. IPSET_ERR_SKBINFO
  131. /* Type specific error codes */
  132. IPSET_ERR_TYPE_SPECIFIC = 4352
  133. )
  134. type IPSetError uintptr
  135. func (e IPSetError) Error() string {
  136. switch int(e) {
  137. case IPSET_ERR_PRIVATE:
  138. return "private"
  139. case IPSET_ERR_PROTOCOL:
  140. return "invalid protocol"
  141. case IPSET_ERR_FIND_TYPE:
  142. return "invalid type"
  143. case IPSET_ERR_MAX_SETS:
  144. return "max sets reached"
  145. case IPSET_ERR_BUSY:
  146. return "busy"
  147. case IPSET_ERR_EXIST_SETNAME2:
  148. return "exist_setname2"
  149. case IPSET_ERR_TYPE_MISMATCH:
  150. return "type mismatch"
  151. case IPSET_ERR_EXIST:
  152. return "exist"
  153. case IPSET_ERR_INVALID_CIDR:
  154. return "invalid cidr"
  155. case IPSET_ERR_INVALID_NETMASK:
  156. return "invalid netmask"
  157. case IPSET_ERR_INVALID_FAMILY:
  158. return "invalid family"
  159. case IPSET_ERR_TIMEOUT:
  160. return "timeout"
  161. case IPSET_ERR_REFERENCED:
  162. return "referenced"
  163. case IPSET_ERR_IPADDR_IPV4:
  164. return "invalid ipv4 address"
  165. case IPSET_ERR_IPADDR_IPV6:
  166. return "invalid ipv6 address"
  167. case IPSET_ERR_COUNTER:
  168. return "invalid counter"
  169. case IPSET_ERR_COMMENT:
  170. return "invalid comment"
  171. case IPSET_ERR_INVALID_MARKMASK:
  172. return "invalid markmask"
  173. case IPSET_ERR_SKBINFO:
  174. return "skbinfo"
  175. default:
  176. return "errno " + strconv.Itoa(int(e))
  177. }
  178. }
  179. func GetIpsetFlags(cmd int) int {
  180. switch cmd {
  181. case IPSET_CMD_CREATE:
  182. return unix.NLM_F_REQUEST | unix.NLM_F_ACK | unix.NLM_F_CREATE
  183. case IPSET_CMD_DESTROY,
  184. IPSET_CMD_FLUSH,
  185. IPSET_CMD_RENAME,
  186. IPSET_CMD_SWAP,
  187. IPSET_CMD_TEST:
  188. return unix.NLM_F_REQUEST | unix.NLM_F_ACK
  189. case IPSET_CMD_LIST,
  190. IPSET_CMD_SAVE:
  191. return unix.NLM_F_REQUEST | unix.NLM_F_ACK | unix.NLM_F_ROOT | unix.NLM_F_MATCH | unix.NLM_F_DUMP
  192. case IPSET_CMD_ADD,
  193. IPSET_CMD_DEL:
  194. return unix.NLM_F_REQUEST | unix.NLM_F_ACK
  195. case IPSET_CMD_HEADER,
  196. IPSET_CMD_TYPE,
  197. IPSET_CMD_PROTOCOL:
  198. return unix.NLM_F_REQUEST
  199. default:
  200. return 0
  201. }
  202. }