| 102 | } |
| 103 | |
| 104 | static void |
| 105 | setup_pkt_udp_ip_headers(struct rte_ipv4_hdr *ip_hdr, |
| 106 | struct rte_udp_hdr *udp_hdr, |
| 107 | uint16_t pkt_data_len) |
| 108 | { |
| 109 | uint16_t *ptr16; |
| 110 | uint32_t ip_cksum; |
| 111 | uint16_t pkt_len; |
| 112 | |
| 113 | /* |
| 114 | * Initialize UDP header. |
| 115 | */ |
| 116 | pkt_len = (uint16_t) (pkt_data_len + sizeof(struct rte_udp_hdr)); |
| 117 | udp_hdr->src_port = rte_cpu_to_be_16(tx_udp_src_port); |
| 118 | udp_hdr->dst_port = rte_cpu_to_be_16(tx_udp_dst_port); |
| 119 | udp_hdr->dgram_len = RTE_CPU_TO_BE_16(pkt_len); |
| 120 | udp_hdr->dgram_cksum = 0; /* No UDP checksum. */ |
| 121 | |
| 122 | /* |
| 123 | * Initialize IP header. |
| 124 | */ |
| 125 | pkt_len = (uint16_t) (pkt_len + sizeof(struct rte_ipv4_hdr)); |
| 126 | ip_hdr->version_ihl = RTE_IPV4_VHL_DEF; |
| 127 | ip_hdr->type_of_service = 0; |
| 128 | ip_hdr->fragment_offset = 0; |
| 129 | ip_hdr->time_to_live = IP_DEFTTL; |
| 130 | ip_hdr->next_proto_id = IPPROTO_UDP; |
| 131 | ip_hdr->packet_id = 0; |
| 132 | ip_hdr->total_length = RTE_CPU_TO_BE_16(pkt_len); |
| 133 | ip_hdr->src_addr = rte_cpu_to_be_32(tx_ip_src_addr); |
| 134 | ip_hdr->dst_addr = rte_cpu_to_be_32(tx_ip_dst_addr); |
| 135 | |
| 136 | /* |
| 137 | * Compute IP header checksum. |
| 138 | */ |
| 139 | ptr16 = (unaligned_uint16_t*) ip_hdr; |
| 140 | ip_cksum = 0; |
| 141 | ip_cksum += ptr16[0]; ip_cksum += ptr16[1]; |
| 142 | ip_cksum += ptr16[2]; ip_cksum += ptr16[3]; |
| 143 | ip_cksum += ptr16[4]; |
| 144 | ip_cksum += ptr16[6]; ip_cksum += ptr16[7]; |
| 145 | ip_cksum += ptr16[8]; ip_cksum += ptr16[9]; |
| 146 | |
| 147 | /* |
| 148 | * Reduce 32 bit checksum to 16 bits and complement it. |
| 149 | */ |
| 150 | ip_cksum = ((ip_cksum & 0xFFFF0000) >> 16) + |
| 151 | (ip_cksum & 0x0000FFFF); |
| 152 | if (ip_cksum > 65535) |
| 153 | ip_cksum -= 65535; |
| 154 | ip_cksum = (~ip_cksum) & 0x0000FFFF; |
| 155 | if (ip_cksum == 0) |
| 156 | ip_cksum = 0xFFFF; |
| 157 | ip_hdr->hdr_checksum = (uint16_t) ip_cksum; |
| 158 | } |
| 159 | |
| 160 | static inline void |
| 161 | update_pkt_header(struct rte_mbuf *pkt, uint32_t total_pkt_len) |