Skip to content

Commit 2188c04

Browse files
manninglucasgvisor-bot
authored andcommitted
Automated rollback of changelist 805108888
PiperOrigin-RevId: 805563847
1 parent f9ecfd9 commit 2188c04

File tree

5 files changed

+71
-48
lines changed

5 files changed

+71
-48
lines changed

pkg/tcpip/stack/packet_buffer.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,3 +768,52 @@ func BufferSince(h PacketHeader) buffer.Buffer {
768768
clone.TrimFront(int64(offset))
769769
return clone
770770
}
771+
772+
// ExperimentOptionValue returns the experiment option value from the packet
773+
// and a bool indicating whether an experiment option value was found.
774+
func (pk *PacketBuffer) ExperimentOptionValue() (uint16, bool) {
775+
switch pk.NetworkProtocolNumber {
776+
case header.IPv4ProtocolNumber:
777+
h := header.IPv4(pk.NetworkHeader().Slice())
778+
opts := h.Options()
779+
iter := opts.MakeIterator()
780+
for {
781+
opt, done, err := iter.Next()
782+
if err != nil {
783+
return 0, false
784+
}
785+
if done {
786+
return 0, false
787+
}
788+
if opt.Type() == header.IPv4OptionExperimentType {
789+
return opt.(*header.IPv4OptionExperiment).Value(), true
790+
}
791+
}
792+
case header.IPv6ProtocolNumber:
793+
h := header.IPv6(pk.NetworkHeader().Slice())
794+
v := pk.NetworkHeader().View()
795+
if v != nil {
796+
v.TrimFront(header.IPv6MinimumSize)
797+
}
798+
buf := buffer.MakeWithView(v)
799+
buf.Append(pk.TransportHeader().View())
800+
dataBuf := pk.Data().ToBuffer()
801+
buf.Merge(&dataBuf)
802+
it := header.MakeIPv6PayloadIterator(header.IPv6ExtensionHeaderIdentifier(h.NextHeader()), buf)
803+
804+
for {
805+
hdr, done, err := it.Next()
806+
if done || err != nil {
807+
break
808+
}
809+
if h, ok := hdr.(header.IPv6ExperimentExtHdr); ok {
810+
hdr.Release()
811+
return h.Value, true
812+
}
813+
hdr.Release()
814+
}
815+
default:
816+
panic(fmt.Sprintf("Unexpected network protocol number %d", pk.NetworkProtocolNumber))
817+
}
818+
return 0, false
819+
}

pkg/tcpip/tcpip.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,10 @@ type ReadOptions struct {
712712
// NeedLinkPacketInfo indicates whether to return the link-layer information,
713713
// if supported.
714714
NeedLinkPacketInfo bool
715+
716+
// NeedRecvdExperimentOption indicates whether to return the experiment
717+
// option value from the last received packet, if supported.
718+
NeedReceivedExperimentOption bool
715719
}
716720

717721
// ReadResult represents result for a successful Endpoint.Read.
@@ -732,6 +736,10 @@ type ReadResult struct {
732736
// LinkPacketInfo is the link-layer information of the received packet if
733737
// ReadOptions.NeedLinkPacketInfo is true.
734738
LinkPacketInfo LinkPacketInfo
739+
740+
// ReceivedExperimentOption is the experiment option value from the last
741+
// received packet if ReadOptions.NeedReceivedExperimentOption is true.
742+
ReceivedExperimentOption uint16
735743
}
736744

737745
// Endpoint is the interface implemented by transport protocols (e.g., tcp, udp)

pkg/tcpip/transport/tcp/forwarder.go

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
package tcp
1616

1717
import (
18-
"fmt"
19-
20-
"gvisor.dev/gvisor/pkg/buffer"
2118
"gvisor.dev/gvisor/pkg/tcpip"
2219
"gvisor.dev/gvisor/pkg/tcpip/header"
2320
"gvisor.dev/gvisor/pkg/tcpip/seqnum"
@@ -179,49 +176,5 @@ func (r *ForwarderRequest) CreateEndpoint(queue *waiter.Queue) (tcpip.Endpoint,
179176
func (r *ForwarderRequest) ForwardedPacketExperimentOption() (uint16, bool) {
180177
r.mu.Lock()
181178
defer r.mu.Unlock()
182-
183-
switch r.segment.pkt.NetworkProtocolNumber {
184-
case header.IPv4ProtocolNumber:
185-
h := header.IPv4(r.segment.pkt.NetworkHeader().Slice())
186-
opts := h.Options()
187-
iter := opts.MakeIterator()
188-
for {
189-
opt, done, err := iter.Next()
190-
if err != nil {
191-
return 0, false
192-
}
193-
if done {
194-
return 0, false
195-
}
196-
if opt.Type() == header.IPv4OptionExperimentType {
197-
return opt.(*header.IPv4OptionExperiment).Value(), true
198-
}
199-
}
200-
case header.IPv6ProtocolNumber:
201-
h := header.IPv6(r.segment.pkt.NetworkHeader().Slice())
202-
v := r.segment.pkt.NetworkHeader().View()
203-
if v != nil {
204-
v.TrimFront(header.IPv6MinimumSize)
205-
}
206-
buf := buffer.MakeWithView(v)
207-
buf.Append(r.segment.pkt.TransportHeader().View())
208-
dataBuf := r.segment.pkt.Data().ToBuffer()
209-
buf.Merge(&dataBuf)
210-
it := header.MakeIPv6PayloadIterator(header.IPv6ExtensionHeaderIdentifier(h.NextHeader()), buf)
211-
212-
for {
213-
hdr, done, err := it.Next()
214-
if done || err != nil {
215-
break
216-
}
217-
if h, ok := hdr.(header.IPv6ExperimentExtHdr); ok {
218-
hdr.Release()
219-
return h.Value, true
220-
}
221-
hdr.Release()
222-
}
223-
default:
224-
panic(fmt.Sprintf("Unexpected network protocol number %d", r.segment.pkt.NetworkProtocolNumber))
225-
}
226-
return 0, false
179+
return r.segment.pkt.ExperimentOptionValue()
227180
}

pkg/tcpip/transport/udp/endpoint.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,10 @@ func (e *endpoint) Read(dst io.Writer, opts tcpip.ReadOptions) (tcpip.ReadResult
294294
if opts.NeedRemoteAddr {
295295
res.RemoteAddr = p.senderAddress
296296
}
297+
if opts.NeedReceivedExperimentOption {
298+
expOptVal, _ := p.pkt.ExperimentOptionValue()
299+
res.ReceivedExperimentOption = expOptVal
300+
}
297301

298302
n, err := p.pkt.Data().ReadTo(dst, opts.Peek)
299303
if n == 0 && err != nil {

pkg/tcpip/transport/udp/forwarder.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ type ForwarderRequest struct {
6565
pkt *stack.PacketBuffer
6666
}
6767

68+
// NewForwarderRequest creates a new ForwarderRequest.
69+
func NewForwarderRequest(stack *stack.Stack, id stack.TransportEndpointID, pkt *stack.PacketBuffer) *ForwarderRequest {
70+
return &ForwarderRequest{
71+
stack: stack,
72+
id: id,
73+
pkt: pkt,
74+
}
75+
}
76+
6877
// ID returns the 4-tuple (src address, src port, dst address, dst port) that
6978
// represents the session request.
7079
func (r *ForwarderRequest) ID() stack.TransportEndpointID {

0 commit comments

Comments
 (0)