inet.af/netstack@v0.0.0-20220214151720-7585b01ddccf/tcpip/stack/stack.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 provides the glue between networking protocols and the 16 // consumers of the networking stack. 17 // 18 // For consumers, the only function of interest is New(), everything else is 19 // provided by the tcpip/public package. 20 package stack 21 22 import ( 23 "encoding/binary" 24 "fmt" 25 "io" 26 "math/rand" 27 "sync/atomic" 28 "time" 29 30 "golang.org/x/time/rate" 31 "inet.af/netstack/atomicbitops" 32 cryptorand "inet.af/netstack/rand" 33 "inet.af/netstack/sync" 34 "inet.af/netstack/tcpip" 35 "inet.af/netstack/tcpip/buffer" 36 "inet.af/netstack/tcpip/header" 37 "inet.af/netstack/tcpip/ports" 38 "inet.af/netstack/waiter" 39 ) 40 41 const ( 42 // DefaultTOS is the default type of service value for network endpoints. 43 DefaultTOS = 0 44 ) 45 46 type transportProtocolState struct { 47 proto TransportProtocol 48 defaultHandler func(id TransportEndpointID, pkt *PacketBuffer) bool 49 } 50 51 // ResumableEndpoint is an endpoint that needs to be resumed after restore. 52 type ResumableEndpoint interface { 53 // Resume resumes an endpoint after restore. This can be used to restart 54 // background workers such as protocol goroutines. This must be called after 55 // all indirect dependencies of the endpoint has been restored, which 56 // generally implies at the end of the restore process. 57 Resume(*Stack) 58 } 59 60 // uniqueIDGenerator is a default unique ID generator. 61 type uniqueIDGenerator atomicbitops.AlignedAtomicUint64 62 63 func (u *uniqueIDGenerator) UniqueID() uint64 { 64 return ((*atomicbitops.AlignedAtomicUint64)(u)).Add(1) 65 } 66 67 // Stack is a networking stack, with all supported protocols, NICs, and route 68 // table. 69 type Stack struct { 70 transportProtocols map[tcpip.TransportProtocolNumber]*transportProtocolState 71 networkProtocols map[tcpip.NetworkProtocolNumber]NetworkProtocol 72 73 // rawFactory creates raw endpoints. If nil, raw endpoints are 74 // disabled. It is set during Stack creation and is immutable. 75 rawFactory RawFactory 76 packetEndpointWriteSupported bool 77 78 demux *transportDemuxer 79 80 stats tcpip.Stats 81 82 // LOCK ORDERING: mu > route.mu. 83 route struct { 84 mu struct { 85 sync.RWMutex 86 87 table []tcpip.Route 88 } 89 } 90 91 mu sync.RWMutex 92 nics map[tcpip.NICID]*nic 93 defaultForwardingEnabled map[tcpip.NetworkProtocolNumber]struct{} 94 95 // cleanupEndpointsMu protects cleanupEndpoints. 96 cleanupEndpointsMu sync.Mutex 97 cleanupEndpoints map[TransportEndpoint]struct{} 98 99 *ports.PortManager 100 101 // If not nil, then any new endpoints will have this probe function 102 // invoked everytime they receive a TCP segment. 103 tcpProbeFunc atomic.Value // TCPProbeFunc 104 105 // clock is used to generate user-visible times. 106 clock tcpip.Clock 107 108 // handleLocal allows non-loopback interfaces to loop packets. 109 handleLocal bool 110 111 // tables are the iptables packet filtering and manipulation rules. 112 // TODO(gvisor.dev/issue/4595): S/R this field. 113 tables *IPTables 114 115 // resumableEndpoints is a list of endpoints that need to be resumed if the 116 // stack is being restored. 117 resumableEndpoints []ResumableEndpoint 118 119 // icmpRateLimiter is a global rate limiter for all ICMP messages generated 120 // by the stack. 121 icmpRateLimiter *ICMPRateLimiter 122 123 // seed is a one-time random value initialized at stack startup. 124 // 125 // TODO(gvisor.dev/issue/940): S/R this field. 126 seed uint32 127 128 // nudConfigs is the default NUD configurations used by interfaces. 129 nudConfigs NUDConfigurations 130 131 // nudDisp is the NUD event dispatcher that is used to send the netstack 132 // integrator NUD related events. 133 nudDisp NUDDispatcher 134 135 // uniqueIDGenerator is a generator of unique identifiers. 136 uniqueIDGenerator UniqueID 137 138 // randomGenerator is an injectable pseudo random generator that can be 139 // used when a random number is required. 140 randomGenerator *rand.Rand 141 142 // secureRNG is a cryptographically secure random number generator. 143 secureRNG io.Reader 144 145 // sendBufferSize holds the min/default/max send buffer sizes for 146 // endpoints other than TCP. 147 sendBufferSize tcpip.SendBufferSizeOption 148 149 // receiveBufferSize holds the min/default/max receive buffer sizes for 150 // endpoints other than TCP. 151 receiveBufferSize tcpip.ReceiveBufferSizeOption 152 153 // tcpInvalidRateLimit is the maximal rate for sending duplicate 154 // acknowledgements in response to incoming TCP packets that are for an existing 155 // connection but that are invalid due to any of the following reasons: 156 // 157 // a) out-of-window sequence number. 158 // b) out-of-window acknowledgement number. 159 // c) PAWS check failure (when implemented). 160 // 161 // This is required to prevent potential ACK loops. 162 // Setting this to 0 will disable all rate limiting. 163 tcpInvalidRateLimit time.Duration 164 165 // tsOffsetSecret is the secret key for generating timestamp offsets 166 // initialized at stack startup. 167 tsOffsetSecret uint32 168 } 169 170 // UniqueID is an abstract generator of unique identifiers. 171 type UniqueID interface { 172 UniqueID() uint64 173 } 174 175 // NetworkProtocolFactory instantiates a network protocol. 176 // 177 // NetworkProtocolFactory must not attempt to modify the stack, it may only 178 // query the stack. 179 type NetworkProtocolFactory func(*Stack) NetworkProtocol 180 181 // TransportProtocolFactory instantiates a transport protocol. 182 // 183 // TransportProtocolFactory must not attempt to modify the stack, it may only 184 // query the stack. 185 type TransportProtocolFactory func(*Stack) TransportProtocol 186 187 // Options contains optional Stack configuration. 188 type Options struct { 189 // NetworkProtocols lists the network protocols to enable. 190 NetworkProtocols []NetworkProtocolFactory 191 192 // TransportProtocols lists the transport protocols to enable. 193 TransportProtocols []TransportProtocolFactory 194 195 // Clock is an optional clock used for timekeeping. 196 // 197 // If Clock is nil, tcpip.NewStdClock() will be used. 198 Clock tcpip.Clock 199 200 // Stats are optional statistic counters. 201 Stats tcpip.Stats 202 203 // HandleLocal indicates whether packets destined to their source 204 // should be handled by the stack internally (true) or outside the 205 // stack (false). 206 HandleLocal bool 207 208 // UniqueID is an optional generator of unique identifiers. 209 UniqueID UniqueID 210 211 // NUDConfigs is the default NUD configurations used by interfaces. 212 NUDConfigs NUDConfigurations 213 214 // NUDDisp is the NUD event dispatcher that an integrator can provide to 215 // receive NUD related events. 216 NUDDisp NUDDispatcher 217 218 // RawFactory produces raw endpoints. Raw endpoints are enabled only if 219 // this is non-nil. 220 RawFactory RawFactory 221 222 // AllowPacketEndpointWrite determines if packet endpoints support write 223 // operations. 224 AllowPacketEndpointWrite bool 225 226 // RandSource is an optional source to use to generate random 227 // numbers. If omitted it defaults to a Source seeded by the data 228 // returned by the stack secure RNG. 229 // 230 // RandSource must be thread-safe. 231 RandSource rand.Source 232 233 // IPTables are the initial iptables rules. If nil, DefaultIPTables will be 234 // used to construct the initial iptables rules. 235 // all traffic. 236 IPTables *IPTables 237 238 // DefaultIPTables is an optional iptables rules constructor that is called 239 // if IPTables is nil. If both fields are nil, iptables will allow all 240 // traffic. 241 DefaultIPTables func(clock tcpip.Clock, rand *rand.Rand) *IPTables 242 243 // SecureRNG is a cryptographically secure random number generator. 244 SecureRNG io.Reader 245 } 246 247 // TransportEndpointInfo holds useful information about a transport endpoint 248 // which can be queried by monitoring tools. 249 // 250 // +stateify savable 251 type TransportEndpointInfo struct { 252 // The following fields are initialized at creation time and are 253 // immutable. 254 255 NetProto tcpip.NetworkProtocolNumber 256 TransProto tcpip.TransportProtocolNumber 257 258 // The following fields are protected by endpoint mu. 259 260 ID TransportEndpointID 261 // BindNICID and bindAddr are set via calls to Bind(). They are used to 262 // reject attempts to send data or connect via a different NIC or 263 // address 264 BindNICID tcpip.NICID 265 BindAddr tcpip.Address 266 // RegisterNICID is the default NICID registered as a side-effect of 267 // connect or datagram write. 268 RegisterNICID tcpip.NICID 269 } 270 271 // AddrNetProtoLocked unwraps the specified address if it is a V4-mapped V6 272 // address and returns the network protocol number to be used to communicate 273 // with the specified address. It returns an error if the passed address is 274 // incompatible with the receiver. 275 // 276 // Preconditon: the parent endpoint mu must be held while calling this method. 277 func (t *TransportEndpointInfo) AddrNetProtoLocked(addr tcpip.FullAddress, v6only bool) (tcpip.FullAddress, tcpip.NetworkProtocolNumber, tcpip.Error) { 278 netProto := t.NetProto 279 switch len(addr.Addr) { 280 case header.IPv4AddressSize: 281 netProto = header.IPv4ProtocolNumber 282 case header.IPv6AddressSize: 283 if header.IsV4MappedAddress(addr.Addr) { 284 netProto = header.IPv4ProtocolNumber 285 addr.Addr = addr.Addr[header.IPv6AddressSize-header.IPv4AddressSize:] 286 if addr.Addr == header.IPv4Any { 287 addr.Addr = "" 288 } 289 } 290 } 291 292 switch len(t.ID.LocalAddress) { 293 case header.IPv4AddressSize: 294 if len(addr.Addr) == header.IPv6AddressSize { 295 return tcpip.FullAddress{}, 0, &tcpip.ErrInvalidEndpointState{} 296 } 297 case header.IPv6AddressSize: 298 if len(addr.Addr) == header.IPv4AddressSize { 299 return tcpip.FullAddress{}, 0, &tcpip.ErrNetworkUnreachable{} 300 } 301 } 302 303 switch { 304 case netProto == t.NetProto: 305 case netProto == header.IPv4ProtocolNumber && t.NetProto == header.IPv6ProtocolNumber: 306 if v6only { 307 return tcpip.FullAddress{}, 0, &tcpip.ErrNoRoute{} 308 } 309 default: 310 return tcpip.FullAddress{}, 0, &tcpip.ErrInvalidEndpointState{} 311 } 312 313 return addr, netProto, nil 314 } 315 316 // IsEndpointInfo is an empty method to implement the tcpip.EndpointInfo 317 // marker interface. 318 func (*TransportEndpointInfo) IsEndpointInfo() {} 319 320 // New allocates a new networking stack with only the requested networking and 321 // transport protocols configured with default options. 322 // 323 // Note, NDPConfigurations will be fixed before being used by the Stack. That 324 // is, if an invalid value was provided, it will be reset to the default value. 325 // 326 // Protocol options can be changed by calling the 327 // SetNetworkProtocolOption/SetTransportProtocolOption methods provided by the 328 // stack. Please refer to individual protocol implementations as to what options 329 // are supported. 330 func New(opts Options) *Stack { 331 clock := opts.Clock 332 if clock == nil { 333 clock = tcpip.NewStdClock() 334 } 335 336 if opts.UniqueID == nil { 337 opts.UniqueID = new(uniqueIDGenerator) 338 } 339 340 if opts.SecureRNG == nil { 341 opts.SecureRNG = cryptorand.Reader 342 } 343 344 randSrc := opts.RandSource 345 if randSrc == nil { 346 var v int64 347 if err := binary.Read(opts.SecureRNG, binary.LittleEndian, &v); err != nil { 348 panic(err) 349 } 350 // Source provided by rand.NewSource is not thread-safe so 351 // we wrap it in a simple thread-safe version. 352 randSrc = &lockedRandomSource{src: rand.NewSource(v)} 353 } 354 randomGenerator := rand.New(randSrc) 355 356 if opts.IPTables == nil { 357 if opts.DefaultIPTables == nil { 358 opts.DefaultIPTables = DefaultTables 359 } 360 opts.IPTables = opts.DefaultIPTables(clock, randomGenerator) 361 } 362 363 opts.NUDConfigs.resetInvalidFields() 364 365 s := &Stack{ 366 transportProtocols: make(map[tcpip.TransportProtocolNumber]*transportProtocolState), 367 networkProtocols: make(map[tcpip.NetworkProtocolNumber]NetworkProtocol), 368 nics: make(map[tcpip.NICID]*nic), 369 packetEndpointWriteSupported: opts.AllowPacketEndpointWrite, 370 defaultForwardingEnabled: make(map[tcpip.NetworkProtocolNumber]struct{}), 371 cleanupEndpoints: make(map[TransportEndpoint]struct{}), 372 PortManager: ports.NewPortManager(), 373 clock: clock, 374 stats: opts.Stats.FillIn(), 375 handleLocal: opts.HandleLocal, 376 tables: opts.IPTables, 377 icmpRateLimiter: NewICMPRateLimiter(clock), 378 seed: randomGenerator.Uint32(), 379 nudConfigs: opts.NUDConfigs, 380 uniqueIDGenerator: opts.UniqueID, 381 nudDisp: opts.NUDDisp, 382 randomGenerator: randomGenerator, 383 secureRNG: opts.SecureRNG, 384 sendBufferSize: tcpip.SendBufferSizeOption{ 385 Min: MinBufferSize, 386 Default: DefaultBufferSize, 387 Max: DefaultMaxBufferSize, 388 }, 389 receiveBufferSize: tcpip.ReceiveBufferSizeOption{ 390 Min: MinBufferSize, 391 Default: DefaultBufferSize, 392 Max: DefaultMaxBufferSize, 393 }, 394 tcpInvalidRateLimit: defaultTCPInvalidRateLimit, 395 tsOffsetSecret: randomGenerator.Uint32(), 396 } 397 398 // Add specified network protocols. 399 for _, netProtoFactory := range opts.NetworkProtocols { 400 netProto := netProtoFactory(s) 401 s.networkProtocols[netProto.Number()] = netProto 402 } 403 404 // Add specified transport protocols. 405 for _, transProtoFactory := range opts.TransportProtocols { 406 transProto := transProtoFactory(s) 407 s.transportProtocols[transProto.Number()] = &transportProtocolState{ 408 proto: transProto, 409 } 410 } 411 412 // Add the factory for raw endpoints, if present. 413 s.rawFactory = opts.RawFactory 414 415 // Create the global transport demuxer. 416 s.demux = newTransportDemuxer(s) 417 418 return s 419 } 420 421 // UniqueID returns a unique identifier. 422 func (s *Stack) UniqueID() uint64 { 423 return s.uniqueIDGenerator.UniqueID() 424 } 425 426 // SetNetworkProtocolOption allows configuring individual protocol level 427 // options. This method returns an error if the protocol is not supported or 428 // option is not supported by the protocol implementation or the provided value 429 // is incorrect. 430 func (s *Stack) SetNetworkProtocolOption(network tcpip.NetworkProtocolNumber, option tcpip.SettableNetworkProtocolOption) tcpip.Error { 431 netProto, ok := s.networkProtocols[network] 432 if !ok { 433 return &tcpip.ErrUnknownProtocol{} 434 } 435 return netProto.SetOption(option) 436 } 437 438 // NetworkProtocolOption allows retrieving individual protocol level option 439 // values. This method returns an error if the protocol is not supported or 440 // option is not supported by the protocol implementation. 441 // e.g. 442 // var v ipv4.MyOption 443 // err := s.NetworkProtocolOption(tcpip.IPv4ProtocolNumber, &v) 444 // if err != nil { 445 // ... 446 // } 447 func (s *Stack) NetworkProtocolOption(network tcpip.NetworkProtocolNumber, option tcpip.GettableNetworkProtocolOption) tcpip.Error { 448 netProto, ok := s.networkProtocols[network] 449 if !ok { 450 return &tcpip.ErrUnknownProtocol{} 451 } 452 return netProto.Option(option) 453 } 454 455 // SetTransportProtocolOption allows configuring individual protocol level 456 // options. This method returns an error if the protocol is not supported or 457 // option is not supported by the protocol implementation or the provided value 458 // is incorrect. 459 func (s *Stack) SetTransportProtocolOption(transport tcpip.TransportProtocolNumber, option tcpip.SettableTransportProtocolOption) tcpip.Error { 460 transProtoState, ok := s.transportProtocols[transport] 461 if !ok { 462 return &tcpip.ErrUnknownProtocol{} 463 } 464 return transProtoState.proto.SetOption(option) 465 } 466 467 // TransportProtocolOption allows retrieving individual protocol level option 468 // values. This method returns an error if the protocol is not supported or 469 // option is not supported by the protocol implementation. 470 // var v tcp.SACKEnabled 471 // if err := s.TransportProtocolOption(tcpip.TCPProtocolNumber, &v); err != nil { 472 // ... 473 // } 474 func (s *Stack) TransportProtocolOption(transport tcpip.TransportProtocolNumber, option tcpip.GettableTransportProtocolOption) tcpip.Error { 475 transProtoState, ok := s.transportProtocols[transport] 476 if !ok { 477 return &tcpip.ErrUnknownProtocol{} 478 } 479 return transProtoState.proto.Option(option) 480 } 481 482 // SetTransportProtocolHandler sets the per-stack default handler for the given 483 // protocol. 484 // 485 // It must be called only during initialization of the stack. Changing it as the 486 // stack is operating is not supported. 487 func (s *Stack) SetTransportProtocolHandler(p tcpip.TransportProtocolNumber, h func(TransportEndpointID, *PacketBuffer) bool) { 488 state := s.transportProtocols[p] 489 if state != nil { 490 state.defaultHandler = h 491 } 492 } 493 494 // Clock returns the Stack's clock for retrieving the current time and 495 // scheduling work. 496 func (s *Stack) Clock() tcpip.Clock { 497 return s.clock 498 } 499 500 // Stats returns a mutable copy of the current stats. 501 // 502 // This is not generally exported via the public interface, but is available 503 // internally. 504 func (s *Stack) Stats() tcpip.Stats { 505 return s.stats 506 } 507 508 // SetNICForwarding enables or disables packet forwarding on the specified NIC 509 // for the passed protocol. 510 func (s *Stack) SetNICForwarding(id tcpip.NICID, protocol tcpip.NetworkProtocolNumber, enable bool) tcpip.Error { 511 s.mu.RLock() 512 defer s.mu.RUnlock() 513 514 nic, ok := s.nics[id] 515 if !ok { 516 return &tcpip.ErrUnknownNICID{} 517 } 518 519 return nic.setForwarding(protocol, enable) 520 } 521 522 // NICForwarding returns the forwarding configuration for the specified NIC. 523 func (s *Stack) NICForwarding(id tcpip.NICID, protocol tcpip.NetworkProtocolNumber) (bool, tcpip.Error) { 524 s.mu.RLock() 525 defer s.mu.RUnlock() 526 527 nic, ok := s.nics[id] 528 if !ok { 529 return false, &tcpip.ErrUnknownNICID{} 530 } 531 532 return nic.forwarding(protocol) 533 } 534 535 // SetForwardingDefaultAndAllNICs sets packet forwarding for all NICs for the 536 // passed protocol and sets the default setting for newly created NICs. 537 func (s *Stack) SetForwardingDefaultAndAllNICs(protocol tcpip.NetworkProtocolNumber, enable bool) tcpip.Error { 538 s.mu.Lock() 539 defer s.mu.Unlock() 540 541 doneOnce := false 542 for id, nic := range s.nics { 543 if err := nic.setForwarding(protocol, enable); err != nil { 544 // Expect forwarding to be settable on all interfaces if it was set on 545 // one. 546 if doneOnce { 547 panic(fmt.Sprintf("nic(id=%d).setForwarding(%d, %t): %s", id, protocol, enable, err)) 548 } 549 550 return err 551 } 552 553 doneOnce = true 554 } 555 556 if enable { 557 s.defaultForwardingEnabled[protocol] = struct{}{} 558 } else { 559 delete(s.defaultForwardingEnabled, protocol) 560 } 561 562 return nil 563 } 564 565 // PortRange returns the UDP and TCP inclusive range of ephemeral ports used in 566 // both IPv4 and IPv6. 567 func (s *Stack) PortRange() (uint16, uint16) { 568 return s.PortManager.PortRange() 569 } 570 571 // SetPortRange sets the UDP and TCP IPv4 and IPv6 ephemeral port range 572 // (inclusive). 573 func (s *Stack) SetPortRange(start uint16, end uint16) tcpip.Error { 574 return s.PortManager.SetPortRange(start, end) 575 } 576 577 // SetRouteTable assigns the route table to be used by this stack. It 578 // specifies which NIC to use for given destination address ranges. 579 // 580 // This method takes ownership of the table. 581 func (s *Stack) SetRouteTable(table []tcpip.Route) { 582 s.route.mu.Lock() 583 defer s.route.mu.Unlock() 584 s.route.mu.table = table 585 } 586 587 // GetRouteTable returns the route table which is currently in use. 588 func (s *Stack) GetRouteTable() []tcpip.Route { 589 s.route.mu.RLock() 590 defer s.route.mu.RUnlock() 591 return append([]tcpip.Route(nil), s.route.mu.table...) 592 } 593 594 // AddRoute appends a route to the route table. 595 func (s *Stack) AddRoute(route tcpip.Route) { 596 s.route.mu.Lock() 597 defer s.route.mu.Unlock() 598 s.route.mu.table = append(s.route.mu.table, route) 599 } 600 601 // RemoveRoutes removes matching routes from the route table. 602 func (s *Stack) RemoveRoutes(match func(tcpip.Route) bool) { 603 s.route.mu.Lock() 604 defer s.route.mu.Unlock() 605 606 var filteredRoutes []tcpip.Route 607 for _, route := range s.route.mu.table { 608 if !match(route) { 609 filteredRoutes = append(filteredRoutes, route) 610 } 611 } 612 s.route.mu.table = filteredRoutes 613 } 614 615 // NewEndpoint creates a new transport layer endpoint of the given protocol. 616 func (s *Stack) NewEndpoint(transport tcpip.TransportProtocolNumber, network tcpip.NetworkProtocolNumber, waiterQueue *waiter.Queue) (tcpip.Endpoint, tcpip.Error) { 617 t, ok := s.transportProtocols[transport] 618 if !ok { 619 return nil, &tcpip.ErrUnknownProtocol{} 620 } 621 622 return t.proto.NewEndpoint(network, waiterQueue) 623 } 624 625 // NewRawEndpoint creates a new raw transport layer endpoint of the given 626 // protocol. Raw endpoints receive all traffic for a given protocol regardless 627 // of address. 628 func (s *Stack) NewRawEndpoint(transport tcpip.TransportProtocolNumber, network tcpip.NetworkProtocolNumber, waiterQueue *waiter.Queue, associated bool) (tcpip.Endpoint, tcpip.Error) { 629 if s.rawFactory == nil { 630 return nil, &tcpip.ErrNotPermitted{} 631 } 632 633 if !associated { 634 return s.rawFactory.NewUnassociatedEndpoint(s, network, transport, waiterQueue) 635 } 636 637 t, ok := s.transportProtocols[transport] 638 if !ok { 639 return nil, &tcpip.ErrUnknownProtocol{} 640 } 641 642 return t.proto.NewRawEndpoint(network, waiterQueue) 643 } 644 645 // NewPacketEndpoint creates a new packet endpoint listening for the given 646 // netProto. 647 func (s *Stack) NewPacketEndpoint(cooked bool, netProto tcpip.NetworkProtocolNumber, waiterQueue *waiter.Queue) (tcpip.Endpoint, tcpip.Error) { 648 if s.rawFactory == nil { 649 return nil, &tcpip.ErrNotPermitted{} 650 } 651 652 return s.rawFactory.NewPacketEndpoint(s, cooked, netProto, waiterQueue) 653 } 654 655 // NICContext is an opaque pointer used to store client-supplied NIC metadata. 656 type NICContext interface{} 657 658 // NICOptions specifies the configuration of a NIC as it is being created. 659 // The zero value creates an enabled, unnamed NIC. 660 type NICOptions struct { 661 // Name specifies the name of the NIC. 662 Name string 663 664 // Disabled specifies whether to avoid calling Attach on the passed 665 // LinkEndpoint. 666 Disabled bool 667 668 // Context specifies user-defined data that will be returned in stack.NICInfo 669 // for the NIC. Clients of this library can use it to add metadata that 670 // should be tracked alongside a NIC, to avoid having to keep a 671 // map[tcpip.NICID]metadata mirroring stack.Stack's nic map. 672 Context NICContext 673 } 674 675 // CreateNICWithOptions creates a NIC with the provided id, LinkEndpoint, and 676 // NICOptions. See the documentation on type NICOptions for details on how 677 // NICs can be configured. 678 // 679 // LinkEndpoint.Attach will be called to bind ep with a NetworkDispatcher. 680 func (s *Stack) CreateNICWithOptions(id tcpip.NICID, ep LinkEndpoint, opts NICOptions) tcpip.Error { 681 s.mu.Lock() 682 defer s.mu.Unlock() 683 684 // Make sure id is unique. 685 if _, ok := s.nics[id]; ok { 686 return &tcpip.ErrDuplicateNICID{} 687 } 688 689 // Make sure name is unique, unless unnamed. 690 if opts.Name != "" { 691 for _, n := range s.nics { 692 if n.Name() == opts.Name { 693 return &tcpip.ErrDuplicateNICID{} 694 } 695 } 696 } 697 698 n := newNIC(s, id, opts.Name, ep, opts.Context) 699 for proto := range s.defaultForwardingEnabled { 700 if err := n.setForwarding(proto, true); err != nil { 701 panic(fmt.Sprintf("newNIC(%d, ...).setForwarding(%d, true): %s", id, proto, err)) 702 } 703 } 704 s.nics[id] = n 705 if !opts.Disabled { 706 return n.enable() 707 } 708 709 return nil 710 } 711 712 // CreateNIC creates a NIC with the provided id and LinkEndpoint and calls 713 // LinkEndpoint.Attach to bind ep with a NetworkDispatcher. 714 func (s *Stack) CreateNIC(id tcpip.NICID, ep LinkEndpoint) tcpip.Error { 715 return s.CreateNICWithOptions(id, ep, NICOptions{}) 716 } 717 718 // GetLinkEndpointByName gets the link endpoint specified by name. 719 func (s *Stack) GetLinkEndpointByName(name string) LinkEndpoint { 720 s.mu.RLock() 721 defer s.mu.RUnlock() 722 for _, nic := range s.nics { 723 if nic.Name() == name { 724 return nic.LinkEndpoint 725 } 726 } 727 return nil 728 } 729 730 // EnableNIC enables the given NIC so that the link-layer endpoint can start 731 // delivering packets to it. 732 func (s *Stack) EnableNIC(id tcpip.NICID) tcpip.Error { 733 s.mu.RLock() 734 defer s.mu.RUnlock() 735 736 nic, ok := s.nics[id] 737 if !ok { 738 return &tcpip.ErrUnknownNICID{} 739 } 740 741 return nic.enable() 742 } 743 744 // DisableNIC disables the given NIC. 745 func (s *Stack) DisableNIC(id tcpip.NICID) tcpip.Error { 746 s.mu.RLock() 747 defer s.mu.RUnlock() 748 749 nic, ok := s.nics[id] 750 if !ok { 751 return &tcpip.ErrUnknownNICID{} 752 } 753 754 nic.disable() 755 return nil 756 } 757 758 // CheckNIC checks if a NIC is usable. 759 func (s *Stack) CheckNIC(id tcpip.NICID) bool { 760 s.mu.RLock() 761 defer s.mu.RUnlock() 762 763 nic, ok := s.nics[id] 764 if !ok { 765 return false 766 } 767 768 return nic.Enabled() 769 } 770 771 // RemoveNIC removes NIC and all related routes from the network stack. 772 func (s *Stack) RemoveNIC(id tcpip.NICID) tcpip.Error { 773 s.mu.Lock() 774 defer s.mu.Unlock() 775 776 return s.removeNICLocked(id) 777 } 778 779 // removeNICLocked removes NIC and all related routes from the network stack. 780 // 781 // s.mu must be locked. 782 func (s *Stack) removeNICLocked(id tcpip.NICID) tcpip.Error { 783 nic, ok := s.nics[id] 784 if !ok { 785 return &tcpip.ErrUnknownNICID{} 786 } 787 if nic.IsLoopback() { 788 return &tcpip.ErrNotSupported{} 789 } 790 delete(s.nics, id) 791 792 // Remove routes in-place. n tracks the number of routes written. 793 s.route.mu.Lock() 794 n := 0 795 for i, r := range s.route.mu.table { 796 s.route.mu.table[i] = tcpip.Route{} 797 if r.NIC != id { 798 // Keep this route. 799 s.route.mu.table[n] = r 800 n++ 801 } 802 } 803 s.route.mu.table = s.route.mu.table[:n] 804 s.route.mu.Unlock() 805 806 return nic.remove() 807 } 808 809 // NICInfo captures the name and addresses assigned to a NIC. 810 type NICInfo struct { 811 Name string 812 LinkAddress tcpip.LinkAddress 813 ProtocolAddresses []tcpip.ProtocolAddress 814 815 // Flags indicate the state of the NIC. 816 Flags NICStateFlags 817 818 // MTU is the maximum transmission unit. 819 MTU uint32 820 821 Stats tcpip.NICStats 822 823 // NetworkStats holds the stats of each NetworkEndpoint bound to the NIC. 824 NetworkStats map[tcpip.NetworkProtocolNumber]NetworkEndpointStats 825 826 // Context is user-supplied data optionally supplied in CreateNICWithOptions. 827 // See type NICOptions for more details. 828 Context NICContext 829 830 // ARPHardwareType holds the ARP Hardware type of the NIC. This is the 831 // value sent in haType field of an ARP Request sent by this NIC and the 832 // value expected in the haType field of an ARP response. 833 ARPHardwareType header.ARPHardwareType 834 835 // Forwarding holds the forwarding status for each network endpoint that 836 // supports forwarding. 837 Forwarding map[tcpip.NetworkProtocolNumber]bool 838 } 839 840 // HasNIC returns true if the NICID is defined in the stack. 841 func (s *Stack) HasNIC(id tcpip.NICID) bool { 842 s.mu.RLock() 843 _, ok := s.nics[id] 844 s.mu.RUnlock() 845 return ok 846 } 847 848 // NICInfo returns a map of NICIDs to their associated information. 849 func (s *Stack) NICInfo() map[tcpip.NICID]NICInfo { 850 s.mu.RLock() 851 defer s.mu.RUnlock() 852 853 nics := make(map[tcpip.NICID]NICInfo) 854 for id, nic := range s.nics { 855 flags := NICStateFlags{ 856 Up: true, // Netstack interfaces are always up. 857 Running: nic.Enabled(), 858 Promiscuous: nic.Promiscuous(), 859 Loopback: nic.IsLoopback(), 860 } 861 862 netStats := make(map[tcpip.NetworkProtocolNumber]NetworkEndpointStats) 863 for proto, netEP := range nic.networkEndpoints { 864 netStats[proto] = netEP.Stats() 865 } 866 867 info := NICInfo{ 868 Name: nic.name, 869 LinkAddress: nic.LinkEndpoint.LinkAddress(), 870 ProtocolAddresses: nic.primaryAddresses(), 871 Flags: flags, 872 MTU: nic.LinkEndpoint.MTU(), 873 Stats: nic.stats.local, 874 NetworkStats: netStats, 875 Context: nic.context, 876 ARPHardwareType: nic.LinkEndpoint.ARPHardwareType(), 877 Forwarding: make(map[tcpip.NetworkProtocolNumber]bool), 878 } 879 880 for proto := range s.networkProtocols { 881 switch forwarding, err := nic.forwarding(proto); err.(type) { 882 case nil: 883 info.Forwarding[proto] = forwarding 884 case *tcpip.ErrUnknownProtocol: 885 panic(fmt.Sprintf("expected network protocol %d to be available on NIC %d", proto, nic.ID())) 886 case *tcpip.ErrNotSupported: 887 // Not all network protocols support forwarding. 888 default: 889 panic(fmt.Sprintf("nic(id=%d).forwarding(%d): %s", nic.ID(), proto, err)) 890 } 891 } 892 893 nics[id] = info 894 } 895 return nics 896 } 897 898 // NICStateFlags holds information about the state of an NIC. 899 type NICStateFlags struct { 900 // Up indicates whether the interface is running. 901 Up bool 902 903 // Running indicates whether resources are allocated. 904 Running bool 905 906 // Promiscuous indicates whether the interface is in promiscuous mode. 907 Promiscuous bool 908 909 // Loopback indicates whether the interface is a loopback. 910 Loopback bool 911 } 912 913 // AddProtocolAddress adds an address to the specified NIC, possibly with extra 914 // properties. 915 func (s *Stack) AddProtocolAddress(id tcpip.NICID, protocolAddress tcpip.ProtocolAddress, properties AddressProperties) tcpip.Error { 916 s.mu.RLock() 917 defer s.mu.RUnlock() 918 919 nic, ok := s.nics[id] 920 if !ok { 921 return &tcpip.ErrUnknownNICID{} 922 } 923 924 return nic.addAddress(protocolAddress, properties) 925 } 926 927 // RemoveAddress removes an existing network-layer address from the specified 928 // NIC. 929 func (s *Stack) RemoveAddress(id tcpip.NICID, addr tcpip.Address) tcpip.Error { 930 s.mu.RLock() 931 defer s.mu.RUnlock() 932 933 if nic, ok := s.nics[id]; ok { 934 return nic.removeAddress(addr) 935 } 936 937 return &tcpip.ErrUnknownNICID{} 938 } 939 940 // AllAddresses returns a map of NICIDs to their protocol addresses (primary 941 // and non-primary). 942 func (s *Stack) AllAddresses() map[tcpip.NICID][]tcpip.ProtocolAddress { 943 s.mu.RLock() 944 defer s.mu.RUnlock() 945 946 nics := make(map[tcpip.NICID][]tcpip.ProtocolAddress) 947 for id, nic := range s.nics { 948 nics[id] = nic.allPermanentAddresses() 949 } 950 return nics 951 } 952 953 // GetMainNICAddress returns the first non-deprecated primary address and prefix 954 // for the given NIC and protocol. If no non-deprecated primary addresses exist, 955 // a deprecated address will be returned. If no deprecated addresses exist, the 956 // zero value will be returned. 957 func (s *Stack) GetMainNICAddress(id tcpip.NICID, protocol tcpip.NetworkProtocolNumber) (tcpip.AddressWithPrefix, tcpip.Error) { 958 s.mu.RLock() 959 defer s.mu.RUnlock() 960 961 nic, ok := s.nics[id] 962 if !ok { 963 return tcpip.AddressWithPrefix{}, &tcpip.ErrUnknownNICID{} 964 } 965 966 return nic.PrimaryAddress(protocol) 967 } 968 969 func (s *Stack) getAddressEP(nic *nic, localAddr, remoteAddr tcpip.Address, netProto tcpip.NetworkProtocolNumber) AssignableAddressEndpoint { 970 if len(localAddr) == 0 { 971 return nic.primaryEndpoint(netProto, remoteAddr) 972 } 973 return nic.findEndpoint(netProto, localAddr, CanBePrimaryEndpoint) 974 } 975 976 // findLocalRouteFromNICRLocked is like findLocalRouteRLocked but finds a route 977 // from the specified NIC. 978 // 979 // Precondition: s.mu must be read locked. 980 func (s *Stack) findLocalRouteFromNICRLocked(localAddressNIC *nic, localAddr, remoteAddr tcpip.Address, netProto tcpip.NetworkProtocolNumber) *Route { 981 localAddressEndpoint := localAddressNIC.getAddressOrCreateTempInner(netProto, localAddr, false /* createTemp */, NeverPrimaryEndpoint) 982 if localAddressEndpoint == nil { 983 return nil 984 } 985 986 var outgoingNIC *nic 987 // Prefer a local route to the same interface as the local address. 988 if localAddressNIC.hasAddress(netProto, remoteAddr) { 989 outgoingNIC = localAddressNIC 990 } 991 992 // If the remote address isn't owned by the local address's NIC, check all 993 // NICs. 994 if outgoingNIC == nil { 995 for _, nic := range s.nics { 996 if nic.hasAddress(netProto, remoteAddr) { 997 outgoingNIC = nic 998 break 999 } 1000 } 1001 } 1002 1003 // If the remote address is not owned by the stack, we can't return a local 1004 // route. 1005 if outgoingNIC == nil { 1006 localAddressEndpoint.DecRef() 1007 return nil 1008 } 1009 1010 r := makeLocalRoute( 1011 netProto, 1012 localAddr, 1013 remoteAddr, 1014 outgoingNIC, 1015 localAddressNIC, 1016 localAddressEndpoint, 1017 ) 1018 1019 if r.IsOutboundBroadcast() { 1020 r.Release() 1021 return nil 1022 } 1023 1024 return r 1025 } 1026 1027 // findLocalRouteRLocked returns a local route. 1028 // 1029 // A local route is a route to some remote address which the stack owns. That 1030 // is, a local route is a route where packets never have to leave the stack. 1031 // 1032 // Precondition: s.mu must be read locked. 1033 func (s *Stack) findLocalRouteRLocked(localAddressNICID tcpip.NICID, localAddr, remoteAddr tcpip.Address, netProto tcpip.NetworkProtocolNumber) *Route { 1034 if len(localAddr) == 0 { 1035 localAddr = remoteAddr 1036 } 1037 1038 if localAddressNICID == 0 { 1039 for _, localAddressNIC := range s.nics { 1040 if r := s.findLocalRouteFromNICRLocked(localAddressNIC, localAddr, remoteAddr, netProto); r != nil { 1041 return r 1042 } 1043 } 1044 1045 return nil 1046 } 1047 1048 if localAddressNIC, ok := s.nics[localAddressNICID]; ok { 1049 return s.findLocalRouteFromNICRLocked(localAddressNIC, localAddr, remoteAddr, netProto) 1050 } 1051 1052 return nil 1053 } 1054 1055 // HandleLocal returns true if non-loopback interfaces are allowed to loop packets. 1056 func (s *Stack) HandleLocal() bool { 1057 return s.handleLocal 1058 } 1059 1060 func isNICForwarding(nic *nic, proto tcpip.NetworkProtocolNumber) bool { 1061 switch forwarding, err := nic.forwarding(proto); err.(type) { 1062 case nil: 1063 return forwarding 1064 case *tcpip.ErrUnknownProtocol: 1065 panic(fmt.Sprintf("expected network protocol %d to be available on NIC %d", proto, nic.ID())) 1066 case *tcpip.ErrNotSupported: 1067 // Not all network protocols support forwarding. 1068 return false 1069 default: 1070 panic(fmt.Sprintf("nic(id=%d).forwarding(%d): %s", nic.ID(), proto, err)) 1071 } 1072 } 1073 1074 // FindRoute creates a route to the given destination address, leaving through 1075 // the given NIC and local address (if provided). 1076 // 1077 // If a NIC is not specified, the returned route will leave through the same 1078 // NIC as the NIC that has the local address assigned when forwarding is 1079 // disabled. If forwarding is enabled and the NIC is unspecified, the route may 1080 // leave through any interface unless the route is link-local. 1081 // 1082 // If no local address is provided, the stack will select a local address. If no 1083 // remote address is provided, the stack wil use a remote address equal to the 1084 // local address. 1085 func (s *Stack) FindRoute(id tcpip.NICID, localAddr, remoteAddr tcpip.Address, netProto tcpip.NetworkProtocolNumber, multicastLoop bool) (*Route, tcpip.Error) { 1086 s.mu.RLock() 1087 defer s.mu.RUnlock() 1088 1089 isLinkLocal := header.IsV6LinkLocalUnicastAddress(remoteAddr) || header.IsV6LinkLocalMulticastAddress(remoteAddr) 1090 isLocalBroadcast := remoteAddr == header.IPv4Broadcast 1091 isMulticast := header.IsV4MulticastAddress(remoteAddr) || header.IsV6MulticastAddress(remoteAddr) 1092 isLoopback := header.IsV4LoopbackAddress(remoteAddr) || header.IsV6LoopbackAddress(remoteAddr) 1093 needRoute := !(isLocalBroadcast || isMulticast || isLinkLocal || isLoopback) 1094 1095 if s.handleLocal && !isMulticast && !isLocalBroadcast { 1096 if r := s.findLocalRouteRLocked(id, localAddr, remoteAddr, netProto); r != nil { 1097 return r, nil 1098 } 1099 } 1100 1101 // If the interface is specified and we do not need a route, return a route 1102 // through the interface if the interface is valid and enabled. 1103 if id != 0 && !needRoute { 1104 if nic, ok := s.nics[id]; ok && nic.Enabled() { 1105 if addressEndpoint := s.getAddressEP(nic, localAddr, remoteAddr, netProto); addressEndpoint != nil { 1106 return makeRoute( 1107 netProto, 1108 "", /* gateway */ 1109 localAddr, 1110 remoteAddr, 1111 nic, /* outboundNIC */ 1112 nic, /* localAddressNIC*/ 1113 addressEndpoint, 1114 s.handleLocal, 1115 multicastLoop, 1116 ), nil 1117 } 1118 } 1119 1120 if isLoopback { 1121 return nil, &tcpip.ErrBadLocalAddress{} 1122 } 1123 return nil, &tcpip.ErrNetworkUnreachable{} 1124 } 1125 1126 onlyGlobalAddresses := !header.IsV6LinkLocalUnicastAddress(localAddr) && !isLinkLocal 1127 1128 // Find a route to the remote with the route table. 1129 var chosenRoute tcpip.Route 1130 if r := func() *Route { 1131 s.route.mu.RLock() 1132 defer s.route.mu.RUnlock() 1133 1134 for _, route := range s.route.mu.table { 1135 if len(remoteAddr) != 0 && !route.Destination.Contains(remoteAddr) { 1136 continue 1137 } 1138 1139 nic, ok := s.nics[route.NIC] 1140 if !ok || !nic.Enabled() { 1141 continue 1142 } 1143 1144 if id == 0 || id == route.NIC { 1145 if addressEndpoint := s.getAddressEP(nic, localAddr, remoteAddr, netProto); addressEndpoint != nil { 1146 var gateway tcpip.Address 1147 if needRoute { 1148 gateway = route.Gateway 1149 } 1150 r := constructAndValidateRoute(netProto, addressEndpoint, nic /* outgoingNIC */, nic /* outgoingNIC */, gateway, localAddr, remoteAddr, s.handleLocal, multicastLoop) 1151 if r == nil { 1152 panic(fmt.Sprintf("non-forwarding route validation failed with route table entry = %#v, id = %d, localAddr = %s, remoteAddr = %s", route, id, localAddr, remoteAddr)) 1153 } 1154 return r 1155 } 1156 } 1157 1158 // If the stack has forwarding enabled and we haven't found a valid route 1159 // to the remote address yet, keep track of the first valid route. We 1160 // keep iterating because we prefer routes that let us use a local 1161 // address that is assigned to the outgoing interface. There is no 1162 // requirement to do this from any RFC but simply a choice made to better 1163 // follow a strong host model which the netstack follows at the time of 1164 // writing. 1165 if onlyGlobalAddresses && chosenRoute == (tcpip.Route{}) && isNICForwarding(nic, netProto) { 1166 chosenRoute = route 1167 } 1168 } 1169 1170 return nil 1171 }(); r != nil { 1172 return r, nil 1173 } 1174 1175 if chosenRoute != (tcpip.Route{}) { 1176 // At this point we know the stack has forwarding enabled since chosenRoute is 1177 // only set when forwarding is enabled. 1178 nic, ok := s.nics[chosenRoute.NIC] 1179 if !ok { 1180 // If the route's NIC was invalid, we should not have chosen the route. 1181 panic(fmt.Sprintf("chosen route must have a valid NIC with ID = %d", chosenRoute.NIC)) 1182 } 1183 1184 var gateway tcpip.Address 1185 if needRoute { 1186 gateway = chosenRoute.Gateway 1187 } 1188 1189 // Use the specified NIC to get the local address endpoint. 1190 if id != 0 { 1191 if aNIC, ok := s.nics[id]; ok { 1192 if addressEndpoint := s.getAddressEP(aNIC, localAddr, remoteAddr, netProto); addressEndpoint != nil { 1193 if r := constructAndValidateRoute(netProto, addressEndpoint, aNIC /* localAddressNIC */, nic /* outgoingNIC */, gateway, localAddr, remoteAddr, s.handleLocal, multicastLoop); r != nil { 1194 return r, nil 1195 } 1196 } 1197 } 1198 1199 return nil, &tcpip.ErrNoRoute{} 1200 } 1201 1202 if id == 0 { 1203 // If an interface is not specified, try to find a NIC that holds the local 1204 // address endpoint to construct a route. 1205 for _, aNIC := range s.nics { 1206 addressEndpoint := s.getAddressEP(aNIC, localAddr, remoteAddr, netProto) 1207 if addressEndpoint == nil { 1208 continue 1209 } 1210 1211 if r := constructAndValidateRoute(netProto, addressEndpoint, aNIC /* localAddressNIC */, nic /* outgoingNIC */, gateway, localAddr, remoteAddr, s.handleLocal, multicastLoop); r != nil { 1212 return r, nil 1213 } 1214 } 1215 } 1216 } 1217 1218 if needRoute { 1219 return nil, &tcpip.ErrNoRoute{} 1220 } 1221 if header.IsV6LoopbackAddress(remoteAddr) { 1222 return nil, &tcpip.ErrBadLocalAddress{} 1223 } 1224 return nil, &tcpip.ErrNetworkUnreachable{} 1225 } 1226 1227 // CheckNetworkProtocol checks if a given network protocol is enabled in the 1228 // stack. 1229 func (s *Stack) CheckNetworkProtocol(protocol tcpip.NetworkProtocolNumber) bool { 1230 _, ok := s.networkProtocols[protocol] 1231 return ok 1232 } 1233 1234 // CheckDuplicateAddress performs duplicate address detection for the address on 1235 // the specified interface. 1236 func (s *Stack) CheckDuplicateAddress(nicID tcpip.NICID, protocol tcpip.NetworkProtocolNumber, addr tcpip.Address, h DADCompletionHandler) (DADCheckAddressDisposition, tcpip.Error) { 1237 nic, ok := s.nics[nicID] 1238 if !ok { 1239 return 0, &tcpip.ErrUnknownNICID{} 1240 } 1241 1242 return nic.checkDuplicateAddress(protocol, addr, h) 1243 } 1244 1245 // CheckLocalAddress determines if the given local address exists, and if it 1246 // does, returns the id of the NIC it's bound to. Returns 0 if the address 1247 // does not exist. 1248 func (s *Stack) CheckLocalAddress(nicID tcpip.NICID, protocol tcpip.NetworkProtocolNumber, addr tcpip.Address) tcpip.NICID { 1249 s.mu.RLock() 1250 defer s.mu.RUnlock() 1251 1252 // If a NIC is specified, we try to find the address there only. 1253 if nicID != 0 { 1254 nic, ok := s.nics[nicID] 1255 if !ok { 1256 return 0 1257 } 1258 1259 if nic.CheckLocalAddress(protocol, addr) { 1260 return nic.id 1261 } 1262 1263 return 0 1264 } 1265 1266 // Go through all the NICs. 1267 for _, nic := range s.nics { 1268 if nic.CheckLocalAddress(protocol, addr) { 1269 return nic.id 1270 } 1271 } 1272 1273 return 0 1274 } 1275 1276 // SetPromiscuousMode enables or disables promiscuous mode in the given NIC. 1277 func (s *Stack) SetPromiscuousMode(nicID tcpip.NICID, enable bool) tcpip.Error { 1278 s.mu.RLock() 1279 defer s.mu.RUnlock() 1280 1281 nic, ok := s.nics[nicID] 1282 if !ok { 1283 return &tcpip.ErrUnknownNICID{} 1284 } 1285 1286 nic.setPromiscuousMode(enable) 1287 1288 return nil 1289 } 1290 1291 // SetSpoofing enables or disables address spoofing in the given NIC, allowing 1292 // endpoints to bind to any address in the NIC. 1293 func (s *Stack) SetSpoofing(nicID tcpip.NICID, enable bool) tcpip.Error { 1294 s.mu.RLock() 1295 defer s.mu.RUnlock() 1296 1297 nic, ok := s.nics[nicID] 1298 if !ok { 1299 return &tcpip.ErrUnknownNICID{} 1300 } 1301 1302 nic.setSpoofing(enable) 1303 1304 return nil 1305 } 1306 1307 // LinkResolutionResult is the result of a link address resolution attempt. 1308 type LinkResolutionResult struct { 1309 LinkAddress tcpip.LinkAddress 1310 Err tcpip.Error 1311 } 1312 1313 // GetLinkAddress finds the link address corresponding to a network address. 1314 // 1315 // Returns ErrNotSupported if the stack is not configured with a link address 1316 // resolver for the specified network protocol. 1317 // 1318 // Returns ErrWouldBlock if the link address is not readily available, along 1319 // with a notification channel for the caller to block on. Triggers address 1320 // resolution asynchronously. 1321 // 1322 // onResolve will be called either immediately, if resolution is not required, 1323 // or when address resolution is complete, with the resolved link address and 1324 // whether resolution succeeded. 1325 // 1326 // If specified, the local address must be an address local to the interface 1327 // the neighbor cache belongs to. The local address is the source address of 1328 // a packet prompting NUD/link address resolution. 1329 func (s *Stack) GetLinkAddress(nicID tcpip.NICID, addr, localAddr tcpip.Address, protocol tcpip.NetworkProtocolNumber, onResolve func(LinkResolutionResult)) tcpip.Error { 1330 s.mu.RLock() 1331 nic, ok := s.nics[nicID] 1332 s.mu.RUnlock() 1333 if !ok { 1334 return &tcpip.ErrUnknownNICID{} 1335 } 1336 1337 return nic.getLinkAddress(addr, localAddr, protocol, onResolve) 1338 } 1339 1340 // Neighbors returns all IP to MAC address associations. 1341 func (s *Stack) Neighbors(nicID tcpip.NICID, protocol tcpip.NetworkProtocolNumber) ([]NeighborEntry, tcpip.Error) { 1342 s.mu.RLock() 1343 nic, ok := s.nics[nicID] 1344 s.mu.RUnlock() 1345 1346 if !ok { 1347 return nil, &tcpip.ErrUnknownNICID{} 1348 } 1349 1350 return nic.neighbors(protocol) 1351 } 1352 1353 // AddStaticNeighbor statically associates an IP address to a MAC address. 1354 func (s *Stack) AddStaticNeighbor(nicID tcpip.NICID, protocol tcpip.NetworkProtocolNumber, addr tcpip.Address, linkAddr tcpip.LinkAddress) tcpip.Error { 1355 s.mu.RLock() 1356 nic, ok := s.nics[nicID] 1357 s.mu.RUnlock() 1358 1359 if !ok { 1360 return &tcpip.ErrUnknownNICID{} 1361 } 1362 1363 return nic.addStaticNeighbor(addr, protocol, linkAddr) 1364 } 1365 1366 // RemoveNeighbor removes an IP to MAC address association previously created 1367 // either automically or by AddStaticNeighbor. Returns ErrBadAddress if there 1368 // is no association with the provided address. 1369 func (s *Stack) RemoveNeighbor(nicID tcpip.NICID, protocol tcpip.NetworkProtocolNumber, addr tcpip.Address) tcpip.Error { 1370 s.mu.RLock() 1371 nic, ok := s.nics[nicID] 1372 s.mu.RUnlock() 1373 1374 if !ok { 1375 return &tcpip.ErrUnknownNICID{} 1376 } 1377 1378 return nic.removeNeighbor(protocol, addr) 1379 } 1380 1381 // ClearNeighbors removes all IP to MAC address associations. 1382 func (s *Stack) ClearNeighbors(nicID tcpip.NICID, protocol tcpip.NetworkProtocolNumber) tcpip.Error { 1383 s.mu.RLock() 1384 nic, ok := s.nics[nicID] 1385 s.mu.RUnlock() 1386 1387 if !ok { 1388 return &tcpip.ErrUnknownNICID{} 1389 } 1390 1391 return nic.clearNeighbors(protocol) 1392 } 1393 1394 // RegisterTransportEndpoint registers the given endpoint with the stack 1395 // transport dispatcher. Received packets that match the provided id will be 1396 // delivered to the given endpoint; specifying a nic is optional, but 1397 // nic-specific IDs have precedence over global ones. 1398 func (s *Stack) RegisterTransportEndpoint(netProtos []tcpip.NetworkProtocolNumber, protocol tcpip.TransportProtocolNumber, id TransportEndpointID, ep TransportEndpoint, flags ports.Flags, bindToDevice tcpip.NICID) tcpip.Error { 1399 return s.demux.registerEndpoint(netProtos, protocol, id, ep, flags, bindToDevice) 1400 } 1401 1402 // CheckRegisterTransportEndpoint checks if an endpoint can be registered with 1403 // the stack transport dispatcher. 1404 func (s *Stack) CheckRegisterTransportEndpoint(netProtos []tcpip.NetworkProtocolNumber, protocol tcpip.TransportProtocolNumber, id TransportEndpointID, flags ports.Flags, bindToDevice tcpip.NICID) tcpip.Error { 1405 return s.demux.checkEndpoint(netProtos, protocol, id, flags, bindToDevice) 1406 } 1407 1408 // UnregisterTransportEndpoint removes the endpoint with the given id from the 1409 // stack transport dispatcher. 1410 func (s *Stack) UnregisterTransportEndpoint(netProtos []tcpip.NetworkProtocolNumber, protocol tcpip.TransportProtocolNumber, id TransportEndpointID, ep TransportEndpoint, flags ports.Flags, bindToDevice tcpip.NICID) { 1411 s.demux.unregisterEndpoint(netProtos, protocol, id, ep, flags, bindToDevice) 1412 } 1413 1414 // StartTransportEndpointCleanup removes the endpoint with the given id from 1415 // the stack transport dispatcher. It also transitions it to the cleanup stage. 1416 func (s *Stack) StartTransportEndpointCleanup(netProtos []tcpip.NetworkProtocolNumber, protocol tcpip.TransportProtocolNumber, id TransportEndpointID, ep TransportEndpoint, flags ports.Flags, bindToDevice tcpip.NICID) { 1417 s.cleanupEndpointsMu.Lock() 1418 s.cleanupEndpoints[ep] = struct{}{} 1419 s.cleanupEndpointsMu.Unlock() 1420 1421 s.demux.unregisterEndpoint(netProtos, protocol, id, ep, flags, bindToDevice) 1422 } 1423 1424 // CompleteTransportEndpointCleanup removes the endpoint from the cleanup 1425 // stage. 1426 func (s *Stack) CompleteTransportEndpointCleanup(ep TransportEndpoint) { 1427 s.cleanupEndpointsMu.Lock() 1428 delete(s.cleanupEndpoints, ep) 1429 s.cleanupEndpointsMu.Unlock() 1430 } 1431 1432 // FindTransportEndpoint finds an endpoint that most closely matches the provided 1433 // id. If no endpoint is found it returns nil. 1434 func (s *Stack) FindTransportEndpoint(netProto tcpip.NetworkProtocolNumber, transProto tcpip.TransportProtocolNumber, id TransportEndpointID, nicID tcpip.NICID) TransportEndpoint { 1435 return s.demux.findTransportEndpoint(netProto, transProto, id, nicID) 1436 } 1437 1438 // RegisterRawTransportEndpoint registers the given endpoint with the stack 1439 // transport dispatcher. Received packets that match the provided transport 1440 // protocol will be delivered to the given endpoint. 1441 func (s *Stack) RegisterRawTransportEndpoint(netProto tcpip.NetworkProtocolNumber, transProto tcpip.TransportProtocolNumber, ep RawTransportEndpoint) tcpip.Error { 1442 return s.demux.registerRawEndpoint(netProto, transProto, ep) 1443 } 1444 1445 // UnregisterRawTransportEndpoint removes the endpoint for the transport 1446 // protocol from the stack transport dispatcher. 1447 func (s *Stack) UnregisterRawTransportEndpoint(netProto tcpip.NetworkProtocolNumber, transProto tcpip.TransportProtocolNumber, ep RawTransportEndpoint) { 1448 s.demux.unregisterRawEndpoint(netProto, transProto, ep) 1449 } 1450 1451 // RegisterRestoredEndpoint records e as an endpoint that has been restored on 1452 // this stack. 1453 func (s *Stack) RegisterRestoredEndpoint(e ResumableEndpoint) { 1454 s.mu.Lock() 1455 s.resumableEndpoints = append(s.resumableEndpoints, e) 1456 s.mu.Unlock() 1457 } 1458 1459 // RegisteredEndpoints returns all endpoints which are currently registered. 1460 func (s *Stack) RegisteredEndpoints() []TransportEndpoint { 1461 s.mu.Lock() 1462 defer s.mu.Unlock() 1463 var es []TransportEndpoint 1464 for _, e := range s.demux.protocol { 1465 es = append(es, e.transportEndpoints()...) 1466 } 1467 return es 1468 } 1469 1470 // CleanupEndpoints returns endpoints currently in the cleanup state. 1471 func (s *Stack) CleanupEndpoints() []TransportEndpoint { 1472 s.cleanupEndpointsMu.Lock() 1473 es := make([]TransportEndpoint, 0, len(s.cleanupEndpoints)) 1474 for e := range s.cleanupEndpoints { 1475 es = append(es, e) 1476 } 1477 s.cleanupEndpointsMu.Unlock() 1478 return es 1479 } 1480 1481 // RestoreCleanupEndpoints adds endpoints to cleanup tracking. This is useful 1482 // for restoring a stack after a save. 1483 func (s *Stack) RestoreCleanupEndpoints(es []TransportEndpoint) { 1484 s.cleanupEndpointsMu.Lock() 1485 for _, e := range es { 1486 s.cleanupEndpoints[e] = struct{}{} 1487 } 1488 s.cleanupEndpointsMu.Unlock() 1489 } 1490 1491 // Close closes all currently registered transport endpoints. 1492 // 1493 // Endpoints created or modified during this call may not get closed. 1494 func (s *Stack) Close() { 1495 for _, e := range s.RegisteredEndpoints() { 1496 e.Abort() 1497 } 1498 for _, p := range s.transportProtocols { 1499 p.proto.Close() 1500 } 1501 for _, p := range s.networkProtocols { 1502 p.Close() 1503 } 1504 } 1505 1506 // Wait waits for all transport and link endpoints to halt their worker 1507 // goroutines. 1508 // 1509 // Endpoints created or modified during this call may not get waited on. 1510 // 1511 // Note that link endpoints must be stopped via an implementation specific 1512 // mechanism. 1513 func (s *Stack) Wait() { 1514 for _, e := range s.RegisteredEndpoints() { 1515 e.Wait() 1516 } 1517 for _, e := range s.CleanupEndpoints() { 1518 e.Wait() 1519 } 1520 for _, p := range s.transportProtocols { 1521 p.proto.Wait() 1522 } 1523 for _, p := range s.networkProtocols { 1524 p.Wait() 1525 } 1526 1527 s.mu.RLock() 1528 defer s.mu.RUnlock() 1529 for _, n := range s.nics { 1530 n.LinkEndpoint.Wait() 1531 } 1532 } 1533 1534 // Resume restarts the stack after a restore. This must be called after the 1535 // entire system has been restored. 1536 func (s *Stack) Resume() { 1537 // ResumableEndpoint.Resume() may call other methods on s, so we can't hold 1538 // s.mu while resuming the endpoints. 1539 s.mu.Lock() 1540 eps := s.resumableEndpoints 1541 s.resumableEndpoints = nil 1542 s.mu.Unlock() 1543 for _, e := range eps { 1544 e.Resume(s) 1545 } 1546 } 1547 1548 // RegisterPacketEndpoint registers ep with the stack, causing it to receive 1549 // all traffic of the specified netProto on the given NIC. If nicID is 0, it 1550 // receives traffic from every NIC. 1551 func (s *Stack) RegisterPacketEndpoint(nicID tcpip.NICID, netProto tcpip.NetworkProtocolNumber, ep PacketEndpoint) tcpip.Error { 1552 s.mu.Lock() 1553 defer s.mu.Unlock() 1554 1555 // If no NIC is specified, capture on all devices. 1556 if nicID == 0 { 1557 // Register with each NIC. 1558 for _, nic := range s.nics { 1559 if err := nic.registerPacketEndpoint(netProto, ep); err != nil { 1560 s.unregisterPacketEndpointLocked(0, netProto, ep) 1561 return err 1562 } 1563 } 1564 return nil 1565 } 1566 1567 // Capture on a specific device. 1568 nic, ok := s.nics[nicID] 1569 if !ok { 1570 return &tcpip.ErrUnknownNICID{} 1571 } 1572 if err := nic.registerPacketEndpoint(netProto, ep); err != nil { 1573 return err 1574 } 1575 1576 return nil 1577 } 1578 1579 // UnregisterPacketEndpoint unregisters ep for packets of the specified 1580 // netProto from the specified NIC. If nicID is 0, ep is unregistered from all 1581 // NICs. 1582 func (s *Stack) UnregisterPacketEndpoint(nicID tcpip.NICID, netProto tcpip.NetworkProtocolNumber, ep PacketEndpoint) { 1583 s.mu.Lock() 1584 defer s.mu.Unlock() 1585 s.unregisterPacketEndpointLocked(nicID, netProto, ep) 1586 } 1587 1588 func (s *Stack) unregisterPacketEndpointLocked(nicID tcpip.NICID, netProto tcpip.NetworkProtocolNumber, ep PacketEndpoint) { 1589 // If no NIC is specified, unregister on all devices. 1590 if nicID == 0 { 1591 // Unregister with each NIC. 1592 for _, nic := range s.nics { 1593 nic.unregisterPacketEndpoint(netProto, ep) 1594 } 1595 return 1596 } 1597 1598 // Unregister in a single device. 1599 nic, ok := s.nics[nicID] 1600 if !ok { 1601 return 1602 } 1603 nic.unregisterPacketEndpoint(netProto, ep) 1604 } 1605 1606 // WritePacketToRemote writes a payload on the specified NIC using the provided 1607 // network protocol and remote link address. 1608 func (s *Stack) WritePacketToRemote(nicID tcpip.NICID, remote tcpip.LinkAddress, netProto tcpip.NetworkProtocolNumber, payload buffer.VectorisedView) tcpip.Error { 1609 s.mu.Lock() 1610 nic, ok := s.nics[nicID] 1611 s.mu.Unlock() 1612 if !ok { 1613 return &tcpip.ErrUnknownDevice{} 1614 } 1615 pkt := NewPacketBuffer(PacketBufferOptions{ 1616 ReserveHeaderBytes: int(nic.MaxHeaderLength()), 1617 Data: payload, 1618 }) 1619 defer pkt.DecRef() 1620 pkt.NetworkProtocolNumber = netProto 1621 return nic.WritePacketToRemote(remote, netProto, pkt) 1622 } 1623 1624 // WriteRawPacket writes data directly to the specified NIC without adding any 1625 // headers. 1626 func (s *Stack) WriteRawPacket(nicID tcpip.NICID, proto tcpip.NetworkProtocolNumber, payload buffer.VectorisedView) tcpip.Error { 1627 s.mu.RLock() 1628 nic, ok := s.nics[nicID] 1629 s.mu.RUnlock() 1630 if !ok { 1631 return &tcpip.ErrUnknownNICID{} 1632 } 1633 1634 pkt := NewPacketBuffer(PacketBufferOptions{ 1635 Data: payload, 1636 }) 1637 defer pkt.DecRef() 1638 pkt.NetworkProtocolNumber = proto 1639 return nic.WriteRawPacket(pkt) 1640 } 1641 1642 // NetworkProtocolInstance returns the protocol instance in the stack for the 1643 // specified network protocol. This method is public for protocol implementers 1644 // and tests to use. 1645 func (s *Stack) NetworkProtocolInstance(num tcpip.NetworkProtocolNumber) NetworkProtocol { 1646 if p, ok := s.networkProtocols[num]; ok { 1647 return p 1648 } 1649 return nil 1650 } 1651 1652 // TransportProtocolInstance returns the protocol instance in the stack for the 1653 // specified transport protocol. This method is public for protocol implementers 1654 // and tests to use. 1655 func (s *Stack) TransportProtocolInstance(num tcpip.TransportProtocolNumber) TransportProtocol { 1656 if pState, ok := s.transportProtocols[num]; ok { 1657 return pState.proto 1658 } 1659 return nil 1660 } 1661 1662 // AddTCPProbe installs a probe function that will be invoked on every segment 1663 // received by a given TCP endpoint. The probe function is passed a copy of the 1664 // TCP endpoint state before and after processing of the segment. 1665 // 1666 // NOTE: TCPProbe is added only to endpoints created after this call. Endpoints 1667 // created prior to this call will not call the probe function. 1668 // 1669 // Further, installing two different probes back to back can result in some 1670 // endpoints calling the first one and some the second one. There is no 1671 // guarantee provided on which probe will be invoked. Ideally this should only 1672 // be called once per stack. 1673 func (s *Stack) AddTCPProbe(probe TCPProbeFunc) { 1674 s.tcpProbeFunc.Store(probe) 1675 } 1676 1677 // GetTCPProbe returns the TCPProbeFunc if installed with AddTCPProbe, nil 1678 // otherwise. 1679 func (s *Stack) GetTCPProbe() TCPProbeFunc { 1680 p := s.tcpProbeFunc.Load() 1681 if p == nil { 1682 return nil 1683 } 1684 return p.(TCPProbeFunc) 1685 } 1686 1687 // RemoveTCPProbe removes an installed TCP probe. 1688 // 1689 // NOTE: This only ensures that endpoints created after this call do not 1690 // have a probe attached. Endpoints already created will continue to invoke 1691 // TCP probe. 1692 func (s *Stack) RemoveTCPProbe() { 1693 // This must be TCPProbeFunc(nil) because atomic.Value.Store(nil) panics. 1694 s.tcpProbeFunc.Store(TCPProbeFunc(nil)) 1695 } 1696 1697 // JoinGroup joins the given multicast group on the given NIC. 1698 func (s *Stack) JoinGroup(protocol tcpip.NetworkProtocolNumber, nicID tcpip.NICID, multicastAddr tcpip.Address) tcpip.Error { 1699 s.mu.RLock() 1700 defer s.mu.RUnlock() 1701 1702 if nic, ok := s.nics[nicID]; ok { 1703 return nic.joinGroup(protocol, multicastAddr) 1704 } 1705 return &tcpip.ErrUnknownNICID{} 1706 } 1707 1708 // LeaveGroup leaves the given multicast group on the given NIC. 1709 func (s *Stack) LeaveGroup(protocol tcpip.NetworkProtocolNumber, nicID tcpip.NICID, multicastAddr tcpip.Address) tcpip.Error { 1710 s.mu.RLock() 1711 defer s.mu.RUnlock() 1712 1713 if nic, ok := s.nics[nicID]; ok { 1714 return nic.leaveGroup(protocol, multicastAddr) 1715 } 1716 return &tcpip.ErrUnknownNICID{} 1717 } 1718 1719 // IsInGroup returns true if the NIC with ID nicID has joined the multicast 1720 // group multicastAddr. 1721 func (s *Stack) IsInGroup(nicID tcpip.NICID, multicastAddr tcpip.Address) (bool, tcpip.Error) { 1722 s.mu.RLock() 1723 defer s.mu.RUnlock() 1724 1725 if nic, ok := s.nics[nicID]; ok { 1726 return nic.isInGroup(multicastAddr), nil 1727 } 1728 return false, &tcpip.ErrUnknownNICID{} 1729 } 1730 1731 // IPTables returns the stack's iptables. 1732 func (s *Stack) IPTables() *IPTables { 1733 return s.tables 1734 } 1735 1736 // ICMPLimit returns the maximum number of ICMP messages that can be sent 1737 // in one second. 1738 func (s *Stack) ICMPLimit() rate.Limit { 1739 return s.icmpRateLimiter.Limit() 1740 } 1741 1742 // SetICMPLimit sets the maximum number of ICMP messages that be sent 1743 // in one second. 1744 func (s *Stack) SetICMPLimit(newLimit rate.Limit) { 1745 s.icmpRateLimiter.SetLimit(newLimit) 1746 } 1747 1748 // ICMPBurst returns the maximum number of ICMP messages that can be sent 1749 // in a single burst. 1750 func (s *Stack) ICMPBurst() int { 1751 return s.icmpRateLimiter.Burst() 1752 } 1753 1754 // SetICMPBurst sets the maximum number of ICMP messages that can be sent 1755 // in a single burst. 1756 func (s *Stack) SetICMPBurst(burst int) { 1757 s.icmpRateLimiter.SetBurst(burst) 1758 } 1759 1760 // AllowICMPMessage returns true if we the rate limiter allows at least one 1761 // ICMP message to be sent at this instant. 1762 func (s *Stack) AllowICMPMessage() bool { 1763 return s.icmpRateLimiter.Allow() 1764 } 1765 1766 // GetNetworkEndpoint returns the NetworkEndpoint with the specified protocol 1767 // number installed on the specified NIC. 1768 func (s *Stack) GetNetworkEndpoint(nicID tcpip.NICID, proto tcpip.NetworkProtocolNumber) (NetworkEndpoint, tcpip.Error) { 1769 s.mu.Lock() 1770 defer s.mu.Unlock() 1771 1772 nic, ok := s.nics[nicID] 1773 if !ok { 1774 return nil, &tcpip.ErrUnknownNICID{} 1775 } 1776 1777 return nic.getNetworkEndpoint(proto), nil 1778 } 1779 1780 // NUDConfigurations gets the per-interface NUD configurations. 1781 func (s *Stack) NUDConfigurations(id tcpip.NICID, proto tcpip.NetworkProtocolNumber) (NUDConfigurations, tcpip.Error) { 1782 s.mu.RLock() 1783 nic, ok := s.nics[id] 1784 s.mu.RUnlock() 1785 1786 if !ok { 1787 return NUDConfigurations{}, &tcpip.ErrUnknownNICID{} 1788 } 1789 1790 return nic.nudConfigs(proto) 1791 } 1792 1793 // SetNUDConfigurations sets the per-interface NUD configurations. 1794 // 1795 // Note, if c contains invalid NUD configuration values, it will be fixed to 1796 // use default values for the erroneous values. 1797 func (s *Stack) SetNUDConfigurations(id tcpip.NICID, proto tcpip.NetworkProtocolNumber, c NUDConfigurations) tcpip.Error { 1798 s.mu.RLock() 1799 nic, ok := s.nics[id] 1800 s.mu.RUnlock() 1801 1802 if !ok { 1803 return &tcpip.ErrUnknownNICID{} 1804 } 1805 1806 return nic.setNUDConfigs(proto, c) 1807 } 1808 1809 // Seed returns a 32 bit value that can be used as a seed value. 1810 // 1811 // NOTE: The seed is generated once during stack initialization only. 1812 func (s *Stack) Seed() uint32 { 1813 return s.seed 1814 } 1815 1816 // Rand returns a reference to a pseudo random generator that can be used 1817 // to generate random numbers as required. 1818 func (s *Stack) Rand() *rand.Rand { 1819 return s.randomGenerator 1820 } 1821 1822 // SecureRNG returns the stack's cryptographically secure random number 1823 // generator. 1824 func (s *Stack) SecureRNG() io.Reader { 1825 return s.secureRNG 1826 } 1827 1828 // FindNICNameFromID returns the name of the NIC for the given NICID. 1829 func (s *Stack) FindNICNameFromID(id tcpip.NICID) string { 1830 s.mu.RLock() 1831 defer s.mu.RUnlock() 1832 1833 nic, ok := s.nics[id] 1834 if !ok { 1835 return "" 1836 } 1837 1838 return nic.Name() 1839 } 1840 1841 // ParseResult indicates the result of a parsing attempt. 1842 type ParseResult int 1843 1844 const ( 1845 // ParsedOK indicates that a packet was successfully parsed. 1846 ParsedOK ParseResult = iota 1847 1848 // UnknownTransportProtocol indicates that the transport protocol is unknown. 1849 UnknownTransportProtocol 1850 1851 // TransportLayerParseError indicates that the transport packet was not 1852 // successfully parsed. 1853 TransportLayerParseError 1854 ) 1855 1856 // ParsePacketBufferTransport parses the provided packet buffer's transport 1857 // header. 1858 func (s *Stack) ParsePacketBufferTransport(protocol tcpip.TransportProtocolNumber, pkt *PacketBuffer) ParseResult { 1859 pkt.TransportProtocolNumber = protocol 1860 // Parse the transport header if present. 1861 state, ok := s.transportProtocols[protocol] 1862 if !ok { 1863 return UnknownTransportProtocol 1864 } 1865 1866 if !state.proto.Parse(pkt) { 1867 return TransportLayerParseError 1868 } 1869 1870 return ParsedOK 1871 } 1872 1873 // networkProtocolNumbers returns the network protocol numbers the stack is 1874 // configured with. 1875 func (s *Stack) networkProtocolNumbers() []tcpip.NetworkProtocolNumber { 1876 protos := make([]tcpip.NetworkProtocolNumber, 0, len(s.networkProtocols)) 1877 for p := range s.networkProtocols { 1878 protos = append(protos, p) 1879 } 1880 return protos 1881 } 1882 1883 func isSubnetBroadcastOnNIC(nic *nic, protocol tcpip.NetworkProtocolNumber, addr tcpip.Address) bool { 1884 addressEndpoint := nic.getAddressOrCreateTempInner(protocol, addr, false /* createTemp */, NeverPrimaryEndpoint) 1885 if addressEndpoint == nil { 1886 return false 1887 } 1888 1889 subnet := addressEndpoint.Subnet() 1890 addressEndpoint.DecRef() 1891 return subnet.IsBroadcast(addr) 1892 } 1893 1894 // IsSubnetBroadcast returns true if the provided address is a subnet-local 1895 // broadcast address on the specified NIC and protocol. 1896 // 1897 // Returns false if the NIC is unknown or if the protocol is unknown or does 1898 // not support addressing. 1899 // 1900 // If the NIC is not specified, the stack will check all NICs. 1901 func (s *Stack) IsSubnetBroadcast(nicID tcpip.NICID, protocol tcpip.NetworkProtocolNumber, addr tcpip.Address) bool { 1902 s.mu.RLock() 1903 defer s.mu.RUnlock() 1904 1905 if nicID != 0 { 1906 nic, ok := s.nics[nicID] 1907 if !ok { 1908 return false 1909 } 1910 1911 return isSubnetBroadcastOnNIC(nic, protocol, addr) 1912 } 1913 1914 for _, nic := range s.nics { 1915 if isSubnetBroadcastOnNIC(nic, protocol, addr) { 1916 return true 1917 } 1918 } 1919 1920 return false 1921 } 1922 1923 // PacketEndpointWriteSupported returns true iff packet endpoints support write 1924 // operations. 1925 func (s *Stack) PacketEndpointWriteSupported() bool { 1926 return s.packetEndpointWriteSupported 1927 }