github.com/flowerwrong/netstack@v0.0.0-20191009141956-e5848263af28/tcpip/stack/registration.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 stack
    16  
    17  import (
    18  	"github.com/FlowerWrong/netstack/sleep"
    19  	"github.com/FlowerWrong/netstack/tcpip"
    20  	"github.com/FlowerWrong/netstack/tcpip/buffer"
    21  	"github.com/FlowerWrong/netstack/waiter"
    22  )
    23  
    24  // NetworkEndpointID is the identifier of a network layer protocol endpoint.
    25  // Currently the local address is sufficient because all supported protocols
    26  // (i.e., IPv4 and IPv6) have different sizes for their addresses.
    27  type NetworkEndpointID struct {
    28  	LocalAddress tcpip.Address
    29  }
    30  
    31  // TransportEndpointID is the identifier of a transport layer protocol endpoint.
    32  //
    33  // +stateify savable
    34  type TransportEndpointID struct {
    35  	// LocalPort is the local port associated with the endpoint.
    36  	LocalPort uint16
    37  
    38  	// LocalAddress is the local [network layer] address associated with
    39  	// the endpoint.
    40  	LocalAddress tcpip.Address
    41  
    42  	// RemotePort is the remote port associated with the endpoint.
    43  	RemotePort uint16
    44  
    45  	// RemoteAddress it the remote [network layer] address associated with
    46  	// the endpoint.
    47  	RemoteAddress tcpip.Address
    48  }
    49  
    50  // ControlType is the type of network control message.
    51  type ControlType int
    52  
    53  // The following are the allowed values for ControlType values.
    54  const (
    55  	ControlPacketTooBig ControlType = iota
    56  	ControlPortUnreachable
    57  	ControlUnknown
    58  )
    59  
    60  // TransportEndpoint is the interface that needs to be implemented by transport
    61  // protocol (e.g., tcp, udp) endpoints that can handle packets.
    62  type TransportEndpoint interface {
    63  	// HandlePacket is called by the stack when new packets arrive to
    64  	// this transport endpoint.
    65  	HandlePacket(r *Route, id TransportEndpointID, vv buffer.VectorisedView)
    66  
    67  	// HandleControlPacket is called by the stack when new control (e.g.,
    68  	// ICMP) packets arrive to this transport endpoint.
    69  	HandleControlPacket(id TransportEndpointID, typ ControlType, extra uint32, vv buffer.VectorisedView)
    70  }
    71  
    72  // RawTransportEndpoint is the interface that needs to be implemented by raw
    73  // transport protocol endpoints. RawTransportEndpoints receive the entire
    74  // packet - including the link, network, and transport headers - as delivered
    75  // to netstack.
    76  type RawTransportEndpoint interface {
    77  	// HandlePacket is called by the stack when new packets arrive to
    78  	// this transport endpoint. The packet contains all data from the link
    79  	// layer up.
    80  	HandlePacket(r *Route, netHeader buffer.View, packet buffer.VectorisedView)
    81  }
    82  
    83  // TransportProtocol is the interface that needs to be implemented by transport
    84  // protocols (e.g., tcp, udp) that want to be part of the networking stack.
    85  type TransportProtocol interface {
    86  	// Number returns the transport protocol number.
    87  	Number() tcpip.TransportProtocolNumber
    88  
    89  	// NewEndpoint creates a new endpoint of the transport protocol.
    90  	NewEndpoint(stack *Stack, netProto tcpip.NetworkProtocolNumber, waitQueue *waiter.Queue) (tcpip.Endpoint, *tcpip.Error)
    91  
    92  	// NewRawEndpoint creates a new raw endpoint of the transport protocol.
    93  	NewRawEndpoint(stack *Stack, netProto tcpip.NetworkProtocolNumber, waitQueue *waiter.Queue) (tcpip.Endpoint, *tcpip.Error)
    94  
    95  	// MinimumPacketSize returns the minimum valid packet size of this
    96  	// transport protocol. The stack automatically drops any packets smaller
    97  	// than this targeted at this protocol.
    98  	MinimumPacketSize() int
    99  
   100  	// ParsePorts returns the source and destination ports stored in a
   101  	// packet of this protocol.
   102  	ParsePorts(v buffer.View) (src, dst uint16, err *tcpip.Error)
   103  
   104  	// HandleUnknownDestinationPacket handles packets targeted at this
   105  	// protocol but that don't match any existing endpoint. For example,
   106  	// it is targeted at a port that have no listeners.
   107  	//
   108  	// The return value indicates whether the packet was well-formed (for
   109  	// stats purposes only).
   110  	HandleUnknownDestinationPacket(r *Route, id TransportEndpointID, netHeader buffer.View, vv buffer.VectorisedView) bool
   111  
   112  	// SetOption allows enabling/disabling protocol specific features.
   113  	// SetOption returns an error if the option is not supported or the
   114  	// provided option value is invalid.
   115  	SetOption(option interface{}) *tcpip.Error
   116  
   117  	// Option allows retrieving protocol specific option values.
   118  	// Option returns an error if the option is not supported or the
   119  	// provided option value is invalid.
   120  	Option(option interface{}) *tcpip.Error
   121  }
   122  
   123  // TransportDispatcher contains the methods used by the network stack to deliver
   124  // packets to the appropriate transport endpoint after it has been handled by
   125  // the network layer.
   126  type TransportDispatcher interface {
   127  	// DeliverTransportPacket delivers packets to the appropriate
   128  	// transport protocol endpoint. It also returns the network layer
   129  	// header for the enpoint to inspect or pass up the stack.
   130  	DeliverTransportPacket(r *Route, protocol tcpip.TransportProtocolNumber, netHeader buffer.View, vv buffer.VectorisedView)
   131  
   132  	// DeliverTransportControlPacket delivers control packets to the
   133  	// appropriate transport protocol endpoint.
   134  	DeliverTransportControlPacket(local, remote tcpip.Address, net tcpip.NetworkProtocolNumber, trans tcpip.TransportProtocolNumber, typ ControlType, extra uint32, vv buffer.VectorisedView)
   135  }
   136  
   137  // PacketLooping specifies where an outbound packet should be sent.
   138  type PacketLooping byte
   139  
   140  const (
   141  	// PacketOut indicates that the packet should be passed to the link
   142  	// endpoint.
   143  	PacketOut PacketLooping = 1 << iota
   144  
   145  	// PacketLoop indicates that the packet should be handled locally.
   146  	PacketLoop
   147  )
   148  
   149  // NetworkEndpoint is the interface that needs to be implemented by endpoints
   150  // of network layer protocols (e.g., ipv4, ipv6).
   151  type NetworkEndpoint interface {
   152  	// DefaultTTL is the default time-to-live value (or hop limit, in ipv6)
   153  	// for this endpoint.
   154  	DefaultTTL() uint8
   155  
   156  	// MTU is the maximum transmission unit for this endpoint. This is
   157  	// generally calculated as the MTU of the underlying data link endpoint
   158  	// minus the network endpoint max header length.
   159  	MTU() uint32
   160  
   161  	// Capabilities returns the set of capabilities supported by the
   162  	// underlying link-layer endpoint.
   163  	Capabilities() LinkEndpointCapabilities
   164  
   165  	// MaxHeaderLength returns the maximum size the network (and lower
   166  	// level layers combined) headers can have. Higher levels use this
   167  	// information to reserve space in the front of the packets they're
   168  	// building.
   169  	MaxHeaderLength() uint16
   170  
   171  	// WritePacket writes a packet to the given destination address and
   172  	// protocol.
   173  	WritePacket(r *Route, gso *GSO, hdr buffer.Prependable, payload buffer.VectorisedView, protocol tcpip.TransportProtocolNumber, ttl uint8, loop PacketLooping) *tcpip.Error
   174  
   175  	// WriteHeaderIncludedPacket writes a packet that includes a network
   176  	// header to the given destination address.
   177  	WriteHeaderIncludedPacket(r *Route, payload buffer.VectorisedView, loop PacketLooping) *tcpip.Error
   178  
   179  	// ID returns the network protocol endpoint ID.
   180  	ID() *NetworkEndpointID
   181  
   182  	// PrefixLen returns the network endpoint's subnet prefix length in bits.
   183  	PrefixLen() int
   184  
   185  	// NICID returns the id of the NIC this endpoint belongs to.
   186  	NICID() tcpip.NICID
   187  
   188  	// HandlePacket is called by the link layer when new packets arrive to
   189  	// this network endpoint.
   190  	HandlePacket(r *Route, vv buffer.VectorisedView)
   191  
   192  	// Close is called when the endpoint is reomved from a stack.
   193  	Close()
   194  }
   195  
   196  // NetworkProtocol is the interface that needs to be implemented by network
   197  // protocols (e.g., ipv4, ipv6) that want to be part of the networking stack.
   198  type NetworkProtocol interface {
   199  	// Number returns the network protocol number.
   200  	Number() tcpip.NetworkProtocolNumber
   201  
   202  	// MinimumPacketSize returns the minimum valid packet size of this
   203  	// network protocol. The stack automatically drops any packets smaller
   204  	// than this targeted at this protocol.
   205  	MinimumPacketSize() int
   206  
   207  	// DefaultPrefixLen returns the protocol's default prefix length.
   208  	DefaultPrefixLen() int
   209  
   210  	// ParsePorts returns the source and destination addresses stored in a
   211  	// packet of this protocol.
   212  	ParseAddresses(v buffer.View) (src, dst tcpip.Address)
   213  
   214  	// NewEndpoint creates a new endpoint of this protocol.
   215  	NewEndpoint(nicid tcpip.NICID, addrWithPrefix tcpip.AddressWithPrefix, linkAddrCache LinkAddressCache, dispatcher TransportDispatcher, sender LinkEndpoint) (NetworkEndpoint, *tcpip.Error)
   216  
   217  	// SetOption allows enabling/disabling protocol specific features.
   218  	// SetOption returns an error if the option is not supported or the
   219  	// provided option value is invalid.
   220  	SetOption(option interface{}) *tcpip.Error
   221  
   222  	// Option allows retrieving protocol specific option values.
   223  	// Option returns an error if the option is not supported or the
   224  	// provided option value is invalid.
   225  	Option(option interface{}) *tcpip.Error
   226  }
   227  
   228  // NetworkDispatcher contains the methods used by the network stack to deliver
   229  // packets to the appropriate network endpoint after it has been handled by
   230  // the data link layer.
   231  type NetworkDispatcher interface {
   232  	// DeliverNetworkPacket finds the appropriate network protocol
   233  	// endpoint and hands the packet over for further processing.
   234  	DeliverNetworkPacket(linkEP LinkEndpoint, remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, vv buffer.VectorisedView)
   235  }
   236  
   237  // LinkEndpointCapabilities is the type associated with the capabilities
   238  // supported by a link-layer endpoint. It is a set of bitfields.
   239  type LinkEndpointCapabilities uint
   240  
   241  // The following are the supported link endpoint capabilities.
   242  const (
   243  	CapabilityNone LinkEndpointCapabilities = 0
   244  	// CapabilityTXChecksumOffload indicates that the link endpoint supports
   245  	// checksum computation for outgoing packets and the stack can skip
   246  	// computing checksums when sending packets.
   247  	CapabilityTXChecksumOffload LinkEndpointCapabilities = 1 << iota
   248  	// CapabilityRXChecksumOffload indicates that the link endpoint supports
   249  	// checksum verification on received packets and that it's safe for the
   250  	// stack to skip checksum verification.
   251  	CapabilityRXChecksumOffload
   252  	CapabilityResolutionRequired
   253  	CapabilitySaveRestore
   254  	CapabilityDisconnectOk
   255  	CapabilityLoopback
   256  	CapabilityGSO
   257  )
   258  
   259  // LinkEndpoint is the interface implemented by data link layer protocols (e.g.,
   260  // ethernet, loopback, raw) and used by network layer protocols to send packets
   261  // out through the implementer's data link endpoint.
   262  type LinkEndpoint interface {
   263  	// MTU is the maximum transmission unit for this endpoint. This is
   264  	// usually dictated by the backing physical network; when such a
   265  	// physical network doesn't exist, the limit is generally 64k, which
   266  	// includes the maximum size of an IP packet.
   267  	MTU() uint32
   268  
   269  	// Capabilities returns the set of capabilities supported by the
   270  	// endpoint.
   271  	Capabilities() LinkEndpointCapabilities
   272  
   273  	// MaxHeaderLength returns the maximum size the data link (and
   274  	// lower level layers combined) headers can have. Higher levels use this
   275  	// information to reserve space in the front of the packets they're
   276  	// building.
   277  	MaxHeaderLength() uint16
   278  
   279  	// LinkAddress returns the link address (typically a MAC) of the
   280  	// link endpoint.
   281  	LinkAddress() tcpip.LinkAddress
   282  
   283  	// WritePacket writes a packet with the given protocol through the given
   284  	// route.
   285  	//
   286  	// To participate in transparent bridging, a LinkEndpoint implementation
   287  	// should call eth.Encode with header.EthernetFields.SrcAddr set to
   288  	// r.LocalLinkAddress if it is provided.
   289  	WritePacket(r *Route, gso *GSO, hdr buffer.Prependable, payload buffer.VectorisedView, protocol tcpip.NetworkProtocolNumber) *tcpip.Error
   290  
   291  	// Attach attaches the data link layer endpoint to the network-layer
   292  	// dispatcher of the stack.
   293  	Attach(dispatcher NetworkDispatcher)
   294  
   295  	// IsAttached returns whether a NetworkDispatcher is attached to the
   296  	// endpoint.
   297  	IsAttached() bool
   298  
   299  	// Wait waits for any worker goroutines owned by the endpoint to stop.
   300  	//
   301  	// For now, requesting that an endpoint's worker goroutine(s) stop is
   302  	// implementation specific.
   303  	//
   304  	// Wait will not block if the endpoint hasn't started any goroutines
   305  	// yet, even if it might later.
   306  	Wait()
   307  }
   308  
   309  // InjectableLinkEndpoint is a LinkEndpoint where inbound packets are
   310  // delivered via the Inject method.
   311  type InjectableLinkEndpoint interface {
   312  	LinkEndpoint
   313  
   314  	// Inject injects an inbound packet.
   315  	Inject(protocol tcpip.NetworkProtocolNumber, vv buffer.VectorisedView)
   316  
   317  	// WriteRawPacket writes a fully formed outbound packet directly to the link.
   318  	//
   319  	// dest is used by endpoints with multiple raw destinations.
   320  	WriteRawPacket(dest tcpip.Address, packet []byte) *tcpip.Error
   321  }
   322  
   323  // A LinkAddressResolver is an extension to a NetworkProtocol that
   324  // can resolve link addresses.
   325  type LinkAddressResolver interface {
   326  	// LinkAddressRequest sends a request for the LinkAddress of addr.
   327  	// The request is sent on linkEP with localAddr as the source.
   328  	//
   329  	// A valid response will cause the discovery protocol's network
   330  	// endpoint to call AddLinkAddress.
   331  	LinkAddressRequest(addr, localAddr tcpip.Address, linkEP LinkEndpoint) *tcpip.Error
   332  
   333  	// ResolveStaticAddress attempts to resolve address without sending
   334  	// requests. It either resolves the name immediately or returns the
   335  	// empty LinkAddress.
   336  	//
   337  	// It can be used to resolve broadcast addresses for example.
   338  	ResolveStaticAddress(addr tcpip.Address) (tcpip.LinkAddress, bool)
   339  
   340  	// LinkAddressProtocol returns the network protocol of the
   341  	// addresses this this resolver can resolve.
   342  	LinkAddressProtocol() tcpip.NetworkProtocolNumber
   343  }
   344  
   345  // A LinkAddressCache caches link addresses.
   346  type LinkAddressCache interface {
   347  	// CheckLocalAddress determines if the given local address exists, and if it
   348  	// does not exist.
   349  	CheckLocalAddress(nicid tcpip.NICID, protocol tcpip.NetworkProtocolNumber, addr tcpip.Address) tcpip.NICID
   350  
   351  	// AddLinkAddress adds a link address to the cache.
   352  	AddLinkAddress(nicid tcpip.NICID, addr tcpip.Address, linkAddr tcpip.LinkAddress)
   353  
   354  	// GetLinkAddress looks up the cache to translate address to link address (e.g. IP -> MAC).
   355  	// If the LinkEndpoint requests address resolution and there is a LinkAddressResolver
   356  	// registered with the network protocol, the cache attempts to resolve the address
   357  	// and returns ErrWouldBlock. Waker is notified when address resolution is
   358  	// complete (success or not).
   359  	//
   360  	// If address resolution is required, ErrNoLinkAddress and a notification channel is
   361  	// returned for the top level caller to block. Channel is closed once address resolution
   362  	// is complete (success or not).
   363  	GetLinkAddress(nicid tcpip.NICID, addr, localAddr tcpip.Address, protocol tcpip.NetworkProtocolNumber, w *sleep.Waker) (tcpip.LinkAddress, <-chan struct{}, *tcpip.Error)
   364  
   365  	// RemoveWaker removes a waker that has been added in GetLinkAddress().
   366  	RemoveWaker(nicid tcpip.NICID, addr tcpip.Address, waker *sleep.Waker)
   367  }
   368  
   369  // UnassociatedEndpointFactory produces endpoints for writing packets not
   370  // associated with a particular transport protocol. Such endpoints can be used
   371  // to write arbitrary packets that include the IP header.
   372  type UnassociatedEndpointFactory interface {
   373  	NewUnassociatedRawEndpoint(stack *Stack, netProto tcpip.NetworkProtocolNumber, transProto tcpip.TransportProtocolNumber, waiterQueue *waiter.Queue) (tcpip.Endpoint, *tcpip.Error)
   374  }
   375  
   376  // GSOType is the type of GSO segments.
   377  //
   378  // +stateify savable
   379  type GSOType int
   380  
   381  // Types of gso segments.
   382  const (
   383  	GSONone GSOType = iota
   384  	GSOTCPv4
   385  	GSOTCPv6
   386  )
   387  
   388  // GSO contains generic segmentation offload properties.
   389  //
   390  // +stateify savable
   391  type GSO struct {
   392  	// Type is one of GSONone, GSOTCPv4, etc.
   393  	Type GSOType
   394  	// NeedsCsum is set if the checksum offload is enabled.
   395  	NeedsCsum bool
   396  	// CsumOffset is offset after that to place checksum.
   397  	CsumOffset uint16
   398  
   399  	// Mss is maximum segment size.
   400  	MSS uint16
   401  	// L3Len is L3 (IP) header length.
   402  	L3HdrLen uint16
   403  
   404  	// MaxSize is maximum GSO packet size.
   405  	MaxSize uint32
   406  }
   407  
   408  // GSOEndpoint provides access to GSO properties.
   409  type GSOEndpoint interface {
   410  	// GSOMaxSize returns the maximum GSO packet size.
   411  	GSOMaxSize() uint32
   412  }