github.com/nicocha30/gvisor-ligolo@v0.0.0-20230726075806-989fa2c0a413/pkg/abi/linux/socket.go (about)

     1  // Copyright 2018 The gVisor Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package linux
    16  
    17  import (
    18  	"github.com/nicocha30/gvisor-ligolo/pkg/marshal"
    19  )
    20  
    21  // Address families, from linux/socket.h.
    22  const (
    23  	AF_UNSPEC     = 0
    24  	AF_UNIX       = 1
    25  	AF_INET       = 2
    26  	AF_AX25       = 3
    27  	AF_IPX        = 4
    28  	AF_APPLETALK  = 5
    29  	AF_NETROM     = 6
    30  	AF_BRIDGE     = 7
    31  	AF_ATMPVC     = 8
    32  	AF_X25        = 9
    33  	AF_INET6      = 10
    34  	AF_ROSE       = 11
    35  	AF_DECnet     = 12
    36  	AF_NETBEUI    = 13
    37  	AF_SECURITY   = 14
    38  	AF_KEY        = 15
    39  	AF_NETLINK    = 16
    40  	AF_PACKET     = 17
    41  	AF_ASH        = 18
    42  	AF_ECONET     = 19
    43  	AF_ATMSVC     = 20
    44  	AF_RDS        = 21
    45  	AF_SNA        = 22
    46  	AF_IRDA       = 23
    47  	AF_PPPOX      = 24
    48  	AF_WANPIPE    = 25
    49  	AF_LLC        = 26
    50  	AF_IB         = 27
    51  	AF_MPLS       = 28
    52  	AF_CAN        = 29
    53  	AF_TIPC       = 30
    54  	AF_BLUETOOTH  = 31
    55  	AF_IUCV       = 32
    56  	AF_RXRPC      = 33
    57  	AF_ISDN       = 34
    58  	AF_PHONET     = 35
    59  	AF_IEEE802154 = 36
    60  	AF_CAIF       = 37
    61  	AF_ALG        = 38
    62  	AF_NFC        = 39
    63  	AF_VSOCK      = 40
    64  )
    65  
    66  // sendmsg(2)/recvmsg(2) flags, from linux/socket.h.
    67  const (
    68  	MSG_OOB              = 0x1
    69  	MSG_PEEK             = 0x2
    70  	MSG_DONTROUTE        = 0x4
    71  	MSG_TRYHARD          = 0x4
    72  	MSG_CTRUNC           = 0x8
    73  	MSG_PROBE            = 0x10
    74  	MSG_TRUNC            = 0x20
    75  	MSG_DONTWAIT         = 0x40
    76  	MSG_EOR              = 0x80
    77  	MSG_WAITALL          = 0x100
    78  	MSG_FIN              = 0x200
    79  	MSG_EOF              = MSG_FIN
    80  	MSG_SYN              = 0x400
    81  	MSG_CONFIRM          = 0x800
    82  	MSG_RST              = 0x1000
    83  	MSG_ERRQUEUE         = 0x2000
    84  	MSG_NOSIGNAL         = 0x4000
    85  	MSG_MORE             = 0x8000
    86  	MSG_WAITFORONE       = 0x10000
    87  	MSG_SENDPAGE_NOTLAST = 0x20000
    88  	MSG_ZEROCOPY         = 0x4000000
    89  	MSG_FASTOPEN         = 0x20000000
    90  	MSG_CMSG_CLOEXEC     = 0x40000000
    91  )
    92  
    93  // Set/get socket option levels, from socket.h.
    94  const (
    95  	SOL_IP      = 0
    96  	SOL_SOCKET  = 1
    97  	SOL_TCP     = 6
    98  	SOL_UDP     = 17
    99  	SOL_IPV6    = 41
   100  	SOL_ICMPV6  = 58
   101  	SOL_RAW     = 255
   102  	SOL_PACKET  = 263
   103  	SOL_NETLINK = 270
   104  )
   105  
   106  // A SockType is a type (as opposed to family) of sockets. These are enumerated
   107  // below as SOCK_* constants.
   108  type SockType int
   109  
   110  // Socket types, from linux/net.h.
   111  const (
   112  	SOCK_STREAM    SockType = 1
   113  	SOCK_DGRAM     SockType = 2
   114  	SOCK_RAW       SockType = 3
   115  	SOCK_RDM       SockType = 4
   116  	SOCK_SEQPACKET SockType = 5
   117  	SOCK_DCCP      SockType = 6
   118  	SOCK_PACKET    SockType = 10
   119  )
   120  
   121  // SOCK_TYPE_MASK covers all of the above socket types. The remaining bits are
   122  // flags. From linux/net.h.
   123  const SOCK_TYPE_MASK = 0xf
   124  
   125  // socket(2)/socketpair(2)/accept4(2) flags, from linux/net.h.
   126  const (
   127  	SOCK_CLOEXEC  = O_CLOEXEC
   128  	SOCK_NONBLOCK = O_NONBLOCK
   129  )
   130  
   131  // shutdown(2) how commands, from <linux/net.h>.
   132  const (
   133  	SHUT_RD   = 0
   134  	SHUT_WR   = 1
   135  	SHUT_RDWR = 2
   136  )
   137  
   138  // Packet types from <linux/if_packet.h>
   139  const (
   140  	PACKET_HOST      = 0 // To us
   141  	PACKET_BROADCAST = 1 // To all
   142  	PACKET_MULTICAST = 2 // To group
   143  	PACKET_OTHERHOST = 3 // To someone else
   144  	PACKET_OUTGOING  = 4 // Outgoing of any type
   145  )
   146  
   147  // Socket options from socket.h.
   148  const (
   149  	SO_DEBUG                 = 1
   150  	SO_REUSEADDR             = 2
   151  	SO_TYPE                  = 3
   152  	SO_ERROR                 = 4
   153  	SO_DONTROUTE             = 5
   154  	SO_BROADCAST             = 6
   155  	SO_SNDBUF                = 7
   156  	SO_RCVBUF                = 8
   157  	SO_KEEPALIVE             = 9
   158  	SO_OOBINLINE             = 10
   159  	SO_NO_CHECK              = 11
   160  	SO_PRIORITY              = 12
   161  	SO_LINGER                = 13
   162  	SO_BSDCOMPAT             = 14
   163  	SO_REUSEPORT             = 15
   164  	SO_PASSCRED              = 16
   165  	SO_PEERCRED              = 17
   166  	SO_RCVLOWAT              = 18
   167  	SO_SNDLOWAT              = 19
   168  	SO_RCVTIMEO              = 20
   169  	SO_SNDTIMEO              = 21
   170  	SO_BINDTODEVICE          = 25
   171  	SO_ATTACH_FILTER         = 26
   172  	SO_DETACH_FILTER         = 27
   173  	SO_GET_FILTER            = SO_ATTACH_FILTER
   174  	SO_PEERNAME              = 28
   175  	SO_TIMESTAMP             = 29
   176  	SO_ACCEPTCONN            = 30
   177  	SO_PEERSEC               = 31
   178  	SO_SNDBUFFORCE           = 32
   179  	SO_RCVBUFFORCE           = 33
   180  	SO_PASSSEC               = 34
   181  	SO_TIMESTAMPNS           = 35
   182  	SO_MARK                  = 36
   183  	SO_TIMESTAMPING          = 37
   184  	SO_PROTOCOL              = 38
   185  	SO_DOMAIN                = 39
   186  	SO_RXQ_OVFL              = 40
   187  	SO_WIFI_STATUS           = 41
   188  	SO_PEEK_OFF              = 42
   189  	SO_NOFCS                 = 43
   190  	SO_LOCK_FILTER           = 44
   191  	SO_SELECT_ERR_QUEUE      = 45
   192  	SO_BUSY_POLL             = 46
   193  	SO_MAX_PACING_RATE       = 47
   194  	SO_BPF_EXTENSIONS        = 48
   195  	SO_INCOMING_CPU          = 49
   196  	SO_ATTACH_BPF            = 50
   197  	SO_ATTACH_REUSEPORT_CBPF = 51
   198  	SO_ATTACH_REUSEPORT_EBPF = 52
   199  	SO_CNX_ADVICE            = 53
   200  	SO_MEMINFO               = 55
   201  	SO_INCOMING_NAPI_ID      = 56
   202  	SO_COOKIE                = 57
   203  	SO_PEERGROUPS            = 59
   204  	SO_ZEROCOPY              = 60
   205  	SO_TXTIME                = 61
   206  )
   207  
   208  // enum socket_state, from uapi/linux/net.h.
   209  const (
   210  	SS_FREE          = 0 // Not allocated.
   211  	SS_UNCONNECTED   = 1 // Unconnected to any socket.
   212  	SS_CONNECTING    = 2 // In process of connecting.
   213  	SS_CONNECTED     = 3 // Connected to socket.
   214  	SS_DISCONNECTING = 4 // In process of disconnecting.
   215  )
   216  
   217  // TCP protocol states, from include/net/tcp_states.h.
   218  const (
   219  	TCP_ESTABLISHED uint32 = iota + 1
   220  	TCP_SYN_SENT
   221  	TCP_SYN_RECV
   222  	TCP_FIN_WAIT1
   223  	TCP_FIN_WAIT2
   224  	TCP_TIME_WAIT
   225  	TCP_CLOSE
   226  	TCP_CLOSE_WAIT
   227  	TCP_LAST_ACK
   228  	TCP_LISTEN
   229  	TCP_CLOSING
   230  	TCP_NEW_SYN_RECV
   231  )
   232  
   233  // SockAddrMax is the maximum size of a struct sockaddr, from
   234  // uapi/linux/socket.h.
   235  const SockAddrMax = 128
   236  
   237  // InetAddr is struct in_addr, from uapi/linux/in.h.
   238  //
   239  // +marshal
   240  type InetAddr [4]byte
   241  
   242  // SizeOfInetAddr is the size of InetAddr.
   243  var SizeOfInetAddr = uint32((*InetAddr)(nil).SizeBytes())
   244  
   245  // SockAddrInet is struct sockaddr_in, from uapi/linux/in.h.
   246  //
   247  // +marshal
   248  type SockAddrInet struct {
   249  	Family uint16
   250  	Port   uint16
   251  	Addr   InetAddr
   252  	_      [8]uint8 // pad to sizeof(struct sockaddr).
   253  }
   254  
   255  // Inet6MulticastRequest is struct ipv6_mreq, from uapi/linux/in6.h.
   256  //
   257  // +marshal
   258  type Inet6MulticastRequest struct {
   259  	MulticastAddr  Inet6Addr
   260  	InterfaceIndex int32
   261  }
   262  
   263  // InetMulticastRequest is struct ip_mreq, from uapi/linux/in.h.
   264  //
   265  // +marshal
   266  type InetMulticastRequest struct {
   267  	MulticastAddr InetAddr
   268  	InterfaceAddr InetAddr
   269  }
   270  
   271  // InetMulticastRequestWithNIC is struct ip_mreqn, from uapi/linux/in.h.
   272  //
   273  // +marshal
   274  type InetMulticastRequestWithNIC struct {
   275  	InetMulticastRequest
   276  	InterfaceIndex int32
   277  }
   278  
   279  // Inet6Addr is struct in6_addr, from uapi/linux/in6.h.
   280  //
   281  // +marshal
   282  type Inet6Addr [16]byte
   283  
   284  // SockAddrInet6 is struct sockaddr_in6, from uapi/linux/in6.h.
   285  //
   286  // +marshal
   287  type SockAddrInet6 struct {
   288  	Family   uint16
   289  	Port     uint16
   290  	Flowinfo uint32
   291  	Addr     [16]byte
   292  	Scope_id uint32
   293  }
   294  
   295  // SockAddrLink is a struct sockaddr_ll, from uapi/linux/if_packet.h.
   296  //
   297  // +marshal
   298  type SockAddrLink struct {
   299  	Family          uint16
   300  	Protocol        uint16
   301  	InterfaceIndex  int32
   302  	ARPHardwareType uint16
   303  	PacketType      byte
   304  	HardwareAddrLen byte
   305  	HardwareAddr    [8]byte
   306  }
   307  
   308  // UnixPathMax is the maximum length of the path in an AF_UNIX socket.
   309  //
   310  // From uapi/linux/un.h.
   311  const UnixPathMax = 108
   312  
   313  // SockAddrUnix is struct sockaddr_un, from uapi/linux/un.h.
   314  //
   315  // +marshal
   316  type SockAddrUnix struct {
   317  	Family uint16
   318  	Path   [UnixPathMax]int8
   319  }
   320  
   321  // SockAddr represents a union of valid socket address types. This is logically
   322  // equivalent to struct sockaddr. SockAddr ensures that a well-defined set of
   323  // types can be used as socket addresses.
   324  type SockAddr interface {
   325  	marshal.Marshallable
   326  
   327  	// implementsSockAddr exists purely to allow a type to indicate that they
   328  	// implement this interface. This method is a no-op and shouldn't be called.
   329  	implementsSockAddr()
   330  }
   331  
   332  func (s *SockAddrInet) implementsSockAddr()    {}
   333  func (s *SockAddrInet6) implementsSockAddr()   {}
   334  func (s *SockAddrLink) implementsSockAddr()    {}
   335  func (s *SockAddrUnix) implementsSockAddr()    {}
   336  func (s *SockAddrNetlink) implementsSockAddr() {}
   337  
   338  // Linger is struct linger, from include/linux/socket.h.
   339  //
   340  // +marshal
   341  type Linger struct {
   342  	OnOff  int32
   343  	Linger int32
   344  }
   345  
   346  // SizeOfLinger is the binary size of a Linger struct.
   347  const SizeOfLinger = 8
   348  
   349  // TCPInfo is a collection of TCP statistics.
   350  //
   351  // From uapi/linux/tcp.h. Newer versions of Linux continue to add new fields to
   352  // the end of this struct or within existing unusued space, so its size grows
   353  // over time. The current iteration is based on linux v4.17. New versions are
   354  // always backwards compatible.
   355  //
   356  // +marshal
   357  type TCPInfo struct {
   358  	// State is the state of the connection.
   359  	State uint8
   360  
   361  	// CaState is the congestion control state.
   362  	CaState uint8
   363  
   364  	// Retransmits is the number of retransmissions triggered by RTO.
   365  	Retransmits uint8
   366  
   367  	// Probes is the number of unanswered zero window probes.
   368  	Probes uint8
   369  
   370  	// BackOff indicates exponential backoff.
   371  	Backoff uint8
   372  
   373  	// Options indicates the options enabled for the connection.
   374  	Options uint8
   375  
   376  	// WindowScale is the combination of snd_wscale (first 4 bits) and
   377  	// rcv_wscale (second 4 bits)
   378  	WindowScale uint8
   379  
   380  	// DeliveryRateAppLimited is a boolean and only the first bit is
   381  	// meaningful.
   382  	DeliveryRateAppLimited uint8
   383  
   384  	// RTO is the retransmission timeout.
   385  	RTO uint32
   386  
   387  	// ATO is the acknowledgement timeout interval.
   388  	ATO uint32
   389  
   390  	// SndMss is the send maximum segment size.
   391  	SndMss uint32
   392  
   393  	// RcvMss is the receive maximum segment size.
   394  	RcvMss uint32
   395  
   396  	// Unacked is the number of packets sent but not acknowledged.
   397  	Unacked uint32
   398  
   399  	// Sacked is the number of packets which are selectively acknowledged.
   400  	Sacked uint32
   401  
   402  	// Lost is the number of packets marked as lost.
   403  	Lost uint32
   404  
   405  	// Retrans is the number of retransmitted packets.
   406  	Retrans uint32
   407  
   408  	// Fackets is not used and is always zero.
   409  	Fackets uint32
   410  
   411  	// Times.
   412  	LastDataSent uint32
   413  	LastAckSent  uint32
   414  	LastDataRecv uint32
   415  	LastAckRecv  uint32
   416  
   417  	// Metrics.
   418  	PMTU        uint32
   419  	RcvSsthresh uint32
   420  	RTT         uint32
   421  	RTTVar      uint32
   422  	SndSsthresh uint32
   423  	SndCwnd     uint32
   424  	Advmss      uint32
   425  	Reordering  uint32
   426  
   427  	// RcvRTT is the receiver round trip time.
   428  	RcvRTT uint32
   429  
   430  	// RcvSpace is the current buffer space available for receiving data.
   431  	RcvSpace uint32
   432  
   433  	// TotalRetrans is the total number of retransmits seen since the start
   434  	// of the connection.
   435  	TotalRetrans uint32
   436  
   437  	// PacingRate is the pacing rate in bytes per second.
   438  	PacingRate uint64
   439  
   440  	// MaxPacingRate is the maximum pacing rate.
   441  	MaxPacingRate uint64
   442  
   443  	// BytesAcked is RFC4898 tcpEStatsAppHCThruOctetsAcked.
   444  	BytesAcked uint64
   445  
   446  	// BytesReceived is RFC4898 tcpEStatsAppHCThruOctetsReceived.
   447  	BytesReceived uint64
   448  
   449  	// SegsOut is RFC4898 tcpEStatsPerfSegsOut.
   450  	SegsOut uint32
   451  
   452  	// SegsIn is RFC4898 tcpEStatsPerfSegsIn.
   453  	SegsIn uint32
   454  
   455  	// NotSentBytes is the amount of bytes in the write queue that are not
   456  	// yet sent.
   457  	NotSentBytes uint32
   458  
   459  	// MinRTT is the minimum round trip time seen in the connection.
   460  	MinRTT uint32
   461  
   462  	// DataSegsIn is RFC4898 tcpEStatsDataSegsIn.
   463  	DataSegsIn uint32
   464  
   465  	// DataSegsOut is RFC4898 tcpEStatsDataSegsOut.
   466  	DataSegsOut uint32
   467  
   468  	// DeliveryRate is the most recent delivery rate in bytes per second.
   469  	DeliveryRate uint64
   470  
   471  	// BusyTime is the time in microseconds busy sending data.
   472  	BusyTime uint64
   473  
   474  	// RwndLimited is the time in microseconds limited by receive window.
   475  	RwndLimited uint64
   476  
   477  	// SndBufLimited is the time in microseconds limited by send buffer.
   478  	SndBufLimited uint64
   479  
   480  	// Delivered is the total data packets delivered including retransmits.
   481  	Delivered uint32
   482  
   483  	// DeliveredCE is the total ECE marked data packets delivered including
   484  	// retransmits.
   485  	DeliveredCE uint32
   486  
   487  	// BytesSent is RFC4898 tcpEStatsPerfHCDataOctetsOut.
   488  	BytesSent uint64
   489  
   490  	// BytesRetrans is RFC4898 tcpEStatsPerfOctetsRetrans.
   491  	BytesRetrans uint64
   492  
   493  	// DSACKDups is RFC4898 tcpEStatsStackDSACKDups.
   494  	DSACKDups uint32
   495  
   496  	// ReordSeen is the number of reordering events seen since the start of
   497  	// the connection.
   498  	ReordSeen uint32
   499  }
   500  
   501  // SizeOfTCPInfo is the binary size of a TCPInfo struct.
   502  var SizeOfTCPInfo = (*TCPInfo)(nil).SizeBytes()
   503  
   504  // Control message types, from linux/socket.h.
   505  const (
   506  	SCM_CREDENTIALS = 0x2
   507  	SCM_RIGHTS      = 0x1
   508  )
   509  
   510  // A ControlMessageHeader is the header for a socket control message.
   511  //
   512  // ControlMessageHeader represents struct cmsghdr from linux/socket.h.
   513  //
   514  // +marshal
   515  type ControlMessageHeader struct {
   516  	Length uint64
   517  	Level  int32
   518  	Type   int32
   519  }
   520  
   521  // SizeOfControlMessageHeader is the binary size of a ControlMessageHeader
   522  // struct.
   523  var SizeOfControlMessageHeader = (*ControlMessageHeader)(nil).SizeBytes()
   524  
   525  // A ControlMessageCredentials is an SCM_CREDENTIALS socket control message.
   526  //
   527  // ControlMessageCredentials represents struct ucred from linux/socket.h.
   528  //
   529  // +marshal
   530  type ControlMessageCredentials struct {
   531  	PID int32
   532  	UID uint32
   533  	GID uint32
   534  }
   535  
   536  // A ControlMessageIPPacketInfo is IP_PKTINFO socket control message.
   537  //
   538  // ControlMessageIPPacketInfo represents struct in_pktinfo from linux/in.h.
   539  //
   540  // +marshal
   541  // +stateify savable
   542  type ControlMessageIPPacketInfo struct {
   543  	NIC             int32
   544  	LocalAddr       InetAddr
   545  	DestinationAddr InetAddr
   546  }
   547  
   548  // ControlMessageIPv6PacketInfo represents struct in6_pktinfo from linux/ipv6.h.
   549  //
   550  // +marshal
   551  // +stateify savable
   552  type ControlMessageIPv6PacketInfo struct {
   553  	Addr Inet6Addr
   554  	NIC  uint32
   555  }
   556  
   557  // SizeOfControlMessageCredentials is the binary size of a
   558  // ControlMessageCredentials struct.
   559  var SizeOfControlMessageCredentials = (*ControlMessageCredentials)(nil).SizeBytes()
   560  
   561  // SizeOfControlMessageRight is the size of a single element in
   562  // ControlMessageRights.
   563  const SizeOfControlMessageRight = 4
   564  
   565  // SizeOfControlMessageInq is the size of a TCP_INQ control message.
   566  const SizeOfControlMessageInq = 4
   567  
   568  // SizeOfControlMessageTOS is the size of an IP_TOS control message.
   569  const SizeOfControlMessageTOS = 1
   570  
   571  // SizeOfControlMessageTTL is the size of an IP_TTL control message.
   572  const SizeOfControlMessageTTL = 4
   573  
   574  // SizeOfControlMessageTClass is the size of an IPV6_TCLASS control message.
   575  const SizeOfControlMessageTClass = 4
   576  
   577  // SizeOfControlMessageHopLimit is the size of an IPV6_HOPLIMIT control message.
   578  const SizeOfControlMessageHopLimit = 4
   579  
   580  // SizeOfControlMessageIPPacketInfo is the size of an IP_PKTINFO control
   581  // message.
   582  const SizeOfControlMessageIPPacketInfo = 12
   583  
   584  // SizeOfControlMessageIPv6PacketInfo is the size of a
   585  // ControlMessageIPv6PacketInfo.
   586  const SizeOfControlMessageIPv6PacketInfo = 20
   587  
   588  // SCM_MAX_FD is the maximum number of FDs accepted in a single sendmsg call.
   589  // From net/scm.h.
   590  const SCM_MAX_FD = 253
   591  
   592  // SO_ACCEPTCON is defined as __SO_ACCEPTCON in
   593  // include/uapi/linux/net.h, which represents a listening socket
   594  // state. Note that this is distinct from SO_ACCEPTCONN, which is a
   595  // socket option for querying whether a socket is in a listening
   596  // state.
   597  const SO_ACCEPTCON = 1 << 16
   598  
   599  // ICMP6Filter represents struct icmp6_filter from linux/icmpv6.h.
   600  //
   601  // +marshal
   602  // +stateify savable
   603  type ICMP6Filter struct {
   604  	Filter [8]uint32
   605  }
   606  
   607  // SizeOfICMP6Filter is the size of ICMP6Filter struct.
   608  var SizeOfICMP6Filter = uint32((*ICMP6Filter)(nil).SizeBytes())