1 /*
2 * Copyright (c) 2016 Intel Corporation.
3 * Copyright (c) 2022 Florian Grandel.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 /**
9 * @file
10 * @brief Packet data common to all IEEE 802.15.4 L2 layers
11 */
12
13 #ifndef ZEPHYR_INCLUDE_NET_IEEE802154_PKT_H_
14 #define ZEPHYR_INCLUDE_NET_IEEE802154_PKT_H_
15
16 #include <string.h>
17
18 #include <zephyr/types.h>
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 /** @cond ignore */
25
26 #ifndef NET_PKT_HAS_CONTROL_BLOCK
27 #define NET_PKT_HAS_CONTROL_BLOCK
28 #endif
29
30 struct net_pkt_cb_ieee802154 {
31 #if defined(CONFIG_NET_L2_OPENTHREAD)
32 uint32_t ack_fc; /* Frame counter set in the ACK */
33 uint8_t ack_keyid; /* Key index set in the ACK */
34 #endif
35 union {
36 /* RX packets */
37 struct {
38 uint8_t lqi; /* Link Quality Indicator */
39 uint8_t rssi; /* Received Signal Strength Indication */
40 };
41 #if defined(CONFIG_IEEE802154_SELECTIVE_TXPOWER)
42 /* TX packets */
43 struct {
44 int8_t txpwr; /* TX power in dBm. */
45 };
46 #endif /* CONFIG_IEEE802154_SELECTIVE_TXPOWER */
47 };
48
49 /* Flags */
50 uint8_t arb : 1; /* ACK Request Bit is set in the frame */
51 uint8_t ack_fpb : 1; /* Frame Pending Bit was set in the ACK */
52 uint8_t frame_secured : 1; /* Frame is authenticated and
53 * encrypted according to its
54 * Auxiliary Security Header
55 */
56 uint8_t mac_hdr_rdy : 1; /* Indicates if frame's MAC header
57 * is ready to be transmitted or if
58 * it requires further modifications,
59 * e.g. Frame Counter injection.
60 */
61 #if defined(CONFIG_NET_L2_OPENTHREAD)
62 uint8_t fv2015 : 1; /* Frame version is IEEE 802.15.4-2015 or later */
63 uint8_t ack_seb : 1; /* Security Enabled Bit was set in the ACK */
64 #endif
65 };
66
67 struct net_pkt;
68 static inline void *net_pkt_cb(struct net_pkt *pkt);
69
net_pkt_cb_ieee802154(struct net_pkt * pkt)70 static inline struct net_pkt_cb_ieee802154 *net_pkt_cb_ieee802154(struct net_pkt *pkt)
71 {
72 return net_pkt_cb(pkt);
73 };
74
net_pkt_ieee802154_lqi(struct net_pkt * pkt)75 static inline uint8_t net_pkt_ieee802154_lqi(struct net_pkt *pkt)
76 {
77 return net_pkt_cb_ieee802154(pkt)->lqi;
78 }
79
net_pkt_set_ieee802154_lqi(struct net_pkt * pkt,uint8_t lqi)80 static inline void net_pkt_set_ieee802154_lqi(struct net_pkt *pkt, uint8_t lqi)
81 {
82 net_pkt_cb_ieee802154(pkt)->lqi = lqi;
83 }
84
net_pkt_ieee802154_rssi(struct net_pkt * pkt)85 static inline uint8_t net_pkt_ieee802154_rssi(struct net_pkt *pkt)
86 {
87 return net_pkt_cb_ieee802154(pkt)->rssi;
88 }
89
net_pkt_set_ieee802154_rssi(struct net_pkt * pkt,uint8_t rssi)90 static inline void net_pkt_set_ieee802154_rssi(struct net_pkt *pkt, uint8_t rssi)
91 {
92 net_pkt_cb_ieee802154(pkt)->rssi = rssi;
93 }
94
95 #if defined(CONFIG_IEEE802154_SELECTIVE_TXPOWER)
net_pkt_ieee802154_txpwr(struct net_pkt * pkt)96 static inline int8_t net_pkt_ieee802154_txpwr(struct net_pkt *pkt)
97 {
98 return net_pkt_cb_ieee802154(pkt)->txpwr;
99 }
100
net_pkt_set_ieee802154_txpwr(struct net_pkt * pkt,int8_t txpwr)101 static inline void net_pkt_set_ieee802154_txpwr(struct net_pkt *pkt, int8_t txpwr)
102 {
103 net_pkt_cb_ieee802154(pkt)->txpwr = txpwr;
104 }
105 #endif /* CONFIG_IEEE802154_SELECTIVE_TXPOWER */
106
net_pkt_ieee802154_arb(struct net_pkt * pkt)107 static inline bool net_pkt_ieee802154_arb(struct net_pkt *pkt)
108 {
109 return net_pkt_cb_ieee802154(pkt)->arb;
110 }
111
net_pkt_set_ieee802154_arb(struct net_pkt * pkt,bool arb)112 static inline void net_pkt_set_ieee802154_arb(struct net_pkt *pkt, bool arb)
113 {
114 net_pkt_cb_ieee802154(pkt)->arb = arb;
115 }
116
net_pkt_ieee802154_ack_fpb(struct net_pkt * pkt)117 static inline bool net_pkt_ieee802154_ack_fpb(struct net_pkt *pkt)
118 {
119 return net_pkt_cb_ieee802154(pkt)->ack_fpb;
120 }
121
net_pkt_set_ieee802154_ack_fpb(struct net_pkt * pkt,bool fpb)122 static inline void net_pkt_set_ieee802154_ack_fpb(struct net_pkt *pkt, bool fpb)
123 {
124 net_pkt_cb_ieee802154(pkt)->ack_fpb = fpb;
125 }
126
net_pkt_ieee802154_frame_secured(struct net_pkt * pkt)127 static inline bool net_pkt_ieee802154_frame_secured(struct net_pkt *pkt)
128 {
129 return net_pkt_cb_ieee802154(pkt)->frame_secured;
130 }
131
net_pkt_set_ieee802154_frame_secured(struct net_pkt * pkt,bool secured)132 static inline void net_pkt_set_ieee802154_frame_secured(struct net_pkt *pkt, bool secured)
133 {
134 net_pkt_cb_ieee802154(pkt)->frame_secured = secured;
135 }
136
net_pkt_ieee802154_mac_hdr_rdy(struct net_pkt * pkt)137 static inline bool net_pkt_ieee802154_mac_hdr_rdy(struct net_pkt *pkt)
138 {
139 return net_pkt_cb_ieee802154(pkt)->mac_hdr_rdy;
140 }
141
net_pkt_set_ieee802154_mac_hdr_rdy(struct net_pkt * pkt,bool rdy)142 static inline void net_pkt_set_ieee802154_mac_hdr_rdy(struct net_pkt *pkt, bool rdy)
143 {
144 net_pkt_cb_ieee802154(pkt)->mac_hdr_rdy = rdy;
145 }
146
147 #if defined(CONFIG_NET_L2_OPENTHREAD)
net_pkt_ieee802154_ack_fc(struct net_pkt * pkt)148 static inline uint32_t net_pkt_ieee802154_ack_fc(struct net_pkt *pkt)
149 {
150 return net_pkt_cb_ieee802154(pkt)->ack_fc;
151 }
152
net_pkt_set_ieee802154_ack_fc(struct net_pkt * pkt,uint32_t fc)153 static inline void net_pkt_set_ieee802154_ack_fc(struct net_pkt *pkt, uint32_t fc)
154 {
155 net_pkt_cb_ieee802154(pkt)->ack_fc = fc;
156 }
157
net_pkt_ieee802154_ack_keyid(struct net_pkt * pkt)158 static inline uint8_t net_pkt_ieee802154_ack_keyid(struct net_pkt *pkt)
159 {
160 return net_pkt_cb_ieee802154(pkt)->ack_keyid;
161 }
162
net_pkt_set_ieee802154_ack_keyid(struct net_pkt * pkt,uint8_t keyid)163 static inline void net_pkt_set_ieee802154_ack_keyid(struct net_pkt *pkt, uint8_t keyid)
164 {
165 net_pkt_cb_ieee802154(pkt)->ack_keyid = keyid;
166 }
167
net_pkt_ieee802154_fv2015(struct net_pkt * pkt)168 static inline bool net_pkt_ieee802154_fv2015(struct net_pkt *pkt)
169 {
170 return net_pkt_cb_ieee802154(pkt)->fv2015;
171 }
172
net_pkt_set_ieee802154_fv2015(struct net_pkt * pkt,bool fv2015)173 static inline void net_pkt_set_ieee802154_fv2015(struct net_pkt *pkt, bool fv2015)
174 {
175 net_pkt_cb_ieee802154(pkt)->fv2015 = fv2015;
176 }
177
net_pkt_ieee802154_ack_seb(struct net_pkt * pkt)178 static inline bool net_pkt_ieee802154_ack_seb(struct net_pkt *pkt)
179 {
180 return net_pkt_cb_ieee802154(pkt)->ack_seb;
181 }
182
net_pkt_set_ieee802154_ack_seb(struct net_pkt * pkt,bool seb)183 static inline void net_pkt_set_ieee802154_ack_seb(struct net_pkt *pkt, bool seb)
184 {
185 net_pkt_cb_ieee802154(pkt)->ack_seb = seb;
186 }
187 #endif /* CONFIG_NET_L2_OPENTHREAD */
188
189 /** @endcond */
190
191 #ifdef __cplusplus
192 }
193 #endif
194
195 #endif /* ZEPHYR_INCLUDE_NET_IEEE802154_PKT_H_ */
196