// Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package linux import "gvisor.googlesource.com/gvisor/pkg/binary" // Address families, from linux/socket.h. const ( AF_UNSPEC = 0 AF_UNIX = 1 AF_INET = 2 AF_AX25 = 3 AF_IPX = 4 AF_APPLETALK = 5 AF_NETROM = 6 AF_BRIDGE = 7 AF_ATMPVC = 8 AF_X25 = 9 AF_INET6 = 10 AF_ROSE = 11 AF_DECnet = 12 AF_NETBEUI = 13 AF_SECURITY = 14 AF_KEY = 15 AF_NETLINK = 16 AF_PACKET = 17 AF_ASH = 18 AF_ECONET = 19 AF_ATMSVC = 20 AF_RDS = 21 AF_SNA = 22 AF_IRDA = 23 AF_PPPOX = 24 AF_WANPIPE = 25 AF_LLC = 26 AF_IB = 27 AF_MPLS = 28 AF_CAN = 29 AF_TIPC = 30 AF_BLUETOOTH = 31 AF_IUCV = 32 AF_RXRPC = 33 AF_ISDN = 34 AF_PHONET = 35 AF_IEEE802154 = 36 AF_CAIF = 37 AF_ALG = 38 AF_NFC = 39 AF_VSOCK = 40 ) // sendmsg(2)/recvmsg(2) flags, from linux/socket.h. const ( MSG_OOB = 0x1 MSG_PEEK = 0x2 MSG_DONTROUTE = 0x4 MSG_TRYHARD = 0x4 MSG_CTRUNC = 0x8 MSG_PROBE = 0x10 MSG_TRUNC = 0x20 MSG_DONTWAIT = 0x40 MSG_EOR = 0x80 MSG_WAITALL = 0x100 MSG_FIN = 0x200 MSG_EOF = MSG_FIN MSG_SYN = 0x400 MSG_CONFIRM = 0x800 MSG_RST = 0x1000 MSG_ERRQUEUE = 0x2000 MSG_NOSIGNAL = 0x4000 MSG_MORE = 0x8000 MSG_WAITFORONE = 0x10000 MSG_SENDPAGE_NOTLAST = 0x20000 MSG_REINJECT = 0x8000000 MSG_ZEROCOPY = 0x4000000 MSG_FASTOPEN = 0x20000000 MSG_CMSG_CLOEXEC = 0x40000000 ) // SOL_SOCKET is from socket.h const SOL_SOCKET = 1 // Socket types, from linux/net.h. const ( SOCK_STREAM = 1 SOCK_DGRAM = 2 SOCK_RAW = 3 SOCK_RDM = 4 SOCK_SEQPACKET = 5 SOCK_DCCP = 6 SOCK_PACKET = 10 ) // SOCK_TYPE_MASK covers all of the above socket types. The remaining bits are // flags. From linux/net.h. const SOCK_TYPE_MASK = 0xf // socket(2)/socketpair(2)/accept4(2) flags, from linux/net.h. const ( SOCK_CLOEXEC = O_CLOEXEC SOCK_NONBLOCK = O_NONBLOCK ) // shutdown(2) how commands, from . const ( SHUT_RD = 0 SHUT_WR = 1 SHUT_RDWR = 2 ) // Socket options from socket.h. const ( SO_ERROR = 4 SO_KEEPALIVE = 9 SO_LINGER = 13 SO_MARK = 36 SO_PASSCRED = 16 SO_PEERCRED = 17 SO_PEERNAME = 28 SO_PROTOCOL = 38 SO_RCVBUF = 8 SO_RCVTIMEO = 20 SO_REUSEADDR = 2 SO_SNDBUF = 7 SO_SNDTIMEO = 21 SO_TIMESTAMP = 29 SO_TIMESTAMPNS = 35 SO_TYPE = 3 ) // SockAddrMax is the maximum size of a struct sockaddr, from // uapi/linux/socket.h. const SockAddrMax = 128 // SockAddrInt is struct sockaddr_in, from uapi/linux/in.h. type SockAddrInet struct { Family uint16 Port uint16 Addr [4]byte Zero [8]uint8 // pad to sizeof(struct sockaddr). } // SockAddrInt6 is struct sockaddr_in6, from uapi/linux/in6.h. type SockAddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 Addr [16]byte Scope_id uint32 } // UnixPathMax is the maximum length of the path in an AF_UNIX socket. // // From uapi/linux/un.h. const UnixPathMax = 108 // SockAddrUnix is struct sockaddr_un, from uapi/linux/un.h. type SockAddrUnix struct { Family uint16 Path [UnixPathMax]int8 } // TCPInfo is a collection of TCP statistics. // // From uapi/linux/tcp.h. type TCPInfo struct { State uint8 CaState uint8 Retransmits uint8 Probes uint8 Backoff uint8 Options uint8 // WindowScale is the combination of snd_wscale (first 4 bits) and rcv_wscale (second 4 bits) WindowScale uint8 // DeliveryRateAppLimited is a boolean and only the first bit is meaningful. DeliveryRateAppLimited uint8 RTO uint32 ATO uint32 SndMss uint32 RcvMss uint32 Unacked uint32 Sacked uint32 Lost uint32 Retrans uint32 Fackets uint32 // Times. LastDataSent uint32 LastAckSent uint32 LastDataRecv uint32 LastAckRecv uint32 // Metrics. PMTU uint32 RcvSsthresh uint32 RTT uint32 RTTVar uint32 SndSsthresh uint32 SndCwnd uint32 Advmss uint32 Reordering uint32 RcvRTT uint32 RcvSpace uint32 TotalRetrans uint32 PacingRate uint64 MaxPacingRate uint64 // BytesAcked is RFC4898 tcpEStatsAppHCThruOctetsAcked. BytesAcked uint64 // BytesReceived is RFC4898 tcpEStatsAppHCThruOctetsReceived. BytesReceived uint64 // SegsOut is RFC4898 tcpEStatsPerfSegsOut. SegsOut uint32 // SegsIn is RFC4898 tcpEStatsPerfSegsIn. SegsIn uint32 NotSentBytes uint32 MinRTT uint32 // DataSegsIn is RFC4898 tcpEStatsDataSegsIn. DataSegsIn uint32 // DataSegsOut is RFC4898 tcpEStatsDataSegsOut. DataSegsOut uint32 DeliveryRate uint64 // BusyTime is the time in microseconds busy sending data. BusyTime uint64 // RwndLimited is the time in microseconds limited by receive window. RwndLimited uint64 // SndBufLimited is the time in microseconds limited by send buffer. SndBufLimited uint64 } // SizeOfTCPInfo is the binary size of a TCPInfo struct (104 bytes). var SizeOfTCPInfo = binary.Size(TCPInfo{}) // Control message types, from linux/socket.h. const ( SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 ) // A ControlMessageHeader is the header for a socket control message. // // ControlMessageHeader represents struct cmsghdr from linux/socket.h. type ControlMessageHeader struct { Length uint64 Level int32 Type int32 } // SizeOfControlMessageHeader is the binary size of a ControlMessageHeader // struct. var SizeOfControlMessageHeader = int(binary.Size(ControlMessageHeader{})) // A ControlMessageCredentials is an SCM_CREDENTIALS socket control message. // // ControlMessageCredentials represents struct ucred from linux/socket.h. type ControlMessageCredentials struct { PID int32 UID uint32 GID uint32 } // SizeOfControlMessageCredentials is the binary size of a // ControlMessageCredentials struct. var SizeOfControlMessageCredentials = int(binary.Size(ControlMessageCredentials{})) // A ControlMessageRights is an SCM_RIGHTS socket control message. type ControlMessageRights []int32 // SizeOfControlMessageRight is the size of a single element in // ControlMessageRights. const SizeOfControlMessageRight = 4 // SCM_MAX_FD is the maximum number of FDs accepted in a single sendmsg call. // From net/scm.h. const SCM_MAX_FD = 253