if (inip4->ip_v == IPVERSION) {
/* XXX This should be done by the forwarding engine instead */
inip4->ip_ttl -= 1;
+ if (inip4->ip_sum >= rte_cpu_to_be_16(0xffff - 0x100))
+ inip4->ip_sum += rte_cpu_to_be_16(0x100) + 1;
+ else
+ inip4->ip_sum += rte_cpu_to_be_16(0x100);
ds_ecn = inip4->ip_tos;
} else {
inip6 = (struct ip6_hdr *)inip4;
static inline void
ip4_ecn_setup(struct ip *ip4)
{
- if (ip4->ip_tos & IPTOS_ECN_MASK)
+ if (ip4->ip_tos & IPTOS_ECN_MASK) {
+ unsigned long sum;
+ uint8_t old;
+
+ old = ip4->ip_tos;
ip4->ip_tos |= IPTOS_ECN_CE;
+ sum = old + (~(*(uint8_t *)&ip4->ip_tos) & 0xff);
+ sum += rte_be_to_cpu_16(ip4->ip_sum);
+ sum = (sum & 0xffff) + (sum >> 16);
+ ip4->ip_sum = rte_cpu_to_be_16(sum + (sum >> 16));
+ }
}
static inline void
ip4_ecn_setup(inip4);
/* XXX This should be done by the forwarding engine instead */
inip4->ip_ttl -= 1;
+ if (inip4->ip_sum >= rte_cpu_to_be_16(0xffff - 0x100))
+ inip4->ip_sum += rte_cpu_to_be_16(0x100) + 1;
+ else
+ inip4->ip_sum += rte_cpu_to_be_16(0x100);
m->packet_type &= ~RTE_PTYPE_L4_MASK;
if (inip4->ip_p == IPPROTO_UDP)
m->packet_type |= RTE_PTYPE_L4_UDP;