16#ifndef ZEPHYR_INCLUDE_NET_NET_PKT_H_
17#define ZEPHYR_INCLUDE_NET_NET_PKT_H_
24#if defined(CONFIG_IEEE802154)
53#if defined(CONFIG_NET_PKT_ALLOC_STATS)
54struct net_pkt_alloc_stats {
60struct net_pkt_alloc_stats_slab {
61 struct net_pkt_alloc_stats ok;
62 struct net_pkt_alloc_stats fail;
63 struct k_mem_slab *slab;
66#define NET_PKT_ALLOC_STATS_DEFINE(alloc_name, slab_name) \
67 STRUCT_SECTION_ITERABLE(net_pkt_alloc_stats_slab, alloc_name) = { \
72#define NET_PKT_ALLOC_STATS_DEFINE(name, slab)
76struct net_pkt_cursor {
118#if defined(CONFIG_NET_TCP)
122#if defined(CONFIG_NET_ROUTING) || defined(CONFIG_NET_ETHERNET_BRIDGE)
123 struct net_if *orig_iface;
126#if defined(CONFIG_NET_PKT_TIMESTAMP) || defined(CONFIG_NET_PKT_TXTIME)
148#if defined(CONFIG_NET_PKT_RXTIME_STATS) || defined(CONFIG_NET_PKT_TXTIME_STATS) || \
149 defined(CONFIG_TRACING_NET_CORE)
154#if defined(CONFIG_NET_PKT_TXTIME_STATS_DETAIL) || \
155 defined(CONFIG_NET_PKT_RXTIME_STATS_DETAIL)
170#if defined(CONFIG_NET_PKT_ALLOC_STATS)
171 struct net_pkt_alloc_stats_slab *alloc_stats;
182#if defined(CONFIG_NET_IP)
199#if defined(CONFIG_NET_IPV4_ACD)
206#if defined(CONFIG_NET_LLDP)
227#if defined(CONFIG_NET_IP_FRAGMENT)
230#if defined(CONFIG_NET_PKT_TIMESTAMP)
236#if defined(CONFIG_NET_IP)
241#if defined(CONFIG_NET_IPV6)
244#if defined(CONFIG_NET_IPV4)
250#if defined(CONFIG_NET_IPV4)
253#if defined(CONFIG_NET_IPV6)
258#if defined(CONFIG_NET_IP_FRAGMENT)
260#if defined(CONFIG_NET_IPV4_FRAGMENT)
266#if defined(CONFIG_NET_IPV6_FRAGMENT)
276#if defined(CONFIG_NET_IPV6)
288#if defined(CONFIG_NET_IP_DSCP_ECN)
297#if defined(CONFIG_NET_VLAN)
306#if defined(NET_PKT_HAS_CONTROL_BLOCK)
311#if defined(CONFIG_IEEE802154)
315 struct net_pkt_cb_ieee802154 cb;
324#if defined(CONFIG_NET_OFFLOAD) || defined(CONFIG_NET_L2_IPIP)
336 struct sockaddr_storage remote_storage;
340#if defined(CONFIG_NET_CAPTURE_COOKED_MODE)
345#if defined(CONFIG_NET_IPV4_PMTU)
366static inline void net_pkt_set_context(
struct net_pkt *pkt,
372static inline struct net_if *net_pkt_iface(
struct net_pkt *pkt)
377static inline void net_pkt_set_iface(
struct net_pkt *pkt,
struct net_if *iface)
388 pkt->lladdr_src.type = type;
389 pkt->lladdr_dst.type = type;
393static inline struct net_if *net_pkt_orig_iface(
struct net_pkt *pkt)
395#if defined(CONFIG_NET_ROUTING) || defined(CONFIG_NET_ETHERNET_BRIDGE)
396 return pkt->orig_iface;
402static inline void net_pkt_set_orig_iface(
struct net_pkt *pkt,
405#if defined(CONFIG_NET_ROUTING) || defined(CONFIG_NET_ETHERNET_BRIDGE)
406 pkt->orig_iface = iface;
418static inline void net_pkt_set_family(
struct net_pkt *pkt,
uint8_t family)
420 pkt->family = family;
423static inline bool net_pkt_is_ptp(
struct net_pkt *pkt)
425 return !!(pkt->ptp_pkt);
428static inline void net_pkt_set_ptp(
struct net_pkt *pkt,
bool is_ptp)
430 pkt->ptp_pkt = is_ptp;
433static inline bool net_pkt_is_tx_timestamping(
struct net_pkt *pkt)
435#if defined(CONFIG_NET_PKT_TIMESTAMP)
436 return !!(pkt->tx_timestamping);
444static inline void net_pkt_set_tx_timestamping(
struct net_pkt *pkt,
bool is_timestamping)
446#if defined(CONFIG_NET_PKT_TIMESTAMP)
447 pkt->tx_timestamping = is_timestamping;
450 ARG_UNUSED(is_timestamping);
454static inline bool net_pkt_is_rx_timestamping(
struct net_pkt *pkt)
456#if defined(CONFIG_NET_PKT_TIMESTAMP)
457 return !!(pkt->rx_timestamping);
465static inline void net_pkt_set_rx_timestamping(
struct net_pkt *pkt,
bool is_timestamping)
467#if defined(CONFIG_NET_PKT_TIMESTAMP)
468 pkt->rx_timestamping = is_timestamping;
471 ARG_UNUSED(is_timestamping);
475static inline bool net_pkt_is_captured(
struct net_pkt *pkt)
477 return !!(pkt->captured);
480static inline void net_pkt_set_captured(
struct net_pkt *pkt,
bool is_captured)
482 pkt->captured = is_captured;
485static inline bool net_pkt_is_l2_bridged(
struct net_pkt *pkt)
487 return IS_ENABLED(CONFIG_NET_ETHERNET_BRIDGE) ? !!(pkt->l2_bridged) : 0;
490static inline void net_pkt_set_l2_bridged(
struct net_pkt *pkt,
bool is_l2_bridged)
493 pkt->l2_bridged = is_l2_bridged;
497static inline bool net_pkt_is_l2_processed(
struct net_pkt *pkt)
499 return !!(pkt->l2_processed);
502static inline void net_pkt_set_l2_processed(
struct net_pkt *pkt,
503 bool is_l2_processed)
505 pkt->l2_processed = is_l2_processed;
508static inline bool net_pkt_is_chksum_done(
struct net_pkt *pkt)
510 return !!(pkt->chksum_done);
513static inline void net_pkt_set_chksum_done(
struct net_pkt *pkt,
516 pkt->chksum_done = is_chksum_done;
521#if defined(CONFIG_NET_IP)
522 return pkt->ip_hdr_len;
530static inline void net_pkt_set_ip_hdr_len(
struct net_pkt *pkt,
uint8_t len)
532#if defined(CONFIG_NET_IP)
533 pkt->ip_hdr_len = len;
542#if defined(CONFIG_NET_IP_DSCP_ECN)
551static inline void net_pkt_set_ip_dscp(
struct net_pkt *pkt,
uint8_t dscp)
553#if defined(CONFIG_NET_IP_DSCP_ECN)
563#if defined(CONFIG_NET_IP_DSCP_ECN)
572static inline void net_pkt_set_ip_ecn(
struct net_pkt *pkt,
uint8_t ecn)
574#if defined(CONFIG_NET_IP_DSCP_ECN)
587static inline void net_pkt_set_eof(
struct net_pkt *pkt,
bool eof)
592static inline bool net_pkt_forwarding(
struct net_pkt *pkt)
594 return !!(pkt->forwarding);
597static inline void net_pkt_set_forwarding(
struct net_pkt *pkt,
bool forward)
599 pkt->forwarding = forward;
602#if defined(CONFIG_NET_IPV4)
605 return pkt->ipv4_ttl;
608static inline void net_pkt_set_ipv4_ttl(
struct net_pkt *pkt,
616 return pkt->ipv4_opts_len;
619static inline void net_pkt_set_ipv4_opts_len(
struct net_pkt *pkt,
622 pkt->ipv4_opts_len = opts_len;
632static inline void net_pkt_set_ipv4_ttl(
struct net_pkt *pkt,
645static inline void net_pkt_set_ipv4_opts_len(
struct net_pkt *pkt,
649 ARG_UNUSED(opts_len);
653#if defined(CONFIG_NET_IPV6)
654static inline uint8_t net_pkt_ipv6_ext_opt_len(
struct net_pkt *pkt)
656 return pkt->ipv6_ext_opt_len;
659static inline void net_pkt_set_ipv6_ext_opt_len(
struct net_pkt *pkt,
662 pkt->ipv6_ext_opt_len = len;
667 return pkt->ipv6_next_hdr;
670static inline void net_pkt_set_ipv6_next_hdr(
struct net_pkt *pkt,
673 pkt->ipv6_next_hdr = next_hdr;
678 return pkt->ipv6_ext_len;
681static inline void net_pkt_set_ipv6_ext_len(
struct net_pkt *pkt,
uint16_t len)
683 pkt->ipv6_ext_len = len;
688 return pkt->ipv6_prev_hdr_start;
691static inline void net_pkt_set_ipv6_hdr_prev(
struct net_pkt *pkt,
694 pkt->ipv6_prev_hdr_start = offset;
699 return pkt->ipv6_hop_limit;
702static inline void net_pkt_set_ipv6_hop_limit(
struct net_pkt *pkt,
705 pkt->ipv6_hop_limit = hop_limit;
708static inline uint8_t net_pkt_ipv6_ext_opt_len(
struct net_pkt *pkt)
715static inline void net_pkt_set_ipv6_ext_opt_len(
struct net_pkt *pkt,
729static inline void net_pkt_set_ipv6_next_hdr(
struct net_pkt *pkt,
733 ARG_UNUSED(next_hdr);
743static inline void net_pkt_set_ipv6_ext_len(
struct net_pkt *pkt,
uint16_t len)
756static inline void net_pkt_set_ipv6_hdr_prev(
struct net_pkt *pkt,
770static inline void net_pkt_set_ipv6_hop_limit(
struct net_pkt *pkt,
774 ARG_UNUSED(hop_limit);
780#if defined(CONFIG_NET_IPV6)
781 return pkt->ipv6_ext_len;
782#elif defined(CONFIG_NET_IPV4)
783 return pkt->ipv4_opts_len;
791#if defined(CONFIG_NET_IPV4_PMTU)
792static inline bool net_pkt_ipv4_pmtu(
struct net_pkt *pkt)
794 return !!pkt->ipv4_pmtu;
797static inline void net_pkt_set_ipv4_pmtu(
struct net_pkt *pkt,
bool value)
799 pkt->ipv4_pmtu = value;
802static inline bool net_pkt_ipv4_pmtu(
struct net_pkt *pkt)
809static inline void net_pkt_set_ipv4_pmtu(
struct net_pkt *pkt,
bool value)
816#if defined(CONFIG_NET_IPV4_FRAGMENT)
817static inline uint16_t net_pkt_ipv4_fragment_offset(
struct net_pkt *pkt)
819 return (pkt->ipv4_fragment.flags & NET_IPV4_FRAGH_OFFSET_MASK) * 8;
822static inline bool net_pkt_ipv4_fragment_more(
struct net_pkt *pkt)
824 return (pkt->ipv4_fragment.flags & NET_IPV4_MORE_FRAG_MASK) != 0;
829 pkt->ipv4_fragment.flags =
flags;
834 return pkt->ipv4_fragment.id;
837static inline void net_pkt_set_ipv4_fragment_id(
struct net_pkt *pkt,
uint32_t id)
839 pkt->ipv4_fragment.id = id;
842static inline uint16_t net_pkt_ipv4_fragment_offset(
struct net_pkt *pkt)
849static inline bool net_pkt_ipv4_fragment_more(
struct net_pkt *pkt)
869static inline void net_pkt_set_ipv4_fragment_id(
struct net_pkt *pkt,
uint32_t id)
876#if defined(CONFIG_NET_IPV6_FRAGMENT)
879 return pkt->ipv6_fragment.hdr_start;
882static inline void net_pkt_set_ipv6_fragment_start(
struct net_pkt *pkt,
885 pkt->ipv6_fragment.hdr_start = start;
888static inline uint16_t net_pkt_ipv6_fragment_offset(
struct net_pkt *pkt)
890 return pkt->ipv6_fragment.flags & NET_IPV6_FRAGH_OFFSET_MASK;
892static inline bool net_pkt_ipv6_fragment_more(
struct net_pkt *pkt)
894 return (pkt->ipv6_fragment.flags & 0x01) != 0;
897static inline void net_pkt_set_ipv6_fragment_flags(
struct net_pkt *pkt,
900 pkt->ipv6_fragment.flags =
flags;
905 return pkt->ipv6_fragment.id;
908static inline void net_pkt_set_ipv6_fragment_id(
struct net_pkt *pkt,
911 pkt->ipv6_fragment.id = id;
921static inline void net_pkt_set_ipv6_fragment_start(
struct net_pkt *pkt,
928static inline uint16_t net_pkt_ipv6_fragment_offset(
struct net_pkt *pkt)
935static inline bool net_pkt_ipv6_fragment_more(
struct net_pkt *pkt)
942static inline void net_pkt_set_ipv6_fragment_flags(
struct net_pkt *pkt,
956static inline void net_pkt_set_ipv6_fragment_id(
struct net_pkt *pkt,
964#if defined(CONFIG_NET_IP_FRAGMENT)
965static inline bool net_pkt_is_ip_reassembled(
struct net_pkt *pkt)
967 return !!(pkt->ip_reassembled);
970static inline void net_pkt_set_ip_reassembled(
struct net_pkt *pkt,
973 pkt->ip_reassembled = reassembled;
976static inline bool net_pkt_is_ip_reassembled(
struct net_pkt *pkt)
983static inline void net_pkt_set_ip_reassembled(
struct net_pkt *pkt,
987 ARG_UNUSED(reassembled);
993 return pkt->priority;
996static inline void net_pkt_set_priority(
struct net_pkt *pkt,
999 pkt->priority = priority;
1002#if defined(CONFIG_NET_CAPTURE_COOKED_MODE)
1003static inline bool net_pkt_is_cooked_mode(
struct net_pkt *pkt)
1005 return pkt->cooked_mode_pkt;
1008static inline void net_pkt_set_cooked_mode(
struct net_pkt *pkt,
bool value)
1010 pkt->cooked_mode_pkt = value;
1013static inline bool net_pkt_is_cooked_mode(
struct net_pkt *pkt)
1020static inline void net_pkt_set_cooked_mode(
struct net_pkt *pkt,
bool value)
1027#if defined(CONFIG_NET_VLAN)
1033static inline void net_pkt_set_vlan_tag(
struct net_pkt *pkt,
uint16_t tag)
1043static inline void net_pkt_set_vlan_priority(
struct net_pkt *pkt,
1049static inline bool net_pkt_vlan_dei(
struct net_pkt *pkt)
1054static inline void net_pkt_set_vlan_dei(
struct net_pkt *pkt,
bool dei)
1059static inline void net_pkt_set_vlan_tci(
struct net_pkt *pkt,
uint16_t tci)
1061 pkt->vlan_tci = tci;
1066 return pkt->vlan_tci;
1076static inline void net_pkt_set_vlan_tag(
struct net_pkt *pkt,
uint16_t tag)
1089static inline bool net_pkt_vlan_dei(
struct net_pkt *pkt)
1096static inline void net_pkt_set_vlan_dei(
struct net_pkt *pkt,
bool dei)
1109static inline void net_pkt_set_vlan_tci(
struct net_pkt *pkt,
uint16_t tci)
1116#if defined(CONFIG_NET_PKT_TIMESTAMP) || defined(CONFIG_NET_PKT_TXTIME)
1119 return &pkt->timestamp;
1122static inline void net_pkt_set_timestamp(
struct net_pkt *pkt,
1125 pkt->timestamp.second = timestamp->
second;
1126 pkt->timestamp.nanosecond = timestamp->
nanosecond;
1134static inline void net_pkt_set_timestamp_ns(
struct net_pkt *pkt,
net_time_t timestamp)
1146static inline void net_pkt_set_timestamp(
struct net_pkt *pkt,
1150 ARG_UNUSED(timestamp);
1160static inline void net_pkt_set_timestamp_ns(
struct net_pkt *pkt,
net_time_t timestamp)
1163 ARG_UNUSED(timestamp);
1167#if defined(CONFIG_NET_PKT_RXTIME_STATS) || defined(CONFIG_NET_PKT_TXTIME_STATS) || \
1168 defined(CONFIG_TRACING_NET_CORE)
1172 return pkt->create_time;
1175static inline void net_pkt_set_create_time(
struct net_pkt *pkt,
1178 pkt->create_time = create_time;
1188static inline void net_pkt_set_create_time(
struct net_pkt *pkt,
1192 ARG_UNUSED(create_time);
1198#if defined(CONFIG_NET_PKT_TXTIME_STATS_DETAIL) || \
1199 defined(CONFIG_NET_PKT_RXTIME_STATS_DETAIL)
1202 return pkt->detail.stat;
1205static inline int net_pkt_stats_tick_count(
struct net_pkt *pkt)
1207 return pkt->detail.count;
1210static inline void net_pkt_stats_tick_reset(
struct net_pkt *pkt)
1212 memset(&pkt->detail, 0,
sizeof(pkt->detail));
1218 if (pkt->detail.count >= NET_PKT_DETAIL_STATS_COUNT) {
1219 NET_ERR(
"Detail stats count overflow (%d >= %d)",
1220 pkt->detail.count, NET_PKT_DETAIL_STATS_COUNT);
1224 pkt->detail.stat[pkt->detail.count++] = tick;
1227#define net_pkt_set_tx_stats_tick(pkt, tick) net_pkt_set_stats_tick(pkt, tick)
1228#define net_pkt_set_rx_stats_tick(pkt, tick) net_pkt_set_stats_tick(pkt, tick)
1237static inline int net_pkt_stats_tick_count(
struct net_pkt *pkt)
1244static inline void net_pkt_stats_tick_reset(
struct net_pkt *pkt)
1249static inline void net_pkt_set_stats_tick(
struct net_pkt *pkt,
uint32_t tick)
1255#define net_pkt_set_tx_stats_tick(pkt, tick)
1256#define net_pkt_set_rx_stats_tick(pkt, tick)
1260static inline size_t net_pkt_get_len(
struct net_pkt *pkt)
1275static inline bool net_pkt_is_empty(
struct net_pkt *pkt)
1282 return &pkt->lladdr_src;
1287 return &pkt->lladdr_dst;
1290static inline void net_pkt_lladdr_swap(
struct net_pkt *pkt)
1294 net_pkt_lladdr_src(pkt)->addr = net_pkt_lladdr_dst(pkt)->addr;
1295 net_pkt_lladdr_dst(pkt)->addr =
addr;
1298static inline void net_pkt_lladdr_clear(
struct net_pkt *pkt)
1300 net_pkt_lladdr_src(pkt)->addr = NULL;
1301 net_pkt_lladdr_src(pkt)->len = 0U;
1306 return pkt->ll_proto_type;
1311 pkt->ll_proto_type =
type;
1314#if defined(CONFIG_NET_IPV4_ACD)
1315static inline bool net_pkt_ipv4_acd(
struct net_pkt *pkt)
1317 return !!(pkt->ipv4_acd_arp_msg);
1320static inline void net_pkt_set_ipv4_acd(
struct net_pkt *pkt,
1321 bool is_acd_arp_msg)
1323 pkt->ipv4_acd_arp_msg = is_acd_arp_msg;
1326static inline bool net_pkt_ipv4_acd(
struct net_pkt *pkt)
1333static inline void net_pkt_set_ipv4_acd(
struct net_pkt *pkt,
1334 bool is_acd_arp_msg)
1337 ARG_UNUSED(is_acd_arp_msg);
1341#if defined(CONFIG_NET_LLDP)
1342static inline bool net_pkt_is_lldp(
struct net_pkt *pkt)
1344 return !!(pkt->lldp_pkt);
1347static inline void net_pkt_set_lldp(
struct net_pkt *pkt,
bool is_lldp)
1349 pkt->lldp_pkt = is_lldp;
1352static inline bool net_pkt_is_lldp(
struct net_pkt *pkt)
1359static inline void net_pkt_set_lldp(
struct net_pkt *pkt,
bool is_lldp)
1362 ARG_UNUSED(is_lldp);
1366#if defined(CONFIG_NET_L2_PPP)
1367static inline bool net_pkt_is_ppp(
struct net_pkt *pkt)
1369 return !!(pkt->ppp_msg);
1372static inline void net_pkt_set_ppp(
struct net_pkt *pkt,
1375 pkt->ppp_msg = is_ppp_msg;
1378static inline bool net_pkt_is_ppp(
struct net_pkt *pkt)
1385static inline void net_pkt_set_ppp(
struct net_pkt *pkt,
1389 ARG_UNUSED(is_ppp_msg);
1393#if defined(NET_PKT_HAS_CONTROL_BLOCK)
1394static inline void *net_pkt_cb(
struct net_pkt *pkt)
1399static inline void *net_pkt_cb(
struct net_pkt *pkt)
1407#define NET_IPV6_HDR(pkt) ((struct net_ipv6_hdr *)net_pkt_ip_data(pkt))
1408#define NET_IPV4_HDR(pkt) ((struct net_ipv4_hdr *)net_pkt_ip_data(pkt))
1410static inline void net_pkt_set_src_ipv6_addr(
struct net_pkt *pkt)
1413 net_pkt_context(pkt)),
1414 (
struct in6_addr *)NET_IPV6_HDR(pkt)->src);
1417static inline void net_pkt_set_overwrite(
struct net_pkt *pkt,
bool overwrite)
1419 pkt->overwrite = overwrite;
1422static inline bool net_pkt_is_being_overwritten(
struct net_pkt *pkt)
1424 return !!(pkt->overwrite);
1427#ifdef CONFIG_NET_PKT_FILTER
1429bool net_pkt_filter_send_ok(
struct net_pkt *pkt);
1430bool net_pkt_filter_recv_ok(
struct net_pkt *pkt);
1434static inline bool net_pkt_filter_send_ok(
struct net_pkt *pkt)
1441static inline bool net_pkt_filter_recv_ok(
struct net_pkt *pkt)
1450#if defined(CONFIG_NET_PKT_FILTER) && \
1451 (defined(CONFIG_NET_PKT_FILTER_IPV4_HOOK) || defined(CONFIG_NET_PKT_FILTER_IPV6_HOOK))
1453bool net_pkt_filter_ip_recv_ok(
struct net_pkt *pkt);
1457static inline bool net_pkt_filter_ip_recv_ok(
struct net_pkt *pkt)
1466#if defined(CONFIG_NET_PKT_FILTER) && defined(CONFIG_NET_PKT_FILTER_LOCAL_IN_HOOK)
1468bool net_pkt_filter_local_in_recv_ok(
struct net_pkt *pkt);
1472static inline bool net_pkt_filter_local_in_recv_ok(
struct net_pkt *pkt)
1481#if defined(CONFIG_NET_OFFLOAD) || defined(CONFIG_NET_L2_IPIP)
1482static inline struct sockaddr *net_pkt_remote_address(
struct net_pkt *pkt)
1484 return &pkt->remote;
1487static inline void net_pkt_set_remote_address(
struct net_pkt *pkt,
1491 memcpy(&pkt->remote, address, len);
1510#define NET_PKT_SLAB_DEFINE(name, count) \
1511 K_MEM_SLAB_DEFINE(name, sizeof(struct net_pkt), count, 4); \
1512 NET_PKT_ALLOC_STATS_DEFINE(pkt_alloc_stats_##name, name)
1517#define NET_PKT_TX_SLAB_DEFINE(name, count) NET_PKT_SLAB_DEFINE(name, count)
1534#define NET_PKT_DATA_POOL_DEFINE(name, count) \
1535 NET_BUF_POOL_DEFINE(name, count, CONFIG_NET_BUF_DATA_SIZE, \
1540#if defined(CONFIG_NET_DEBUG_NET_PKT_ALLOC) || \
1541 (CONFIG_NET_PKT_LOG_LEVEL >= LOG_LEVEL_DBG)
1542#define NET_PKT_DEBUG_ENABLED
1545#if defined(NET_PKT_DEBUG_ENABLED)
1557#define net_pkt_get_reserve_data(pool, min_len, timeout) \
1558 net_pkt_get_reserve_data_debug(pool, min_len, timeout, __func__, __LINE__)
1560struct net_buf *net_pkt_get_reserve_rx_data_debug(
size_t min_len,
1564#define net_pkt_get_reserve_rx_data(min_len, timeout) \
1565 net_pkt_get_reserve_rx_data_debug(min_len, timeout, __func__, __LINE__)
1567struct net_buf *net_pkt_get_reserve_tx_data_debug(
size_t min_len,
1571#define net_pkt_get_reserve_tx_data(min_len, timeout) \
1572 net_pkt_get_reserve_tx_data_debug(min_len, timeout, __func__, __LINE__)
1574struct net_buf *net_pkt_get_frag_debug(
struct net_pkt *pkt,
size_t min_len,
1576 const char *caller,
int line);
1577#define net_pkt_get_frag(pkt, min_len, timeout) \
1578 net_pkt_get_frag_debug(pkt, min_len, timeout, __func__, __LINE__)
1580void net_pkt_unref_debug(
struct net_pkt *pkt,
const char *caller,
int line);
1581#define net_pkt_unref(pkt) net_pkt_unref_debug(pkt, __func__, __LINE__)
1583struct net_pkt *net_pkt_ref_debug(
struct net_pkt *pkt,
const char *caller,
1585#define net_pkt_ref(pkt) net_pkt_ref_debug(pkt, __func__, __LINE__)
1588 const char *caller,
int line);
1589#define net_pkt_frag_ref(frag) net_pkt_frag_ref_debug(frag, __func__, __LINE__)
1591void net_pkt_frag_unref_debug(
struct net_buf *frag,
1592 const char *caller,
int line);
1593#define net_pkt_frag_unref(frag) \
1594 net_pkt_frag_unref_debug(frag, __func__, __LINE__)
1599 const char *caller,
int line);
1600#define net_pkt_frag_del(pkt, parent, frag) \
1601 net_pkt_frag_del_debug(pkt, parent, frag, __func__, __LINE__)
1603void net_pkt_frag_add_debug(
struct net_pkt *pkt,
struct net_buf *frag,
1604 const char *caller,
int line);
1605#define net_pkt_frag_add(pkt, frag) \
1606 net_pkt_frag_add_debug(pkt, frag, __func__, __LINE__)
1608void net_pkt_frag_insert_debug(
struct net_pkt *pkt,
struct net_buf *frag,
1609 const char *caller,
int line);
1610#define net_pkt_frag_insert(pkt, frag) \
1611 net_pkt_frag_insert_debug(pkt, frag, __func__, __LINE__)
1617#if defined(NET_PKT_DEBUG_ENABLED)
1627#define net_pkt_print_frags(pkt)
1630#if !defined(NET_PKT_DEBUG_ENABLED)
1649#if !defined(NET_PKT_DEBUG_ENABLED)
1667#if !defined(NET_PKT_DEBUG_ENABLED)
1685#if !defined(NET_PKT_DEBUG_ENABLED)
1702#if !defined(NET_PKT_DEBUG_ENABLED)
1715#if !defined(NET_PKT_DEBUG_ENABLED)
1728#if !defined(NET_PKT_DEBUG_ENABLED)
1741#if !defined(NET_PKT_DEBUG_ENABLED)
1750#if !defined(NET_PKT_DEBUG_ENABLED)
1766#if !defined(NET_PKT_DEBUG_ENABLED)
1776#if !defined(NET_PKT_DEBUG_ENABLED)
1803 struct k_mem_slab **tx,
1809#if defined(CONFIG_NET_DEBUG_NET_PKT_ALLOC)
1813void net_pkt_print(
void);
1815typedef void (*net_pkt_allocs_cb_t)(
struct net_pkt *pkt,
1817 const char *func_alloc,
1819 const char *func_free,
1824void net_pkt_allocs_foreach(net_pkt_allocs_cb_t cb,
void *
user_data);
1826const char *net_pkt_slab2str(
struct k_mem_slab *slab);
1827const char *net_pkt_pool2str(
struct net_buf_pool *pool);
1830#define net_pkt_print(...)
1836#if defined(NET_PKT_DEBUG_ENABLED)
1839 const char *caller,
int line);
1840#define net_pkt_alloc(_timeout) \
1841 net_pkt_alloc_debug(_timeout, __func__, __LINE__)
1843struct net_pkt *net_pkt_alloc_from_slab_debug(
struct k_mem_slab *
slab,
1845 const char *caller,
int line);
1846#define net_pkt_alloc_from_slab(_slab, _timeout) \
1847 net_pkt_alloc_from_slab_debug(_slab, _timeout, __func__, __LINE__)
1850 const char *caller,
int line);
1851#define net_pkt_rx_alloc(_timeout) \
1852 net_pkt_rx_alloc_debug(_timeout, __func__, __LINE__)
1858#define net_pkt_alloc_on_iface(_iface, _timeout) \
1859 net_pkt_alloc_on_iface_debug(_iface, _timeout, __func__, __LINE__)
1865#define net_pkt_rx_alloc_on_iface(_iface, _timeout) \
1866 net_pkt_rx_alloc_on_iface_debug(_iface, _timeout, \
1869int net_pkt_alloc_buffer_debug(
struct net_pkt *pkt,
1873 const char *caller,
int line);
1874#define net_pkt_alloc_buffer(_pkt, _size, _proto, _timeout) \
1875 net_pkt_alloc_buffer_debug(_pkt, _size, _proto, _timeout, \
1878int net_pkt_alloc_buffer_raw_debug(
struct net_pkt *pkt,
size_t size,
1880 const char *caller,
int line);
1881#define net_pkt_alloc_buffer_raw(_pkt, _size, _timeout) \
1882 net_pkt_alloc_buffer_raw_debug(_pkt, _size, _timeout, \
1892#define net_pkt_alloc_with_buffer(_iface, _size, _family, \
1894 net_pkt_alloc_with_buffer_debug(_iface, _size, _family, \
1905#define net_pkt_rx_alloc_with_buffer(_iface, _size, _family, \
1907 net_pkt_rx_alloc_with_buffer_debug(_iface, _size, _family, \
1913#if !defined(NET_PKT_DEBUG_ENABLED)
1927#if !defined(NET_PKT_DEBUG_ENABLED)
1946#if !defined(NET_PKT_DEBUG_ENABLED)
1960#if !defined(NET_PKT_DEBUG_ENABLED)
1981#if !defined(NET_PKT_DEBUG_ENABLED)
2003#if !defined(NET_PKT_DEBUG_ENABLED)
2021#if !defined(NET_PKT_DEBUG_ENABLED)
2132 struct net_pkt_cursor *backup)
2134 backup->buf = pkt->
cursor.buf;
2135 backup->pos = pkt->
cursor.pos;
2145 struct net_pkt_cursor *backup)
2147 pkt->
cursor.buf = backup->buf;
2148 pkt->
cursor.pos = backup->pos;
2505struct net_pkt_data_access {
2506#if !defined(CONFIG_NET_HEADERS_ALWAYS_CONTIGUOUS)
2512#if defined(CONFIG_NET_HEADERS_ALWAYS_CONTIGUOUS)
2513#define NET_PKT_DATA_ACCESS_DEFINE(_name, _type) \
2514 struct net_pkt_data_access _name = { \
2515 .size = sizeof(_type), \
2518#define NET_PKT_DATA_ACCESS_CONTIGUOUS_DEFINE(_name, _type) \
2519 NET_PKT_DATA_ACCESS_DEFINE(_name, _type)
2522#define NET_PKT_DATA_ACCESS_DEFINE(_name, _type) \
2523 _type _hdr_##_name; \
2524 struct net_pkt_data_access _name = { \
2525 .data = &_hdr_##_name, \
2526 .size = sizeof(_type), \
2529#define NET_PKT_DATA_ACCESS_CONTIGUOUS_DEFINE(_name, _type) \
2530 struct net_pkt_data_access _name = { \
2532 .size = sizeof(_type), \
2553 struct net_pkt_data_access *access);
2569 struct net_pkt_data_access *access);
2576 struct net_pkt_data_access *access)
long atomic_t
Definition atomic_types.h:15
VLAN specific definitions.
unsigned short int sa_family_t
Socket address family type.
Definition net_ip.h:168
#define htons(x)
Convert 16-bit value from host to network byte order.
Definition net_ip.h:124
size_t socklen_t
Length of a socket address.
Definition net_ip.h:172
#define htonl(x)
Convert 32-bit value from host to network byte order.
Definition net_ip.h:132
net_ip_protocol
Protocol numbers from IANA/BSD.
Definition net_ip.h:64
static size_t net_buf_frags_len(const struct net_buf *buf)
Calculate amount of bytes stored in fragments.
Definition net_buf.h:2711
static struct net_if * net_context_get_iface(struct net_context *context)
Get network interface for this context.
Definition net_context.h:727
static struct net_linkaddr * net_if_get_link_addr(struct net_if *iface)
Get an network interface's link address.
Definition net_if.h:1088
static const struct in6_addr * net_if_ipv6_select_src_addr(struct net_if *iface, const struct in6_addr *dst)
Get a IPv6 source address that should be used when sending network data to destination.
Definition net_if.h:2055
void net_pkt_frag_add(struct net_pkt *pkt, struct net_buf *frag)
Add a fragment to a packet at the end of its fragment list.
static int net_pkt_write_be32(struct net_pkt *pkt, uint32_t data)
Write a uint32_t big endian data to a net_pkt.
Definition net_pkt.h:2388
void net_pkt_cursor_init(struct net_pkt *pkt)
Initialize net_pkt cursor.
int net_pkt_skip(struct net_pkt *pkt, size_t length)
Skip some data from a net_pkt.
struct net_pkt * net_pkt_shallow_clone(struct net_pkt *pkt, k_timeout_t timeout)
Clone pkt and increase the refcount of its buffer.
void net_pkt_append_buffer(struct net_pkt *pkt, struct net_buf *buffer)
Append a buffer in packet.
#define net_pkt_print_frags(pkt)
Definition net_pkt.h:1627
int net_pkt_update_length(struct net_pkt *pkt, size_t length)
Update the overall length of a packet.
int net_pkt_pull(struct net_pkt *pkt, size_t length)
Remove data from the packet at current location.
int net_pkt_copy(struct net_pkt *pkt_dst, struct net_pkt *pkt_src, size_t length)
Copy data from a packet into another one.
struct net_pkt * net_pkt_rx_alloc(k_timeout_t timeout)
Allocate an initialized net_pkt for RX.
struct net_pkt * net_pkt_ref(struct net_pkt *pkt)
Increase the packet ref count.
int net_pkt_read_be16(struct net_pkt *pkt, uint16_t *data)
Read uint16_t big endian data from a net_pkt.
int net_pkt_alloc_buffer_raw(struct net_pkt *pkt, size_t size, k_timeout_t timeout)
Allocate buffer for a net_pkt, of specified size, w/o any additional preconditions.
struct net_pkt * net_pkt_alloc_with_buffer(struct net_if *iface, size_t size, sa_family_t family, enum net_ip_protocol proto, k_timeout_t timeout)
Allocate a network packet and buffer at once.
void net_pkt_frag_unref(struct net_buf *frag)
Decrease the packet fragment ref count.
struct net_pkt * net_pkt_rx_clone(struct net_pkt *pkt, k_timeout_t timeout)
Clone pkt and its buffer.
struct net_buf * net_pkt_get_reserve_data(struct net_buf_pool *pool, size_t min_len, k_timeout_t timeout)
Get a data buffer from a given pool.
void net_pkt_trim_buffer(struct net_pkt *pkt)
Trim net_pkt buffer.
struct net_pkt * net_pkt_alloc_on_iface(struct net_if *iface, k_timeout_t timeout)
Allocate a network packet for a specific network interface.
void net_pkt_get_info(struct k_mem_slab **rx, struct k_mem_slab **tx, struct net_buf_pool **rx_data, struct net_buf_pool **tx_data)
Get information about predefined RX, TX and DATA pools.
void net_pkt_unref(struct net_pkt *pkt)
Place packet back into the available packets slab.
static int net_pkt_write_be16(struct net_pkt *pkt, uint16_t data)
Write a uint16_t big endian data to a net_pkt.
Definition net_pkt.h:2369
struct net_pkt * net_pkt_alloc(k_timeout_t timeout)
Allocate an initialized net_pkt.
int net_pkt_read(struct net_pkt *pkt, void *data, size_t length)
Read some data from a net_pkt.
struct net_buf * net_pkt_frag_del(struct net_pkt *pkt, struct net_buf *parent, struct net_buf *frag)
Delete existing fragment from a packet.
int net_pkt_set_data(struct net_pkt *pkt, struct net_pkt_data_access *access)
Set contiguous data into a network packet.
void * net_pkt_get_data(struct net_pkt *pkt, struct net_pkt_data_access *access)
Get data from a network packet in a contiguous way.
static int net_pkt_write_u8(struct net_pkt *pkt, uint8_t data)
Write a byte (uint8_t) data to a net_pkt.
Definition net_pkt.h:2352
size_t net_pkt_available_payload_buffer(struct net_pkt *pkt, enum net_ip_protocol proto)
Get available buffer space for payload from a pkt.
int net_pkt_read_le16(struct net_pkt *pkt, uint16_t *data)
Read uint16_t little endian data from a net_pkt.
int net_pkt_read_be32(struct net_pkt *pkt, uint32_t *data)
Read uint32_t big endian data from a net_pkt.
int net_pkt_remove_tail(struct net_pkt *pkt, size_t length)
Remove length bytes from tail of packet.
struct net_buf * net_pkt_get_reserve_tx_data(size_t min_len, k_timeout_t timeout)
Get TX DATA buffer from pool.
static void * net_pkt_cursor_get_pos(struct net_pkt *pkt)
Returns current position of the cursor.
Definition net_pkt.h:2158
void net_pkt_frag_insert(struct net_pkt *pkt, struct net_buf *frag)
Insert a fragment to a packet at the beginning of its fragment list.
int net_pkt_memset(struct net_pkt *pkt, int byte, size_t length)
Memset some data in a net_pkt.
static void net_pkt_cursor_backup(struct net_pkt *pkt, struct net_pkt_cursor *backup)
Backup net_pkt cursor.
Definition net_pkt.h:2131
void net_pkt_compact(struct net_pkt *pkt)
Compact the fragment list of a packet.
static int net_pkt_acknowledge_data(struct net_pkt *pkt, struct net_pkt_data_access *access)
Acknowledge previously contiguous data taken from a network packet Packet needs to be set to overwrit...
Definition net_pkt.h:2575
static int net_pkt_write_le16(struct net_pkt *pkt, uint16_t data)
Write a uint16_t little endian data to a net_pkt.
Definition net_pkt.h:2426
static void net_pkt_cursor_restore(struct net_pkt *pkt, struct net_pkt_cursor *backup)
Restore net_pkt cursor from a backup.
Definition net_pkt.h:2144
uint16_t net_pkt_get_current_offset(struct net_pkt *pkt)
Get the actual offset in the packet from its cursor.
size_t net_pkt_remaining_data(struct net_pkt *pkt)
Get the amount of data which can be read from current cursor position.
int net_pkt_alloc_buffer(struct net_pkt *pkt, size_t size, enum net_ip_protocol proto, k_timeout_t timeout)
Allocate buffer for a net_pkt.
int net_pkt_write(struct net_pkt *pkt, const void *data, size_t length)
Write data into a net_pkt.
struct net_buf * net_pkt_frag_ref(struct net_buf *frag)
Increase the packet fragment ref count.
size_t net_pkt_available_buffer(struct net_pkt *pkt)
Get available buffer space from a pkt.
struct net_pkt * net_pkt_clone(struct net_pkt *pkt, k_timeout_t timeout)
Clone pkt and its buffer.
struct net_pkt * net_pkt_alloc_from_slab(struct k_mem_slab *slab, k_timeout_t timeout)
Allocate an initialized net_pkt from a specific slab.
static int net_pkt_write_le32(struct net_pkt *pkt, uint32_t data)
Write a uint32_t little endian data to a net_pkt.
Definition net_pkt.h:2407
struct net_buf * net_pkt_get_reserve_rx_data(size_t min_len, k_timeout_t timeout)
Get RX DATA buffer from pool.
bool net_pkt_is_contiguous(struct net_pkt *pkt, size_t size)
Check if a data size could fit contiguously.
static int net_pkt_read_u8(struct net_pkt *pkt, uint8_t *data)
Read a byte (uint8_t) from a net_pkt.
Definition net_pkt.h:2278
struct net_buf * net_pkt_get_frag(struct net_pkt *pkt, size_t min_len, k_timeout_t timeout)
Get a data fragment that might be from user specific buffer pool or from global DATA pool.
size_t net_pkt_get_contiguous_len(struct net_pkt *pkt)
Get the contiguous buffer space.
int64_t net_time_t
Any occurrence of net_time_t specifies a concept of nanosecond resolution scalar time span,...
Definition net_time.h:103
static net_time_t net_ptp_time_to_ns(struct net_ptp_time *ts)
Convert a PTP timestamp to a nanosecond precision timestamp, both related to the local network refere...
Definition ptp_time.h:210
static struct net_ptp_time ns_to_net_ptp_time(net_time_t nsec)
Convert a nanosecond precision timestamp to a PTP timestamp, both related to the local network refere...
Definition ptp_time.h:231
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
#define IS_ENABLED(config_macro)
Check for macro definition in compiler-visible expressions.
Definition util_macro.h:140
static uint16_t net_eth_vlan_set_vid(uint16_t tci, uint16_t vid)
Set VLAN identifier to TCI.
Definition ethernet_vlan.h:78
static uint8_t net_eth_vlan_get_dei(uint16_t tci)
Get Drop Eligible Indicator from TCI.
Definition ethernet_vlan.h:53
#define NET_VLAN_TAG_UNSPEC
Unspecified VLAN tag value.
Definition ethernet_vlan.h:32
static uint16_t net_eth_vlan_set_dei(uint16_t tci, bool dei)
Set Drop Eligible Indicator to TCI.
Definition ethernet_vlan.h:91
static uint16_t net_eth_vlan_get_vid(uint16_t tci)
Get VLAN identifier from TCI.
Definition ethernet_vlan.h:41
static uint16_t net_eth_vlan_set_pcp(uint16_t tci, uint8_t pcp)
Set Priority Code Point to TCI.
Definition ethernet_vlan.h:104
static uint8_t net_eth_vlan_get_pcp(uint16_t tci)
Get Priority Code Point from TCI.
Definition ethernet_vlan.h:65
Packet data common to all IEEE 802.15.4 L2 layers.
Network context definitions.
Network core definitions.
Public API for network interface.
IPv6 and IPv4 definitions.
Public API for network link address.
Representation of nanosecond resolution elapsed time and timestamps in the network stack.
flags
Definition parser.h:96
Public functions for the Precision Time Protocol time specification.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__INTPTR_TYPE__ intptr_t
Definition stdint.h:104
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
void * memset(void *buf, int c, size_t n)
void * memcpy(void *ZRESTRICT d, const void *ZRESTRICT s, size_t n)
IPv6 address struct.
Definition net_ip.h:143
Kernel timeout type.
Definition sys_clock.h:65
Network buffer pool representation.
Definition net_buf.h:1078
Network buffer representation.
Definition net_buf.h:1006
uint8_t * data
Pointer to the start of data in the buffer.
Definition net_buf.h:1032
uint8_t user_data[]
System metadata for this buffer.
Definition net_buf.h:1053
uint16_t len
Length of the data behind the data pointer.
Definition net_buf.h:1035
Note that we do not store the actual source IP address in the context because the address is already ...
Definition net_context.h:207
Network Interface structure.
Definition net_if.h:690
Hardware link address structure.
Definition net_linkaddr.h:69
uint8_t * addr
The array of byte representing the address.
Definition net_linkaddr.h:71
uint8_t type
What kind of address is this for.
Definition net_linkaddr.h:77
Network packet.
Definition net_pkt.h:91
struct net_buf * frags
buffer fragment
Definition net_pkt.h:103
struct net_context * context
Network connection context.
Definition net_pkt.h:111
struct net_pkt_cursor cursor
Internal buffer iterator used for reading/writing.
Definition net_pkt.h:108
struct net_if * iface
Network interface.
Definition net_pkt.h:114
intptr_t fifo
The fifo is used by RX/TX threads and by socket layer.
Definition net_pkt.h:96
struct net_buf * buffer
alias to a buffer fragment
Definition net_pkt.h:104
struct k_mem_slab * slab
Slab pointer from where it belongs to.
Definition net_pkt.h:99
(Generalized) Precision Time Protocol Timestamp format.
Definition ptp_time.h:111
uint32_t nanosecond
Nanoseconds.
Definition ptp_time.h:134
uint64_t second
Second value.
Definition ptp_time.h:130
Generic sockaddr struct.
Definition net_ip.h:408
#define sys_cpu_to_le32(val)
Convert 32-bit integer from host endianness to little-endian.
Definition byteorder.h:270
#define sys_cpu_to_le16(val)
Convert 16-bit integer from host endianness to little-endian.
Definition byteorder.h:266