blob: 4a4ce6cae9660a9385f9f22e435623f5fd59cd13 [file] [log] [blame]
/** @file
* @brief Network core definitions
*
* Definitions for networking support.
*/
/*
* Copyright (c) 2015 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_NET_NET_CORE_H_
#define ZEPHYR_INCLUDE_NET_NET_CORE_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
/**
* @brief Networking
* @defgroup networking Networking
* @{
* @}
*/
/**
* @brief Network core library
* @defgroup net_core Network Core Library
* @ingroup networking
* @{
*/
/** @cond INTERNAL_HIDDEN */
/* Network subsystem logging helpers */
#include <logging/log.h>
#define NET_DBG(fmt, ...) LOG_DBG("(%p): " fmt, k_current_get(), \
##__VA_ARGS__)
#define NET_ERR(fmt, ...) LOG_ERR(fmt, ##__VA_ARGS__)
#define NET_WARN(fmt, ...) LOG_WRN(fmt, ##__VA_ARGS__)
#define NET_INFO(fmt, ...) LOG_INF(fmt, ##__VA_ARGS__)
#include <misc/__assert.h>
#define NET_ASSERT(cond) __ASSERT_NO_MSG(cond)
#define NET_ASSERT_INFO(cond, fmt, ...) __ASSERT(cond, fmt, ##__VA_ARGS__)
/** @endcond */
#include <kernel.h>
struct net_buf;
struct net_pkt;
struct net_context;
struct net_if;
#include <string.h>
/**
* @brief Net Verdict
*/
enum net_verdict {
/** Packet has been taken care of. */
NET_OK,
/** Packet has not been touched, other part should decide about its
* fate.
*/
NET_CONTINUE,
/** Packet must be dropped. */
NET_DROP,
};
/**
* @brief Called by lower network stack or network device driver when
* a network packet has been received. The function will push the packet up in
* the network stack for further processing.
*
* @param iface Network interface where the packet was received.
* @param pkt Network packet data.
*
* @return 0 if ok, <0 if error.
*/
int net_recv_data(struct net_if *iface, struct net_pkt *pkt);
/**
* @brief Send data to network.
*
* @details Send data to network. This should not be used normally by
* applications as it requires that the network packet is properly
* constructed.
*
* @param pkt Network packet.
*
* @return 0 if ok, <0 if error. If <0 is returned, then the caller needs
* to unref the pkt in order to avoid memory leak.
*/
int net_send_data(struct net_pkt *pkt);
/** @cond INTERNAL_HIDDEN */
/*
* The net_stack_info struct needs to be aligned to 32 byte boundary,
* otherwise the __net_stack_end will point to wrong location and looping
* through net_stack section will go wrong.
* So this alignment is a workaround and should eventually be removed.
*/
struct net_stack_info {
k_thread_stack_t *stack;
const char *pretty_name;
const char *name;
size_t orig_size;
size_t size;
int prio;
int idx;
} __aligned(32);
#if defined(CONFIG_NET_SHELL)
#define NET_STACK_GET_NAME(pretty, name, sfx) \
(__net_stack_##pretty##_##name##_##sfx)
#define NET_STACK_INFO_ADDR(_pretty, _name, _orig, _size, _addr, sfx) \
static struct net_stack_info \
(NET_STACK_GET_NAME(_pretty, _name, sfx)) __used \
__attribute__((__section__(".net_stack.data"))) = { \
.stack = _addr, \
.size = _size, \
.orig_size = _orig, \
.name = #_name, \
.pretty_name = #_pretty, \
.prio = -1, \
.idx = -1, \
}
/* Note that the stack address needs to be fixed at runtime because
* we cannot do it during static initialization. For name we allocate
* some space so that the stack index can be printed too.
*/
#define NET_STACK_INFO_ADDR_ARRAY(_pretty, _name, _orig, _size, _addr, \
sfx, _nmemb) \
static struct net_stack_info \
(NET_STACK_GET_NAME(_pretty, _name, sfx))[_nmemb] __used \
__attribute__((__section__(".net_stack.data"))) = { \
[0 ... (_nmemb - 1)] = { \
.stack = _addr[0], \
.size = _size, \
.orig_size = _orig, \
.name = #_name, \
.pretty_name = #_pretty, \
.prio = -1, \
.idx = -1, \
} \
}
#define NET_STACK_INFO(_pretty_name, _name, _orig, _size) \
NET_STACK_INFO_ADDR(_pretty_name, _name, _orig, _size, _name, 0)
#define NET_STACK_INFO_ARRAY(_pretty_name, _name, _orig, _size, _nmemb) \
NET_STACK_INFO_ADDR_ARRAY(_pretty_name, _name, _orig, _size, _name, \
0, _nmemb)
#define NET_STACK_DEFINE(pretty_name, name, orig, size) \
K_THREAD_STACK_DEFINE(name, size); \
NET_STACK_INFO(pretty_name, name, orig, size)
#define NET_STACK_ARRAY_DEFINE(pretty_name, name, orig, size, nmemb) \
K_THREAD_STACK_ARRAY_DEFINE(name, nmemb, size); \
NET_STACK_INFO_ARRAY(pretty_name, name, orig, size, nmemb)
#else /* CONFIG_NET_SHELL */
#define NET_STACK_GET_NAME(pretty, name, sfx) (name)
#define NET_STACK_INFO(...)
#define NET_STACK_INFO_ADDR(...)
#define NET_STACK_DEFINE(pretty_name, name, orig, size) \
K_THREAD_STACK_DEFINE(name, size)
#define NET_STACK_ARRAY_DEFINE(pretty_name, name, orig, size, nmemb) \
K_THREAD_STACK_ARRAY_DEFINE(name, nmemb, size)
#endif /* CONFIG_NET_SHELL */
#define NET_STACK_DEFINE_EMBEDDED(name, size) char name[size]
#if defined(CONFIG_INIT_STACKS)
#include <misc/stack.h>
static inline void net_analyze_stack_get_values(const char *stack,
size_t size,
unsigned *pcnt,
unsigned *unused)
{
*unused = stack_unused_space_get(stack, size);
/* Calculate the real size reserved for the stack */
*pcnt = ((size - *unused) * 100) / size;
}
void net_analyze_stack(const char *name, const char *stack, size_t size);
#else
#define net_analyze_stack(...)
#define net_analyze_stack_get_values(...)
#endif
/* Some helper defines for traffic class support */
#if defined(CONFIG_NET_TC_TX_COUNT) && defined(CONFIG_NET_TC_RX_COUNT)
#define NET_TC_TX_COUNT CONFIG_NET_TC_TX_COUNT
#define NET_TC_RX_COUNT CONFIG_NET_TC_RX_COUNT
#if NET_TC_TX_COUNT > NET_TC_RX_COUNT
#define NET_TC_COUNT NET_TC_TX_COUNT
#else
#define NET_TC_COUNT NET_TC_RX_COUNT
#endif
#else /* CONFIG_NET_TC_TX_COUNT && CONFIG_NET_TC_RX_COUNT */
#define NET_TC_TX_COUNT 1
#define NET_TC_RX_COUNT 1
#define NET_TC_COUNT 1
#endif /* CONFIG_NET_TC_TX_COUNT && CONFIG_NET_TC_RX_COUNT */
/* @endcond */
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_NET_NET_CORE_H_ */