summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/link/loopback
diff options
context:
space:
mode:
authorBert Muthalaly <stijlist@google.com>2018-09-05 17:33:18 -0700
committerShentubot <shentubot@google.com>2018-09-05 17:34:25 -0700
commit5685d6b5add2acce9618aa908b846f5ce3658346 (patch)
treeca93fb55c83ebf77806957c73c3951fc01844560 /pkg/tcpip/link/loopback
parentfe8ca76c22ff03c9ae8bf524031553d65b30f53d (diff)
Update {LinkEndpoint,NetworkEndpoint}#WritePacket to take a VectorisedView
Makes it possible to avoid copying or allocating in cases where DeliverNetworkPacket (rx) needs to turn around and call WritePacket (tx) with its VectorisedView. Also removes the restriction on having VectorisedViews with multiple views in the write path. PiperOrigin-RevId: 211728717 Change-Id: Ie03a65ecb4e28bd15ebdb9c69f05eced18fdfcff
Diffstat (limited to 'pkg/tcpip/link/loopback')
-rw-r--r--pkg/tcpip/link/loopback/loopback.go18
1 files changed, 6 insertions, 12 deletions
diff --git a/pkg/tcpip/link/loopback/loopback.go b/pkg/tcpip/link/loopback/loopback.go
index 015275721..4a750fa12 100644
--- a/pkg/tcpip/link/loopback/loopback.go
+++ b/pkg/tcpip/link/loopback/loopback.go
@@ -72,18 +72,12 @@ func (*endpoint) LinkAddress() tcpip.LinkAddress {
// WritePacket implements stack.LinkEndpoint.WritePacket. It delivers outbound
// packets to the network-layer dispatcher.
-func (e *endpoint) WritePacket(_ *stack.Route, hdr *buffer.Prependable, payload buffer.View, protocol tcpip.NetworkProtocolNumber) *tcpip.Error {
- if len(payload) == 0 {
- // We don't have a payload, so just use the buffer from the
- // header as the full packet.
- v := hdr.View()
- vv := v.ToVectorisedView([1]buffer.View{})
- e.dispatcher.DeliverNetworkPacket(e, "", protocol, &vv)
- } else {
- views := []buffer.View{hdr.View(), payload}
- vv := buffer.NewVectorisedView(len(views[0])+len(views[1]), views)
- e.dispatcher.DeliverNetworkPacket(e, "", protocol, &vv)
- }
+func (e *endpoint) WritePacket(_ *stack.Route, hdr *buffer.Prependable, payload buffer.VectorisedView, protocol tcpip.NetworkProtocolNumber) *tcpip.Error {
+ views := make([]buffer.View, 1, 1+len(payload.Views()))
+ views[0] = hdr.View()
+ views = append(views, payload.Views()...)
+ vv := buffer.NewVectorisedView(len(views[0])+payload.Size(), views)
+ e.dispatcher.DeliverNetworkPacket(e, "", protocol, &vv)
return nil
}