github.com/sagernet/netlink@v0.0.0-20240612041022-b9a21c07ac6a/nl/conntrack_linux.go (about) 1 package nl 2 3 import "unsafe" 4 5 // Track the message sizes for the correct serialization/deserialization 6 const ( 7 SizeofNfgenmsg = 4 8 SizeofNfattr = 4 9 SizeofNfConntrack = 376 10 SizeofNfctTupleHead = 52 11 ) 12 13 var L4ProtoMap = map[uint8]string{ 14 6: "tcp", 15 17: "udp", 16 } 17 18 // All the following constants are coming from: 19 // https://github.com/torvalds/linux/blob/master/include/uapi/linux/netfilter/nfnetlink_conntrack.h 20 21 // enum cntl_msg_types { 22 // IPCTNL_MSG_CT_NEW, 23 // IPCTNL_MSG_CT_GET, 24 // IPCTNL_MSG_CT_DELETE, 25 // IPCTNL_MSG_CT_GET_CTRZERO, 26 // IPCTNL_MSG_CT_GET_STATS_CPU, 27 // IPCTNL_MSG_CT_GET_STATS, 28 // IPCTNL_MSG_CT_GET_DYING, 29 // IPCTNL_MSG_CT_GET_UNCONFIRMED, 30 // 31 // IPCTNL_MSG_MAX 32 // }; 33 const ( 34 IPCTNL_MSG_CT_GET = 1 35 IPCTNL_MSG_CT_DELETE = 2 36 ) 37 38 // #define NFNETLINK_V0 0 39 const ( 40 NFNETLINK_V0 = 0 41 ) 42 43 const ( 44 NLA_F_NESTED uint16 = (1 << 15) // #define NLA_F_NESTED (1 << 15) 45 NLA_F_NET_BYTEORDER uint16 = (1 << 14) // #define NLA_F_NESTED (1 << 14) 46 NLA_TYPE_MASK = ^(NLA_F_NESTED | NLA_F_NET_BYTEORDER) 47 NLA_ALIGNTO uint16 = 4 // #define NLA_ALIGNTO 4 48 ) 49 50 // enum ctattr_type { 51 // CTA_UNSPEC, 52 // CTA_TUPLE_ORIG, 53 // CTA_TUPLE_REPLY, 54 // CTA_STATUS, 55 // CTA_PROTOINFO, 56 // CTA_HELP, 57 // CTA_NAT_SRC, 58 // 59 // #define CTA_NAT CTA_NAT_SRC /* backwards compatibility */ 60 // 61 // CTA_TIMEOUT, 62 // CTA_MARK, 63 // CTA_COUNTERS_ORIG, 64 // CTA_COUNTERS_REPLY, 65 // CTA_USE, 66 // CTA_ID, 67 // CTA_NAT_DST, 68 // CTA_TUPLE_MASTER, 69 // CTA_SEQ_ADJ_ORIG, 70 // CTA_NAT_SEQ_ADJ_ORIG = CTA_SEQ_ADJ_ORIG, 71 // CTA_SEQ_ADJ_REPLY, 72 // CTA_NAT_SEQ_ADJ_REPLY = CTA_SEQ_ADJ_REPLY, 73 // CTA_SECMARK, /* obsolete */ 74 // CTA_ZONE, 75 // CTA_SECCTX, 76 // CTA_TIMESTAMP, 77 // CTA_MARK_MASK, 78 // CTA_LABELS, 79 // CTA_LABELS_MASK, 80 // __CTA_MAX 81 // }; 82 const ( 83 CTA_TUPLE_ORIG = 1 84 CTA_TUPLE_REPLY = 2 85 CTA_STATUS = 3 86 CTA_PROTOINFO = 4 87 CTA_TIMEOUT = 7 88 CTA_MARK = 8 89 CTA_COUNTERS_ORIG = 9 90 CTA_COUNTERS_REPLY = 10 91 CTA_USE = 11 92 CTA_ID = 12 93 CTA_TIMESTAMP = 20 94 ) 95 96 // enum ctattr_tuple { 97 // CTA_TUPLE_UNSPEC, 98 // CTA_TUPLE_IP, 99 // CTA_TUPLE_PROTO, 100 // CTA_TUPLE_ZONE, 101 // __CTA_TUPLE_MAX 102 // }; 103 // 104 // #define CTA_TUPLE_MAX (__CTA_TUPLE_MAX - 1) 105 const ( 106 CTA_TUPLE_IP = 1 107 CTA_TUPLE_PROTO = 2 108 ) 109 110 // enum ctattr_ip { 111 // CTA_IP_UNSPEC, 112 // CTA_IP_V4_SRC, 113 // CTA_IP_V4_DST, 114 // CTA_IP_V6_SRC, 115 // CTA_IP_V6_DST, 116 // __CTA_IP_MAX 117 // }; 118 // 119 // #define CTA_IP_MAX (__CTA_IP_MAX - 1) 120 const ( 121 CTA_IP_V4_SRC = 1 122 CTA_IP_V4_DST = 2 123 CTA_IP_V6_SRC = 3 124 CTA_IP_V6_DST = 4 125 ) 126 127 // enum ctattr_l4proto { 128 // CTA_PROTO_UNSPEC, 129 // CTA_PROTO_NUM, 130 // CTA_PROTO_SRC_PORT, 131 // CTA_PROTO_DST_PORT, 132 // CTA_PROTO_ICMP_ID, 133 // CTA_PROTO_ICMP_TYPE, 134 // CTA_PROTO_ICMP_CODE, 135 // CTA_PROTO_ICMPV6_ID, 136 // CTA_PROTO_ICMPV6_TYPE, 137 // CTA_PROTO_ICMPV6_CODE, 138 // __CTA_PROTO_MAX 139 // }; 140 // 141 // #define CTA_PROTO_MAX (__CTA_PROTO_MAX - 1) 142 const ( 143 CTA_PROTO_NUM = 1 144 CTA_PROTO_SRC_PORT = 2 145 CTA_PROTO_DST_PORT = 3 146 ) 147 148 // enum ctattr_protoinfo { 149 // CTA_PROTOINFO_UNSPEC, 150 // CTA_PROTOINFO_TCP, 151 // CTA_PROTOINFO_DCCP, 152 // CTA_PROTOINFO_SCTP, 153 // __CTA_PROTOINFO_MAX 154 // }; 155 // 156 // #define CTA_PROTOINFO_MAX (__CTA_PROTOINFO_MAX - 1) 157 const ( 158 CTA_PROTOINFO_TCP = 1 159 ) 160 161 // enum ctattr_protoinfo_tcp { 162 // CTA_PROTOINFO_TCP_UNSPEC, 163 // CTA_PROTOINFO_TCP_STATE, 164 // CTA_PROTOINFO_TCP_WSCALE_ORIGINAL, 165 // CTA_PROTOINFO_TCP_WSCALE_REPLY, 166 // CTA_PROTOINFO_TCP_FLAGS_ORIGINAL, 167 // CTA_PROTOINFO_TCP_FLAGS_REPLY, 168 // __CTA_PROTOINFO_TCP_MAX 169 // }; 170 // 171 // #define CTA_PROTOINFO_TCP_MAX (__CTA_PROTOINFO_TCP_MAX - 1) 172 const ( 173 CTA_PROTOINFO_TCP_STATE = 1 174 CTA_PROTOINFO_TCP_WSCALE_ORIGINAL = 2 175 CTA_PROTOINFO_TCP_WSCALE_REPLY = 3 176 CTA_PROTOINFO_TCP_FLAGS_ORIGINAL = 4 177 CTA_PROTOINFO_TCP_FLAGS_REPLY = 5 178 ) 179 180 // enum ctattr_counters { 181 // CTA_COUNTERS_UNSPEC, 182 // CTA_COUNTERS_PACKETS, /* 64bit counters */ 183 // CTA_COUNTERS_BYTES, /* 64bit counters */ 184 // CTA_COUNTERS32_PACKETS, /* old 32bit counters, unused */ 185 // CTA_COUNTERS32_BYTES, /* old 32bit counters, unused */ 186 // CTA_COUNTERS_PAD, 187 // __CTA_COUNTERS_M 188 // }; 189 // 190 // #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) 191 const ( 192 CTA_COUNTERS_PACKETS = 1 193 CTA_COUNTERS_BYTES = 2 194 ) 195 196 // enum CTA TIMESTAMP TLVs 197 // CTA_TIMESTAMP_START /* 64bit value */ 198 // CTA_TIMESTAMP_STOP /* 64bit value */ 199 const ( 200 CTA_TIMESTAMP_START = 1 201 CTA_TIMESTAMP_STOP = 2 202 ) 203 204 // /* General form of address family dependent message. 205 // 206 // */ 207 // 208 // struct nfgenmsg { 209 // __u8 nfgen_family; /* AF_xxx */ 210 // __u8 version; /* nfnetlink version */ 211 // __be16 res_id; /* resource id */ 212 // }; 213 type Nfgenmsg struct { 214 NfgenFamily uint8 215 Version uint8 216 ResId uint16 // big endian 217 } 218 219 func (msg *Nfgenmsg) Len() int { 220 return SizeofNfgenmsg 221 } 222 223 func DeserializeNfgenmsg(b []byte) *Nfgenmsg { 224 return (*Nfgenmsg)(unsafe.Pointer(&b[0:SizeofNfgenmsg][0])) 225 } 226 227 func (msg *Nfgenmsg) Serialize() []byte { 228 return (*(*[SizeofNfgenmsg]byte)(unsafe.Pointer(msg)))[:] 229 }