static struct dp_packet_batch * prepare_packets(size_t n, bool change, unsigned tid, ovs_be16 *dl_type) { struct dp_packet_batch *pkt_batch = xzalloc(sizeof *pkt_batch); struct flow flow; size_t i; ovs_assert(n <= ARRAY_SIZE(pkt_batch->packets)); dp_packet_batch_init(pkt_batch); for (i = 0; i < n; i++) { struct udp_header *udp; struct dp_packet *pkt = dp_packet_new(sizeof payload/2); dp_packet_put_hex(pkt, payload, NULL); flow_extract(pkt, &flow); udp = dp_packet_l4(pkt); udp->udp_src = htons(ntohs(udp->udp_src) + tid); if (change) { udp->udp_dst = htons(ntohs(udp->udp_dst) + i); } dp_packet_batch_add(pkt_batch, pkt); *dl_type = flow.dl_type; } return pkt_batch; }
/* Creates and returns a new dp_packet with an initial capacity of 'size + * headroom' bytes, reserving the first 'headroom' bytes as headroom. */ struct dp_packet * dp_packet_new_with_headroom(size_t size, size_t headroom) { struct dp_packet *b = dp_packet_new(size + headroom); dp_packet_reserve(b, headroom); return b; }