summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/devices/tundev/tundev.go
diff options
context:
space:
mode:
authorgVisor bot <gvisor-bot@google.com>2020-10-09 19:17:35 +0000
committergVisor bot <gvisor-bot@google.com>2020-10-09 19:17:35 +0000
commit578aece760dd47a06a686f82efab5b650807d4c5 (patch)
treee57a1d077e19bf33dd2818e399557f7b359adbc5 /pkg/sentry/devices/tundev/tundev.go
parent9774e9a0ca4110d88e5c4b4a59c188d5bedc0adc (diff)
parent257703c050e5901aeb3734f200f5a6b41856b4d9 (diff)
Merge release-20200928.0-77-g257703c05 (automated)
Diffstat (limited to 'pkg/sentry/devices/tundev/tundev.go')
-rw-r--r--pkg/sentry/devices/tundev/tundev.go14
1 files changed, 13 insertions, 1 deletions
diff --git a/pkg/sentry/devices/tundev/tundev.go b/pkg/sentry/devices/tundev/tundev.go
index 0b701a289..655ea549b 100644
--- a/pkg/sentry/devices/tundev/tundev.go
+++ b/pkg/sentry/devices/tundev/tundev.go
@@ -16,6 +16,8 @@
package tundev
import (
+ "fmt"
+
"gvisor.dev/gvisor/pkg/abi/linux"
"gvisor.dev/gvisor/pkg/context"
"gvisor.dev/gvisor/pkg/sentry/arch"
@@ -26,6 +28,7 @@ import (
"gvisor.dev/gvisor/pkg/sentry/vfs"
"gvisor.dev/gvisor/pkg/syserror"
"gvisor.dev/gvisor/pkg/tcpip/link/tun"
+ "gvisor.dev/gvisor/pkg/tcpip/network/arp"
"gvisor.dev/gvisor/pkg/usermem"
"gvisor.dev/gvisor/pkg/waiter"
)
@@ -84,7 +87,16 @@ func (fd *tunFD) Ioctl(ctx context.Context, uio usermem.IO, args arch.SyscallArg
return 0, err
}
flags := usermem.ByteOrder.Uint16(req.Data[:])
- return 0, fd.device.SetIff(stack.Stack, req.Name(), flags)
+ created, err := fd.device.SetIff(stack.Stack, req.Name(), flags)
+ if err == nil && created {
+ // Always start with an ARP address for interfaces so they can handle ARP
+ // packets.
+ nicID := fd.device.NICID()
+ if err := stack.Stack.AddAddress(nicID, arp.ProtocolNumber, arp.ProtocolAddress); err != nil {
+ panic(fmt.Sprintf("failed to add ARP address after creating new TUN/TAP interface with ID = %d", nicID))
+ }
+ }
+ return 0, err
case linux.TUNGETIFF:
var req linux.IFReq