examples/ip_frag: fix unknown ethernet type

Right now app blindly set IPv4 ether type for all non IPv6 packets.
Instead we can save and later restore original type value.

Fixes: 74de12b7b6 ("examples/ip_fragmentation: overhaul")
Cc: stable@dpdk.org

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
This commit is contained in:
Konstantin Ananyev 2019-07-18 11:11:13 +01:00 committed by Thomas Monjalon
parent b869cbc955
commit 826038fcfc

View File

@ -242,18 +242,21 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf,
{ {
struct rx_queue *rxq; struct rx_queue *rxq;
uint32_t i, len, next_hop; uint32_t i, len, next_hop;
uint8_t ipv6; uint16_t port_out, ether_type;
uint16_t port_out;
int32_t len2; int32_t len2;
uint64_t ol_flags; uint64_t ol_flags;
const struct rte_ether_hdr *eth;
ipv6 = 0;
ol_flags = 0; ol_flags = 0;
rxq = &qconf->rx_queue_list[queueid]; rxq = &qconf->rx_queue_list[queueid];
/* by default, send everything back to the source port */ /* by default, send everything back to the source port */
port_out = port_in; port_out = port_in;
/* save ether type of the incoming packet */
eth = rte_pktmbuf_mtod(m, const struct rte_ether_hdr *);
ether_type = eth->ether_type;
/* Remove the Ethernet header and trailer from the input packet */ /* Remove the Ethernet header and trailer from the input packet */
rte_pktmbuf_adj(m, (uint16_t)sizeof(struct rte_ether_hdr)); rte_pktmbuf_adj(m, (uint16_t)sizeof(struct rte_ether_hdr));
@ -302,8 +305,6 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf,
/* if this is an IPv6 packet */ /* if this is an IPv6 packet */
struct rte_ipv6_hdr *ip_hdr; struct rte_ipv6_hdr *ip_hdr;
ipv6 = 1;
/* Read the lookup key (i.e. ip_dst) from the input packet */ /* Read the lookup key (i.e. ip_dst) from the input packet */
ip_hdr = rte_pktmbuf_mtod(m, struct rte_ipv6_hdr *); ip_hdr = rte_pktmbuf_mtod(m, struct rte_ipv6_hdr *);
@ -364,13 +365,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf,
/* src addr */ /* src addr */
rte_ether_addr_copy(&ports_eth_addr[port_out], rte_ether_addr_copy(&ports_eth_addr[port_out],
&eth_hdr->s_addr); &eth_hdr->s_addr);
if (ipv6) { eth_hdr->ether_type = ether_type;
eth_hdr->ether_type =
rte_be_to_cpu_16(RTE_ETHER_TYPE_IPV6);
} else {
eth_hdr->ether_type =
rte_be_to_cpu_16(RTE_ETHER_TYPE_IPV4);
}
} }
len += len2; len += len2;