mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Set transport and network headers on outbound packets.
These are necessary for iptables to read and parse headers for packet filtering. PiperOrigin-RevId: 282372811
This commit is contained in:
committed by
gVisor bot
parent
2b1b51f1d7
commit
1641338b14
@@ -240,16 +240,18 @@ func (e *endpoint) addIPHeader(r *stack.Route, hdr *buffer.Prependable, payloadS
|
||||
// WritePacket writes a packet to the given destination address and protocol.
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, params stack.NetworkHeaderParams, loop stack.PacketLooping, pkt tcpip.PacketBuffer) *tcpip.Error {
|
||||
ip := e.addIPHeader(r, &pkt.Header, pkt.Data.Size(), params)
|
||||
pkt.NetworkHeader = buffer.View(ip)
|
||||
|
||||
if loop&stack.PacketLoop != 0 {
|
||||
// The inbound path expects the network header to still be in
|
||||
// the PacketBuffer's Data field.
|
||||
views := make([]buffer.View, 1, 1+len(pkt.Data.Views()))
|
||||
views[0] = pkt.Header.View()
|
||||
views = append(views, pkt.Data.Views()...)
|
||||
loopedR := r.MakeLoopedRoute()
|
||||
|
||||
e.HandlePacket(&loopedR, tcpip.PacketBuffer{
|
||||
Data: buffer.NewVectorisedView(len(views[0])+pkt.Data.Size(), views),
|
||||
NetworkHeader: buffer.View(ip),
|
||||
Data: buffer.NewVectorisedView(len(views[0])+pkt.Data.Size(), views),
|
||||
})
|
||||
|
||||
loopedR.Release()
|
||||
@@ -277,7 +279,8 @@ func (e *endpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts []tcpip.Pac
|
||||
}
|
||||
|
||||
for i := range pkts {
|
||||
e.addIPHeader(r, &pkts[i].Header, pkts[i].DataSize, params)
|
||||
ip := e.addIPHeader(r, &pkts[i].Header, pkts[i].DataSize, params)
|
||||
pkts[i].NetworkHeader = buffer.View(ip)
|
||||
}
|
||||
n, err := e.linkEP.WritePackets(r, gso, pkts, ProtocolNumber)
|
||||
r.Stats().IP.PacketsSent.IncrementBy(uint64(n))
|
||||
|
||||
@@ -114,16 +114,18 @@ func (e *endpoint) addIPHeader(r *stack.Route, hdr *buffer.Prependable, payloadS
|
||||
// WritePacket writes a packet to the given destination address and protocol.
|
||||
func (e *endpoint) WritePacket(r *stack.Route, gso *stack.GSO, params stack.NetworkHeaderParams, loop stack.PacketLooping, pkt tcpip.PacketBuffer) *tcpip.Error {
|
||||
ip := e.addIPHeader(r, &pkt.Header, pkt.Data.Size(), params)
|
||||
pkt.NetworkHeader = buffer.View(ip)
|
||||
|
||||
if loop&stack.PacketLoop != 0 {
|
||||
// The inbound path expects the network header to still be in
|
||||
// the PacketBuffer's Data field.
|
||||
views := make([]buffer.View, 1, 1+len(pkt.Data.Views()))
|
||||
views[0] = pkt.Header.View()
|
||||
views = append(views, pkt.Data.Views()...)
|
||||
loopedR := r.MakeLoopedRoute()
|
||||
|
||||
e.HandlePacket(&loopedR, tcpip.PacketBuffer{
|
||||
Data: buffer.NewVectorisedView(len(views[0])+pkt.Data.Size(), views),
|
||||
NetworkHeader: buffer.View(ip),
|
||||
Data: buffer.NewVectorisedView(len(views[0])+pkt.Data.Size(), views),
|
||||
})
|
||||
|
||||
loopedR.Release()
|
||||
@@ -148,7 +150,8 @@ func (e *endpoint) WritePackets(r *stack.Route, gso *stack.GSO, pkts []tcpip.Pac
|
||||
for i := range pkts {
|
||||
hdr := &pkts[i].Header
|
||||
size := pkts[i].DataSize
|
||||
e.addIPHeader(r, hdr, size, params)
|
||||
ip := e.addIPHeader(r, hdr, size, params)
|
||||
pkts[i].NetworkHeader = buffer.View(ip)
|
||||
}
|
||||
|
||||
n, err := e.linkEP.WritePackets(r, gso, pkts, ProtocolNumber)
|
||||
|
||||
@@ -647,6 +647,7 @@ func buildTCPHdr(r *stack.Route, id stack.TransportEndpointID, pkt *tcpip.Packet
|
||||
off := pkt.DataOffset
|
||||
// Initialize the header.
|
||||
tcp := header.TCP(hdr.Prepend(header.TCPMinimumSize + optLen))
|
||||
pkt.TransportHeader = buffer.View(tcp)
|
||||
tcp.Encode(&header.TCPFields{
|
||||
SrcPort: id.LocalPort,
|
||||
DstPort: id.RemotePort,
|
||||
|
||||
@@ -823,8 +823,9 @@ func sendUDP(r *stack.Route, data buffer.VectorisedView, localPort, remotePort u
|
||||
ttl = r.DefaultTTL()
|
||||
}
|
||||
if err := r.WritePacket(nil /* gso */, stack.NetworkHeaderParams{Protocol: ProtocolNumber, TTL: ttl, TOS: tos}, tcpip.PacketBuffer{
|
||||
Header: hdr,
|
||||
Data: data,
|
||||
Header: hdr,
|
||||
Data: data,
|
||||
TransportHeader: buffer.View(udp),
|
||||
}); err != nil {
|
||||
r.Stats().UDP.PacketSendErrors.Increment()
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user