net: export IPv6 header extensions skip function

skip_ip6_ext function can be exported as a helper, it may be used
by some PMD to skip IPv6 header extensions.

Signed-off-by: Didier Pallard <didier.pallard@6wind.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
Acked-by: Yong Wang <yongwang@vmware.com>
This commit is contained in:
Didier Pallard 2018-03-28 17:43:42 +02:00 committed by Ferruh Yigit
parent 3c0db1ab51
commit 8f0e4d6a78
5 changed files with 44 additions and 7 deletions

View File

@ -5,6 +5,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
LIB = librte_net.a
CFLAGS += -DALLOW_EXPERIMENTAL_API
CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
LDLIBS += -lrte_mbuf -lrte_eal -lrte_mempool

View File

@ -2,6 +2,7 @@
# Copyright(c) 2017 Intel Corporation
version = 1
allow_experimental_apis = true
headers = files('rte_ip.h',
'rte_tcp.h',
'rte_udp.h',

View File

@ -178,8 +178,8 @@ ip4_hlen(const struct ipv4_hdr *hdr)
}
/* parse ipv6 extended headers, update offset and return next proto */
static uint16_t
skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off,
int __rte_experimental
rte_net_skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off,
int *frag)
{
struct ext_hdr {
@ -201,7 +201,7 @@ skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off,
xh = rte_pktmbuf_read(m, *off, sizeof(*xh),
&xh_copy);
if (xh == NULL)
return 0;
return -1;
*off += (xh->len + 1) * 8;
proto = xh->next_hdr;
break;
@ -209,7 +209,7 @@ skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off,
xh = rte_pktmbuf_read(m, *off, sizeof(*xh),
&xh_copy);
if (xh == NULL)
return 0;
return -1;
*off += 8;
proto = xh->next_hdr;
*frag = 1;
@ -220,7 +220,7 @@ skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off,
return proto;
}
}
return 0;
return -1;
}
/* parse mbuf data to get packet type */
@ -233,6 +233,7 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m,
uint32_t pkt_type = RTE_PTYPE_L2_ETHER;
uint32_t off = 0;
uint16_t proto;
int ret;
if (hdr_lens == NULL)
hdr_lens = &local_hdr_lens;
@ -316,7 +317,10 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m,
off += hdr_lens->l3_len;
pkt_type |= ptype_l3_ip6(proto);
if ((pkt_type & RTE_PTYPE_L3_MASK) == RTE_PTYPE_L3_IPV6_EXT) {
proto = skip_ip6_ext(proto, m, &off, &frag);
ret = rte_net_skip_ip6_ext(proto, m, &off, &frag);
if (ret < 0)
return pkt_type;
proto = ret;
hdr_lens->l3_len = off - hdr_lens->l2_len;
}
if (proto == 0)
@ -449,7 +453,10 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m,
uint32_t prev_off;
prev_off = off;
proto = skip_ip6_ext(proto, m, &off, &frag);
ret = rte_net_skip_ip6_ext(proto, m, &off, &frag);
if (ret < 0)
return pkt_type;
proto = ret;
hdr_lens->inner_l3_len += off - prev_off;
}
if (proto == 0)

View File

@ -28,6 +28,33 @@ struct rte_net_hdr_lens {
uint8_t inner_l4_len;
};
/**
* Skip IPv6 header extensions.
*
* This function skips all IPv6 extensions, returning size of
* complete header including options and final protocol value.
*
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* @param proto
* Protocol field of IPv6 header.
* @param m
* The packet mbuf to be parsed.
* @param off
* On input, must contain the offset to the first byte following
* IPv6 header, on output, contains offset to the first byte
* of next layer (after any IPv6 extension header)
* @param frag
* Contains 1 in output if packet is an IPv6 fragment.
* @return
* Protocol that follows IPv6 header.
* -1 if an error occurs during mbuf parsing.
*/
int __rte_experimental
rte_net_skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off,
int *frag);
/**
* Parse an Ethernet packet to get its packet type.
*

View File

@ -17,4 +17,5 @@ EXPERIMENTAL {
global:
rte_net_make_rarp_packet;
rte_net_skip_ip6_ext;
} DPDK_17.05;