github.com/flowerwrong/netstack@v0.0.0-20191009141956-e5848263af28/tcpip/stack/transport_test.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_test 16 17 import ( 18 "testing" 19 20 "github.com/FlowerWrong/netstack/tcpip" 21 "github.com/FlowerWrong/netstack/tcpip/buffer" 22 "github.com/FlowerWrong/netstack/tcpip/iptables" 23 "github.com/FlowerWrong/netstack/tcpip/link/channel" 24 "github.com/FlowerWrong/netstack/tcpip/link/loopback" 25 "github.com/FlowerWrong/netstack/tcpip/stack" 26 "github.com/FlowerWrong/netstack/waiter" 27 ) 28 29 const ( 30 fakeTransNumber tcpip.TransportProtocolNumber = 1 31 fakeTransHeaderLen = 3 32 ) 33 34 // fakeTransportEndpoint is a transport-layer protocol endpoint. It counts 35 // received packets; the counts of all endpoints are aggregated in the protocol 36 // descriptor. 37 // 38 // Headers of this protocol are fakeTransHeaderLen bytes, but we currently don't 39 // use it. 40 type fakeTransportEndpoint struct { 41 id stack.TransportEndpointID 42 stack *stack.Stack 43 netProto tcpip.NetworkProtocolNumber 44 proto *fakeTransportProtocol 45 peerAddr tcpip.Address 46 route stack.Route 47 48 // acceptQueue is non-nil iff bound. 49 acceptQueue []fakeTransportEndpoint 50 } 51 52 func newFakeTransportEndpoint(stack *stack.Stack, proto *fakeTransportProtocol, netProto tcpip.NetworkProtocolNumber) tcpip.Endpoint { 53 return &fakeTransportEndpoint{stack: stack, netProto: netProto, proto: proto} 54 } 55 56 func (f *fakeTransportEndpoint) Close() { 57 f.route.Release() 58 } 59 60 func (*fakeTransportEndpoint) Readiness(mask waiter.EventMask) waiter.EventMask { 61 return mask 62 } 63 64 func (*fakeTransportEndpoint) Read(*tcpip.FullAddress) (buffer.View, tcpip.ControlMessages, *tcpip.Error) { 65 return buffer.View{}, tcpip.ControlMessages{}, nil 66 } 67 68 func (f *fakeTransportEndpoint) Write(p tcpip.Payloader, opts tcpip.WriteOptions) (int64, <-chan struct{}, *tcpip.Error) { 69 if len(f.route.RemoteAddress) == 0 { 70 return 0, nil, tcpip.ErrNoRoute 71 } 72 73 hdr := buffer.NewPrependable(int(f.route.MaxHeaderLength())) 74 v, err := p.FullPayload() 75 if err != nil { 76 return 0, nil, err 77 } 78 if err := f.route.WritePacket(nil /* gso */, hdr, buffer.View(v).ToVectorisedView(), fakeTransNumber, 123 /* ttl */, false /* useDefaultTTL */); err != nil { 79 return 0, nil, err 80 } 81 82 return int64(len(v)), nil, nil 83 } 84 85 func (f *fakeTransportEndpoint) Peek([][]byte) (int64, tcpip.ControlMessages, *tcpip.Error) { 86 return 0, tcpip.ControlMessages{}, nil 87 } 88 89 // SetSockOpt sets a socket option. Currently not supported. 90 func (*fakeTransportEndpoint) SetSockOpt(interface{}) *tcpip.Error { 91 return tcpip.ErrInvalidEndpointState 92 } 93 94 // SetSockOptInt sets a socket option. Currently not supported. 95 func (*fakeTransportEndpoint) SetSockOptInt(tcpip.SockOpt, int) *tcpip.Error { 96 return tcpip.ErrInvalidEndpointState 97 } 98 99 // GetSockOptInt implements tcpip.Endpoint.GetSockOptInt. 100 func (*fakeTransportEndpoint) GetSockOptInt(opt tcpip.SockOpt) (int, *tcpip.Error) { 101 return -1, tcpip.ErrUnknownProtocolOption 102 } 103 104 // GetSockOpt implements tcpip.Endpoint.GetSockOpt. 105 func (*fakeTransportEndpoint) GetSockOpt(opt interface{}) *tcpip.Error { 106 switch opt.(type) { 107 case tcpip.ErrorOption: 108 return nil 109 } 110 return tcpip.ErrInvalidEndpointState 111 } 112 113 // Disconnect implements tcpip.Endpoint.Disconnect. 114 func (*fakeTransportEndpoint) Disconnect() *tcpip.Error { 115 return tcpip.ErrNotSupported 116 } 117 118 func (f *fakeTransportEndpoint) Connect(addr tcpip.FullAddress) *tcpip.Error { 119 f.peerAddr = addr.Addr 120 121 // Find the route. 122 r, err := f.stack.FindRoute(addr.NIC, "", addr.Addr, fakeNetNumber, false /* multicastLoop */) 123 if err != nil { 124 return tcpip.ErrNoRoute 125 } 126 defer r.Release() 127 128 // Try to register so that we can start receiving packets. 129 f.id.RemoteAddress = addr.Addr 130 err = f.stack.RegisterTransportEndpoint(0, []tcpip.NetworkProtocolNumber{fakeNetNumber}, fakeTransNumber, f.id, f, false /* reuse */, 0 /* bindToDevice */) 131 if err != nil { 132 return err 133 } 134 135 f.route = r.Clone() 136 137 return nil 138 } 139 140 func (f *fakeTransportEndpoint) ConnectEndpoint(e tcpip.Endpoint) *tcpip.Error { 141 return nil 142 } 143 144 func (*fakeTransportEndpoint) Shutdown(tcpip.ShutdownFlags) *tcpip.Error { 145 return nil 146 } 147 148 func (*fakeTransportEndpoint) Reset() { 149 } 150 151 func (*fakeTransportEndpoint) Listen(int) *tcpip.Error { 152 return nil 153 } 154 155 func (f *fakeTransportEndpoint) Accept() (tcpip.Endpoint, *waiter.Queue, *tcpip.Error) { 156 if len(f.acceptQueue) == 0 { 157 return nil, nil, nil 158 } 159 a := f.acceptQueue[0] 160 f.acceptQueue = f.acceptQueue[1:] 161 return &a, nil, nil 162 } 163 164 func (f *fakeTransportEndpoint) Bind(a tcpip.FullAddress) *tcpip.Error { 165 if err := f.stack.RegisterTransportEndpoint( 166 a.NIC, 167 []tcpip.NetworkProtocolNumber{fakeNetNumber}, 168 fakeTransNumber, 169 stack.TransportEndpointID{LocalAddress: a.Addr}, 170 f, 171 false, /* reuse */ 172 0, /* bindtoDevice */ 173 ); err != nil { 174 return err 175 } 176 f.acceptQueue = []fakeTransportEndpoint{} 177 return nil 178 } 179 180 func (*fakeTransportEndpoint) GetLocalAddress() (tcpip.FullAddress, *tcpip.Error) { 181 return tcpip.FullAddress{}, nil 182 } 183 184 func (*fakeTransportEndpoint) GetRemoteAddress() (tcpip.FullAddress, *tcpip.Error) { 185 return tcpip.FullAddress{}, nil 186 } 187 188 func (f *fakeTransportEndpoint) HandlePacket(r *stack.Route, id stack.TransportEndpointID, _ buffer.VectorisedView) { 189 // Increment the number of received packets. 190 f.proto.packetCount++ 191 if f.acceptQueue != nil { 192 f.acceptQueue = append(f.acceptQueue, fakeTransportEndpoint{ 193 id: id, 194 stack: f.stack, 195 netProto: f.netProto, 196 proto: f.proto, 197 peerAddr: r.RemoteAddress, 198 route: r.Clone(), 199 }) 200 } 201 } 202 203 func (f *fakeTransportEndpoint) HandleControlPacket(stack.TransportEndpointID, stack.ControlType, uint32, buffer.VectorisedView) { 204 // Increment the number of received control packets. 205 f.proto.controlCount++ 206 } 207 208 func (f *fakeTransportEndpoint) State() uint32 { 209 return 0 210 } 211 212 func (f *fakeTransportEndpoint) ModerateRecvBuf(copied int) { 213 } 214 215 func (f *fakeTransportEndpoint) IPTables() (iptables.IPTables, error) { 216 return iptables.IPTables{}, nil 217 } 218 219 func (f *fakeTransportEndpoint) Resume(*stack.Stack) { 220 } 221 222 type fakeTransportGoodOption bool 223 224 type fakeTransportBadOption bool 225 226 type fakeTransportInvalidValueOption int 227 228 type fakeTransportProtocolOptions struct { 229 good bool 230 } 231 232 // fakeTransportProtocol is a transport-layer protocol descriptor. It 233 // aggregates the number of packets received via endpoints of this protocol. 234 type fakeTransportProtocol struct { 235 packetCount int 236 controlCount int 237 opts fakeTransportProtocolOptions 238 } 239 240 func (*fakeTransportProtocol) Number() tcpip.TransportProtocolNumber { 241 return fakeTransNumber 242 } 243 244 func (f *fakeTransportProtocol) NewEndpoint(stack *stack.Stack, netProto tcpip.NetworkProtocolNumber, _ *waiter.Queue) (tcpip.Endpoint, *tcpip.Error) { 245 return newFakeTransportEndpoint(stack, f, netProto), nil 246 } 247 248 func (f *fakeTransportProtocol) NewRawEndpoint(stack *stack.Stack, netProto tcpip.NetworkProtocolNumber, _ *waiter.Queue) (tcpip.Endpoint, *tcpip.Error) { 249 return nil, tcpip.ErrUnknownProtocol 250 } 251 252 func (*fakeTransportProtocol) MinimumPacketSize() int { 253 return fakeTransHeaderLen 254 } 255 256 func (*fakeTransportProtocol) ParsePorts(buffer.View) (src, dst uint16, err *tcpip.Error) { 257 return 0, 0, nil 258 } 259 260 func (*fakeTransportProtocol) HandleUnknownDestinationPacket(*stack.Route, stack.TransportEndpointID, buffer.View, buffer.VectorisedView) bool { 261 return true 262 } 263 264 func (f *fakeTransportProtocol) SetOption(option interface{}) *tcpip.Error { 265 switch v := option.(type) { 266 case fakeTransportGoodOption: 267 f.opts.good = bool(v) 268 return nil 269 case fakeTransportInvalidValueOption: 270 return tcpip.ErrInvalidOptionValue 271 default: 272 return tcpip.ErrUnknownProtocolOption 273 } 274 } 275 276 func (f *fakeTransportProtocol) Option(option interface{}) *tcpip.Error { 277 switch v := option.(type) { 278 case *fakeTransportGoodOption: 279 *v = fakeTransportGoodOption(f.opts.good) 280 return nil 281 default: 282 return tcpip.ErrUnknownProtocolOption 283 } 284 } 285 286 func fakeTransFactory() stack.TransportProtocol { 287 return &fakeTransportProtocol{} 288 } 289 290 func TestTransportReceive(t *testing.T) { 291 linkEP := channel.New(10, defaultMTU, "") 292 s := stack.New(stack.Options{ 293 NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()}, 294 TransportProtocols: []stack.TransportProtocol{fakeTransFactory()}, 295 }) 296 if err := s.CreateNIC(1, linkEP); err != nil { 297 t.Fatalf("CreateNIC failed: %v", err) 298 } 299 300 { 301 subnet, err := tcpip.NewSubnet("\x00", "\x00") 302 if err != nil { 303 t.Fatal(err) 304 } 305 s.SetRouteTable([]tcpip.Route{{Destination: subnet, Gateway: "\x00", NIC: 1}}) 306 } 307 308 if err := s.AddAddress(1, fakeNetNumber, "\x01"); err != nil { 309 t.Fatalf("AddAddress failed: %v", err) 310 } 311 312 // Create endpoint and connect to remote address. 313 wq := waiter.Queue{} 314 ep, err := s.NewEndpoint(fakeTransNumber, fakeNetNumber, &wq) 315 if err != nil { 316 t.Fatalf("NewEndpoint failed: %v", err) 317 } 318 319 if err := ep.Connect(tcpip.FullAddress{0, "\x02", 0}); err != nil { 320 t.Fatalf("Connect failed: %v", err) 321 } 322 323 fakeTrans := s.TransportProtocolInstance(fakeTransNumber).(*fakeTransportProtocol) 324 325 // Create buffer that will hold the packet. 326 buf := buffer.NewView(30) 327 328 // Make sure packet with wrong protocol is not delivered. 329 buf[0] = 1 330 buf[2] = 0 331 linkEP.Inject(fakeNetNumber, buf.ToVectorisedView()) 332 if fakeTrans.packetCount != 0 { 333 t.Errorf("packetCount = %d, want %d", fakeTrans.packetCount, 0) 334 } 335 336 // Make sure packet from the wrong source is not delivered. 337 buf[0] = 1 338 buf[1] = 3 339 buf[2] = byte(fakeTransNumber) 340 linkEP.Inject(fakeNetNumber, buf.ToVectorisedView()) 341 if fakeTrans.packetCount != 0 { 342 t.Errorf("packetCount = %d, want %d", fakeTrans.packetCount, 0) 343 } 344 345 // Make sure packet is delivered. 346 buf[0] = 1 347 buf[1] = 2 348 buf[2] = byte(fakeTransNumber) 349 linkEP.Inject(fakeNetNumber, buf.ToVectorisedView()) 350 if fakeTrans.packetCount != 1 { 351 t.Errorf("packetCount = %d, want %d", fakeTrans.packetCount, 1) 352 } 353 } 354 355 func TestTransportControlReceive(t *testing.T) { 356 linkEP := channel.New(10, defaultMTU, "") 357 s := stack.New(stack.Options{ 358 NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()}, 359 TransportProtocols: []stack.TransportProtocol{fakeTransFactory()}, 360 }) 361 if err := s.CreateNIC(1, linkEP); err != nil { 362 t.Fatalf("CreateNIC failed: %v", err) 363 } 364 365 { 366 subnet, err := tcpip.NewSubnet("\x00", "\x00") 367 if err != nil { 368 t.Fatal(err) 369 } 370 s.SetRouteTable([]tcpip.Route{{Destination: subnet, Gateway: "\x00", NIC: 1}}) 371 } 372 373 if err := s.AddAddress(1, fakeNetNumber, "\x01"); err != nil { 374 t.Fatalf("AddAddress failed: %v", err) 375 } 376 377 // Create endpoint and connect to remote address. 378 wq := waiter.Queue{} 379 ep, err := s.NewEndpoint(fakeTransNumber, fakeNetNumber, &wq) 380 if err != nil { 381 t.Fatalf("NewEndpoint failed: %v", err) 382 } 383 384 if err := ep.Connect(tcpip.FullAddress{0, "\x02", 0}); err != nil { 385 t.Fatalf("Connect failed: %v", err) 386 } 387 388 fakeTrans := s.TransportProtocolInstance(fakeTransNumber).(*fakeTransportProtocol) 389 390 // Create buffer that will hold the control packet. 391 buf := buffer.NewView(2*fakeNetHeaderLen + 30) 392 393 // Outer packet contains the control protocol number. 394 buf[0] = 1 395 buf[1] = 0xfe 396 buf[2] = uint8(fakeControlProtocol) 397 398 // Make sure packet with wrong protocol is not delivered. 399 buf[fakeNetHeaderLen+0] = 0 400 buf[fakeNetHeaderLen+1] = 1 401 buf[fakeNetHeaderLen+2] = 0 402 linkEP.Inject(fakeNetNumber, buf.ToVectorisedView()) 403 if fakeTrans.controlCount != 0 { 404 t.Errorf("controlCount = %d, want %d", fakeTrans.controlCount, 0) 405 } 406 407 // Make sure packet from the wrong source is not delivered. 408 buf[fakeNetHeaderLen+0] = 3 409 buf[fakeNetHeaderLen+1] = 1 410 buf[fakeNetHeaderLen+2] = byte(fakeTransNumber) 411 linkEP.Inject(fakeNetNumber, buf.ToVectorisedView()) 412 if fakeTrans.controlCount != 0 { 413 t.Errorf("controlCount = %d, want %d", fakeTrans.controlCount, 0) 414 } 415 416 // Make sure packet is delivered. 417 buf[fakeNetHeaderLen+0] = 2 418 buf[fakeNetHeaderLen+1] = 1 419 buf[fakeNetHeaderLen+2] = byte(fakeTransNumber) 420 linkEP.Inject(fakeNetNumber, buf.ToVectorisedView()) 421 if fakeTrans.controlCount != 1 { 422 t.Errorf("controlCount = %d, want %d", fakeTrans.controlCount, 1) 423 } 424 } 425 426 func TestTransportSend(t *testing.T) { 427 linkEP := channel.New(10, defaultMTU, "") 428 s := stack.New(stack.Options{ 429 NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()}, 430 TransportProtocols: []stack.TransportProtocol{fakeTransFactory()}, 431 }) 432 if err := s.CreateNIC(1, linkEP); err != nil { 433 t.Fatalf("CreateNIC failed: %v", err) 434 } 435 436 if err := s.AddAddress(1, fakeNetNumber, "\x01"); err != nil { 437 t.Fatalf("AddAddress failed: %v", err) 438 } 439 440 { 441 subnet, err := tcpip.NewSubnet("\x00", "\x00") 442 if err != nil { 443 t.Fatal(err) 444 } 445 s.SetRouteTable([]tcpip.Route{{Destination: subnet, Gateway: "\x00", NIC: 1}}) 446 } 447 448 // Create endpoint and bind it. 449 wq := waiter.Queue{} 450 ep, err := s.NewEndpoint(fakeTransNumber, fakeNetNumber, &wq) 451 if err != nil { 452 t.Fatalf("NewEndpoint failed: %v", err) 453 } 454 455 if err := ep.Connect(tcpip.FullAddress{0, "\x02", 0}); err != nil { 456 t.Fatalf("Connect failed: %v", err) 457 } 458 459 // Create buffer that will hold the payload. 460 view := buffer.NewView(30) 461 _, _, err = ep.Write(tcpip.SlicePayload(view), tcpip.WriteOptions{}) 462 if err != nil { 463 t.Fatalf("write failed: %v", err) 464 } 465 466 fakeNet := s.NetworkProtocolInstance(fakeNetNumber).(*fakeNetworkProtocol) 467 468 if fakeNet.sendPacketCount[2] != 1 { 469 t.Errorf("sendPacketCount = %d, want %d", fakeNet.sendPacketCount[2], 1) 470 } 471 } 472 473 func TestTransportOptions(t *testing.T) { 474 s := stack.New(stack.Options{ 475 NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()}, 476 TransportProtocols: []stack.TransportProtocol{fakeTransFactory()}, 477 }) 478 479 // Try an unsupported transport protocol. 480 if err := s.SetTransportProtocolOption(tcpip.TransportProtocolNumber(99999), fakeTransportGoodOption(false)); err != tcpip.ErrUnknownProtocol { 481 t.Fatalf("SetTransportProtocolOption(fakeTrans2, blah, false) = %v, want = tcpip.ErrUnknownProtocol", err) 482 } 483 484 testCases := []struct { 485 option interface{} 486 wantErr *tcpip.Error 487 verifier func(t *testing.T, p stack.TransportProtocol) 488 }{ 489 {fakeTransportGoodOption(true), nil, func(t *testing.T, p stack.TransportProtocol) { 490 t.Helper() 491 fakeTrans := p.(*fakeTransportProtocol) 492 if fakeTrans.opts.good != true { 493 t.Fatalf("fakeTrans.opts.good = false, want = true") 494 } 495 var v fakeTransportGoodOption 496 if err := s.TransportProtocolOption(fakeTransNumber, &v); err != nil { 497 t.Fatalf("s.TransportProtocolOption(fakeTransNumber, &v) = %v, want = nil, where v is option %T", v, err) 498 } 499 if v != true { 500 t.Fatalf("s.TransportProtocolOption(fakeTransNumber, &v) returned v = %v, want = true", v) 501 } 502 503 }}, 504 {fakeTransportBadOption(true), tcpip.ErrUnknownProtocolOption, nil}, 505 {fakeTransportInvalidValueOption(1), tcpip.ErrInvalidOptionValue, nil}, 506 } 507 for _, tc := range testCases { 508 if got := s.SetTransportProtocolOption(fakeTransNumber, tc.option); got != tc.wantErr { 509 t.Errorf("s.SetTransportProtocolOption(fakeTrans, %v) = %v, want = %v", tc.option, got, tc.wantErr) 510 } 511 if tc.verifier != nil { 512 tc.verifier(t, s.TransportProtocolInstance(fakeTransNumber)) 513 } 514 } 515 } 516 517 func TestTransportForwarding(t *testing.T) { 518 s := stack.New(stack.Options{ 519 NetworkProtocols: []stack.NetworkProtocol{fakeNetFactory()}, 520 TransportProtocols: []stack.TransportProtocol{fakeTransFactory()}, 521 }) 522 s.SetForwarding(true) 523 524 // TODO(b/123449044): Change this to a channel NIC. 525 ep1 := loopback.New() 526 if err := s.CreateNIC(1, ep1); err != nil { 527 t.Fatalf("CreateNIC #1 failed: %v", err) 528 } 529 if err := s.AddAddress(1, fakeNetNumber, "\x01"); err != nil { 530 t.Fatalf("AddAddress #1 failed: %v", err) 531 } 532 533 ep2 := channel.New(10, defaultMTU, "") 534 if err := s.CreateNIC(2, ep2); err != nil { 535 t.Fatalf("CreateNIC #2 failed: %v", err) 536 } 537 if err := s.AddAddress(2, fakeNetNumber, "\x02"); err != nil { 538 t.Fatalf("AddAddress #2 failed: %v", err) 539 } 540 541 // Route all packets to address 3 to NIC 2 and all packets to address 542 // 1 to NIC 1. 543 { 544 subnet0, err := tcpip.NewSubnet("\x03", "\xff") 545 if err != nil { 546 t.Fatal(err) 547 } 548 subnet1, err := tcpip.NewSubnet("\x01", "\xff") 549 if err != nil { 550 t.Fatal(err) 551 } 552 s.SetRouteTable([]tcpip.Route{ 553 {Destination: subnet0, Gateway: "\x00", NIC: 2}, 554 {Destination: subnet1, Gateway: "\x00", NIC: 1}, 555 }) 556 } 557 558 wq := waiter.Queue{} 559 ep, err := s.NewEndpoint(fakeTransNumber, fakeNetNumber, &wq) 560 if err != nil { 561 t.Fatalf("NewEndpoint failed: %v", err) 562 } 563 564 if err := ep.Bind(tcpip.FullAddress{Addr: "\x01", NIC: 1}); err != nil { 565 t.Fatalf("Bind failed: %v", err) 566 } 567 568 // Send a packet to address 1 from address 3. 569 req := buffer.NewView(30) 570 req[0] = 1 571 req[1] = 3 572 req[2] = byte(fakeTransNumber) 573 ep2.Inject(fakeNetNumber, req.ToVectorisedView()) 574 575 aep, _, err := ep.Accept() 576 if err != nil || aep == nil { 577 t.Fatalf("Accept failed: %v, %v", aep, err) 578 } 579 580 resp := buffer.NewView(30) 581 if _, _, err := aep.Write(tcpip.SlicePayload(resp), tcpip.WriteOptions{}); err != nil { 582 t.Fatalf("Write failed: %v", err) 583 } 584 585 var p channel.PacketInfo 586 select { 587 case p = <-ep2.C: 588 default: 589 t.Fatal("Response packet not forwarded") 590 } 591 592 if dst := p.Header[0]; dst != 3 { 593 t.Errorf("Response packet has incorrect destination addresss: got = %d, want = 3", dst) 594 } 595 if src := p.Header[1]; src != 1 { 596 t.Errorf("Response packet has incorrect source addresss: got = %d, want = 3", src) 597 } 598 }