github.com/nicocha30/gvisor-ligolo@v0.0.0-20230726075806-989fa2c0a413/pkg/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 "fmt" 19 "time" 20 21 "github.com/nicocha30/gvisor-ligolo/pkg/buffer" 22 "github.com/nicocha30/gvisor-ligolo/pkg/tcpip" 23 "github.com/nicocha30/gvisor-ligolo/pkg/tcpip/header" 24 "github.com/nicocha30/gvisor-ligolo/pkg/waiter" 25 ) 26 27 // NetworkEndpointID is the identifier of a network layer protocol endpoint. 28 // Currently the local address is sufficient because all supported protocols 29 // (i.e., IPv4 and IPv6) have different sizes for their addresses. 30 type NetworkEndpointID struct { 31 LocalAddress tcpip.Address 32 } 33 34 // TransportEndpointID is the identifier of a transport layer protocol endpoint. 35 // 36 // +stateify savable 37 type TransportEndpointID struct { 38 // LocalPort is the local port associated with the endpoint. 39 LocalPort uint16 40 41 // LocalAddress is the local [network layer] address associated with 42 // the endpoint. 43 LocalAddress tcpip.Address 44 45 // RemotePort is the remote port associated with the endpoint. 46 RemotePort uint16 47 48 // RemoteAddress it the remote [network layer] address associated with 49 // the endpoint. 50 RemoteAddress tcpip.Address 51 } 52 53 // NetworkPacketInfo holds information about a network layer packet. 54 // 55 // +stateify savable 56 type NetworkPacketInfo struct { 57 // LocalAddressBroadcast is true if the packet's local address is a broadcast 58 // address. 59 LocalAddressBroadcast bool 60 61 // IsForwardedPacket is true if the packet is being forwarded. 62 IsForwardedPacket bool 63 } 64 65 // TransportErrorKind enumerates error types that are handled by the transport 66 // layer. 67 type TransportErrorKind int 68 69 const ( 70 // PacketTooBigTransportError indicates that a packet did not reach its 71 // destination because a link on the path to the destination had an MTU that 72 // was too small to carry the packet. 73 PacketTooBigTransportError TransportErrorKind = iota 74 75 // DestinationHostUnreachableTransportError indicates that the destination 76 // host was unreachable. 77 DestinationHostUnreachableTransportError 78 79 // DestinationPortUnreachableTransportError indicates that a packet reached 80 // the destination host, but the transport protocol was not active on the 81 // destination port. 82 DestinationPortUnreachableTransportError 83 84 // DestinationNetworkUnreachableTransportError indicates that the destination 85 // network was unreachable. 86 DestinationNetworkUnreachableTransportError 87 88 // DestinationProtoUnreachableTransportError indicates that the destination 89 // protocol was unreachable. 90 DestinationProtoUnreachableTransportError 91 92 // SourceRouteFailedTransportError indicates that the source route failed. 93 SourceRouteFailedTransportError 94 95 // SourceHostIsolatedTransportError indicates that the source machine is not 96 // on the network. 97 SourceHostIsolatedTransportError 98 99 // DestinationHostDownTransportError indicates that the destination host is 100 // down. 101 DestinationHostDownTransportError 102 ) 103 104 // TransportError is a marker interface for errors that may be handled by the 105 // transport layer. 106 type TransportError interface { 107 tcpip.SockErrorCause 108 109 // Kind returns the type of the transport error. 110 Kind() TransportErrorKind 111 } 112 113 // TransportEndpoint is the interface that needs to be implemented by transport 114 // protocol (e.g., tcp, udp) endpoints that can handle packets. 115 type TransportEndpoint interface { 116 // UniqueID returns an unique ID for this transport endpoint. 117 UniqueID() uint64 118 119 // HandlePacket is called by the stack when new packets arrive to this 120 // transport endpoint. It sets the packet buffer's transport header. 121 // 122 // HandlePacket may modify the packet. 123 HandlePacket(TransportEndpointID, PacketBufferPtr) 124 125 // HandleError is called when the transport endpoint receives an error. 126 // 127 // HandleError takes may modify the packet buffer. 128 HandleError(TransportError, PacketBufferPtr) 129 130 // Abort initiates an expedited endpoint teardown. It puts the endpoint 131 // in a closed state and frees all resources associated with it. This 132 // cleanup may happen asynchronously. Wait can be used to block on this 133 // asynchronous cleanup. 134 Abort() 135 136 // Wait waits for any worker goroutines owned by the endpoint to stop. 137 // 138 // An endpoint can be requested to stop its worker goroutines by calling 139 // its Close method. 140 // 141 // Wait will not block if the endpoint hasn't started any goroutines 142 // yet, even if it might later. 143 Wait() 144 } 145 146 // RawTransportEndpoint is the interface that needs to be implemented by raw 147 // transport protocol endpoints. RawTransportEndpoints receive the entire 148 // packet - including the network and transport headers - as delivered to 149 // netstack. 150 type RawTransportEndpoint interface { 151 // HandlePacket is called by the stack when new packets arrive to 152 // this transport endpoint. The packet contains all data from the link 153 // layer up. 154 // 155 // HandlePacket may modify the packet. 156 HandlePacket(PacketBufferPtr) 157 } 158 159 // PacketEndpoint is the interface that needs to be implemented by packet 160 // transport protocol endpoints. These endpoints receive link layer headers in 161 // addition to whatever they contain (usually network and transport layer 162 // headers and a payload). 163 type PacketEndpoint interface { 164 // HandlePacket is called by the stack when new packets arrive that 165 // match the endpoint. 166 // 167 // Implementers should treat packet as immutable and should copy it 168 // before before modification. 169 // 170 // linkHeader may have a length of 0, in which case the PacketEndpoint 171 // should construct its own ethernet header for applications. 172 // 173 // HandlePacket may modify pkt. 174 HandlePacket(nicID tcpip.NICID, netProto tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) 175 } 176 177 // UnknownDestinationPacketDisposition enumerates the possible return values from 178 // HandleUnknownDestinationPacket(). 179 type UnknownDestinationPacketDisposition int 180 181 const ( 182 // UnknownDestinationPacketMalformed denotes that the packet was malformed 183 // and no further processing should be attempted other than updating 184 // statistics. 185 UnknownDestinationPacketMalformed UnknownDestinationPacketDisposition = iota 186 187 // UnknownDestinationPacketUnhandled tells the caller that the packet was 188 // well formed but that the issue was not handled and the stack should take 189 // the default action. 190 UnknownDestinationPacketUnhandled 191 192 // UnknownDestinationPacketHandled tells the caller that it should do 193 // no further processing. 194 UnknownDestinationPacketHandled 195 ) 196 197 // TransportProtocol is the interface that needs to be implemented by transport 198 // protocols (e.g., tcp, udp) that want to be part of the networking stack. 199 type TransportProtocol interface { 200 // Number returns the transport protocol number. 201 Number() tcpip.TransportProtocolNumber 202 203 // NewEndpoint creates a new endpoint of the transport protocol. 204 NewEndpoint(netProto tcpip.NetworkProtocolNumber, waitQueue *waiter.Queue) (tcpip.Endpoint, tcpip.Error) 205 206 // NewRawEndpoint creates a new raw endpoint of the transport protocol. 207 NewRawEndpoint(netProto tcpip.NetworkProtocolNumber, waitQueue *waiter.Queue) (tcpip.Endpoint, tcpip.Error) 208 209 // MinimumPacketSize returns the minimum valid packet size of this 210 // transport protocol. The stack automatically drops any packets smaller 211 // than this targeted at this protocol. 212 MinimumPacketSize() int 213 214 // ParsePorts returns the source and destination ports stored in a 215 // packet of this protocol. 216 ParsePorts(b []byte) (src, dst uint16, err tcpip.Error) 217 218 // HandleUnknownDestinationPacket handles packets targeted at this 219 // protocol that don't match any existing endpoint. For example, 220 // it is targeted at a port that has no listeners. 221 // 222 // HandleUnknownDestinationPacket may modify the packet if it handles 223 // the issue. 224 HandleUnknownDestinationPacket(TransportEndpointID, PacketBufferPtr) UnknownDestinationPacketDisposition 225 226 // SetOption allows enabling/disabling protocol specific features. 227 // SetOption returns an error if the option is not supported or the 228 // provided option value is invalid. 229 SetOption(option tcpip.SettableTransportProtocolOption) tcpip.Error 230 231 // Option allows retrieving protocol specific option values. 232 // Option returns an error if the option is not supported or the 233 // provided option value is invalid. 234 Option(option tcpip.GettableTransportProtocolOption) tcpip.Error 235 236 // Close requests that any worker goroutines owned by the protocol 237 // stop. 238 Close() 239 240 // Wait waits for any worker goroutines owned by the protocol to stop. 241 Wait() 242 243 // Pause requests that any protocol level background workers pause. 244 Pause() 245 246 // Resume resumes any protocol level background workers that were 247 // previously paused by Pause. 248 Resume() 249 250 // Parse sets pkt.TransportHeader and trims pkt.Data appropriately. It does 251 // neither and returns false if pkt.Data is too small, i.e. pkt.Data.Size() < 252 // MinimumPacketSize() 253 Parse(pkt PacketBufferPtr) (ok bool) 254 } 255 256 // TransportPacketDisposition is the result from attempting to deliver a packet 257 // to the transport layer. 258 type TransportPacketDisposition int 259 260 const ( 261 // TransportPacketHandled indicates that a transport packet was handled by the 262 // transport layer and callers need not take any further action. 263 TransportPacketHandled TransportPacketDisposition = iota 264 265 // TransportPacketProtocolUnreachable indicates that the transport 266 // protocol requested in the packet is not supported. 267 TransportPacketProtocolUnreachable 268 269 // TransportPacketDestinationPortUnreachable indicates that there weren't any 270 // listeners interested in the packet and the transport protocol has no means 271 // to notify the sender. 272 TransportPacketDestinationPortUnreachable 273 ) 274 275 // TransportDispatcher contains the methods used by the network stack to deliver 276 // packets to the appropriate transport endpoint after it has been handled by 277 // the network layer. 278 type TransportDispatcher interface { 279 // DeliverTransportPacket delivers packets to the appropriate 280 // transport protocol endpoint. 281 // 282 // pkt.NetworkHeader must be set before calling DeliverTransportPacket. 283 // 284 // DeliverTransportPacket may modify the packet. 285 DeliverTransportPacket(tcpip.TransportProtocolNumber, PacketBufferPtr) TransportPacketDisposition 286 287 // DeliverTransportError delivers an error to the appropriate transport 288 // endpoint. 289 // 290 // DeliverTransportError may modify the packet buffer. 291 DeliverTransportError(local, remote tcpip.Address, _ tcpip.NetworkProtocolNumber, _ tcpip.TransportProtocolNumber, _ TransportError, _ PacketBufferPtr) 292 293 // DeliverRawPacket delivers a packet to any subscribed raw sockets. 294 // 295 // DeliverRawPacket does NOT take ownership of the packet buffer. 296 DeliverRawPacket(tcpip.TransportProtocolNumber, PacketBufferPtr) 297 } 298 299 // PacketLooping specifies where an outbound packet should be sent. 300 type PacketLooping byte 301 302 const ( 303 // PacketOut indicates that the packet should be passed to the link 304 // endpoint. 305 PacketOut PacketLooping = 1 << iota 306 307 // PacketLoop indicates that the packet should be handled locally. 308 PacketLoop 309 ) 310 311 // NetworkHeaderParams are the header parameters given as input by the 312 // transport endpoint to the network. 313 type NetworkHeaderParams struct { 314 // Protocol refers to the transport protocol number. 315 Protocol tcpip.TransportProtocolNumber 316 317 // TTL refers to Time To Live field of the IP-header. 318 TTL uint8 319 320 // TOS refers to TypeOfService or TrafficClass field of the IP-header. 321 TOS uint8 322 } 323 324 // GroupAddressableEndpoint is an endpoint that supports group addressing. 325 // 326 // An endpoint is considered to support group addressing when one or more 327 // endpoints may associate themselves with the same identifier (group address). 328 type GroupAddressableEndpoint interface { 329 // JoinGroup joins the specified group. 330 JoinGroup(group tcpip.Address) tcpip.Error 331 332 // LeaveGroup attempts to leave the specified group. 333 LeaveGroup(group tcpip.Address) tcpip.Error 334 335 // IsInGroup returns true if the endpoint is a member of the specified group. 336 IsInGroup(group tcpip.Address) bool 337 } 338 339 // PrimaryEndpointBehavior is an enumeration of an AddressEndpoint's primary 340 // behavior. 341 type PrimaryEndpointBehavior int 342 343 const ( 344 // CanBePrimaryEndpoint indicates the endpoint can be used as a primary 345 // endpoint for new connections with no local address. 346 CanBePrimaryEndpoint PrimaryEndpointBehavior = iota 347 348 // FirstPrimaryEndpoint indicates the endpoint should be the first 349 // primary endpoint considered. If there are multiple endpoints with 350 // this behavior, they are ordered by recency. 351 FirstPrimaryEndpoint 352 353 // NeverPrimaryEndpoint indicates the endpoint should never be a 354 // primary endpoint. 355 NeverPrimaryEndpoint 356 ) 357 358 func (peb PrimaryEndpointBehavior) String() string { 359 switch peb { 360 case CanBePrimaryEndpoint: 361 return "CanBePrimaryEndpoint" 362 case FirstPrimaryEndpoint: 363 return "FirstPrimaryEndpoint" 364 case NeverPrimaryEndpoint: 365 return "NeverPrimaryEndpoint" 366 default: 367 panic(fmt.Sprintf("unknown primary endpoint behavior: %d", peb)) 368 } 369 } 370 371 // AddressConfigType is the method used to add an address. 372 type AddressConfigType int 373 374 const ( 375 // AddressConfigStatic is a statically configured address endpoint that was 376 // added by some user-specified action (adding an explicit address, joining a 377 // multicast group). 378 AddressConfigStatic AddressConfigType = iota 379 380 // AddressConfigSlaac is an address endpoint added by SLAAC, as per RFC 4862 381 // section 5.5.3. 382 AddressConfigSlaac 383 ) 384 385 // AddressLifetimes encodes an address' preferred and valid lifetimes, as well 386 // as if the address is deprecated. 387 type AddressLifetimes struct { 388 // Deprecated is whether the address is deprecated. 389 Deprecated bool 390 391 // PreferredUntil is the time at which the address will be deprecated. 392 // 393 // Note that for certain addresses, deprecating the address at the 394 // PreferredUntil time is not handled as a scheduled job by the stack, but 395 // is information provided by the owner as an indication of when it will 396 // deprecate the address. 397 // 398 // PreferredUntil should be ignored if Deprecated is true. If Deprecated 399 // is false, and PreferredUntil is the zero value, no information about 400 // the preferred lifetime can be inferred. 401 PreferredUntil tcpip.MonotonicTime 402 403 // ValidUntil is the time at which the address will be invalidated. 404 // 405 // Note that for certain addresses, invalidating the address at the 406 // ValidUntil time is not handled as a scheduled job by the stack, but 407 // is information provided by the owner as an indication of when it will 408 // invalidate the address. 409 // 410 // If ValidUntil is the zero value, no information about the valid lifetime 411 // can be inferred. 412 ValidUntil tcpip.MonotonicTime 413 } 414 415 // AddressProperties contains additional properties that can be configured when 416 // adding an address. 417 type AddressProperties struct { 418 PEB PrimaryEndpointBehavior 419 ConfigType AddressConfigType 420 // Lifetimes encodes the address' lifetimes. 421 // 422 // Lifetimes.PreferredUntil and Lifetimes.ValidUntil are informational, i.e. 423 // the stack will not deprecated nor invalidate the address upon reaching 424 // these timestamps. 425 // 426 // If Lifetimes.Deprecated is true, the address will be added as deprecated. 427 Lifetimes AddressLifetimes 428 // Temporary is as defined in RFC 4941, but applies not only to addresses 429 // added via SLAAC, e.g. DHCPv6 can also add temporary addresses. Temporary 430 // addresses are short-lived and are not to be valid (or preferred) 431 // forever; hence the term temporary. 432 Temporary bool 433 Disp AddressDispatcher 434 } 435 436 // AddressAssignmentState is an address' assignment state. 437 type AddressAssignmentState int 438 439 const ( 440 _ AddressAssignmentState = iota 441 442 // AddressDisabled indicates the NIC the address is assigned to is disabled. 443 AddressDisabled 444 445 // AddressTentative indicates an address is yet to pass DAD (IPv4 addresses 446 // are never tentative). 447 AddressTentative 448 449 // AddressAssigned indicates an address is assigned. 450 AddressAssigned 451 ) 452 453 func (state AddressAssignmentState) String() string { 454 switch state { 455 case AddressDisabled: 456 return "Disabled" 457 case AddressTentative: 458 return "Tentative" 459 case AddressAssigned: 460 return "Assigned" 461 default: 462 panic(fmt.Sprintf("unknown address assignment state: %d", state)) 463 } 464 } 465 466 // AddressRemovalReason is the reason an address was removed. 467 type AddressRemovalReason int 468 469 const ( 470 _ AddressRemovalReason = iota 471 472 // AddressRemovalManualAction indicates the address was removed explicitly 473 // using the stack API. 474 AddressRemovalManualAction 475 476 // AddressRemovalInterfaceRemoved indicates the address was removed because 477 // the NIC it is assigned to was removed. 478 AddressRemovalInterfaceRemoved 479 480 // AddressRemovalDADFailed indicates the address was removed because DAD 481 // failed. 482 AddressRemovalDADFailed 483 484 // AddressRemovalInvalidated indicates the address was removed because it 485 // was invalidated. 486 AddressRemovalInvalidated 487 ) 488 489 func (reason AddressRemovalReason) String() string { 490 switch reason { 491 case AddressRemovalManualAction: 492 return "ManualAction" 493 case AddressRemovalInterfaceRemoved: 494 return "InterfaceRemoved" 495 case AddressRemovalDADFailed: 496 return "DADFailed" 497 case AddressRemovalInvalidated: 498 return "Invalidated" 499 default: 500 panic(fmt.Sprintf("unknown address removal reason: %d", reason)) 501 } 502 } 503 504 // AddressDispatcher is the interface integrators can implement to receive 505 // address-related events. 506 type AddressDispatcher interface { 507 // OnChanged is called with an address' properties when they change. 508 // 509 // OnChanged is called once when the address is added with the initial state, 510 // and every time a property changes. 511 // 512 // The PreferredUntil and ValidUntil fields in AddressLifetimes must be 513 // considered informational, i.e. one must not consider an address to be 514 // deprecated/invalid even if the monotonic clock timestamp is past these 515 // deadlines. The Deprecated field indicates whether an address is 516 // preferred or not; and OnRemoved will be called when an address is 517 // removed due to invalidation. 518 OnChanged(AddressLifetimes, AddressAssignmentState) 519 520 // OnRemoved is called when an address is removed with the removal reason. 521 OnRemoved(AddressRemovalReason) 522 } 523 524 // AssignableAddressEndpoint is a reference counted address endpoint that may be 525 // assigned to a NetworkEndpoint. 526 type AssignableAddressEndpoint interface { 527 // AddressWithPrefix returns the endpoint's address. 528 AddressWithPrefix() tcpip.AddressWithPrefix 529 530 // Subnet returns the subnet of the endpoint's address. 531 Subnet() tcpip.Subnet 532 533 // IsAssigned returns whether or not the endpoint is considered bound 534 // to its NetworkEndpoint. 535 IsAssigned(allowExpired bool) bool 536 537 // IncRef increments this endpoint's reference count. 538 // 539 // Returns true if it was successfully incremented. If it returns false, then 540 // the endpoint is considered expired and should no longer be used. 541 IncRef() bool 542 543 // DecRef decrements this endpoint's reference count. 544 DecRef() 545 } 546 547 // AddressEndpoint is an endpoint representing an address assigned to an 548 // AddressableEndpoint. 549 type AddressEndpoint interface { 550 AssignableAddressEndpoint 551 552 // GetKind returns the address kind for this endpoint. 553 GetKind() AddressKind 554 555 // SetKind sets the address kind for this endpoint. 556 SetKind(AddressKind) 557 558 // ConfigType returns the method used to add the address. 559 ConfigType() AddressConfigType 560 561 // Deprecated returns whether or not this endpoint is deprecated. 562 Deprecated() bool 563 564 // SetDeprecated sets this endpoint's deprecated status. 565 SetDeprecated(bool) 566 567 // Lifetimes returns this endpoint's lifetimes. 568 Lifetimes() AddressLifetimes 569 570 // SetLifetimes sets this endpoint's lifetimes. 571 // 572 // Note that setting preferred-until and valid-until times do not result in 573 // deprecation/invalidation jobs to be scheduled by the stack. 574 SetLifetimes(AddressLifetimes) 575 576 // Temporary returns whether or not this endpoint is temporary. 577 Temporary() bool 578 579 // RegisterDispatcher registers an address dispatcher. 580 // 581 // OnChanged will be called immediately on the provided address dispatcher 582 // with this endpoint's current state. 583 RegisterDispatcher(AddressDispatcher) 584 } 585 586 // AddressKind is the kind of an address. 587 // 588 // See the values of AddressKind for more details. 589 type AddressKind int 590 591 const ( 592 // PermanentTentative is a permanent address endpoint that is not yet 593 // considered to be fully bound to an interface in the traditional 594 // sense. That is, the address is associated with a NIC, but packets 595 // destined to the address MUST NOT be accepted and MUST be silently 596 // dropped, and the address MUST NOT be used as a source address for 597 // outgoing packets. For IPv6, addresses are of this kind until NDP's 598 // Duplicate Address Detection (DAD) resolves. If DAD fails, the address 599 // is removed. 600 PermanentTentative AddressKind = iota 601 602 // Permanent is a permanent endpoint (vs. a temporary one) assigned to the 603 // NIC. Its reference count is biased by 1 to avoid removal when no route 604 // holds a reference to it. It is removed by explicitly removing the address 605 // from the NIC. 606 Permanent 607 608 // PermanentExpired is a permanent endpoint that had its address removed from 609 // the NIC, and it is waiting to be removed once no references to it are held. 610 // 611 // If the address is re-added before the endpoint is removed, its type 612 // changes back to Permanent. 613 PermanentExpired 614 615 // Temporary is an endpoint, created on a one-off basis to temporarily 616 // consider the NIC bound an an address that it is not explicitly bound to 617 // (such as a permanent address). Its reference count must not be biased by 1 618 // so that the address is removed immediately when references to it are no 619 // longer held. 620 // 621 // A temporary endpoint may be promoted to permanent if the address is added 622 // permanently. 623 Temporary 624 ) 625 626 // IsPermanent returns true if the AddressKind represents a permanent address. 627 func (k AddressKind) IsPermanent() bool { 628 switch k { 629 case Permanent, PermanentTentative: 630 return true 631 case Temporary, PermanentExpired: 632 return false 633 default: 634 panic(fmt.Sprintf("unrecognized address kind = %d", k)) 635 } 636 } 637 638 // AddressableEndpoint is an endpoint that supports addressing. 639 // 640 // An endpoint is considered to support addressing when the endpoint may 641 // associate itself with an identifier (address). 642 type AddressableEndpoint interface { 643 // AddAndAcquirePermanentAddress adds the passed permanent address. 644 // 645 // Returns *tcpip.ErrDuplicateAddress if the address exists. 646 // 647 // Acquires and returns the AddressEndpoint for the added address. 648 AddAndAcquirePermanentAddress(addr tcpip.AddressWithPrefix, properties AddressProperties) (AddressEndpoint, tcpip.Error) 649 650 // RemovePermanentAddress removes the passed address if it is a permanent 651 // address. 652 // 653 // Returns *tcpip.ErrBadLocalAddress if the endpoint does not have the passed 654 // permanent address. 655 RemovePermanentAddress(addr tcpip.Address) tcpip.Error 656 657 // SetLifetimes sets an address' lifetimes (strictly informational) and 658 // whether it should be deprecated or preferred. 659 // 660 // Returns *tcpip.ErrBadLocalAddress if the endpoint does not have the passed 661 // address. 662 SetLifetimes(addr tcpip.Address, lifetimes AddressLifetimes) tcpip.Error 663 664 // MainAddress returns the endpoint's primary permanent address. 665 MainAddress() tcpip.AddressWithPrefix 666 667 // AcquireAssignedAddress returns an address endpoint for the passed address 668 // that is considered bound to the endpoint, optionally creating a temporary 669 // endpoint if requested and no existing address exists. 670 // 671 // The returned endpoint's reference count is incremented. 672 // 673 // Returns nil if the specified address is not local to this endpoint. 674 AcquireAssignedAddress(localAddr tcpip.Address, allowTemp bool, tempPEB PrimaryEndpointBehavior) AddressEndpoint 675 676 // AcquireOutgoingPrimaryAddress returns a primary address that may be used as 677 // a source address when sending packets to the passed remote address. 678 // 679 // If allowExpired is true, expired addresses may be returned. 680 // 681 // The returned endpoint's reference count is incremented. 682 // 683 // Returns nil if a primary address is not available. 684 AcquireOutgoingPrimaryAddress(remoteAddr tcpip.Address, allowExpired bool) AddressEndpoint 685 686 // PrimaryAddresses returns the primary addresses. 687 PrimaryAddresses() []tcpip.AddressWithPrefix 688 689 // PermanentAddresses returns all the permanent addresses. 690 PermanentAddresses() []tcpip.AddressWithPrefix 691 } 692 693 // NDPEndpoint is a network endpoint that supports NDP. 694 type NDPEndpoint interface { 695 NetworkEndpoint 696 697 // InvalidateDefaultRouter invalidates a default router discovered through 698 // NDP. 699 InvalidateDefaultRouter(tcpip.Address) 700 } 701 702 // NetworkInterface is a network interface. 703 type NetworkInterface interface { 704 NetworkLinkEndpoint 705 706 // ID returns the interface's ID. 707 ID() tcpip.NICID 708 709 // IsLoopback returns true if the interface is a loopback interface. 710 IsLoopback() bool 711 712 // Name returns the name of the interface. 713 // 714 // May return an empty string if the interface is not configured with a name. 715 Name() string 716 717 // Enabled returns true if the interface is enabled. 718 Enabled() bool 719 720 // Promiscuous returns true if the interface is in promiscuous mode. 721 // 722 // When in promiscuous mode, the interface should accept all packets. 723 Promiscuous() bool 724 725 // Spoofing returns true if the interface is in spoofing mode. 726 // 727 // When in spoofing mode, the interface should consider all addresses as 728 // assigned to it. 729 Spoofing() bool 730 731 // PrimaryAddress returns the primary address associated with the interface. 732 // 733 // PrimaryAddress will return the first non-deprecated address if such an 734 // address exists. If no non-deprecated addresses exist, the first deprecated 735 // address will be returned. If no deprecated addresses exist, the zero value 736 // will be returned. 737 PrimaryAddress(tcpip.NetworkProtocolNumber) (tcpip.AddressWithPrefix, tcpip.Error) 738 739 // CheckLocalAddress returns true if the address exists on the interface. 740 CheckLocalAddress(tcpip.NetworkProtocolNumber, tcpip.Address) bool 741 742 // WritePacketToRemote writes the packet to the given remote link address. 743 WritePacketToRemote(tcpip.LinkAddress, PacketBufferPtr) tcpip.Error 744 745 // WritePacket writes a packet through the given route. 746 // 747 // WritePacket may modify the packet buffer. The packet buffer's 748 // network and transport header must be set. 749 WritePacket(*Route, PacketBufferPtr) tcpip.Error 750 751 // HandleNeighborProbe processes an incoming neighbor probe (e.g. ARP 752 // request or NDP Neighbor Solicitation). 753 // 754 // HandleNeighborProbe assumes that the probe is valid for the network 755 // interface the probe was received on. 756 HandleNeighborProbe(tcpip.NetworkProtocolNumber, tcpip.Address, tcpip.LinkAddress) tcpip.Error 757 758 // HandleNeighborConfirmation processes an incoming neighbor confirmation 759 // (e.g. ARP reply or NDP Neighbor Advertisement). 760 HandleNeighborConfirmation(tcpip.NetworkProtocolNumber, tcpip.Address, tcpip.LinkAddress, ReachabilityConfirmationFlags) tcpip.Error 761 } 762 763 // LinkResolvableNetworkEndpoint handles link resolution events. 764 type LinkResolvableNetworkEndpoint interface { 765 // HandleLinkResolutionFailure is called when link resolution prevents the 766 // argument from having been sent. 767 HandleLinkResolutionFailure(PacketBufferPtr) 768 } 769 770 // NetworkEndpoint is the interface that needs to be implemented by endpoints 771 // of network layer protocols (e.g., ipv4, ipv6). 772 type NetworkEndpoint interface { 773 // Enable enables the endpoint. 774 // 775 // Must only be called when the stack is in a state that allows the endpoint 776 // to send and receive packets. 777 // 778 // Returns *tcpip.ErrNotPermitted if the endpoint cannot be enabled. 779 Enable() tcpip.Error 780 781 // Enabled returns true if the endpoint is enabled. 782 Enabled() bool 783 784 // Disable disables the endpoint. 785 Disable() 786 787 // DefaultTTL is the default time-to-live value (or hop limit, in ipv6) 788 // for this endpoint. 789 DefaultTTL() uint8 790 791 // MTU is the maximum transmission unit for this endpoint. This is 792 // generally calculated as the MTU of the underlying data link endpoint 793 // minus the network endpoint max header length. 794 MTU() uint32 795 796 // MaxHeaderLength returns the maximum size the network (and lower 797 // level layers combined) headers can have. Higher levels use this 798 // information to reserve space in the front of the packets they're 799 // building. 800 MaxHeaderLength() uint16 801 802 // WritePacket writes a packet to the given destination address and 803 // protocol. It may modify pkt. pkt.TransportHeader must have 804 // already been set. 805 WritePacket(r *Route, params NetworkHeaderParams, pkt PacketBufferPtr) tcpip.Error 806 807 // WriteHeaderIncludedPacket writes a packet that includes a network 808 // header to the given destination address. It may modify pkt. 809 WriteHeaderIncludedPacket(r *Route, pkt PacketBufferPtr) tcpip.Error 810 811 // HandlePacket is called by the link layer when new packets arrive to 812 // this network endpoint. It sets pkt.NetworkHeader. 813 // 814 // HandlePacket may modify pkt. 815 HandlePacket(pkt PacketBufferPtr) 816 817 // Close is called when the endpoint is removed from a stack. 818 Close() 819 820 // NetworkProtocolNumber returns the tcpip.NetworkProtocolNumber for 821 // this endpoint. 822 NetworkProtocolNumber() tcpip.NetworkProtocolNumber 823 824 // Stats returns a reference to the network endpoint stats. 825 Stats() NetworkEndpointStats 826 } 827 828 // NetworkEndpointStats is the interface implemented by each network endpoint 829 // stats struct. 830 type NetworkEndpointStats interface { 831 // IsNetworkEndpointStats is an empty method to implement the 832 // NetworkEndpointStats marker interface. 833 IsNetworkEndpointStats() 834 } 835 836 // IPNetworkEndpointStats is a NetworkEndpointStats that tracks IP-related 837 // statistics. 838 type IPNetworkEndpointStats interface { 839 NetworkEndpointStats 840 841 // IPStats returns the IP statistics of a network endpoint. 842 IPStats() *tcpip.IPStats 843 } 844 845 // ForwardingNetworkEndpoint is a network endpoint that may forward packets. 846 type ForwardingNetworkEndpoint interface { 847 NetworkEndpoint 848 849 // Forwarding returns the forwarding configuration. 850 Forwarding() bool 851 852 // SetForwarding sets the forwarding configuration. 853 // 854 // Returns the previous forwarding configuration. 855 SetForwarding(bool) bool 856 } 857 858 // MulticastForwardingNetworkEndpoint is a network endpoint that may forward 859 // multicast packets. 860 type MulticastForwardingNetworkEndpoint interface { 861 ForwardingNetworkEndpoint 862 863 // MulticastForwarding returns true if multicast forwarding is enabled. 864 // Otherwise, returns false. 865 MulticastForwarding() bool 866 867 // SetMulticastForwarding sets the multicast forwarding configuration. 868 // 869 // Returns the previous forwarding configuration. 870 SetMulticastForwarding(bool) bool 871 } 872 873 // NetworkProtocol is the interface that needs to be implemented by network 874 // protocols (e.g., ipv4, ipv6) that want to be part of the networking stack. 875 type NetworkProtocol interface { 876 // Number returns the network protocol number. 877 Number() tcpip.NetworkProtocolNumber 878 879 // MinimumPacketSize returns the minimum valid packet size of this 880 // network protocol. The stack automatically drops any packets smaller 881 // than this targeted at this protocol. 882 MinimumPacketSize() int 883 884 // ParseAddresses returns the source and destination addresses stored in a 885 // packet of this protocol. 886 ParseAddresses(b []byte) (src, dst tcpip.Address) 887 888 // NewEndpoint creates a new endpoint of this protocol. 889 NewEndpoint(nic NetworkInterface, dispatcher TransportDispatcher) NetworkEndpoint 890 891 // SetOption allows enabling/disabling protocol specific features. 892 // SetOption returns an error if the option is not supported or the 893 // provided option value is invalid. 894 SetOption(option tcpip.SettableNetworkProtocolOption) tcpip.Error 895 896 // Option allows retrieving protocol specific option values. 897 // Option returns an error if the option is not supported or the 898 // provided option value is invalid. 899 Option(option tcpip.GettableNetworkProtocolOption) tcpip.Error 900 901 // Close requests that any worker goroutines owned by the protocol 902 // stop. 903 Close() 904 905 // Wait waits for any worker goroutines owned by the protocol to stop. 906 Wait() 907 908 // Parse sets pkt.NetworkHeader and trims pkt.Data appropriately. It 909 // returns: 910 // - The encapsulated protocol, if present. 911 // - Whether there is an encapsulated transport protocol payload (e.g. ARP 912 // does not encapsulate anything). 913 // - Whether pkt.Data was large enough to parse and set pkt.NetworkHeader. 914 Parse(pkt PacketBufferPtr) (proto tcpip.TransportProtocolNumber, hasTransportHdr bool, ok bool) 915 } 916 917 // UnicastSourceAndMulticastDestination is a tuple that represents a unicast 918 // source address and a multicast destination address. 919 type UnicastSourceAndMulticastDestination struct { 920 // Source represents a unicast source address. 921 Source tcpip.Address 922 // Destination represents a multicast destination address. 923 Destination tcpip.Address 924 } 925 926 // MulticastRouteOutgoingInterface represents an outgoing interface in a 927 // multicast route. 928 type MulticastRouteOutgoingInterface struct { 929 // ID corresponds to the outgoing NIC. 930 ID tcpip.NICID 931 932 // MinTTL represents the minumum TTL/HopLimit a multicast packet must have to 933 // be sent through the outgoing interface. 934 // 935 // Note: a value of 0 allows all packets to be forwarded. 936 MinTTL uint8 937 } 938 939 // MulticastRoute is a multicast route. 940 type MulticastRoute struct { 941 // ExpectedInputInterface is the interface on which packets using this route 942 // are expected to ingress. 943 ExpectedInputInterface tcpip.NICID 944 945 // OutgoingInterfaces is the set of interfaces that a multicast packet should 946 // be forwarded out of. 947 // 948 // This field should not be empty. 949 OutgoingInterfaces []MulticastRouteOutgoingInterface 950 } 951 952 // MulticastForwardingNetworkProtocol is the interface that needs to be 953 // implemented by the network protocols that support multicast forwarding. 954 type MulticastForwardingNetworkProtocol interface { 955 NetworkProtocol 956 957 // AddMulticastRoute adds a route to the multicast routing table such that 958 // packets matching the addresses will be forwarded using the provided route. 959 // 960 // Returns an error if the addresses or route is invalid. 961 AddMulticastRoute(UnicastSourceAndMulticastDestination, MulticastRoute) tcpip.Error 962 963 // RemoveMulticastRoute removes the route matching the provided addresses 964 // from the multicast routing table. 965 // 966 // Returns an error if the addresses are invalid or a matching route is not 967 // found. 968 RemoveMulticastRoute(UnicastSourceAndMulticastDestination) tcpip.Error 969 970 // MulticastRouteLastUsedTime returns a monotonic timestamp that 971 // represents the last time that the route matching the provided addresses 972 // was used or updated. 973 // 974 // Returns an error if the addresses are invalid or a matching route was not 975 // found. 976 MulticastRouteLastUsedTime(UnicastSourceAndMulticastDestination) (tcpip.MonotonicTime, tcpip.Error) 977 978 // EnableMulticastForwarding enables multicast forwarding for the protocol. 979 // 980 // Returns an error if the provided multicast forwarding event dispatcher is 981 // nil. Otherwise, returns true if the multicast forwarding was already 982 // enabled. 983 EnableMulticastForwarding(MulticastForwardingEventDispatcher) (bool, tcpip.Error) 984 985 // DisableMulticastForwarding disables multicast forwarding for the protocol. 986 DisableMulticastForwarding() 987 } 988 989 // MulticastPacketContext is the context in which a multicast packet triggered 990 // a multicast forwarding event. 991 type MulticastPacketContext struct { 992 // SourceAndDestination contains the unicast source address and the multicast 993 // destination address found in the relevant multicast packet. 994 SourceAndDestination UnicastSourceAndMulticastDestination 995 // InputInterface is the interface on which the relevant multicast packet 996 // arrived. 997 InputInterface tcpip.NICID 998 } 999 1000 // MulticastForwardingEventDispatcher is the interface that integrators should 1001 // implement to handle multicast routing events. 1002 type MulticastForwardingEventDispatcher interface { 1003 // OnMissingRoute is called when an incoming multicast packet does not match 1004 // any installed route. 1005 // 1006 // The packet that triggered this event may be queued so that it can be 1007 // transmitted once a route is installed. Even then, it may still be dropped 1008 // as per the routing table's GC/eviction policy. 1009 OnMissingRoute(MulticastPacketContext) 1010 1011 // OnUnexpectedInputInterface is called when a multicast packet arrives at an 1012 // interface that does not match the installed route's expected input 1013 // interface. 1014 // 1015 // This may be an indication of a routing loop. The packet that triggered 1016 // this event is dropped without being forwarded. 1017 OnUnexpectedInputInterface(context MulticastPacketContext, expectedInputInterface tcpip.NICID) 1018 } 1019 1020 // NetworkDispatcher contains the methods used by the network stack to deliver 1021 // inbound/outbound packets to the appropriate network/packet(if any) endpoints. 1022 type NetworkDispatcher interface { 1023 // DeliverNetworkPacket finds the appropriate network protocol endpoint 1024 // and hands the packet over for further processing. 1025 // 1026 // 1027 // If the link-layer has a header, the packet's link header must be populated. 1028 // 1029 // DeliverNetworkPacket may modify pkt. 1030 DeliverNetworkPacket(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) 1031 1032 // DeliverLinkPacket delivers a packet to any interested packet endpoints. 1033 // 1034 // This method should be called with both incoming and outgoing packets. 1035 // 1036 // If the link-layer has a header, the packet's link header must be populated. 1037 DeliverLinkPacket(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) 1038 } 1039 1040 // LinkEndpointCapabilities is the type associated with the capabilities 1041 // supported by a link-layer endpoint. It is a set of bitfields. 1042 type LinkEndpointCapabilities uint 1043 1044 // The following are the supported link endpoint capabilities. 1045 const ( 1046 CapabilityNone LinkEndpointCapabilities = 0 1047 // CapabilityTXChecksumOffload indicates that the link endpoint supports 1048 // checksum computation for outgoing packets and the stack can skip 1049 // computing checksums when sending packets. 1050 CapabilityTXChecksumOffload LinkEndpointCapabilities = 1 << iota 1051 // CapabilityRXChecksumOffload indicates that the link endpoint supports 1052 // checksum verification on received packets and that it's safe for the 1053 // stack to skip checksum verification. 1054 CapabilityRXChecksumOffload 1055 CapabilityResolutionRequired 1056 CapabilitySaveRestore 1057 CapabilityDisconnectOk 1058 CapabilityLoopback 1059 ) 1060 1061 // LinkWriter is an interface that supports sending packets via a data-link 1062 // layer endpoint. It is used with QueueingDiscipline to batch writes from 1063 // upper layer endpoints. 1064 type LinkWriter interface { 1065 // WritePackets writes packets. Must not be called with an empty list of 1066 // packet buffers. 1067 // 1068 // Each packet must have the link-layer header set, if the link requires 1069 // one. 1070 // 1071 // WritePackets may modify the packet buffers, and takes ownership of the PacketBufferList. 1072 // it is not safe to use the PacketBufferList after a call to WritePackets. 1073 WritePackets(PacketBufferList) (int, tcpip.Error) 1074 } 1075 1076 // NetworkLinkEndpoint is a data-link layer that supports sending network 1077 // layer packets. 1078 type NetworkLinkEndpoint interface { 1079 // MTU is the maximum transmission unit for this endpoint. This is 1080 // usually dictated by the backing physical network; when such a 1081 // physical network doesn't exist, the limit is generally 64k, which 1082 // includes the maximum size of an IP packet. 1083 MTU() uint32 1084 1085 // MaxHeaderLength returns the maximum size the data link (and 1086 // lower level layers combined) headers can have. Higher levels use this 1087 // information to reserve space in the front of the packets they're 1088 // building. 1089 MaxHeaderLength() uint16 1090 1091 // LinkAddress returns the link address (typically a MAC) of the 1092 // endpoint. 1093 LinkAddress() tcpip.LinkAddress 1094 1095 // Capabilities returns the set of capabilities supported by the 1096 // endpoint. 1097 Capabilities() LinkEndpointCapabilities 1098 1099 // Attach attaches the data link layer endpoint to the network-layer 1100 // dispatcher of the stack. 1101 // 1102 // Attach is called with a nil dispatcher when the endpoint's NIC is being 1103 // removed. 1104 Attach(dispatcher NetworkDispatcher) 1105 1106 // IsAttached returns whether a NetworkDispatcher is attached to the 1107 // endpoint. 1108 IsAttached() bool 1109 1110 // Wait waits for any worker goroutines owned by the endpoint to stop. 1111 // 1112 // For now, requesting that an endpoint's worker goroutine(s) stop is 1113 // implementation specific. 1114 // 1115 // Wait will not block if the endpoint hasn't started any goroutines 1116 // yet, even if it might later. 1117 Wait() 1118 1119 // ARPHardwareType returns the ARPHRD_TYPE of the link endpoint. 1120 // 1121 // See: 1122 // https://github.com/torvalds/linux/blob/aa0c9086b40c17a7ad94425b3b70dd1fdd7497bf/include/uapi/linux/if_arp.h#L30 1123 ARPHardwareType() header.ARPHardwareType 1124 1125 // AddHeader adds a link layer header to the packet if required. 1126 AddHeader(PacketBufferPtr) 1127 1128 // ParseHeader parses the link layer header to the packet. 1129 ParseHeader(PacketBufferPtr) bool 1130 } 1131 1132 // QueueingDiscipline provides a queueing strategy for outgoing packets (e.g 1133 // FIFO, LIFO, Random Early Drop etc). 1134 type QueueingDiscipline interface { 1135 // WritePacket writes a packet. 1136 // 1137 // WritePacket may modify the packet buffer. The packet buffer's 1138 // network and transport header must be set. 1139 // 1140 // To participate in transparent bridging, a LinkEndpoint implementation 1141 // should call eth.Encode with header.EthernetFields.SrcAddr set to 1142 // pkg.EgressRoute.LocalLinkAddress if it is provided. 1143 WritePacket(PacketBufferPtr) tcpip.Error 1144 1145 Close() 1146 } 1147 1148 // LinkEndpoint is the interface implemented by data link layer protocols (e.g., 1149 // ethernet, loopback, raw) and used by network layer protocols to send packets 1150 // out through the implementer's data link endpoint. When a link header exists, 1151 // it sets each PacketBuffer's LinkHeader field before passing it up the 1152 // stack. 1153 type LinkEndpoint interface { 1154 NetworkLinkEndpoint 1155 LinkWriter 1156 } 1157 1158 // InjectableLinkEndpoint is a LinkEndpoint where inbound packets are 1159 // delivered via the Inject method. 1160 type InjectableLinkEndpoint interface { 1161 LinkEndpoint 1162 1163 // InjectInbound injects an inbound packet. 1164 InjectInbound(protocol tcpip.NetworkProtocolNumber, pkt PacketBufferPtr) 1165 1166 // InjectOutbound writes a fully formed outbound packet directly to the 1167 // link. 1168 // 1169 // dest is used by endpoints with multiple raw destinations. 1170 InjectOutbound(dest tcpip.Address, packet *buffer.View) tcpip.Error 1171 } 1172 1173 // DADResult is a marker interface for the result of a duplicate address 1174 // detection process. 1175 type DADResult interface { 1176 isDADResult() 1177 } 1178 1179 var _ DADResult = (*DADSucceeded)(nil) 1180 1181 // DADSucceeded indicates DAD completed without finding any duplicate addresses. 1182 type DADSucceeded struct{} 1183 1184 func (*DADSucceeded) isDADResult() {} 1185 1186 var _ DADResult = (*DADError)(nil) 1187 1188 // DADError indicates DAD hit an error. 1189 type DADError struct { 1190 Err tcpip.Error 1191 } 1192 1193 func (*DADError) isDADResult() {} 1194 1195 var _ DADResult = (*DADAborted)(nil) 1196 1197 // DADAborted indicates DAD was aborted. 1198 type DADAborted struct{} 1199 1200 func (*DADAborted) isDADResult() {} 1201 1202 var _ DADResult = (*DADDupAddrDetected)(nil) 1203 1204 // DADDupAddrDetected indicates DAD detected a duplicate address. 1205 type DADDupAddrDetected struct { 1206 // HolderLinkAddress is the link address of the node that holds the duplicate 1207 // address. 1208 HolderLinkAddress tcpip.LinkAddress 1209 } 1210 1211 func (*DADDupAddrDetected) isDADResult() {} 1212 1213 // DADCompletionHandler is a handler for DAD completion. 1214 type DADCompletionHandler func(DADResult) 1215 1216 // DADCheckAddressDisposition enumerates the possible return values from 1217 // DAD.CheckDuplicateAddress. 1218 type DADCheckAddressDisposition int 1219 1220 const ( 1221 _ DADCheckAddressDisposition = iota 1222 1223 // DADDisabled indicates that DAD is disabled. 1224 DADDisabled 1225 1226 // DADStarting indicates that DAD is starting for an address. 1227 DADStarting 1228 1229 // DADAlreadyRunning indicates that DAD was already started for an address. 1230 DADAlreadyRunning 1231 ) 1232 1233 const ( 1234 // defaultDupAddrDetectTransmits is the default number of NDP Neighbor 1235 // Solicitation messages to send when doing Duplicate Address Detection 1236 // for a tentative address. 1237 // 1238 // Default = 1 (from RFC 4862 section 5.1) 1239 defaultDupAddrDetectTransmits = 1 1240 ) 1241 1242 // DADConfigurations holds configurations for duplicate address detection. 1243 type DADConfigurations struct { 1244 // The number of Neighbor Solicitation messages to send when doing 1245 // Duplicate Address Detection for a tentative address. 1246 // 1247 // Note, a value of zero effectively disables DAD. 1248 DupAddrDetectTransmits uint8 1249 1250 // The amount of time to wait between sending Neighbor Solicitation 1251 // messages. 1252 // 1253 // Must be greater than or equal to 1ms. 1254 RetransmitTimer time.Duration 1255 } 1256 1257 // DefaultDADConfigurations returns the default DAD configurations. 1258 func DefaultDADConfigurations() DADConfigurations { 1259 return DADConfigurations{ 1260 DupAddrDetectTransmits: defaultDupAddrDetectTransmits, 1261 RetransmitTimer: defaultRetransmitTimer, 1262 } 1263 } 1264 1265 // Validate modifies the configuration with valid values. If invalid values are 1266 // present in the configurations, the corresponding default values are used 1267 // instead. 1268 func (c *DADConfigurations) Validate() { 1269 if c.RetransmitTimer < minimumRetransmitTimer { 1270 c.RetransmitTimer = defaultRetransmitTimer 1271 } 1272 } 1273 1274 // DuplicateAddressDetector handles checking if an address is already assigned 1275 // to some neighboring node on the link. 1276 type DuplicateAddressDetector interface { 1277 // CheckDuplicateAddress checks if an address is assigned to a neighbor. 1278 // 1279 // If DAD is already being performed for the address, the handler will be 1280 // called with the result of the original DAD request. 1281 CheckDuplicateAddress(tcpip.Address, DADCompletionHandler) DADCheckAddressDisposition 1282 1283 // SetDADConfigurations sets the configurations for DAD. 1284 SetDADConfigurations(c DADConfigurations) 1285 1286 // DuplicateAddressProtocol returns the network protocol the receiver can 1287 // perform duplicate address detection for. 1288 DuplicateAddressProtocol() tcpip.NetworkProtocolNumber 1289 } 1290 1291 // LinkAddressResolver handles link address resolution for a network protocol. 1292 type LinkAddressResolver interface { 1293 // LinkAddressRequest sends a request for the link address of the target 1294 // address. The request is broadcast on the local network if a remote link 1295 // address is not provided. 1296 LinkAddressRequest(targetAddr, localAddr tcpip.Address, remoteLinkAddr tcpip.LinkAddress) tcpip.Error 1297 1298 // ResolveStaticAddress attempts to resolve address without sending 1299 // requests. It either resolves the name immediately or returns the 1300 // empty LinkAddress. 1301 // 1302 // It can be used to resolve broadcast addresses for example. 1303 ResolveStaticAddress(addr tcpip.Address) (tcpip.LinkAddress, bool) 1304 1305 // LinkAddressProtocol returns the network protocol of the 1306 // addresses this resolver can resolve. 1307 LinkAddressProtocol() tcpip.NetworkProtocolNumber 1308 } 1309 1310 // RawFactory produces endpoints for writing various types of raw packets. 1311 type RawFactory interface { 1312 // NewUnassociatedEndpoint produces endpoints for writing packets not 1313 // associated with a particular transport protocol. Such endpoints can 1314 // be used to write arbitrary packets that include the network header. 1315 NewUnassociatedEndpoint(stack *Stack, netProto tcpip.NetworkProtocolNumber, transProto tcpip.TransportProtocolNumber, waiterQueue *waiter.Queue) (tcpip.Endpoint, tcpip.Error) 1316 1317 // NewPacketEndpoint produces endpoints for reading and writing packets 1318 // that include network and (when cooked is false) link layer headers. 1319 NewPacketEndpoint(stack *Stack, cooked bool, netProto tcpip.NetworkProtocolNumber, waiterQueue *waiter.Queue) (tcpip.Endpoint, tcpip.Error) 1320 } 1321 1322 // GSOType is the type of GSO segments. 1323 // 1324 // +stateify savable 1325 type GSOType int 1326 1327 // Types of gso segments. 1328 const ( 1329 GSONone GSOType = iota 1330 1331 // Hardware GSO types: 1332 GSOTCPv4 1333 GSOTCPv6 1334 1335 // GSOGvisor is used for gVisor GSO segments which have to be sent by 1336 // endpoint.WritePackets. 1337 GSOGvisor 1338 ) 1339 1340 // GSO contains generic segmentation offload properties. 1341 // 1342 // +stateify savable 1343 type GSO struct { 1344 // Type is one of GSONone, GSOTCPv4, etc. 1345 Type GSOType 1346 // NeedsCsum is set if the checksum offload is enabled. 1347 NeedsCsum bool 1348 // CsumOffset is offset after that to place checksum. 1349 CsumOffset uint16 1350 1351 // Mss is maximum segment size. 1352 MSS uint16 1353 // L3Len is L3 (IP) header length. 1354 L3HdrLen uint16 1355 1356 // MaxSize is maximum GSO packet size. 1357 MaxSize uint32 1358 } 1359 1360 // SupportedGSO is the type of segmentation offloading supported. 1361 type SupportedGSO int 1362 1363 const ( 1364 // GSONotSupported indicates that segmentation offloading is not supported. 1365 GSONotSupported SupportedGSO = iota 1366 1367 // HostGSOSupported indicates that segmentation offloading may be performed 1368 // by the host. This is typically true when netstack is attached to a host 1369 // AF_PACKET socket, and not true when attached to a unix socket or other 1370 // non-networking data layer. 1371 HostGSOSupported 1372 1373 // GvisorGSOSupported indicates that segmentation offloading may be performed 1374 // in gVisor. 1375 GvisorGSOSupported 1376 ) 1377 1378 // GSOEndpoint provides access to GSO properties. 1379 type GSOEndpoint interface { 1380 // GSOMaxSize returns the maximum GSO packet size. 1381 GSOMaxSize() uint32 1382 1383 // SupportedGSO returns the supported segmentation offloading. 1384 SupportedGSO() SupportedGSO 1385 } 1386 1387 // GvisorGSOMaxSize is a maximum allowed size of a software GSO segment. 1388 // This isn't a hard limit, because it is never set into packet headers. 1389 const GvisorGSOMaxSize = 1 << 16