summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/transport/internal
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/tcpip/transport/internal')
-rw-r--r--pkg/tcpip/transport/internal/network/BUILD46
-rw-r--r--pkg/tcpip/transport/internal/network/endpoint_test.go318
-rw-r--r--pkg/tcpip/transport/internal/network/network_state_autogen.go110
-rw-r--r--pkg/tcpip/transport/internal/noop/BUILD14
-rw-r--r--pkg/tcpip/transport/internal/noop/noop_state_autogen.go39
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))
+}