aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/include/odp/api/plat/packet_inline_types.h
blob: 880fd01f274a8fbe5fa1f99b351d9eef517f1bcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/* Copyright (c) 2015-2018, Linaro Limited
 * All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */


/**
 * @file
 *
 * ODP packet descriptor
 */

#ifndef ODP_PACKET_INLINE_TYPES_H_
#define ODP_PACKET_INLINE_TYPES_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/** @internal 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 */
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 */
typedef union {
	/** All input flags */
	uint64_t all;

	/** Individual input flags */
	struct {
		uint64_t dst_queue:1; /**< Dst queue 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 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 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
					   odp_packet_has_ipsec_set() func. */
		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 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;

#ifdef __cplusplus
}
#endif

#endif