(srcIPPort, dstIPPort netip.AddrPort, payloadLen int, ipFn func(*header.IPv6Fields))
| 62 | } |
| 63 | |
| 64 | func udp6PacketMutateIPFields(srcIPPort, dstIPPort netip.AddrPort, payloadLen int, ipFn func(*header.IPv6Fields)) []byte { |
| 65 | totalLen := 48 + payloadLen |
| 66 | b := make([]byte, offset+int(totalLen), 65535) |
| 67 | ipv6H := header.IPv6(b[offset:]) |
| 68 | srcAs16 := srcIPPort.Addr().As16() |
| 69 | dstAs16 := dstIPPort.Addr().As16() |
| 70 | ipFields := &header.IPv6Fields{ |
| 71 | SrcAddr: tcpip.AddrFromSlice(srcAs16[:]), |
| 72 | DstAddr: tcpip.AddrFromSlice(dstAs16[:]), |
| 73 | TransportProtocol: unix.IPPROTO_UDP, |
| 74 | HopLimit: 64, |
| 75 | PayloadLength: uint16(payloadLen + udphLen), |
| 76 | } |
| 77 | if ipFn != nil { |
| 78 | ipFn(ipFields) |
| 79 | } |
| 80 | ipv6H.Encode(ipFields) |
| 81 | udpH := header.UDP(b[offset+40:]) |
| 82 | udpH.Encode(&header.UDPFields{ |
| 83 | SrcPort: srcIPPort.Port(), |
| 84 | DstPort: dstIPPort.Port(), |
| 85 | Length: uint16(payloadLen + udphLen), |
| 86 | }) |
| 87 | pseudoCsum := header.PseudoHeaderChecksum(unix.IPPROTO_UDP, ipv6H.SourceAddress(), ipv6H.DestinationAddress(), uint16(udphLen+payloadLen)) |
| 88 | udpH.SetChecksum(^udpH.CalculateChecksum(pseudoCsum)) |
| 89 | return b |
| 90 | } |
| 91 | |
| 92 | func udp4Packet(srcIPPort, dstIPPort netip.AddrPort, payloadLen int) []byte { |
| 93 | return udp4PacketMutateIPFields(srcIPPort, dstIPPort, payloadLen, nil) |
no test coverage detected