(srcIPPort, dstIPPort netip.AddrPort, payloadLen int, ipFn func(*header.IPv4Fields))
| 29 | ) |
| 30 | |
| 31 | func 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 | |
| 60 | func udp6Packet(srcIPPort, dstIPPort netip.AddrPort, payloadLen int) []byte { |
| 61 | return udp6PacketMutateIPFields(srcIPPort, dstIPPort, payloadLen, nil) |
no test coverage detected