summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/socket/netstack
diff options
context:
space:
mode:
authorgVisor bot <gvisor-bot@google.com>2020-07-17 01:43:18 +0000
committergVisor bot <gvisor-bot@google.com>2020-07-17 01:43:18 +0000
commit1d81bf5f979b77928a1a890675b6905862e6fa75 (patch)
tree0b3624920fa4989888305eb02bdaaca5aff6ae50 /pkg/sentry/socket/netstack
parent667702d0dd27926f9963d3a1571e0362f45c204e (diff)
parentdcf6ddc2772b8fcf824f1f48e0281e1cc80b93ea (diff)
Merge release-20200622.1-173-gdcf6ddc27 (automated)
Diffstat (limited to 'pkg/sentry/socket/netstack')
-rw-r--r--pkg/sentry/socket/netstack/netstack.go24
-rw-r--r--pkg/sentry/socket/netstack/netstack_state_autogen.go19
2 files changed, 32 insertions, 11 deletions
diff --git a/pkg/sentry/socket/netstack/netstack.go b/pkg/sentry/socket/netstack/netstack.go
index 0b1be1bd2..49a04e613 100644
--- a/pkg/sentry/socket/netstack/netstack.go
+++ b/pkg/sentry/socket/netstack/netstack.go
@@ -297,8 +297,9 @@ type socketOpsCommon struct {
readView buffer.View
// readCM holds control message information for the last packet read
// from Endpoint.
- readCM tcpip.ControlMessages
- sender tcpip.FullAddress
+ readCM tcpip.ControlMessages
+ sender tcpip.FullAddress
+ linkPacketInfo tcpip.LinkPacketInfo
// sockOptTimestamp corresponds to SO_TIMESTAMP. When true, timestamps
// of returned messages can be returned via control messages. When
@@ -447,8 +448,21 @@ func (s *socketOpsCommon) fetchReadView() *syserr.Error {
}
s.readView = nil
s.sender = tcpip.FullAddress{}
+ s.linkPacketInfo = tcpip.LinkPacketInfo{}
- v, cms, err := s.Endpoint.Read(&s.sender)
+ var v buffer.View
+ var cms tcpip.ControlMessages
+ var err *tcpip.Error
+
+ switch e := s.Endpoint.(type) {
+ // The ordering of these interfaces matters. The most specific
+ // interfaces must be specified before the more generic Endpoint
+ // interface.
+ case tcpip.PacketEndpoint:
+ v, cms, err = e.ReadPacket(&s.sender, &s.linkPacketInfo)
+ case tcpip.Endpoint:
+ v, cms, err = e.Read(&s.sender)
+ }
if err != nil {
atomic.StoreUint32(&s.readViewHasData, 0)
return syserr.TranslateNetstackError(err)
@@ -2509,6 +2523,10 @@ func (s *socketOpsCommon) nonBlockingRead(ctx context.Context, dst usermem.IOSeq
var addrLen uint32
if isPacket && senderRequested {
addr, addrLen = ConvertAddress(s.family, s.sender)
+ switch v := addr.(type) {
+ case *linux.SockAddrLink:
+ v.Protocol = htons(uint16(s.linkPacketInfo.Protocol))
+ }
}
if peek {
diff --git a/pkg/sentry/socket/netstack/netstack_state_autogen.go b/pkg/sentry/socket/netstack/netstack_state_autogen.go
index b7cf0b290..27e3ada76 100644
--- a/pkg/sentry/socket/netstack/netstack_state_autogen.go
+++ b/pkg/sentry/socket/netstack/netstack_state_autogen.go
@@ -45,6 +45,7 @@ func (x *socketOpsCommon) StateFields() []string {
"readView",
"readCM",
"sender",
+ "linkPacketInfo",
"sockOptTimestamp",
"timestampValid",
"timestampNS",
@@ -66,10 +67,11 @@ func (x *socketOpsCommon) StateSave(m state.Sink) {
m.Save(7, &x.readView)
m.Save(8, &x.readCM)
m.Save(9, &x.sender)
- m.Save(10, &x.sockOptTimestamp)
- m.Save(11, &x.timestampValid)
- m.Save(12, &x.timestampNS)
- m.Save(13, &x.sockOptInq)
+ m.Save(10, &x.linkPacketInfo)
+ m.Save(11, &x.sockOptTimestamp)
+ m.Save(12, &x.timestampValid)
+ m.Save(13, &x.timestampNS)
+ m.Save(14, &x.sockOptInq)
}
func (x *socketOpsCommon) afterLoad() {}
@@ -85,10 +87,11 @@ func (x *socketOpsCommon) StateLoad(m state.Source) {
m.Load(7, &x.readView)
m.Load(8, &x.readCM)
m.Load(9, &x.sender)
- m.Load(10, &x.sockOptTimestamp)
- m.Load(11, &x.timestampValid)
- m.Load(12, &x.timestampNS)
- m.Load(13, &x.sockOptInq)
+ m.Load(10, &x.linkPacketInfo)
+ m.Load(11, &x.sockOptTimestamp)
+ m.Load(12, &x.timestampValid)
+ m.Load(13, &x.timestampNS)
+ m.Load(14, &x.sockOptInq)
}
func (x *Stack) StateTypeName() string {