diff options
Diffstat (limited to 'pkg/tcpip/transport/internal')
-rw-r--r-- | pkg/tcpip/transport/internal/network/BUILD | 46 | ||||
-rw-r--r-- | pkg/tcpip/transport/internal/network/endpoint_test.go | 318 | ||||
-rw-r--r-- | pkg/tcpip/transport/internal/network/network_state_autogen.go | 110 | ||||
-rw-r--r-- | pkg/tcpip/transport/internal/noop/BUILD | 14 | ||||
-rw-r--r-- | pkg/tcpip/transport/internal/noop/noop_state_autogen.go | 39 |
5 files changed, 149 insertions, 378 deletions
diff --git a/pkg/tcpip/transport/internal/network/BUILD b/pkg/tcpip/transport/internal/network/BUILD deleted file mode 100644 index 3818cb04e..000000000 --- a/pkg/tcpip/transport/internal/network/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("//tools:defs.bzl", "go_library", "go_test") - -package(licenses = ["notice"]) - -go_library( - name = "network", - srcs = [ - "endpoint.go", - "endpoint_state.go", - ], - visibility = [ - "//pkg/tcpip/transport/icmp:__pkg__", - "//pkg/tcpip/transport/raw:__pkg__", - "//pkg/tcpip/transport/udp:__pkg__", - ], - deps = [ - "//pkg/sync", - "//pkg/tcpip", - "//pkg/tcpip/header", - "//pkg/tcpip/stack", - "//pkg/tcpip/transport", - ], -) - -go_test( - name = "network_test", - size = "small", - srcs = ["endpoint_test.go"], - deps = [ - ":network", - "//pkg/tcpip", - "//pkg/tcpip/buffer", - "//pkg/tcpip/checker", - "//pkg/tcpip/faketime", - "//pkg/tcpip/header", - "//pkg/tcpip/link/channel", - "//pkg/tcpip/link/loopback", - "//pkg/tcpip/network/ipv4", - "//pkg/tcpip/network/ipv6", - "//pkg/tcpip/stack", - "//pkg/tcpip/testutil", - "//pkg/tcpip/transport", - "//pkg/tcpip/transport/udp", - "@com_github_google_go_cmp//cmp:go_default_library", - ], -) diff --git a/pkg/tcpip/transport/internal/network/endpoint_test.go b/pkg/tcpip/transport/internal/network/endpoint_test.go deleted file mode 100644 index f263a9ea2..000000000 --- a/pkg/tcpip/transport/internal/network/endpoint_test.go +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2021 The gVisor Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package network_test - -import ( - "fmt" - "testing" - - "github.com/google/go-cmp/cmp" - "gvisor.dev/gvisor/pkg/tcpip" - "gvisor.dev/gvisor/pkg/tcpip/buffer" - "gvisor.dev/gvisor/pkg/tcpip/checker" - "gvisor.dev/gvisor/pkg/tcpip/faketime" - "gvisor.dev/gvisor/pkg/tcpip/header" - "gvisor.dev/gvisor/pkg/tcpip/link/channel" - "gvisor.dev/gvisor/pkg/tcpip/link/loopback" - "gvisor.dev/gvisor/pkg/tcpip/network/ipv4" - "gvisor.dev/gvisor/pkg/tcpip/network/ipv6" - "gvisor.dev/gvisor/pkg/tcpip/stack" - "gvisor.dev/gvisor/pkg/tcpip/testutil" - "gvisor.dev/gvisor/pkg/tcpip/transport" - "gvisor.dev/gvisor/pkg/tcpip/transport/internal/network" - "gvisor.dev/gvisor/pkg/tcpip/transport/udp" -) - -var ( - ipv4NICAddr = testutil.MustParse4("1.2.3.4") - ipv6NICAddr = testutil.MustParse6("a::1") - ipv4RemoteAddr = testutil.MustParse4("6.7.8.9") - ipv6RemoteAddr = testutil.MustParse6("b::1") -) - -func TestEndpointStateTransitions(t *testing.T) { - const nicID = 1 - - data := buffer.View([]byte{1, 2, 4, 5}) - v4Checker := func(t *testing.T, b buffer.View) { - checker.IPv4(t, b, - checker.SrcAddr(ipv4NICAddr), - checker.DstAddr(ipv4RemoteAddr), - checker.IPPayload(data), - ) - } - - v6Checker := func(t *testing.T, b buffer.View) { - checker.IPv6(t, b, - checker.SrcAddr(ipv6NICAddr), - checker.DstAddr(ipv6RemoteAddr), - checker.IPPayload(data), - ) - } - - tests := []struct { - name string - netProto tcpip.NetworkProtocolNumber - expectedMaxHeaderLength uint16 - expectedNetProto tcpip.NetworkProtocolNumber - expectedLocalAddr tcpip.Address - bindAddr tcpip.Address - expectedBoundAddr tcpip.Address - remoteAddr tcpip.Address - expectedRemoteAddr tcpip.Address - checker func(*testing.T, buffer.View) - }{ - { - name: "IPv4", - netProto: ipv4.ProtocolNumber, - expectedMaxHeaderLength: header.IPv4MaximumHeaderSize, - expectedNetProto: ipv4.ProtocolNumber, - expectedLocalAddr: ipv4NICAddr, - bindAddr: header.IPv4AllSystems, - expectedBoundAddr: header.IPv4AllSystems, - remoteAddr: ipv4RemoteAddr, - expectedRemoteAddr: ipv4RemoteAddr, - checker: v4Checker, - }, - { - name: "IPv6", - netProto: ipv6.ProtocolNumber, - expectedMaxHeaderLength: header.IPv6FixedHeaderSize, - expectedNetProto: ipv6.ProtocolNumber, - expectedLocalAddr: ipv6NICAddr, - bindAddr: header.IPv6AllNodesMulticastAddress, - expectedBoundAddr: header.IPv6AllNodesMulticastAddress, - remoteAddr: ipv6RemoteAddr, - expectedRemoteAddr: ipv6RemoteAddr, - checker: v6Checker, - }, - { - name: "IPv4-mapped-IPv6", - netProto: ipv6.ProtocolNumber, - expectedMaxHeaderLength: header.IPv4MaximumHeaderSize, - expectedNetProto: ipv4.ProtocolNumber, - expectedLocalAddr: ipv4NICAddr, - bindAddr: testutil.MustParse6("::ffff:e000:0001"), - expectedBoundAddr: header.IPv4AllSystems, - remoteAddr: testutil.MustParse6("::ffff:0607:0809"), - expectedRemoteAddr: ipv4RemoteAddr, - checker: v4Checker, - }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - s := stack.New(stack.Options{ - NetworkProtocols: []stack.NetworkProtocolFactory{ipv4.NewProtocol, ipv6.NewProtocol}, - TransportProtocols: []stack.TransportProtocolFactory{udp.NewProtocol}, - Clock: &faketime.NullClock{}, - }) - e := channel.New(1, header.IPv6MinimumMTU, "") - if err := s.CreateNIC(nicID, e); err != nil { - t.Fatalf("s.CreateNIC(%d, _): %s", nicID, err) - } - - ipv4ProtocolAddr := tcpip.ProtocolAddress{ - Protocol: ipv4.ProtocolNumber, - AddressWithPrefix: ipv4NICAddr.WithPrefix(), - } - if err := s.AddProtocolAddress(nicID, ipv4ProtocolAddr, stack.AddressProperties{}); err != nil { - t.Fatalf("s.AddProtocolAddress(%d, %+v, {}: %s", nicID, ipv4ProtocolAddr, err) - } - ipv6ProtocolAddr := tcpip.ProtocolAddress{ - Protocol: ipv6.ProtocolNumber, - AddressWithPrefix: ipv6NICAddr.WithPrefix(), - } - - if err := s.AddProtocolAddress(nicID, ipv6ProtocolAddr, stack.AddressProperties{}); err != nil { - t.Fatalf("s.AddProtocolAddress(%d, %+v, {}): %s", nicID, ipv6ProtocolAddr, err) - } - - s.SetRouteTable([]tcpip.Route{ - {Destination: ipv4RemoteAddr.WithPrefix().Subnet(), NIC: nicID}, - {Destination: ipv6RemoteAddr.WithPrefix().Subnet(), NIC: nicID}, - }) - - var ops tcpip.SocketOptions - var ep network.Endpoint - ep.Init(s, test.netProto, udp.ProtocolNumber, &ops) - defer ep.Close() - if state := ep.State(); state != transport.DatagramEndpointStateInitial { - t.Fatalf("got ep.State() = %s, want = %s", state, transport.DatagramEndpointStateInitial) - } - - bindAddr := tcpip.FullAddress{Addr: test.bindAddr} - if err := ep.Bind(bindAddr); err != nil { - t.Fatalf("ep.Bind(%#v): %s", bindAddr, err) - } - if state := ep.State(); state != transport.DatagramEndpointStateBound { - t.Fatalf("got ep.State() = %s, want = %s", state, transport.DatagramEndpointStateBound) - } - if diff := cmp.Diff(ep.GetLocalAddress(), tcpip.FullAddress{Addr: test.expectedBoundAddr}); diff != "" { - t.Errorf("ep.GetLocalAddress() mismatch (-want +got):\n%s", diff) - } - if addr, connected := ep.GetRemoteAddress(); connected { - t.Errorf("got ep.GetRemoteAddress() = (true, %#v), want = (false, _)", addr) - } - - connectAddr := tcpip.FullAddress{Addr: test.remoteAddr} - if err := ep.Connect(connectAddr); err != nil { - t.Fatalf("ep.Connect(%#v): %s", connectAddr, err) - } - if state := ep.State(); state != transport.DatagramEndpointStateConnected { - t.Fatalf("got ep.State() = %s, want = %s", state, transport.DatagramEndpointStateConnected) - } - if diff := cmp.Diff(ep.GetLocalAddress(), tcpip.FullAddress{Addr: test.expectedLocalAddr}); diff != "" { - t.Errorf("ep.GetLocalAddress() mismatch (-want +got):\n%s", diff) - } - if addr, connected := ep.GetRemoteAddress(); !connected { - t.Errorf("got ep.GetRemoteAddress() = (false, _), want = (true, %#v)", connectAddr) - } else if diff := cmp.Diff(addr, tcpip.FullAddress{Addr: test.expectedRemoteAddr}); diff != "" { - t.Errorf("remote address mismatch (-want +got):\n%s", diff) - } - - ctx, err := ep.AcquireContextForWrite(tcpip.WriteOptions{}) - if err != nil { - t.Fatalf("ep.AcquireContexForWrite({}): %s", err) - } - defer ctx.Release() - info := ctx.PacketInfo() - if diff := cmp.Diff(network.WritePacketInfo{ - NetProto: test.expectedNetProto, - LocalAddress: test.expectedLocalAddr, - RemoteAddress: test.expectedRemoteAddr, - MaxHeaderLength: test.expectedMaxHeaderLength, - RequiresTXTransportChecksum: true, - }, info); diff != "" { - t.Errorf("write packet info mismatch (-want +got):\n%s", diff) - } - if err := ctx.WritePacket(stack.NewPacketBuffer(stack.PacketBufferOptions{ - ReserveHeaderBytes: int(info.MaxHeaderLength), - Data: data.ToVectorisedView(), - }), false /* headerIncluded */); err != nil { - t.Fatalf("ctx.WritePacket(_, false): %s", err) - } - if pkt, ok := e.Read(); !ok { - t.Fatalf("expected packet to be read from link endpoint") - } else { - test.checker(t, stack.PayloadSince(pkt.Pkt.NetworkHeader())) - } - - ep.Close() - if state := ep.State(); state != transport.DatagramEndpointStateClosed { - t.Fatalf("got ep.State() = %s, want = %s", state, transport.DatagramEndpointStateClosed) - } - }) - } -} - -func TestBindNICID(t *testing.T) { - const nicID = 1 - - tests := []struct { - name string - netProto tcpip.NetworkProtocolNumber - bindAddr tcpip.Address - unicast bool - }{ - { - name: "IPv4 multicast", - netProto: ipv4.ProtocolNumber, - bindAddr: header.IPv4AllSystems, - unicast: false, - }, - { - name: "IPv6 multicast", - netProto: ipv6.ProtocolNumber, - bindAddr: header.IPv6AllNodesMulticastAddress, - unicast: false, - }, - { - name: "IPv4 unicast", - netProto: ipv4.ProtocolNumber, - bindAddr: ipv4NICAddr, - unicast: true, - }, - { - name: "IPv6 unicast", - netProto: ipv6.ProtocolNumber, - bindAddr: ipv6NICAddr, - unicast: true, - }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - for _, testBindNICID := range []tcpip.NICID{0, nicID} { - t.Run(fmt.Sprintf("BindNICID=%d", testBindNICID), func(t *testing.T) { - s := stack.New(stack.Options{ - NetworkProtocols: []stack.NetworkProtocolFactory{ipv4.NewProtocol, ipv6.NewProtocol}, - TransportProtocols: []stack.TransportProtocolFactory{udp.NewProtocol}, - Clock: &faketime.NullClock{}, - }) - if err := s.CreateNIC(nicID, loopback.New()); err != nil { - t.Fatalf("s.CreateNIC(%d, _): %s", nicID, err) - } - - ipv4ProtocolAddr := tcpip.ProtocolAddress{ - Protocol: ipv4.ProtocolNumber, - AddressWithPrefix: ipv4NICAddr.WithPrefix(), - } - if err := s.AddProtocolAddress(nicID, ipv4ProtocolAddr, stack.AddressProperties{}); err != nil { - t.Fatalf("s.AddProtocolAddress(%d, %+v, {}): %s", nicID, ipv4ProtocolAddr, err) - } - ipv6ProtocolAddr := tcpip.ProtocolAddress{ - Protocol: ipv6.ProtocolNumber, - AddressWithPrefix: ipv6NICAddr.WithPrefix(), - } - if err := s.AddProtocolAddress(nicID, ipv6ProtocolAddr, stack.AddressProperties{}); err != nil { - t.Fatalf("s.AddProtocolAddress(%d, %+v, {}): %s", nicID, ipv6ProtocolAddr, err) - } - - var ops tcpip.SocketOptions - var ep network.Endpoint - ep.Init(s, test.netProto, udp.ProtocolNumber, &ops) - defer ep.Close() - if ep.WasBound() { - t.Fatal("got ep.WasBound() = true, want = false") - } - wantInfo := stack.TransportEndpointInfo{NetProto: test.netProto, TransProto: udp.ProtocolNumber} - if diff := cmp.Diff(wantInfo, ep.Info()); diff != "" { - t.Fatalf("ep.Info() mismatch (-want +got):\n%s", diff) - } - - bindAddr := tcpip.FullAddress{Addr: test.bindAddr, NIC: testBindNICID} - if err := ep.Bind(bindAddr); err != nil { - t.Fatalf("ep.Bind(%#v): %s", bindAddr, err) - } - if !ep.WasBound() { - t.Error("got ep.WasBound() = false, want = true") - } - wantInfo.ID = stack.TransportEndpointID{LocalAddress: bindAddr.Addr} - wantInfo.BindAddr = bindAddr.Addr - wantInfo.BindNICID = bindAddr.NIC - if test.unicast { - wantInfo.RegisterNICID = nicID - } else { - wantInfo.RegisterNICID = bindAddr.NIC - } - if diff := cmp.Diff(wantInfo, ep.Info()); diff != "" { - t.Errorf("ep.Info() mismatch (-want +got):\n%s", diff) - } - }) - } - }) - } -} diff --git a/pkg/tcpip/transport/internal/network/network_state_autogen.go b/pkg/tcpip/transport/internal/network/network_state_autogen.go new file mode 100644 index 000000000..1515c8632 --- /dev/null +++ b/pkg/tcpip/transport/internal/network/network_state_autogen.go @@ -0,0 +1,110 @@ +// automatically generated by stateify. + +package network + +import ( + "gvisor.dev/gvisor/pkg/state" +) + +func (e *Endpoint) StateTypeName() string { + return "pkg/tcpip/transport/internal/network.Endpoint" +} + +func (e *Endpoint) StateFields() []string { + return []string{ + "ops", + "netProto", + "transProto", + "wasBound", + "owner", + "writeShutdown", + "effectiveNetProto", + "multicastMemberships", + "ttl", + "multicastTTL", + "multicastAddr", + "multicastNICID", + "ipv4TOS", + "ipv6TClass", + "info", + "state", + } +} + +func (e *Endpoint) beforeSave() {} + +// +checklocksignore +func (e *Endpoint) StateSave(stateSinkObject state.Sink) { + e.beforeSave() + stateSinkObject.Save(0, &e.ops) + stateSinkObject.Save(1, &e.netProto) + stateSinkObject.Save(2, &e.transProto) + stateSinkObject.Save(3, &e.wasBound) + stateSinkObject.Save(4, &e.owner) + stateSinkObject.Save(5, &e.writeShutdown) + stateSinkObject.Save(6, &e.effectiveNetProto) + stateSinkObject.Save(7, &e.multicastMemberships) + stateSinkObject.Save(8, &e.ttl) + stateSinkObject.Save(9, &e.multicastTTL) + stateSinkObject.Save(10, &e.multicastAddr) + stateSinkObject.Save(11, &e.multicastNICID) + stateSinkObject.Save(12, &e.ipv4TOS) + stateSinkObject.Save(13, &e.ipv6TClass) + stateSinkObject.Save(14, &e.info) + stateSinkObject.Save(15, &e.state) +} + +func (e *Endpoint) afterLoad() {} + +// +checklocksignore +func (e *Endpoint) StateLoad(stateSourceObject state.Source) { + stateSourceObject.Load(0, &e.ops) + stateSourceObject.Load(1, &e.netProto) + stateSourceObject.Load(2, &e.transProto) + stateSourceObject.Load(3, &e.wasBound) + stateSourceObject.Load(4, &e.owner) + stateSourceObject.Load(5, &e.writeShutdown) + stateSourceObject.Load(6, &e.effectiveNetProto) + stateSourceObject.Load(7, &e.multicastMemberships) + stateSourceObject.Load(8, &e.ttl) + stateSourceObject.Load(9, &e.multicastTTL) + stateSourceObject.Load(10, &e.multicastAddr) + stateSourceObject.Load(11, &e.multicastNICID) + stateSourceObject.Load(12, &e.ipv4TOS) + stateSourceObject.Load(13, &e.ipv6TClass) + stateSourceObject.Load(14, &e.info) + stateSourceObject.Load(15, &e.state) +} + +func (m *multicastMembership) StateTypeName() string { + return "pkg/tcpip/transport/internal/network.multicastMembership" +} + +func (m *multicastMembership) StateFields() []string { + return []string{ + "nicID", + "multicastAddr", + } +} + +func (m *multicastMembership) beforeSave() {} + +// +checklocksignore +func (m *multicastMembership) StateSave(stateSinkObject state.Sink) { + m.beforeSave() + stateSinkObject.Save(0, &m.nicID) + stateSinkObject.Save(1, &m.multicastAddr) +} + +func (m *multicastMembership) afterLoad() {} + +// +checklocksignore +func (m *multicastMembership) StateLoad(stateSourceObject state.Source) { + stateSourceObject.Load(0, &m.nicID) + stateSourceObject.Load(1, &m.multicastAddr) +} + +func init() { + state.Register((*Endpoint)(nil)) + state.Register((*multicastMembership)(nil)) +} diff --git a/pkg/tcpip/transport/internal/noop/BUILD b/pkg/tcpip/transport/internal/noop/BUILD deleted file mode 100644 index 171c41eb1..000000000 --- a/pkg/tcpip/transport/internal/noop/BUILD +++ /dev/null @@ -1,14 +0,0 @@ -load("//tools:defs.bzl", "go_library") - -package(licenses = ["notice"]) - -go_library( - name = "noop", - srcs = ["endpoint.go"], - visibility = ["//pkg/tcpip/transport/raw:__pkg__"], - deps = [ - "//pkg/tcpip", - "//pkg/tcpip/stack", - "//pkg/waiter", - ], -) diff --git a/pkg/tcpip/transport/internal/noop/noop_state_autogen.go b/pkg/tcpip/transport/internal/noop/noop_state_autogen.go new file mode 100644 index 000000000..27d6064ae --- /dev/null +++ b/pkg/tcpip/transport/internal/noop/noop_state_autogen.go @@ -0,0 +1,39 @@ +// automatically generated by stateify. + +package noop + +import ( + "gvisor.dev/gvisor/pkg/state" +) + +func (ep *endpoint) StateTypeName() string { + return "pkg/tcpip/transport/internal/noop.endpoint" +} + +func (ep *endpoint) StateFields() []string { + return []string{ + "DefaultSocketOptionsHandler", + "ops", + } +} + +func (ep *endpoint) beforeSave() {} + +// +checklocksignore +func (ep *endpoint) StateSave(stateSinkObject state.Sink) { + ep.beforeSave() + stateSinkObject.Save(0, &ep.DefaultSocketOptionsHandler) + stateSinkObject.Save(1, &ep.ops) +} + +func (ep *endpoint) afterLoad() {} + +// +checklocksignore +func (ep *endpoint) StateLoad(stateSourceObject state.Source) { + stateSourceObject.Load(0, &ep.DefaultSocketOptionsHandler) + stateSourceObject.Load(1, &ep.ops) +} + +func init() { + state.Register((*endpoint)(nil)) +} |