func responsePacket(local net.IP, remote net.IP, lPort uint16, rPort uint16, respPayload []byte) *udpPacket { ip := packet.NewIPv4() udp := packet.NewUDP() ip.Version = 4 ip.SrcIP = make(net.IP, len(remote)) copy(ip.SrcIP, remote) ip.DstIP = make(net.IP, len(local)) copy(ip.DstIP, local) ip.TTL = 64 ip.Protocol = packet.IPProtocolUDP udp.SrcPort = rPort udp.DstPort = lPort udp.Payload = respPayload pkt := newUDPPacket() pkt.ip = ip pkt.udp = udp buf := newBuffer() pkt.mtuBuf = buf payloadL := len(udp.Payload) payloadStart := MTU - payloadL if payloadL != 0 { copy(pkt.mtuBuf[payloadStart:], udp.Payload) } udpHL := 8 udpStart := payloadStart - udpHL pseduoStart := udpStart - packet.IPv4_PSEUDO_LENGTH ip.PseudoHeader(pkt.mtuBuf[pseduoStart:udpStart], packet.IPProtocolUDP, udpHL+payloadL) udp.Serialize(pkt.mtuBuf[udpStart:payloadStart], pkt.mtuBuf[pseduoStart:]) ipHL := ip.HeaderLength() ipStart := udpStart - ipHL ip.Serialize(pkt.mtuBuf[ipStart:udpStart], udpHL+payloadL) pkt.wire = pkt.mtuBuf[ipStart:] return pkt }
func copyUDPPacket(raw []byte, ip *packet.IPv4, udp *packet.UDP) *udpPacket { iphdr := packet.NewIPv4() udphdr := packet.NewUDP() pkt := newUDPPacket() if len(udp.Payload) == 0 { // shallow copy headers // for now, we don't need deep copy if no payload *iphdr = *ip *udphdr = *udp pkt.ip = iphdr pkt.udp = udphdr } else { // get a block of buffer, make a deep copy buf := newBuffer() n := copy(buf, raw) pkt.mtuBuf = buf pkt.wire = buf[:n] packet.ParseIPv4(pkt.wire, iphdr) packet.ParseUDP(iphdr.Payload, udphdr) pkt.ip = iphdr pkt.udp = udphdr } return pkt }