github.com/nicocha30/gvisor-ligolo@v0.0.0-20230726075806-989fa2c0a413/pkg/sentry/inet/inet.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 inet defines semantics for IP stacks. 16 package inet 17 18 import ( 19 "time" 20 21 "github.com/nicocha30/gvisor-ligolo/pkg/abi/linux" 22 "github.com/nicocha30/gvisor-ligolo/pkg/tcpip" 23 "github.com/nicocha30/gvisor-ligolo/pkg/tcpip/stack" 24 ) 25 26 // Stack represents a TCP/IP stack. 27 type Stack interface { 28 // Interfaces returns all network interfaces as a mapping from interface 29 // indexes to interface properties. Interface indices are strictly positive 30 // integers. 31 Interfaces() map[int32]Interface 32 33 // RemoveInterface removes the specified network interface. 34 RemoveInterface(idx int32) error 35 36 // InterfaceAddrs returns all network interface addresses as a mapping from 37 // interface indexes to a slice of associated interface address properties. 38 InterfaceAddrs() map[int32][]InterfaceAddr 39 40 // AddInterfaceAddr adds an address to the network interface identified by 41 // idx. 42 AddInterfaceAddr(idx int32, addr InterfaceAddr) error 43 44 // RemoveInterfaceAddr removes an address from the network interface 45 // identified by idx. 46 RemoveInterfaceAddr(idx int32, addr InterfaceAddr) error 47 48 // SupportsIPv6 returns true if the stack supports IPv6 connectivity. 49 SupportsIPv6() bool 50 51 // TCPReceiveBufferSize returns TCP receive buffer size settings. 52 TCPReceiveBufferSize() (TCPBufferSize, error) 53 54 // SetTCPReceiveBufferSize attempts to change TCP receive buffer size 55 // settings. 56 SetTCPReceiveBufferSize(size TCPBufferSize) error 57 58 // TCPSendBufferSize returns TCP send buffer size settings. 59 TCPSendBufferSize() (TCPBufferSize, error) 60 61 // SetTCPSendBufferSize attempts to change TCP send buffer size settings. 62 SetTCPSendBufferSize(size TCPBufferSize) error 63 64 // TCPSACKEnabled returns true if RFC 2018 TCP Selective Acknowledgements 65 // are enabled. 66 TCPSACKEnabled() (bool, error) 67 68 // SetTCPSACKEnabled attempts to change TCP selective acknowledgement 69 // settings. 70 SetTCPSACKEnabled(enabled bool) error 71 72 // TCPRecovery returns the TCP loss detection algorithm. 73 TCPRecovery() (TCPLossRecovery, error) 74 75 // SetTCPRecovery attempts to change TCP loss detection algorithm. 76 SetTCPRecovery(recovery TCPLossRecovery) error 77 78 // Statistics reports stack statistics. 79 Statistics(stat any, arg string) error 80 81 // RouteTable returns the network stack's route table. 82 RouteTable() []Route 83 84 // Pause pauses the network stack before save. 85 Pause() 86 87 // Resume restarts the network stack after restore. 88 Resume() 89 90 // Destroy the network stack. 91 Destroy() 92 93 // RegisteredEndpoints returns all endpoints which are currently registered. 94 RegisteredEndpoints() []stack.TransportEndpoint 95 96 // CleanupEndpoints returns endpoints currently in the cleanup state. 97 CleanupEndpoints() []stack.TransportEndpoint 98 99 // RestoreCleanupEndpoints adds endpoints to cleanup tracking. This is useful 100 // for restoring a stack after a save. 101 RestoreCleanupEndpoints([]stack.TransportEndpoint) 102 103 // SetForwarding enables or disables packet forwarding between NICs. 104 SetForwarding(protocol tcpip.NetworkProtocolNumber, enable bool) error 105 106 // PortRange returns the UDP and TCP inclusive range of ephemeral ports 107 // used in both IPv4 and IPv6. 108 PortRange() (uint16, uint16) 109 110 // SetPortRange sets the UDP and TCP IPv4 and IPv6 ephemeral port range 111 // (inclusive). 112 SetPortRange(start uint16, end uint16) error 113 114 // GROTimeout returns the GRO timeout. 115 GROTimeout(NICID int32) (time.Duration, error) 116 117 // GROTimeout sets the GRO timeout. 118 SetGROTimeout(NICID int32, timeout time.Duration) error 119 } 120 121 // Interface contains information about a network interface. 122 type Interface struct { 123 // DeviceType is the device type, a Linux ARPHRD_* constant. 124 DeviceType uint16 125 126 // Flags is the device flags; see netdevice(7), under "Ioctls", 127 // "SIOCGIFFLAGS, SIOCSIFFLAGS". 128 Flags uint32 129 130 // Name is the device name. 131 Name string 132 133 // Addr is the hardware device address. 134 Addr []byte 135 136 // MTU is the maximum transmission unit. 137 MTU uint32 138 139 // Features are the device features queried from the host at 140 // stack creation time. These are immutable after startup. 141 Features []linux.EthtoolGetFeaturesBlock 142 } 143 144 // InterfaceAddr contains information about a network interface address. 145 type InterfaceAddr struct { 146 // Family is the address family, a Linux AF_* constant. 147 Family uint8 148 149 // PrefixLen is the address prefix length. 150 PrefixLen uint8 151 152 // Flags is the address flags. 153 Flags uint8 154 155 // Addr is the actual address. 156 Addr []byte 157 } 158 159 // TCPBufferSize contains settings controlling TCP buffer sizing. 160 // 161 // +stateify savable 162 type TCPBufferSize struct { 163 // Min is the minimum size. 164 Min int 165 166 // Default is the default size. 167 Default int 168 169 // Max is the maximum size. 170 Max int 171 } 172 173 // StatDev describes one line of /proc/net/dev, i.e., stats for one network 174 // interface. 175 type StatDev [16]uint64 176 177 // Route contains information about a network route. 178 type Route struct { 179 // Family is the address family, a Linux AF_* constant. 180 Family uint8 181 182 // DstLen is the length of the destination address. 183 DstLen uint8 184 185 // SrcLen is the length of the source address. 186 SrcLen uint8 187 188 // TOS is the Type of Service filter. 189 TOS uint8 190 191 // Table is the routing table ID. 192 Table uint8 193 194 // Protocol is the route origin, a Linux RTPROT_* constant. 195 Protocol uint8 196 197 // Scope is the distance to destination, a Linux RT_SCOPE_* constant. 198 Scope uint8 199 200 // Type is the route origin, a Linux RTN_* constant. 201 Type uint8 202 203 // Flags are route flags. See rtnetlink(7) under "rtm_flags". 204 Flags uint32 205 206 // DstAddr is the route destination address (RTA_DST). 207 DstAddr []byte 208 209 // SrcAddr is the route source address (RTA_SRC). 210 SrcAddr []byte 211 212 // OutputInterface is the output interface index (RTA_OIF). 213 OutputInterface int32 214 215 // GatewayAddr is the route gateway address (RTA_GATEWAY). 216 GatewayAddr []byte 217 } 218 219 // Below SNMP metrics are from Linux/usr/include/linux/snmp.h. 220 221 // StatSNMPIP describes Ip line of /proc/net/snmp. 222 type StatSNMPIP [19]uint64 223 224 // StatSNMPICMP describes Icmp line of /proc/net/snmp. 225 type StatSNMPICMP [27]uint64 226 227 // StatSNMPICMPMSG describes IcmpMsg line of /proc/net/snmp. 228 type StatSNMPICMPMSG [512]uint64 229 230 // StatSNMPTCP describes Tcp line of /proc/net/snmp. 231 type StatSNMPTCP [15]uint64 232 233 // StatSNMPUDP describes Udp line of /proc/net/snmp. 234 type StatSNMPUDP [8]uint64 235 236 // StatSNMPUDPLite describes UdpLite line of /proc/net/snmp. 237 type StatSNMPUDPLite [8]uint64 238 239 // TCPLossRecovery indicates TCP loss detection and recovery methods to use. 240 type TCPLossRecovery int32 241 242 // Loss recovery constants from include/net/tcp.h which are used to set 243 // /proc/sys/net/ipv4/tcp_recovery. 244 const ( 245 TCP_RACK_LOSS_DETECTION TCPLossRecovery = 1 << iota 246 TCP_RACK_STATIC_REO_WND 247 TCP_RACK_NO_DUPTHRESH 248 )