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  }