MCPcopy Create free account
hub / github.com/encodeous/nylon / udp4PacketMutateIPFields

Function udp4PacketMutateIPFields

polyamide/tun/offload_linux_test.go:31–58  ·  view source on GitHub ↗
(srcIPPort, dstIPPort netip.AddrPort, payloadLen int, ipFn func(*header.IPv4Fields))

Source from the content-addressed store, hash-verified

29)
30
31func udp4PacketMutateIPFields(srcIPPort, dstIPPort netip.AddrPort, payloadLen int, ipFn func(*header.IPv4Fields)) []byte {
32 totalLen := 28 + payloadLen
33 b := make([]byte, offset+int(totalLen), 65535)
34 ipv4H := header.IPv4(b[offset:])
35 srcAs4 := srcIPPort.Addr().As4()
36 dstAs4 := dstIPPort.Addr().As4()
37 ipFields := &header.IPv4Fields{
38 SrcAddr: tcpip.AddrFromSlice(srcAs4[:]),
39 DstAddr: tcpip.AddrFromSlice(dstAs4[:]),
40 Protocol: unix.IPPROTO_UDP,
41 TTL: 64,
42 TotalLength: uint16(totalLen),
43 }
44 if ipFn != nil {
45 ipFn(ipFields)
46 }
47 ipv4H.Encode(ipFields)
48 udpH := header.UDP(b[offset+20:])
49 udpH.Encode(&header.UDPFields{
50 SrcPort: srcIPPort.Port(),
51 DstPort: dstIPPort.Port(),
52 Length: uint16(payloadLen + udphLen),
53 })
54 ipv4H.SetChecksum(^ipv4H.CalculateChecksum())
55 pseudoCsum := header.PseudoHeaderChecksum(unix.IPPROTO_UDP, ipv4H.SourceAddress(), ipv4H.DestinationAddress(), uint16(udphLen+payloadLen))
56 udpH.SetChecksum(^udpH.CalculateChecksum(pseudoCsum))
57 return b
58}
59
60func udp6Packet(srcIPPort, dstIPPort netip.AddrPort, payloadLen int) []byte {
61 return udp6PacketMutateIPFields(srcIPPort, dstIPPort, payloadLen, nil)

Callers 2

udp4PacketFunction · 0.85
Test_handleGROFunction · 0.85

Calls 1

AddrMethod · 0.45

Tested by

no test coverage detected