237 lines
5.9 KiB
C
237 lines
5.9 KiB
C
/** @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_ */
|