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 713f9d5dee94b6eb81cdbbb929bf875f414d339c (commit) via 0034b0c0c63194bd7aa227364b381d6b049631dc (commit) via 933a59910b2b95f579dbb11729192ccfcc26bcd7 (commit) via 894b80ee113440037b7899459eeb1c0f5c14b124 (commit) from 0ee8255c2555ed68721ea5e7679f26a2e53bd8b8 (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 713f9d5dee94b6eb81cdbbb929bf875f414d339c Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Sat Jan 13 05:37:11 2018 +0300
linux-gen: pktio: loop: support checksum parsing
Add capability bits referencing support for IPv4 and UDP checksum validation for loop pktio device.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Bogdan Pricope bogdan.pricope@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index d75102dc..f9faba5c 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -357,6 +357,9 @@ static int loopback_init_capability(pktio_entry_t *pktio_entry) odp_pktio_config_init(&capa->config); capa->config.pktin.bit.ts_all = 1; capa->config.pktin.bit.ts_ptp = 1; + capa->config.pktin.bit.ipv4_chksum = 1; + capa->config.pktin.bit.tcp_chksum = 1; + capa->config.pktin.bit.udp_chksum = 1; capa->config.pktout.bit.ipv4_chksum = 1; capa->config.pktout.bit.tcp_chksum = 1; capa->config.pktout.bit.udp_chksum = 1;
commit 0034b0c0c63194bd7aa227364b381d6b049631dc Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Sat Jan 13 05:36:28 2018 +0300
linux-gen: packet: check TCP/UDP checksums
Add code to enable checking of TCP and UDP checksums.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Bogdan Pricope bogdan.pricope@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp/api/plat/packet_inline_types.h b/platform/linux-generic/include/odp/api/plat/packet_inline_types.h index 4b88d351..9a285fe4 100644 --- a/platform/linux-generic/include/odp/api/plat/packet_inline_types.h +++ b/platform/linux-generic/include/odp/api/plat/packet_inline_types.h @@ -98,6 +98,7 @@ typedef union { uint64_t l3_chksum_done:1; /* L3 checksum validation done */ uint64_t l4_chksum_done:1; /* L4 checksum validation done */ uint64_t ipsec_udp:1; /* UDP-encapsulated IPsec packet */ + uint64_t udp_chksum_zero:1; /* UDP header had 0 as chksum */ };
} _odp_packet_input_flags_t; diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 77e00fce..50dbdc45 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -1999,6 +1999,22 @@ static uint32_t packet_sum16_32(odp_packet_hdr_t *pkt_hdr, return sum; }
+static uint16_t packet_sum_ones_comp16(odp_packet_hdr_t *pkt_hdr, + uint32_t offset, + uint32_t len, + uint32_t l4_part_sum) +{ + uint32_t sum = l4_part_sum; + + sum += packet_sum16_32(pkt_hdr, offset, len); + + /* Not more than two additions */ + sum = (sum & 0xffff) + (sum >> 16); + sum = (sum & 0xffff) + (sum >> 16); + + return sum; +} + /** Parser helper function for Ethernet packets */ static inline uint16_t parse_eth(packet_parser_t *prs, const uint8_t **parseptr, uint32_t *offset, uint32_t frame_len) @@ -2085,7 +2101,8 @@ error: */ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr, uint32_t *offset, uint32_t frame_len, - odp_proto_chksums_t chksums) + odp_proto_chksums_t chksums, + uint32_t *l4_part_sum) { const _odp_ipv4hdr_t *ipv4 = (const _odp_ipv4hdr_t *)*parseptr; uint32_t dstaddr = _odp_be_to_cpu_32(ipv4->dst_addr); @@ -2113,6 +2130,10 @@ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr, *offset += ihl * 4; *parseptr += ihl * 4;
+ if (chksums.chksum.udp || chksums.chksum.tcp) + *l4_part_sum = segment_sum16_32((const uint8_t *)&ipv4->src_addr, + 2 * _ODP_IPV4ADDR_LEN, 0); + if (odp_unlikely(ihl > _ODP_IPV4HDR_IHL_MIN)) prs->input_flags.ipopt = 1;
@@ -2139,7 +2160,9 @@ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr, */ static inline uint8_t parse_ipv6(packet_parser_t *prs, const uint8_t **parseptr, uint32_t *offset, uint32_t frame_len, - uint32_t seg_len) + uint32_t seg_len, + odp_proto_chksums_t chksums, + uint32_t *l4_part_sum) { const _odp_ipv6hdr_t *ipv6 = (const _odp_ipv6hdr_t *)*parseptr; const _odp_ipv6hdr_ext_t *ipv6ext; @@ -2162,6 +2185,10 @@ static inline uint8_t parse_ipv6(packet_parser_t *prs, const uint8_t **parseptr, *offset += sizeof(_odp_ipv6hdr_t); *parseptr += sizeof(_odp_ipv6hdr_t);
+ if (chksums.chksum.udp || chksums.chksum.tcp) + *l4_part_sum = segment_sum16_32((const uint8_t *)&ipv6->src_addr, + 2 * _ODP_IPV6ADDR_LEN, 0); + /* Skip past any IPv6 extension headers */ if (ipv6->next_hdr == _ODP_IPPROTO_HOPOPTS || ipv6->next_hdr == _ODP_IPPROTO_ROUTE) { @@ -2200,7 +2227,10 @@ static inline uint8_t parse_ipv6(packet_parser_t *prs, const uint8_t **parseptr, /** * Parser helper function for TCP */ -static inline void parse_tcp(packet_parser_t *prs, const uint8_t **parseptr) +static inline void parse_tcp(packet_parser_t *prs, const uint8_t **parseptr, + uint16_t tcp_len, + odp_proto_chksums_t chksums, + uint32_t *l4_part_sum) { const _odp_tcphdr_t *tcp = (const _odp_tcphdr_t *)*parseptr; uint32_t len = tcp->hl * 4; @@ -2208,20 +2238,51 @@ static inline void parse_tcp(packet_parser_t *prs, const uint8_t **parseptr) if (odp_unlikely(tcp->hl < sizeof(_odp_tcphdr_t) / sizeof(uint32_t))) prs->flags.tcp_err = 1;
+ if (chksums.chksum.tcp && + !prs->input_flags.ipfrag) { + *l4_part_sum += odp_cpu_to_be_16(tcp_len); +#if ODP_BYTE_ORDER == ODP_BIG_ENDIAN + *l4_part_sum += _ODP_IPPROTO_TCP; +#else + *l4_part_sum += _ODP_IPPROTO_TCP << 8; +#endif + } + *parseptr += len; }
/** * Parser helper function for UDP */ -static inline void parse_udp(packet_parser_t *prs, const uint8_t **parseptr) +static inline void parse_udp(packet_parser_t *prs, const uint8_t **parseptr, + odp_proto_chksums_t chksums, + uint32_t *l4_part_sum) { const _odp_udphdr_t *udp = (const _odp_udphdr_t *)*parseptr; uint32_t udplen = _odp_be_to_cpu_16(udp->length); uint16_t ipsec_port = _odp_cpu_to_be_16(_ODP_UDP_IPSEC_PORT);
- if (odp_unlikely(udplen < sizeof(_odp_udphdr_t))) + if (odp_unlikely(udplen < sizeof(_odp_udphdr_t))) { prs->flags.udp_err = 1; + return; + } + + if (chksums.chksum.udp && + !prs->input_flags.ipfrag) { + if (udp->chksum == 0) { + prs->input_flags.l4_chksum_done = 1; + prs->flags.l4_chksum_err = + (prs->input_flags.ipv4 != 1); + } else { + *l4_part_sum += udp->length; +#if ODP_BYTE_ORDER == ODP_BIG_ENDIAN + *l4_part_sum += _ODP_IPPROTO_UDP; +#else + *l4_part_sum += _ODP_IPPROTO_UDP << 8; +#endif + } + prs->input_flags.udp_chksum_zero = (udp->chksum == 0); + }
if (odp_unlikely(ipsec_port == udp->dst_port && udplen > 4)) { uint32_t val; @@ -2241,7 +2302,8 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, uint32_t offset, uint32_t frame_len, uint32_t seg_len, int layer, uint16_t ethtype, - odp_proto_chksums_t chksums) + odp_proto_chksums_t chksums, + uint32_t *l4_part_sum) { uint8_t ip_proto;
@@ -2258,14 +2320,14 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, case _ODP_ETHTYPE_IPV4: prs->input_flags.ipv4 = 1; ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len, - chksums); + chksums, l4_part_sum); prs->l4_offset = offset; break;
case _ODP_ETHTYPE_IPV6: prs->input_flags.ipv6 = 1; ip_proto = parse_ipv6(prs, &parseptr, &offset, frame_len, - seg_len); + seg_len, chksums, l4_part_sum); prs->l4_offset = offset; break;
@@ -2302,14 +2364,15 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, if (odp_unlikely(offset + _ODP_TCPHDR_LEN > seg_len)) return -1; prs->input_flags.tcp = 1; - parse_tcp(prs, &parseptr); + parse_tcp(prs, &parseptr, frame_len - prs->l4_offset, chksums, + l4_part_sum); break;
case _ODP_IPPROTO_UDP: if (odp_unlikely(offset + _ODP_UDPHDR_LEN > seg_len)) return -1; prs->input_flags.udp = 1; - parse_udp(prs, &parseptr); + parse_udp(prs, &parseptr, chksums, l4_part_sum); break;
case _ODP_IPPROTO_AH: @@ -2351,6 +2414,7 @@ int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, uint32_t offset; uint16_t ethtype; const uint8_t *parseptr; + uint32_t l4_part_sum;
parseptr = ptr; offset = 0; @@ -2364,7 +2428,8 @@ int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, ethtype = parse_eth(prs, &parseptr, &offset, frame_len);
return packet_parse_common_l3_l4(prs, parseptr, offset, frame_len, - seg_len, layer, ethtype, chksums); + seg_len, layer, ethtype, chksums, + &l4_part_sum); }
static inline int packet_ipv4_chksum(odp_packet_t pkt, @@ -2520,6 +2585,49 @@ int _odp_packet_udp_chksum_insert(odp_packet_t pkt) return _odp_packet_tcp_udp_chksum_insert(pkt, _ODP_IPPROTO_UDP); }
+static int packet_l4_chksum(odp_packet_hdr_t *pkt_hdr, + odp_proto_chksums_t chksums, + uint32_t l4_part_sum) +{ + /* UDP chksum == 0 case is covered in parse_udp() */ + if (chksums.chksum.udp && + pkt_hdr->p.input_flags.udp && + !pkt_hdr->p.input_flags.ipfrag && + !pkt_hdr->p.input_flags.udp_chksum_zero) { + uint16_t sum = ~packet_sum_ones_comp16(pkt_hdr, + pkt_hdr->p.l4_offset, + pkt_hdr->frame_len - + pkt_hdr->p.l4_offset, + l4_part_sum); + + pkt_hdr->p.input_flags.l4_chksum_done = 1; + if (sum != 0) { + pkt_hdr->p.flags.l4_chksum_err = 1; + pkt_hdr->p.flags.udp_err = 1; + ODP_DBG("UDP chksum fail (%x)!\n", sum); + } + } + + if (chksums.chksum.tcp && + pkt_hdr->p.input_flags.tcp && + !pkt_hdr->p.input_flags.ipfrag) { + uint16_t sum = ~packet_sum_ones_comp16(pkt_hdr, + pkt_hdr->p.l4_offset, + pkt_hdr->frame_len - + pkt_hdr->p.l4_offset, + l4_part_sum); + + pkt_hdr->p.input_flags.l4_chksum_done = 1; + if (sum != 0) { + pkt_hdr->p.flags.l4_chksum_err = 1; + pkt_hdr->p.flags.tcp_err = 1; + ODP_DBG("TCP chksum fail (%x)!\n", sum); + } + } + + return pkt_hdr->p.flags.all_flags != 0; +} + /** * Simple packet parser */ @@ -2528,23 +2636,46 @@ int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, odp_proto_chksums_t chksums) { uint32_t seg_len = packet_first_seg_len(pkt_hdr); - void *base = packet_data(pkt_hdr); + const uint8_t *base = packet_data(pkt_hdr); + uint32_t offset = 0; + uint16_t ethtype; + uint32_t l4_part_sum = 0; + int rc;
- return packet_parse_common(&pkt_hdr->p, base, pkt_hdr->frame_len, - seg_len, layer, chksums); + if (odp_unlikely(layer == ODP_PROTO_LAYER_NONE)) + return 0; + + /* Assume valid L2 header, no CRC/FCS check in SW */ + pkt_hdr->p.l2_offset = offset; + + ethtype = parse_eth(&pkt_hdr->p, &base, &offset, pkt_hdr->frame_len); + + rc = packet_parse_common_l3_l4(&pkt_hdr->p, base, offset, + pkt_hdr->frame_len, + seg_len, layer, ethtype, chksums, + &l4_part_sum); + + if (rc != 0) + return rc; + + if (layer >= ODP_PKTIO_PARSER_LAYER_L4) + return packet_l4_chksum(pkt_hdr, chksums, l4_part_sum); + else + return 0; }
int odp_packet_parse(odp_packet_t pkt, uint32_t offset, const odp_packet_parse_param_t *param) { odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt); - void *data; + const uint8_t *data; uint32_t seg_len; uint32_t packet_len = pkt_hdr->frame_len; odp_proto_t proto = param->proto; odp_proto_layer_t layer = param->last_layer; int ret; uint16_t ethtype; + uint32_t l4_part_sum = 0;
if (proto == ODP_PROTO_NONE || layer == ODP_PROTO_LAYER_NONE) return -1; @@ -2557,24 +2688,29 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset, packet_parse_reset(pkt_hdr);
if (proto == ODP_PROTO_ETH) { - ret = packet_parse_common(&pkt_hdr->p, data, packet_len, - seg_len, layer, - param->chksums); - - if (ret) - return -1; + /* Assume valid L2 header, no CRC/FCS check in SW */ + pkt_hdr->p.l2_offset = offset; + + ethtype = parse_eth(&pkt_hdr->p, &data, &offset, packet_len); + } else if (proto == ODP_PROTO_IPV4) { + ethtype = _ODP_ETHTYPE_IPV4; + } else if (proto == ODP_PROTO_IPV6) { + ethtype = _ODP_ETHTYPE_IPV6; } else { - if (proto == ODP_PROTO_IPV4) - ethtype = _ODP_ETHTYPE_IPV4; - else - ethtype = _ODP_ETHTYPE_IPV6; + ethtype = 0; /* Invalid */ + }
- ret = packet_parse_common_l3_l4(&pkt_hdr->p, data, offset, - packet_len, seg_len, - layer, ethtype, - param->chksums); + ret = packet_parse_common_l3_l4(&pkt_hdr->p, data, offset, + packet_len, seg_len, + layer, ethtype, + param->chksums, + &l4_part_sum);
+ if (ret) + return -1;
+ if (layer >= ODP_PROTO_LAYER_L4) { + ret = packet_l4_chksum(pkt_hdr, param->chksums, l4_part_sum); if (ret) return -1; }
commit 933a59910b2b95f579dbb11729192ccfcc26bcd7 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Sat Jan 13 05:23:55 2018 +0300
linux-gen: packet: add IPv4 checksum validation
If configured, check IPv4 header checksum.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Bogdan Pricope bogdan.pricope@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 933dd4be..951903dd 100644 --- a/platform/linux-generic/include/odp_packet_internal.h +++ b/platform/linux-generic/include/odp_packet_internal.h @@ -252,7 +252,8 @@ int packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len,
/* Perform packet parse up to a given protocol layer */ int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, - odp_proto_layer_t layer); + odp_proto_layer_t layer, + odp_proto_chksums_t chksums);
/* Reset parser metadata for a new parse */ void packet_parse_reset(odp_packet_hdr_t *pkt_hdr); @@ -293,7 +294,8 @@ static inline void packet_set_ts(odp_packet_hdr_t *pkt_hdr, odp_time_t *ts) }
int packet_parse_common(packet_parser_t *pkt_hdr, const uint8_t *ptr, - uint32_t pkt_len, uint32_t seg_len, int layer); + uint32_t pkt_len, uint32_t seg_len, int layer, + odp_proto_chksums_t chksums);
int _odp_cls_parse(odp_packet_hdr_t *pkt_hdr, const uint8_t *parseptr);
diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c index 46fcf67e..ae4eb585 100644 --- a/platform/linux-generic/odp_classification.c +++ b/platform/linux-generic/odp_classification.c @@ -998,7 +998,8 @@ int cls_classify_packet(pktio_entry_t *entry, const uint8_t *base, packet_set_len(pkt_hdr, pkt_len);
packet_parse_common(&pkt_hdr->p, base, pkt_len, seg_len, - ODP_PROTO_LAYER_ALL); + ODP_PROTO_LAYER_ALL, + entry->s.in_chksums); } cos = cls_select_cos(entry, base, pkt_hdr);
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index e0635444..77e00fce 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -2084,7 +2084,8 @@ error: * Parser helper function for IPv4 */ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr, - uint32_t *offset, uint32_t frame_len) + uint32_t *offset, uint32_t frame_len, + odp_proto_chksums_t chksums) { const _odp_ipv4hdr_t *ipv4 = (const _odp_ipv4hdr_t *)*parseptr; uint32_t dstaddr = _odp_be_to_cpu_32(ipv4->dst_addr); @@ -2100,6 +2101,15 @@ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr, return 0; }
+ if (chksums.chksum.ipv4) { + prs->input_flags.l3_chksum_done = 1; + if (odp_chksum_ones_comp16(ipv4, ihl * 4) != 0xffff) { + prs->flags.ip_err = 1; + prs->flags.l3_chksum_err = 1; + return 0; + } + } + *offset += ihl * 4; *parseptr += ihl * 4;
@@ -2230,7 +2240,8 @@ static inline int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, uint32_t offset, uint32_t frame_len, uint32_t seg_len, - int layer, uint16_t ethtype) + int layer, uint16_t ethtype, + odp_proto_chksums_t chksums) { uint8_t ip_proto;
@@ -2246,7 +2257,8 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, switch (ethtype) { case _ODP_ETHTYPE_IPV4: prs->input_flags.ipv4 = 1; - ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len); + ip_proto = parse_ipv4(prs, &parseptr, &offset, frame_len, + chksums); prs->l4_offset = offset; break;
@@ -2334,7 +2346,7 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr, */ int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, uint32_t frame_len, uint32_t seg_len, - int layer) + int layer, odp_proto_chksums_t chksums) { uint32_t offset; uint16_t ethtype; @@ -2352,7 +2364,7 @@ int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, ethtype = parse_eth(prs, &parseptr, &offset, frame_len);
return packet_parse_common_l3_l4(prs, parseptr, offset, frame_len, - seg_len, layer, ethtype); + seg_len, layer, ethtype, chksums); }
static inline int packet_ipv4_chksum(odp_packet_t pkt, @@ -2512,13 +2524,14 @@ int _odp_packet_udp_chksum_insert(odp_packet_t pkt) * Simple packet parser */ int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, - odp_proto_layer_t layer) + odp_proto_layer_t layer, + odp_proto_chksums_t chksums) { uint32_t seg_len = packet_first_seg_len(pkt_hdr); void *base = packet_data(pkt_hdr);
return packet_parse_common(&pkt_hdr->p, base, pkt_hdr->frame_len, - seg_len, layer); + seg_len, layer, chksums); }
int odp_packet_parse(odp_packet_t pkt, uint32_t offset, @@ -2545,7 +2558,8 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset,
if (proto == ODP_PROTO_ETH) { ret = packet_parse_common(&pkt_hdr->p, data, packet_len, - seg_len, layer); + seg_len, layer, + param->chksums);
if (ret) return -1; @@ -2557,7 +2571,9 @@ int odp_packet_parse(odp_packet_t pkt, uint32_t offset,
ret = packet_parse_common_l3_l4(&pkt_hdr->p, data, offset, packet_len, seg_len, - layer, ethtype); + layer, ethtype, + param->chksums); +
if (ret) return -1; diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index 779e4c62..d75102dc 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -151,7 +151,8 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, } } else { packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums); }
packet_set_ts(pkt_hdr, ts); diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 567bc9f9..1fb76d2a 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -724,7 +724,8 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry, copy_packet_cls_metadata(&parsed_hdr, pkt_hdr); else packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums);
packet_set_ts(pkt_hdr, ts); } diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index 3df7f960..530a1600 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -256,7 +256,8 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, }
packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums); pktio_entry->s.stats.in_octets += pkt_hdr->frame_len;
packet_set_ts(pkt_hdr, ts); diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 8b7200e6..d7753850 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -682,7 +682,8 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
if (!pktio_cls_enabled(pktio_entry)) packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums);
pkt_hdr->input = pktio_entry->s.handle; packet_set_ts(pkt_hdr, ts); diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index 847eb71a..1731e60d 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -259,7 +259,8 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, copy_packet_cls_metadata(&parsed_hdr, hdr); else packet_parse_layer(hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums);
packet_set_ts(hdr, ts);
diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index af766e0d..d2f5cea1 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -286,7 +286,8 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, copy_packet_cls_metadata(&parsed_hdr, pkt_hdr); else packet_parse_layer(pkt_hdr, - pktio_entry->s.config.parser.layer); + pktio_entry->s.config.parser.layer, + pktio_entry->s.in_chksums);
packet_set_ts(pkt_hdr, ts); pkt_hdr->input = pktio_entry->s.handle;
commit 894b80ee113440037b7899459eeb1c0f5c14b124 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Sat Jan 13 05:18:31 2018 +0300
linux-gen: pktio: introduce checksum settings
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Bogdan Pricope bogdan.pricope@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index 4be4b151..cf02476d 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -155,6 +155,7 @@ struct pktio_entry { odp_pktio_config_t config; /**< Device configuration */ classifier_t cls; /**< classifier linked with this pktio*/ odp_pktio_stats_t stats; /**< statistic counters for pktio */ + odp_proto_chksums_t in_chksums; /**< Checksums validation settings */ enum { STATS_SYSFS = 0, STATS_ETHTOOL, diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 7b211c45..1721cdec 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -456,6 +456,12 @@ int odp_pktio_config(odp_pktio_t hdl, const odp_pktio_config_t *config)
entry->s.config = *config;
+ entry->s.in_chksums.all_chksum = 0; + entry->s.in_chksums.chksum.ipv4 = config->pktin.bit.ipv4_chksum; + entry->s.in_chksums.chksum.tcp = config->pktin.bit.tcp_chksum; + entry->s.in_chksums.chksum.udp = config->pktin.bit.udp_chksum; + entry->s.in_chksums.chksum.sctp = config->pktin.bit.sctp_chksum; + if (entry->s.ops->config) res = entry->s.ops->config(entry, config);
-----------------------------------------------------------------------
Summary of changes: .../include/odp/api/plat/packet_inline_types.h | 1 + .../linux-generic/include/odp_packet_internal.h | 6 +- .../linux-generic/include/odp_packet_io_internal.h | 1 + platform/linux-generic/odp_classification.c | 3 +- platform/linux-generic/odp_packet.c | 210 ++++++++++++++++++--- platform/linux-generic/odp_packet_io.c | 6 + platform/linux-generic/pktio/loop.c | 6 +- platform/linux-generic/pktio/netmap.c | 3 +- platform/linux-generic/pktio/pcap.c | 3 +- platform/linux-generic/pktio/socket.c | 3 +- platform/linux-generic/pktio/socket_mmap.c | 3 +- platform/linux-generic/pktio/tap.c | 3 +- 12 files changed, 210 insertions(+), 38 deletions(-)
hooks/post-receive