(srcIPPort, dstIPPort netip.AddrPort, flags header.TCPFlags, segmentSize, seq uint32, ipFn func(*header.IPv6Fields))
| 131 | } |
| 132 | |
| 133 | func tcp6PacketMutateIPFields(srcIPPort, dstIPPort netip.AddrPort, flags header.TCPFlags, segmentSize, seq uint32, ipFn func(*header.IPv6Fields)) []byte { |
| 134 | totalLen := 60 + segmentSize |
| 135 | b := make([]byte, offset+int(totalLen), 65535) |
| 136 | ipv6H := header.IPv6(b[offset:]) |
| 137 | srcAs16 := srcIPPort.Addr().As16() |
| 138 | dstAs16 := dstIPPort.Addr().As16() |
| 139 | ipFields := &header.IPv6Fields{ |
| 140 | SrcAddr: tcpip.AddrFromSlice(srcAs16[:]), |
| 141 | DstAddr: tcpip.AddrFromSlice(dstAs16[:]), |
| 142 | TransportProtocol: unix.IPPROTO_TCP, |
| 143 | HopLimit: 64, |
| 144 | PayloadLength: uint16(segmentSize + 20), |
| 145 | } |
| 146 | if ipFn != nil { |
| 147 | ipFn(ipFields) |
| 148 | } |
| 149 | ipv6H.Encode(ipFields) |
| 150 | tcpH := header.TCP(b[offset+40:]) |
| 151 | tcpH.Encode(&header.TCPFields{ |
| 152 | SrcPort: srcIPPort.Port(), |
| 153 | DstPort: dstIPPort.Port(), |
| 154 | SeqNum: seq, |
| 155 | AckNum: 1, |
| 156 | DataOffset: 20, |
| 157 | Flags: flags, |
| 158 | WindowSize: 3000, |
| 159 | }) |
| 160 | pseudoCsum := header.PseudoHeaderChecksum(unix.IPPROTO_TCP, ipv6H.SourceAddress(), ipv6H.DestinationAddress(), uint16(20+segmentSize)) |
| 161 | tcpH.SetChecksum(^tcpH.CalculateChecksum(pseudoCsum)) |
| 162 | return b |
| 163 | } |
| 164 | |
| 165 | func tcp6Packet(srcIPPort, dstIPPort netip.AddrPort, flags header.TCPFlags, segmentSize, seq uint32) []byte { |
| 166 | return tcp6PacketMutateIPFields(srcIPPort, dstIPPort, flags, segmentSize, seq, nil) |
no test coverage detected