This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, master has been updated via 15f3c174f5a104e9749ed83797acb00660d675ad (commit) via f9baafc4a5644973410ef6c5a1d233671bec1d17 (commit) from 1b1da0fe917cb916232fd9aad615b68941b8f490 (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit 15f3c174f5a104e9749ed83797acb00660d675ad Author: Bill Fischofer bill.fischofer@linaro.org Date: Thu Jun 9 07:12:41 2016 -0500
validation: packet: ensure user area is copied correctly
As part of resolution of Bug https://bugs.linaro.org/show_bug.cgi?id=2310 make sure that odp_packet_copy() handles user area copies correctly. The copy should fail if the target pool's user area size is not large enough to contain the source user area.
Signed-off-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Zoltan Kiss zoltan.kiss@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/test/validation/packet/packet.c b/test/validation/packet/packet.c index 6770339..a4426e2 100644 --- a/test/validation/packet/packet.c +++ b/test/validation/packet/packet.c @@ -14,7 +14,7 @@ /* Reserve some tailroom for tests */ #define PACKET_TAILROOM_RESERVE 4
-static odp_pool_t packet_pool; +static odp_pool_t packet_pool, packet_pool_no_uarea, packet_pool_double_uarea; static uint32_t packet_len;
static uint32_t segmented_packet_len; @@ -65,6 +65,24 @@ int packet_suite_init(void) if (packet_pool == ODP_POOL_INVALID) return -1;
+ params.pkt.uarea_size = 0; + packet_pool_no_uarea = odp_pool_create("packet_pool_no_uarea", + ¶ms); + if (packet_pool_no_uarea == ODP_POOL_INVALID) { + odp_pool_destroy(packet_pool); + return -1; + } + + params.pkt.uarea_size = 2 * sizeof(struct udata_struct); + packet_pool_double_uarea = odp_pool_create("packet_pool_double_uarea", + ¶ms); + + if (packet_pool_double_uarea == ODP_POOL_INVALID) { + odp_pool_destroy(packet_pool_no_uarea); + odp_pool_destroy(packet_pool); + return -1; + } + test_packet = odp_packet_alloc(packet_pool, packet_len);
for (i = 0; i < packet_len; i++) { @@ -113,8 +131,12 @@ int packet_suite_term(void) { odp_packet_free(test_packet); odp_packet_free(segmented_test_packet); - if (odp_pool_destroy(packet_pool) != 0) + + if (odp_pool_destroy(packet_pool_double_uarea) != 0 || + odp_pool_destroy(packet_pool_no_uarea) != 0 || + odp_pool_destroy(packet_pool) != 0) return -1; + return 0; }
@@ -863,32 +885,41 @@ free_packet: odp_packet_free(pkt); }
-#define COMPARE_INFLAG(p1, p2, flag) \ +#define COMPARE_HAS_INFLAG(p1, p2, flag) \ CU_ASSERT(odp_packet_has_##flag(p1) == odp_packet_has_##flag(p2))
+#define COMPARE_INFLAG(p1, p2, flag) \ + CU_ASSERT(odp_packet_##flag(p1) == odp_packet_##flag(p2)) + static void _packet_compare_inflags(odp_packet_t pkt1, odp_packet_t pkt2) { - COMPARE_INFLAG(pkt1, pkt2, l2); - COMPARE_INFLAG(pkt1, pkt2, l3); - COMPARE_INFLAG(pkt1, pkt2, l4); - COMPARE_INFLAG(pkt1, pkt2, eth); - COMPARE_INFLAG(pkt1, pkt2, eth_bcast); - COMPARE_INFLAG(pkt1, pkt2, eth_mcast); - COMPARE_INFLAG(pkt1, pkt2, jumbo); - COMPARE_INFLAG(pkt1, pkt2, vlan); - COMPARE_INFLAG(pkt1, pkt2, vlan_qinq); - COMPARE_INFLAG(pkt1, pkt2, arp); - COMPARE_INFLAG(pkt1, pkt2, ipv4); - COMPARE_INFLAG(pkt1, pkt2, ipv6); - COMPARE_INFLAG(pkt1, pkt2, ip_bcast); - COMPARE_INFLAG(pkt1, pkt2, ip_mcast); - COMPARE_INFLAG(pkt1, pkt2, ipfrag); - COMPARE_INFLAG(pkt1, pkt2, ipopt); - COMPARE_INFLAG(pkt1, pkt2, ipsec); - COMPARE_INFLAG(pkt1, pkt2, udp); - COMPARE_INFLAG(pkt1, pkt2, tcp); - COMPARE_INFLAG(pkt1, pkt2, sctp); - COMPARE_INFLAG(pkt1, pkt2, icmp); + COMPARE_HAS_INFLAG(pkt1, pkt2, l2); + COMPARE_HAS_INFLAG(pkt1, pkt2, l3); + COMPARE_HAS_INFLAG(pkt1, pkt2, l4); + COMPARE_HAS_INFLAG(pkt1, pkt2, eth); + COMPARE_HAS_INFLAG(pkt1, pkt2, eth_bcast); + COMPARE_HAS_INFLAG(pkt1, pkt2, eth_mcast); + COMPARE_HAS_INFLAG(pkt1, pkt2, jumbo); + COMPARE_HAS_INFLAG(pkt1, pkt2, vlan); + COMPARE_HAS_INFLAG(pkt1, pkt2, vlan_qinq); + COMPARE_HAS_INFLAG(pkt1, pkt2, arp); + COMPARE_HAS_INFLAG(pkt1, pkt2, ipv4); + COMPARE_HAS_INFLAG(pkt1, pkt2, ipv6); + COMPARE_HAS_INFLAG(pkt1, pkt2, ip_bcast); + COMPARE_HAS_INFLAG(pkt1, pkt2, ip_mcast); + COMPARE_HAS_INFLAG(pkt1, pkt2, ipfrag); + COMPARE_HAS_INFLAG(pkt1, pkt2, ipopt); + COMPARE_HAS_INFLAG(pkt1, pkt2, ipsec); + COMPARE_HAS_INFLAG(pkt1, pkt2, udp); + COMPARE_HAS_INFLAG(pkt1, pkt2, tcp); + COMPARE_HAS_INFLAG(pkt1, pkt2, sctp); + COMPARE_HAS_INFLAG(pkt1, pkt2, icmp); + COMPARE_HAS_INFLAG(pkt1, pkt2, flow_hash); + COMPARE_HAS_INFLAG(pkt1, pkt2, ts); + + COMPARE_INFLAG(pkt1, pkt2, color); + COMPARE_INFLAG(pkt1, pkt2, drop_eligible); + COMPARE_INFLAG(pkt1, pkt2, shaper_len_adjust); }
static void _packet_compare_data(odp_packet_t pkt1, odp_packet_t pkt2) @@ -913,6 +944,20 @@ static void _packet_compare_data(odp_packet_t pkt1, odp_packet_t pkt2) } }
+static void _packet_compare_udata(odp_packet_t pkt1, odp_packet_t pkt2) +{ + uint32_t usize1 = odp_packet_user_area_size(pkt1); + uint32_t usize2 = odp_packet_user_area_size(pkt2); + + void *uaddr1 = odp_packet_user_area(pkt1); + void *uaddr2 = odp_packet_user_area(pkt2); + + uint32_t cmplen = usize1 <= usize2 ? usize1 : usize2; + + if (cmplen) + CU_ASSERT(!memcmp(uaddr1, uaddr2, cmplen)); +} + static void _packet_compare_offset(odp_packet_t pkt1, uint32_t off1, odp_packet_t pkt2, uint32_t off2, uint32_t len) @@ -948,6 +993,11 @@ void packet_test_copy(void) uint32_t i, plen, seg_len, src_offset, dst_offset; void *pkt_data;
+ pkt = odp_packet_copy(test_packet, packet_pool_no_uarea); + CU_ASSERT(pkt == ODP_PACKET_INVALID); + if (pkt != ODP_PACKET_INVALID) + odp_packet_free(pkt); + pkt = odp_packet_copy(test_packet, odp_packet_pool(test_packet)); CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); _packet_compare_data(pkt, test_packet); @@ -962,6 +1012,30 @@ void packet_test_copy(void)
_packet_compare_inflags(pkt, pkt_copy); _packet_compare_data(pkt, pkt_copy); + CU_ASSERT(odp_packet_user_area_size(pkt) == + odp_packet_user_area_size(test_packet)); + _packet_compare_udata(pkt, pkt_copy); + odp_packet_free(pkt_copy); + odp_packet_free(pkt); + + pkt = odp_packet_copy(test_packet, packet_pool_double_uarea); + CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID); + _packet_compare_data(pkt, test_packet); + pool = odp_packet_pool(pkt); + CU_ASSERT_FATAL(pool != ODP_POOL_INVALID); + pkt_copy = odp_packet_copy(pkt, pool); + CU_ASSERT_FATAL(pkt_copy != ODP_PACKET_INVALID); + + CU_ASSERT(pkt != pkt_copy); + CU_ASSERT(odp_packet_data(pkt) != odp_packet_data(pkt_copy)); + CU_ASSERT(odp_packet_len(pkt) == odp_packet_len(pkt_copy)); + + _packet_compare_inflags(pkt, pkt_copy); + _packet_compare_data(pkt, pkt_copy); + CU_ASSERT(odp_packet_user_area_size(pkt) == + 2 * odp_packet_user_area_size(test_packet)); + _packet_compare_udata(pkt, pkt_copy); + _packet_compare_udata(pkt, test_packet); odp_packet_free(pkt_copy);
/* Now test copy_part */
commit f9baafc4a5644973410ef6c5a1d233671bec1d17 Author: Bill Fischofer bill.fischofer@linaro.org Date: Thu Jun 9 07:12:40 2016 -0500
linux-generic: packet: copy user area as part of odp_packet_copy()
Resolve Bug https://bugs.linaro.org/show_bug.cgi?id=2310 by copying the user area as part of odp_packet_copy(). The copy fails if the user area size of the destination pool is not large enough to hold the source packet user area.
Reported-by: Zoltan Kiss zoltan.kiss@linaro.org Signed-off-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Zoltan Kiss zoltan.kiss@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h index eedb416..4c4e36c 100644 --- a/platform/linux-generic/include/odp_packet_internal.h +++ b/platform/linux-generic/include/odp_packet_internal.h @@ -199,6 +199,9 @@ static inline void copy_packet_cls_metadata(odp_packet_hdr_t *src_hdr, { dst_hdr->p = src_hdr->p; dst_hdr->dst_queue = src_hdr->dst_queue; + dst_hdr->flow_hash = src_hdr->flow_hash; + dst_hdr->timestamp = src_hdr->timestamp; + dst_hdr->op_result = src_hdr->op_result; }
static inline void *packet_map(odp_packet_hdr_t *pkt_hdr, @@ -301,7 +304,7 @@ static inline int packet_parse_not_complete(odp_packet_hdr_t *pkt_hdr) }
/* Forward declarations */ -void _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt); +int _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt);
odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len, int parse);
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index c319833..9f81073 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -756,22 +756,11 @@ odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_pool_t pool) { odp_packet_hdr_t *srchdr = odp_packet_hdr(pkt); uint32_t pktlen = srchdr->frame_len; - uint32_t meta_offset = ODP_FIELD_SIZEOF(odp_packet_hdr_t, buf_hdr); odp_packet_t newpkt = odp_packet_alloc(pool, pktlen);
if (newpkt != ODP_PACKET_INVALID) { - odp_packet_hdr_t *newhdr = odp_packet_hdr(newpkt); - uint8_t *newstart, *srcstart; - - /* Must copy metadata first, followed by packet data */ - newstart = (uint8_t *)newhdr + meta_offset; - srcstart = (uint8_t *)srchdr + meta_offset; - - memcpy(newstart, srcstart, - sizeof(odp_packet_hdr_t) - meta_offset); - - if (odp_packet_copy_from_pkt(newpkt, 0, pkt, 0, - pktlen) != 0) { + if (_odp_packet_copy_md_to_packet(pkt, newpkt) || + odp_packet_copy_from_pkt(newpkt, 0, pkt, 0, pktlen)) { odp_packet_free(newpkt); newpkt = ODP_PACKET_INVALID; } @@ -966,7 +955,7 @@ int odp_packet_is_valid(odp_packet_t pkt) * */
-void _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt) +int _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt) { odp_packet_hdr_t *srchdr = odp_packet_hdr(srcpkt); odp_packet_hdr_t *dsthdr = odp_packet_hdr(dstpkt); @@ -987,6 +976,12 @@ void _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt) odp_atomic_load_u32( &srchdr->buf_hdr.ref_count)); copy_packet_parser_metadata(srchdr, dsthdr); + + /* Metadata copied, but return indication of whether the packet + * user area was truncated in the process. Note this can only + * happen when copying between different pools. + */ + return dsthdr->buf_hdr.uarea_size < srchdr->buf_hdr.uarea_size; }
/**
-----------------------------------------------------------------------
Summary of changes: .../linux-generic/include/odp_packet_internal.h | 5 +- platform/linux-generic/odp_packet.c | 23 ++-- test/validation/packet/packet.c | 122 +++++++++++++++++---- 3 files changed, 111 insertions(+), 39 deletions(-)
hooks/post-receive