> On Oct 9, 2017, at 8:42 AM, Shailja Pandey <[email protected]> wrote:
>
> Hi,
>
> In the DPDK application, I am maintaining some state and due to that I need
> to generate the packets with monotonically increasing sequence numbers. As
> shown in the code below,
>
> /tip->tcp.seq = htonl(DEFAULT_PKT_NUMBER);/
>
> DPDK is putting some default number as a sequence number in the TCP packet
> and not using as defined by TCP protocol. I tried various workarounds but due
> to multi-threaded nature of the pktgen application, I am facing some issues
> and unable to put sequence numbers in increasing order. I tried thread_local
> and pthread_mutex_lock etc to generate packets with increasing sequence
> number.
>
> I am not very sure what am I missing, Please help me in this matter.
The way pktgen was written was for performance, which means I setup the mbufs
at start time and do not touch them again till another start command. This
causes packets to be sent out of order as I do not know when mbufs are returned
to the free pool.
The only way to send a given sequence is to modified each packet as it is sent,
which will impact performance. The random mode does just this type of packet
mods and it would be a good model to look at if you want to modify the code.
>
> _Function:_
>
> void
> pktgen_tcp_hdr_ctor(pkt_seq_t *pkt, tcpip_t *tip, int type __rte_unused)
> {
> uint16_t tlen;
>
> /* Zero out the header space */
> memset((char *)tip, 0, sizeof(tcpip_t));
>
> /* Create the TCP header */
> tip->ip.src = htonl(pkt->ip_src_addr.addr.ipv4.s_addr);
> tip->ip.dst = htonl(pkt->ip_dst_addr.addr.ipv4.s_addr);
> tlen = pkt->pktSize -
> (pkt->ether_hdr_size + sizeof(ipHdr_t));
>
> tip->ip.len = htons(tlen);
> tip->ip.proto = pkt->ipProto;
>
> tip->tcp.sport = htons(pkt->sport);
> tip->tcp.dport = htons(pkt->dport);
>
> *tip->tcp.seq = htonl(DEFAULT_PKT_NUMBER);*
>
> tip->tcp.ack = htonl(DEFAULT_ACK_NUMBER);
> tip->tcp.offset = ((sizeof(tcpHdr_t) / sizeof(uint32_t)) << 4);
> /* Offset in words */
> tip->tcp.flags = ACK_FLAG;
> /* ACK */
> tip->tcp.window = htons(DEFAULT_WND_SIZE);
> tip->tcp.urgent = 0;
>
> tlen = pkt->pktSize - pkt->ether_hdr_size;
>
> tip->tcp.cksum = cksum(tip, tlen, 0);
> }
>
> --
>
> Thanks,
> Shailja
>
Regards,
Keith