Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions include/zephyr/net/net_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,18 @@ static inline int net_send_data(struct net_pkt *pkt)
#define NET_TC_COUNT 0
#endif /* CONFIG_NET_TC_TX_COUNT && CONFIG_NET_TC_RX_COUNT */

#if CONFIG_NET_TC_TX_SKIP_FOR_HIGH_PRIO
#define NET_TC_TX_EFFECTIVE_COUNT (NET_TC_TX_COUNT + 1)
#else
#define NET_TC_TX_EFFECTIVE_COUNT NET_TC_TX_COUNT
#endif

#if CONFIG_NET_TC_RX_SKIP_FOR_HIGH_PRIO
#define NET_TC_RX_EFFECTIVE_COUNT (NET_TC_RX_COUNT + 1)
#else
#define NET_TC_RX_EFFECTIVE_COUNT NET_TC_RX_COUNT
#endif

/**
* @brief Registration information for a given L3 handler. Note that
* the layer number (L3) just refers to something that is on top
Expand Down
9 changes: 5 additions & 4 deletions subsys/net/ip/net_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_pkt.h>
#include <zephyr/net/icmp.h>
#include <zephyr/net/net_core.h>

#ifdef CONFIG_NET_MGMT_EVENT_INFO

Expand Down Expand Up @@ -212,17 +213,17 @@ extern int net_tc_tx_thread_priority(int tc);
extern int net_tc_rx_thread_priority(int tc);
static inline bool net_tc_tx_is_immediate(int tc, int prio)
{
ARG_UNUSED(tc);
bool high_prio = (prio >= NET_PRIORITY_CA);
ARG_UNUSED(prio);
bool high_prio = (tc == NET_TC_TX_EFFECTIVE_COUNT - 1);
bool skipping = IS_ENABLED(CONFIG_NET_TC_TX_SKIP_FOR_HIGH_PRIO);
bool no_queues = (0 == NET_TC_TX_COUNT);

return no_queues || (high_prio && skipping);
}
static inline bool net_tc_rx_is_immediate(int tc, int prio)
{
ARG_UNUSED(tc);
bool high_prio = (prio >= NET_PRIORITY_CA);
ARG_UNUSED(prio);
bool high_prio = (tc == NET_TC_RX_EFFECTIVE_COUNT - 1);
bool skipping = IS_ENABLED(CONFIG_NET_TC_RX_SKIP_FOR_HIGH_PRIO);
bool no_queues = (0 == NET_TC_RX_COUNT);

Expand Down
9 changes: 4 additions & 5 deletions subsys/net/ip/net_tc.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ LOG_MODULE_REGISTER(net_tc, CONFIG_NET_TC_LOG_LEVEL);
#include "net_stats.h"
#include "net_tc_mapping.h"

#define TC_RX_PSEUDO_QUEUE (COND_CODE_1(CONFIG_NET_TC_RX_SKIP_FOR_HIGH_PRIO, (1), (0)))
#define NET_TC_RX_EFFECTIVE_COUNT (NET_TC_RX_COUNT + TC_RX_PSEUDO_QUEUE)

#if NET_TC_RX_EFFECTIVE_COUNT > 1
#define NET_TC_RX_SLOTS (CONFIG_NET_PKT_RX_COUNT / NET_TC_RX_EFFECTIVE_COUNT)
BUILD_ASSERT(NET_TC_RX_SLOTS > 0,
Expand All @@ -29,8 +26,6 @@ BUILD_ASSERT(NET_TC_RX_SLOTS > 0,
"CONFIG_NET_TC_RX_COUNT or disable CONFIG_NET_TC_RX_SKIP_FOR_HIGH_PRIO");
#endif

#define TC_TX_PSEUDO_QUEUE (COND_CODE_1(CONFIG_NET_TC_TX_SKIP_FOR_HIGH_PRIO, (1), (0)))
#define NET_TC_TX_EFFECTIVE_COUNT (NET_TC_TX_COUNT + TC_TX_PSEUDO_QUEUE)

#if NET_TC_TX_EFFECTIVE_COUNT > 1
#define NET_TC_TX_SLOTS (CONFIG_NET_PKT_TX_COUNT / NET_TC_TX_EFFECTIVE_COUNT)
Expand Down Expand Up @@ -120,6 +115,8 @@ enum net_verdict net_tc_submit_to_rx_queue(uint8_t tc, struct net_pkt *pkt)
int net_tx_priority2tc(enum net_priority prio)
{
#if NET_TC_TX_COUNT > 0
static const uint8_t tx_prio2tc_map[] = PRIORITY2TC_TX;

if (prio > NET_PRIORITY_NC) {
/* Use default value suggested in 802.1Q */
prio = NET_PRIORITY_BE;
Expand All @@ -136,6 +133,8 @@ int net_tx_priority2tc(enum net_priority prio)
int net_rx_priority2tc(enum net_priority prio)
{
#if NET_TC_RX_COUNT > 0
static const uint8_t rx_prio2tc_map[] = PRIORITY2TC_RX;

if (prio > NET_PRIORITY_NC) {
/* Use default value suggested in 802.1Q */
prio = NET_PRIORITY_BE;
Expand Down
175 changes: 76 additions & 99 deletions subsys/net/ip/net_tc_mapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#ifndef __TC_MAPPING_H
#define __TC_MAPPING_H

#include <zephyr/types.h>
#include "zephyr/net/net_core.h"

/* All the maps below use priorities and indexes, below is the list of them
* according to 802.1Q - table I-2.
Expand All @@ -29,122 +29,99 @@
* 7 (highest) NC Network control
*/

/* Helper macros used to generate the map to use */
#define PRIORITY2TC_GEN_INNER(TYPE, COUNT) priority2tc_ ## TYPE ## _ ## COUNT
#define PRIORITY2TC_GEN(TYPE, COUNT) PRIORITY2TC_GEN_INNER(TYPE, COUNT)

#if defined(CONFIG_NET_TC_MAPPING_STRICT) && (NET_TC_COUNT > 0)

/* This is the recommended priority to traffic class mapping for
* implementations that do not support the credit-based shaper transmission
* selection algorithm.
* Ref: 802.1Q - chapter 8.6.6 - table 8-4
*/
#if defined(CONFIG_NET_TC_MAPPING_STRICT)
#define PRIORITY2TC_1 {0, 0, 0, 0, 0, 0, 0, 0}
#define PRIORITY2TC_2 {0, 0, 0, 0, 1, 1, 1, 1}
#define PRIORITY2TC_3 {0, 0, 0, 0, 1, 1, 2, 2}
#define PRIORITY2TC_4 {0, 0, 1, 1, 2, 2, 3, 3}
#define PRIORITY2TC_5 {0, 0, 1, 1, 2, 2, 3, 4}
#define PRIORITY2TC_6 {1, 0, 2, 2, 3, 3, 4, 5}
#define PRIORITY2TC_7 {1, 0, 2, 3, 4, 4, 5, 6}
#define PRIORITY2TC_8 {1, 0, 2, 3, 4, 5, 6, 7}

#if NET_TC_TX_COUNT == 1 || NET_TC_RX_COUNT == 1
static const uint8_t priority2tc_strict_1[] = {0, 0, 0, 0, 0, 0, 0, 0};
#endif
#if NET_TC_TX_COUNT == 2 || NET_TC_RX_COUNT == 2
static const uint8_t priority2tc_strict_2[] = {0, 0, 0, 0, 1, 1, 1, 1};
#endif
#if NET_TC_TX_COUNT == 3 || NET_TC_RX_COUNT == 3
static const uint8_t priority2tc_strict_3[] = {0, 0, 0, 0, 1, 1, 2, 2};
#endif
#if NET_TC_TX_COUNT == 4 || NET_TC_RX_COUNT == 4
static const uint8_t priority2tc_strict_4[] = {0, 0, 1, 1, 2, 2, 3, 3};
#endif
#if NET_TC_TX_COUNT == 5 || NET_TC_RX_COUNT == 5
static const uint8_t priority2tc_strict_5[] = {0, 0, 1, 1, 2, 2, 3, 4};
#endif
#if NET_TC_TX_COUNT == 6 || NET_TC_RX_COUNT == 6
static const uint8_t priority2tc_strict_6[] = {1, 0, 2, 2, 3, 3, 4, 5};
#endif
#if NET_TC_TX_COUNT == 7 || NET_TC_RX_COUNT == 7
static const uint8_t priority2tc_strict_7[] = {1, 0, 2, 3, 4, 4, 5, 6};
#endif
#if NET_TC_TX_COUNT == 8 || NET_TC_RX_COUNT == 8
static const uint8_t priority2tc_strict_8[] = {1, 0, 2, 3, 4, 5, 6, 7};
#endif

#if NET_TC_TX_COUNT > 0
static const uint8_t *tx_prio2tc_map = PRIORITY2TC_GEN(strict, NET_TC_TX_COUNT);
#endif
#if NET_TC_RX_COUNT > 0
static const uint8_t *rx_prio2tc_map = PRIORITY2TC_GEN(strict, NET_TC_RX_COUNT);
#endif

#elif defined(CONFIG_NET_TC_MAPPING_SR_CLASS_A_AND_B) && (NET_TC_COUNT > 0)

/* This is the recommended priority to traffic class mapping for a system that
* supports SR (Stream Reservation) class A and SR class B.
* Ref: 802.1Q - chapter 34.5 - table 34-1
*/
#elif defined(CONFIG_NET_TC_MAPPING_SR_CLASS_A_AND_B)
#define PRIORITY2TC_1 {0, 0, 0, 0, 0, 0, 0, 0}
#define PRIORITY2TC_2 {0, 0, 1, 1, 0, 0, 0, 0}
#define PRIORITY2TC_3 {0, 0, 1, 2, 0, 0, 0, 0}
#define PRIORITY2TC_4 {0, 0, 2, 3, 1, 1, 1, 1}
#define PRIORITY2TC_5 {0, 0, 3, 4, 1, 1, 2, 2}
#define PRIORITY2TC_6 {0, 0, 4, 5, 1, 1, 2, 3}
#define PRIORITY2TC_7 {0, 0, 5, 6, 1, 2, 3, 4}
#define PRIORITY2TC_8 {1, 0, 6, 7, 2, 3, 4, 5}

#if NET_TC_TX_COUNT == 2 || NET_TC_RX_COUNT == 2
static const uint8_t priority2tc_sr_ab_2[] = {0, 0, 1, 1, 0, 0, 0, 0};
#endif
#if NET_TC_TX_COUNT == 3 || NET_TC_RX_COUNT == 3
static const uint8_t priority2tc_sr_ab_3[] = {0, 0, 1, 2, 0, 0, 0, 0};
#endif
#if NET_TC_TX_COUNT == 4 || NET_TC_RX_COUNT == 4
static const uint8_t priority2tc_sr_ab_4[] = {0, 0, 2, 3, 1, 1, 1, 1};
#endif
#if NET_TC_TX_COUNT == 5 || NET_TC_RX_COUNT == 5
static const uint8_t priority2tc_sr_ab_5[] = {0, 0, 3, 4, 1, 1, 2, 2};
#endif
#if NET_TC_TX_COUNT == 6 || NET_TC_RX_COUNT == 6
static const uint8_t priority2tc_sr_ab_6[] = {0, 0, 4, 5, 1, 1, 2, 3};
#endif
#if NET_TC_TX_COUNT == 7 || NET_TC_RX_COUNT == 7
static const uint8_t priority2tc_sr_ab_7[] = {0, 0, 5, 6, 1, 2, 3, 4};
#endif
#if NET_TC_TX_COUNT == 8 || NET_TC_RX_COUNT == 8
static const uint8_t priority2tc_sr_ab_8[] = {1, 0, 6, 7, 2, 3, 4, 5};
#endif

#if NET_TC_TX_COUNT > 0
static const uint8_t *tx_prio2tc_map = PRIORITY2TC_GEN(sr_ab, NET_TC_TX_COUNT);
#endif
#if NET_TC_RX_COUNT > 0
static const uint8_t *rx_prio2tc_map = PRIORITY2TC_GEN(sr_ab, NET_TC_RX_COUNT);
#endif

#elif defined(CONFIG_NET_TC_MAPPING_SR_CLASS_B_ONLY) && (NET_TC_COUNT > 0)

/* This is the recommended priority to traffic class mapping for a system that
* supports SR (Stream Reservation) class B only.
* Ref: 802.1Q - chapter 34.5 - table 34-2
*/

#if NET_TC_TX_COUNT == 2 || NET_TC_RX_COUNT == 2
static const uint8_t priority2tc_sr_b_2[] = {0, 0, 1, 0, 0, 0, 0, 0};
#endif
#if NET_TC_TX_COUNT == 3 || NET_TC_RX_COUNT == 3
static const uint8_t priority2tc_sr_b_3[] = {0, 0, 2, 0, 1, 1, 1, 1};
#endif
#if NET_TC_TX_COUNT == 4 || NET_TC_RX_COUNT == 4
static const uint8_t priority2tc_sr_b_4[] = {0, 0, 3, 0, 1, 1, 2, 2};
#endif
#if NET_TC_TX_COUNT == 5 || NET_TC_RX_COUNT == 5
static const uint8_t priority2tc_sr_b_5[] = {0, 0, 4, 1, 2, 2, 3, 3};
#endif
#if NET_TC_TX_COUNT == 6 || NET_TC_RX_COUNT == 6
static const uint8_t priority2tc_sr_b_6[] = {0, 0, 5, 1, 2, 2, 3, 4};
#endif
#if NET_TC_TX_COUNT == 7 || NET_TC_RX_COUNT == 7
static const uint8_t priority2tc_sr_b_7[] = {1, 0, 6, 2, 3, 3, 4, 5};
#endif
#if NET_TC_TX_COUNT == 8 || NET_TC_RX_COUNT == 8
static const uint8_t priority2tc_sr_b_8[] = {1, 0, 7, 2, 3, 4, 5, 6};
#endif

#if NET_TC_TX_COUNT > 0
static const uint8_t *tx_prio2tc_map = PRIORITY2TC_GEN(sr_b, NET_TC_TX_COUNT);
#endif
#if NET_TC_RX_COUNT > 0
static const uint8_t *rx_prio2tc_map = PRIORITY2TC_GEN(sr_b, NET_TC_RX_COUNT);
#endif

#elif defined(CONFIG_NET_TC_MAPPING_SR_CLASS_B_ONLY)
#define PRIORITY2TC_1 {0, 0, 0, 0, 0, 0, 0, 0}
#define PRIORITY2TC_2 {0, 0, 1, 0, 0, 0, 0, 0}
#define PRIORITY2TC_3 {0, 0, 2, 0, 1, 1, 1, 1}
#define PRIORITY2TC_4 {0, 0, 3, 0, 1, 1, 2, 2}
#define PRIORITY2TC_5 {0, 0, 4, 1, 2, 2, 3, 3}
#define PRIORITY2TC_6 {0, 0, 5, 1, 2, 2, 3, 4}
#define PRIORITY2TC_7 {1, 0, 6, 2, 3, 3, 4, 5}
#define PRIORITY2TC_8 {1, 0, 7, 2, 3, 4, 5, 6}
#endif


#if NET_TC_TX_EFFECTIVE_COUNT == 0
#elif NET_TC_TX_EFFECTIVE_COUNT == 1
#define PRIORITY2TC_TX PRIORITY2TC_1
#elif NET_TC_TX_EFFECTIVE_COUNT == 2
#define PRIORITY2TC_TX PRIORITY2TC_2
#elif NET_TC_TX_EFFECTIVE_COUNT == 3
#define PRIORITY2TC_TX PRIORITY2TC_3
#elif NET_TC_TX_EFFECTIVE_COUNT == 4
#define PRIORITY2TC_TX PRIORITY2TC_4
#elif NET_TC_TX_EFFECTIVE_COUNT == 5
#define PRIORITY2TC_TX PRIORITY2TC_5
#elif NET_TC_TX_EFFECTIVE_COUNT == 6
#define PRIORITY2TC_TX PRIORITY2TC_6
#elif NET_TC_TX_EFFECTIVE_COUNT == 7
#define PRIORITY2TC_TX PRIORITY2TC_7
#elif NET_TC_TX_EFFECTIVE_COUNT == 8
#define PRIORITY2TC_TX PRIORITY2TC_8
#else
BUILD_ASSERT(false, "Too many effective tx traffic class queues, either reduce "
"CONFIG_NET_TC_TX_COUNT or disable "
"CONFIG_NET_TC_TX_SKIP_FOR_HIGH_PRIO");
#endif


#if NET_TC_RX_EFFECTIVE_COUNT == 0
#elif NET_TC_RX_EFFECTIVE_COUNT == 1
#define PRIORITY2TC_RX PRIORITY2TC_1
#elif NET_TC_RX_EFFECTIVE_COUNT == 2
#define PRIORITY2TC_RX PRIORITY2TC_2
#elif NET_TC_RX_EFFECTIVE_COUNT == 3
#define PRIORITY2TC_RX PRIORITY2TC_3
#elif NET_TC_RX_EFFECTIVE_COUNT == 4
#define PRIORITY2TC_RX PRIORITY2TC_4
#elif NET_TC_RX_EFFECTIVE_COUNT == 5
#define PRIORITY2TC_RX PRIORITY2TC_5
#elif NET_TC_RX_EFFECTIVE_COUNT == 6
#define PRIORITY2TC_RX PRIORITY2TC_6
#elif NET_TC_RX_EFFECTIVE_COUNT == 7
#define PRIORITY2TC_RX PRIORITY2TC_7
#elif NET_TC_RX_EFFECTIVE_COUNT == 8
#define PRIORITY2TC_RX PRIORITY2TC_8
#else
BUILD_ASSERT(false, "Too many effective rx traffic class queues, either reduce "
"CONFIG_NET_TC_RX_COUNT or disable "
"CONFIG_NET_TC_RX_SKIP_FOR_HIGH_PRIO");
#endif

#endif /* __TC_MAPPING_H */