@@ -67,101 +67,130 @@ typedef enum {
#endif
-/** @internal Packet field accessor */
+/** @cond _ODP_HIDE_FROM_DOXYGEN_ */
+
+/* Packet field accessor */
#define _odp_pkt_get(pkt, cast, field) \
(*(cast *)(uintptr_t)((uint8_t *)pkt + _odp_packet_inline.field))
-/** @internal Packet header field offsets for inline functions */
+/* Packet header field offsets for inline functions */
typedef struct _odp_packet_inline_offset_t {
- /** @internal field offset */
uint16_t data;
- /** @internal field offset */
uint16_t seg_len;
- /** @internal field offset */
uint16_t frame_len;
- /** @internal field offset */
uint16_t headroom;
- /** @internal field offset */
uint16_t tailroom;
- /** @internal field offset */
uint16_t pool;
- /** @internal field offset */
uint16_t input;
- /** @internal field offset */
uint16_t segcount;
- /** @internal field offset */
uint16_t user_ptr;
- /** @internal field offset */
uint16_t user_area;
- /** @internal field offset */
uint16_t l2_offset;
- /** @internal field offset */
uint16_t l3_offset;
- /** @internal field offset */
uint16_t l4_offset;
- /** @internal field offset */
uint16_t flow_hash;
- /** @internal field offset */
uint16_t timestamp;
- /** @internal field offset */
uint16_t input_flags;
} _odp_packet_inline_offset_t;
-/** @internal Packet input & protocol flags */
+/* Packet input & protocol flags */
typedef union {
- /** All input flags */
+ /* All input flags */
uint64_t all;
- /** Individual input flags */
+ /* Individual input flags */
struct {
- uint64_t dst_queue:1; /**< Dst queue present */
+ uint64_t dst_queue:1; /* Dst queue present */
- uint64_t flow_hash:1; /**< Flow hash present */
- uint64_t timestamp:1; /**< Timestamp present */
+ uint64_t flow_hash:1; /* Flow hash present */
+ uint64_t timestamp:1; /* Timestamp present */
- uint64_t l2:1; /**< known L2 protocol present */
- uint64_t l3:1; /**< known L3 protocol present */
- uint64_t l4:1; /**< known L4 protocol present */
+ uint64_t l2:1; /* known L2 protocol present */
+ uint64_t l3:1; /* known L3 protocol present */
+ uint64_t l4:1; /* known L4 protocol present */
- uint64_t eth:1; /**< Ethernet */
- uint64_t eth_bcast:1; /**< Ethernet broadcast */
- uint64_t eth_mcast:1; /**< Ethernet multicast */
- uint64_t jumbo:1; /**< Jumbo frame */
- uint64_t vlan:1; /**< VLAN hdr found */
- uint64_t vlan_qinq:1; /**< Stacked VLAN found, QinQ */
+ uint64_t eth:1; /* Ethernet */
+ uint64_t eth_bcast:1; /* Ethernet broadcast */
+ uint64_t eth_mcast:1; /* Ethernet multicast */
+ uint64_t jumbo:1; /* Jumbo frame */
+ uint64_t vlan:1; /* VLAN hdr found */
+ uint64_t vlan_qinq:1; /* Stacked VLAN found, QinQ */
- uint64_t snap:1; /**< SNAP */
- uint64_t arp:1; /**< ARP */
+ uint64_t snap:1; /* SNAP */
+ uint64_t arp:1; /* ARP */
- uint64_t ipv4:1; /**< IPv4 */
- uint64_t ipv6:1; /**< IPv6 */
- uint64_t ip_bcast:1; /**< IP broadcast */
- uint64_t ip_mcast:1; /**< IP multicast */
- uint64_t ipfrag:1; /**< IP fragment */
- uint64_t ipopt:1; /**< IP optional headers */
+ uint64_t ipv4:1; /* IPv4 */
+ uint64_t ipv6:1; /* IPv6 */
+ uint64_t ip_bcast:1; /* IP broadcast */
+ uint64_t ip_mcast:1; /* IP multicast */
+ uint64_t ipfrag:1; /* IP fragment */
+ uint64_t ipopt:1; /* IP optional headers */
- uint64_t ipsec:1; /**< IPSec packet. Required by the
+ uint64_t ipsec:1; /* IPSec packet. Required by the
odp_packet_has_ipsec_set() func. */
- uint64_t ipsec_ah:1; /**< IPSec authentication header */
- uint64_t ipsec_esp:1; /**< IPSec encapsulating security
+ uint64_t ipsec_ah:1; /* IPSec authentication header */
+ uint64_t ipsec_esp:1; /* IPSec encapsulating security
payload */
- uint64_t udp:1; /**< UDP */
- uint64_t tcp:1; /**< TCP */
- uint64_t tcpopt:1; /**< TCP options present */
- uint64_t sctp:1; /**< SCTP */
- uint64_t icmp:1; /**< ICMP */
-
- uint64_t color:2; /**< Packet color for traffic mgmt */
- uint64_t nodrop:1; /**< Drop eligibility status */
-
- 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:1; /* UDP */
+ uint64_t tcp:1; /* TCP */
+ uint64_t tcpopt:1; /* TCP options present */
+ uint64_t sctp:1; /* SCTP */
+ uint64_t icmp:1; /* ICMP */
+
+ uint64_t color:2; /* Packet color for traffic mgmt */
+ uint64_t nodrop:1; /* Drop eligibility status */
+
+ 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 */
};
} _odp_packet_input_flags_t;
+/*
+ * Additional packet flags
+ */
+typedef union {
+ /* All flags */
+ uint32_t all_flags;
+
+ struct {
+ uint32_t reserved1: 12;
+
+ /*
+ * Packet output flags
+ */
+ uint32_t l3_chksum_set: 1; /* L3 chksum bit is valid */
+ uint32_t l3_chksum: 1; /* L3 chksum override */
+ uint32_t l4_chksum_set: 1; /* L4 chksum bit is valid */
+ uint32_t l4_chksum: 1; /* L4 chksum override */
+ uint32_t shaper_len_adj: 8; /* Adjustment for traffic mgr */
+
+ /*
+ * Error flags
+ */
+ uint32_t snap_len_err: 1; /* Snap length error */
+ uint32_t ip_err: 1; /* IP error */
+ uint32_t l3_chksum_err: 1; /* L3 checksum error */
+ uint32_t tcp_err: 1; /* TCP error */
+ uint32_t udp_err: 1; /* UDP error */
+ uint32_t l4_chksum_err: 1; /* L4 checksum error */
+ uint32_t ipsec_err: 1; /* IPsec error */
+ uint32_t crypto_err: 1; /* Crypto packet operation error */
+ };
+
+ /* Flag groups */
+ struct {
+ uint32_t reserved2: 12;
+ uint32_t other: 12; /* All other flags */
+ uint32_t error: 8; /* All error flags */
+ } all;
+
+} _odp_packet_flags_t;
+
+/** @endcond */
+
#ifdef __cplusplus
}
#endif
@@ -32,65 +32,21 @@ extern "C" {
/** Minimum segment length expected by packet_parse_common() */
#define PACKET_PARSE_SEG_LEN 96
-
ODP_STATIC_ASSERT(sizeof(_odp_packet_input_flags_t) == sizeof(uint64_t),
"INPUT_FLAGS_SIZE_ERROR");
-/**
- * Packet error flags
- */
-typedef union {
- /* All error flags */
- uint32_t all;
-
- struct {
- /* Bitfield flags for each detected error */
- uint32_t app_error:1; /**< Error bit for application use */
- uint32_t frame_len:1; /**< Frame length error */
- uint32_t snap_len:1; /**< Snap length error */
- uint32_t l2_chksum:1; /**< L2 checksum error, checks TBD */
- uint32_t ip_err:1; /**< IP error, checks TBD */
- uint32_t l3_chksum:1; /**< L3 checksum error */
- uint32_t tcp_err:1; /**< TCP error, checks TBD */
- uint32_t udp_err:1; /**< UDP error, checks TBD */
- uint32_t l4_chksum:1; /**< L4 checksum error */
- uint32_t ipsec_err:1; /**< IPsec error */
- uint32_t crypto_err:1; /**< Crypto packet operation error */
- };
-} error_flags_t;
-
-ODP_STATIC_ASSERT(sizeof(error_flags_t) == sizeof(uint32_t),
+ODP_STATIC_ASSERT(sizeof(_odp_packet_flags_t) == sizeof(uint32_t),
"ERROR_FLAGS_SIZE_ERROR");
-/**
- * Packet output flags
- */
-typedef union {
- /* All output flags */
- uint32_t all;
-
- struct {
- /** adjustment for traffic mgr */
- uint32_t shaper_len_adj:8;
-
- /* Bitfield flags for each output option */
- uint32_t l3_chksum_set:1; /**< L3 chksum bit is valid */
- uint32_t l3_chksum:1; /**< L3 chksum override */
- uint32_t l4_chksum_set:1; /**< L3 chksum bit is valid */
- uint32_t l4_chksum:1; /**< L4 chksum override */
- };
-} output_flags_t;
-
-ODP_STATIC_ASSERT(sizeof(output_flags_t) == sizeof(uint32_t),
- "OUTPUT_FLAGS_SIZE_ERROR");
-
/**
* Packet parser metadata
*/
typedef struct {
+ /* Packet input flags */
_odp_packet_input_flags_t input_flags;
- error_flags_t error_flags;
- output_flags_t output_flags;
+
+ /* Other flags */
+ _odp_packet_flags_t flags;
/* offset to L2 hdr, e.g. Eth */
uint16_t l2_offset;
@@ -231,8 +187,7 @@ static inline void packet_init(odp_packet_hdr_t *pkt_hdr, uint32_t len)
}
pkt_hdr->p.input_flags.all = 0;
- pkt_hdr->p.output_flags.all = 0;
- pkt_hdr->p.error_flags.all = 0;
+ pkt_hdr->p.flags.all_flags = 0;
pkt_hdr->p.l2_offset = 0;
pkt_hdr->p.l3_offset = ODP_PACKET_OFFSET_INVALID;
@@ -923,7 +923,7 @@ static inline cos_t *cls_select_cos(pktio_entry_t *entry,
default_cos = cls->default_cos;
/* Return error cos for error packet */
- if (pkt_hdr->p.error_flags.all)
+ if (pkt_hdr->p.flags.all.error)
return cls->error_cos;
/* Calls all the PMRs attached at the PKTIO level*/
for (i = 0; i < odp_atomic_load_u32(&default_cos->s.num_rule); i++) {
@@ -1364,7 +1364,7 @@ int odp_crypto_int(odp_packet_t pkt_in,
(rc_auth == ODP_CRYPTO_ALG_ERR_NONE);
pkt_hdr = odp_packet_hdr(out_pkt);
- pkt_hdr->p.error_flags.crypto_err = !op_result->ok;
+ pkt_hdr->p.flags.crypto_err = !op_result->ok;
/* Synchronous, simply return results */
*pkt_out = out_pkt;
@@ -828,7 +828,7 @@ static ipsec_sa_t *ipsec_in_single(odp_packet_t pkt,
err:
pkt_hdr = odp_packet_hdr(pkt);
- pkt_hdr->p.error_flags.ipsec_err = 1;
+ pkt_hdr->p.flags.ipsec_err = 1;
*pkt_out = pkt;
@@ -1404,7 +1404,7 @@ static ipsec_sa_t *ipsec_out_single(odp_packet_t pkt,
err:
pkt_hdr = odp_packet_hdr(pkt);
- pkt_hdr->p.error_flags.ipsec_err = 1;
+ pkt_hdr->p.flags.ipsec_err = 1;
*pkt_out = pkt;
return ipsec_sa;
@@ -338,9 +338,8 @@ void *_odp_packet_map(void *pkt_ptr, uint32_t offset, uint32_t *seg_len,
void packet_parse_reset(odp_packet_hdr_t *pkt_hdr)
{
/* Reset parser metadata before new parse */
- pkt_hdr->p.error_flags.all = 0;
pkt_hdr->p.input_flags.all = 0;
- pkt_hdr->p.output_flags.all = 0;
+ pkt_hdr->p.flags.all.error = 0;
pkt_hdr->p.l2_offset = ODP_PACKET_OFFSET_INVALID;
pkt_hdr->p.l3_offset = ODP_PACKET_OFFSET_INVALID;
pkt_hdr->p.l4_offset = ODP_PACKET_OFFSET_INVALID;
@@ -1309,16 +1308,16 @@ void odp_packet_l3_chksum_insert(odp_packet_t pkt, int insert)
{
odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
- pkt_hdr->p.output_flags.l3_chksum_set = 1;
- pkt_hdr->p.output_flags.l3_chksum = insert;
+ pkt_hdr->p.flags.l3_chksum_set = 1;
+ pkt_hdr->p.flags.l3_chksum = insert;
}
void odp_packet_l4_chksum_insert(odp_packet_t pkt, int insert)
{
odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
- pkt_hdr->p.output_flags.l4_chksum_set = 1;
- pkt_hdr->p.output_flags.l4_chksum = insert;
+ pkt_hdr->p.flags.l4_chksum_set = 1;
+ pkt_hdr->p.flags.l4_chksum = insert;
}
odp_packet_chksum_status_t odp_packet_l3_chksum_status(odp_packet_t pkt)
@@ -1328,7 +1327,7 @@ odp_packet_chksum_status_t odp_packet_l3_chksum_status(odp_packet_t pkt)
if (!pkt_hdr->p.input_flags.l3_chksum_done)
return ODP_PACKET_CHKSUM_UNKNOWN;
- if (pkt_hdr->p.error_flags.l3_chksum)
+ if (pkt_hdr->p.flags.l3_chksum_err)
return ODP_PACKET_CHKSUM_BAD;
return ODP_PACKET_CHKSUM_OK;
@@ -1341,7 +1340,7 @@ odp_packet_chksum_status_t odp_packet_l4_chksum_status(odp_packet_t pkt)
if (!pkt_hdr->p.input_flags.l4_chksum_done)
return ODP_PACKET_CHKSUM_UNKNOWN;
- if (pkt_hdr->p.error_flags.l4_chksum)
+ if (pkt_hdr->p.flags.l4_chksum_err)
return ODP_PACKET_CHKSUM_BAD;
return ODP_PACKET_CHKSUM_OK;
@@ -1783,11 +1782,8 @@ void odp_packet_print(odp_packet_t pkt)
len += odp_buffer_snprint(&str[len], n - len, buf);
len += snprintf(&str[len], n - len, " input_flags 0x%" PRIx64 "\n",
hdr->p.input_flags.all);
- len += snprintf(&str[len], n - len, " error_flags 0x%" PRIx32 "\n",
- hdr->p.error_flags.all);
- len += snprintf(&str[len], n - len,
- " output_flags 0x%" PRIx32 "\n",
- hdr->p.output_flags.all);
+ len += snprintf(&str[len], n - len, " flags 0x%" PRIx32 "\n",
+ hdr->p.flags.all_flags);
len += snprintf(&str[len], n - len,
" l2_offset %" PRIu32 "\n", hdr->p.l2_offset);
len += snprintf(&str[len], n - len,
@@ -1989,7 +1985,7 @@ static inline uint16_t parse_eth(packet_parser_t *prs, const uint8_t **parseptr,
if (ethtype < _ODP_ETH_LEN_MAX) {
prs->input_flags.snap = 1;
if (ethtype > frame_len - *offset) {
- prs->error_flags.snap_len = 1;
+ prs->flags.snap_len_err = 1;
return 0;
}
ethtype = odp_be_to_cpu_16(*((const uint16_t *)(uintptr_t)
@@ -2036,7 +2032,7 @@ static inline uint8_t parse_ipv4(packet_parser_t *prs, const uint8_t **parseptr,
if (odp_unlikely(ihl < _ODP_IPV4HDR_IHL_MIN) ||
odp_unlikely(ver != 4) ||
(l3_len > frame_len - *offset)) {
- prs->error_flags.ip_err = 1;
+ prs->flags.ip_err = 1;
return 0;
}
@@ -2078,7 +2074,7 @@ static inline uint8_t parse_ipv6(packet_parser_t *prs, const uint8_t **parseptr,
/* Basic sanity checks on IPv6 header */
if ((odp_be_to_cpu_32(ipv6->ver_tc_flow) >> 28) != 6 ||
l3_len > frame_len - *offset) {
- prs->error_flags.ip_err = 1;
+ prs->flags.ip_err = 1;
return 0;
}
@@ -2107,7 +2103,7 @@ static inline uint8_t parse_ipv6(packet_parser_t *prs, const uint8_t **parseptr,
if (*offset >= prs->l3_offset +
odp_be_to_cpu_16(ipv6->payload_len)) {
- prs->error_flags.ip_err = 1;
+ prs->flags.ip_err = 1;
return 0;
}
@@ -2134,7 +2130,7 @@ static inline void parse_tcp(packet_parser_t *prs,
const _odp_tcphdr_t *tcp = (const _odp_tcphdr_t *)*parseptr;
if (tcp->hl < sizeof(_odp_tcphdr_t) / sizeof(uint32_t))
- prs->error_flags.tcp_err = 1;
+ prs->flags.tcp_err = 1;
else if ((uint32_t)tcp->hl * 4 > sizeof(_odp_tcphdr_t))
prs->input_flags.tcpopt = 1;
@@ -2153,7 +2149,7 @@ static inline void parse_udp(packet_parser_t *prs,
uint32_t udplen = odp_be_to_cpu_16(udp->length);
if (odp_unlikely(udplen < sizeof(_odp_udphdr_t)))
- prs->error_flags.udp_err = 1;
+ prs->flags.udp_err = 1;
if (odp_cpu_to_be_16(_ODP_UDP_IPSEC_PORT) == udp->dst_port &&
udplen > 4) {
@@ -2182,7 +2178,7 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr,
prs->l3_offset = offset;
if (layer <= ODP_PROTO_LAYER_L2)
- return prs->error_flags.all != 0;
+ return prs->flags.all.error != 0;
/* Set l3 flag only for known ethtypes */
prs->input_flags.l3 = 1;
@@ -2213,7 +2209,7 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr,
}
if (layer == ODP_PROTO_LAYER_L3)
- return prs->error_flags.all != 0;
+ return prs->flags.all.error != 0;
/* Set l4 flag only for known ip_proto */
prs->input_flags.l4 = 1;
@@ -2264,7 +2260,7 @@ int packet_parse_common_l3_l4(packet_parser_t *prs, const uint8_t *parseptr,
break;
}
- return prs->error_flags.all != 0;
+ return prs->flags.all.error != 0;
}
/**
@@ -24,7 +24,7 @@ int odp_packet_has_error(odp_packet_t pkt)
{
odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
- return pkt_hdr->p.error_flags.all != 0;
+ return pkt_hdr->p.flags.all.error != 0;
}
/* Get Input Flags */
@@ -34,9 +34,7 @@ int odp_packet_has_l2_error(odp_packet_t pkt)
odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
/* L2 parsing is always done by default and hence
no additional check is required */
- return pkt_hdr->p.error_flags.frame_len
- | pkt_hdr->p.error_flags.snap_len
- | pkt_hdr->p.error_flags.l2_chksum;
+ return pkt_hdr->p.flags.snap_len_err;
}
int odp_packet_has_l3(odp_packet_t pkt)
@@ -48,7 +46,7 @@ int odp_packet_has_l3_error(odp_packet_t pkt)
{
odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
- return pkt_hdr->p.error_flags.ip_err;
+ return pkt_hdr->p.flags.ip_err;
}
int odp_packet_has_l4(odp_packet_t pkt)
@@ -60,7 +58,7 @@ int odp_packet_has_l4_error(odp_packet_t pkt)
{
odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
- return pkt_hdr->p.error_flags.tcp_err | pkt_hdr->p.error_flags.udp_err;
+ return pkt_hdr->p.flags.tcp_err | pkt_hdr->p.flags.udp_err;
}
int odp_packet_has_eth_bcast(odp_packet_t pkt)
@@ -169,14 +167,14 @@ void odp_packet_drop_eligible_set(odp_packet_t pkt, odp_bool_t drop)
int8_t odp_packet_shaper_len_adjust(odp_packet_t pkt)
{
- retflag(pkt, output_flags.shaper_len_adj);
+ retflag(pkt, flags.shaper_len_adj);
}
void odp_packet_shaper_len_adjust_set(odp_packet_t pkt, int8_t adj)
{
odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
- pkt_hdr->p.output_flags.shaper_len_adj = adj;
+ pkt_hdr->p.flags.shaper_len_adj = adj;
}
/* Set Input Flags */
@@ -380,8 +380,8 @@ static inline int pkt_set_ol_rx(odp_pktin_config_opt_t *pktin_cfg,
return -1;
pkt_hdr->p.input_flags.l3_chksum_done = 1;
- pkt_hdr->p.error_flags.ip_err = 1;
- pkt_hdr->p.error_flags.l3_chksum = 1;
+ pkt_hdr->p.flags.ip_err = 1;
+ pkt_hdr->p.flags.l3_chksum_err = 1;
}
}
@@ -396,8 +396,8 @@ static inline int pkt_set_ol_rx(odp_pktin_config_opt_t *pktin_cfg,
return -1;
pkt_hdr->p.input_flags.l4_chksum_done = 1;
- pkt_hdr->p.error_flags.udp_err = 1;
- pkt_hdr->p.error_flags.l4_chksum = 1;
+ pkt_hdr->p.flags.udp_err = 1;
+ pkt_hdr->p.flags.l4_chksum_err = 1;
}
} else if (pktin_cfg->bit.tcp_chksum &&
HAS_L4_PROTO(mbuf, RTE_PTYPE_L4_TCP)) {
@@ -410,8 +410,8 @@ static inline int pkt_set_ol_rx(odp_pktin_config_opt_t *pktin_cfg,
return -1;
pkt_hdr->p.input_flags.l4_chksum_done = 1;
- pkt_hdr->p.error_flags.tcp_err = 1;
- pkt_hdr->p.error_flags.l4_chksum = 1;
+ pkt_hdr->p.flags.tcp_err = 1;
+ pkt_hdr->p.flags.l4_chksum_err = 1;
}
}
@@ -572,18 +572,18 @@ static inline void pkt_set_ol_tx(odp_pktout_config_opt_t *pktout_cfg,
ipv4_chksum_pkt = OL_TX_CHKSUM_PKT(pktout_cfg->bit.ipv4_chksum,
pktout_capa->bit.ipv4_chksum,
l3_proto_v4,
- pkt_p->output_flags.l3_chksum_set,
- pkt_p->output_flags.l3_chksum);
+ pkt_p->flags.l3_chksum_set,
+ pkt_p->flags.l3_chksum);
udp_chksum_pkt = OL_TX_CHKSUM_PKT(pktout_cfg->bit.udp_chksum,
pktout_capa->bit.udp_chksum,
(l4_proto == _ODP_IPPROTO_UDP),
- pkt_p->output_flags.l4_chksum_set,
- pkt_p->output_flags.l4_chksum);
+ pkt_p->flags.l4_chksum_set,
+ pkt_p->flags.l4_chksum);
tcp_chksum_pkt = OL_TX_CHKSUM_PKT(pktout_cfg->bit.tcp_chksum,
pktout_capa->bit.tcp_chksum,
(l4_proto == _ODP_IPPROTO_TCP),
- pkt_p->output_flags.l4_chksum_set,
- pkt_p->output_flags.l4_chksum);
+ pkt_p->flags.l4_chksum_set,
+ pkt_p->flags.l4_chksum);
if (!ipv4_chksum_pkt && !udp_chksum_pkt && !tcp_chksum_pkt)
return;