blob: c5ac0febbeed9696f04d3183c95cd8e923f45185 [file] [log] [blame]
/** @file
* @brief Various priority to traffic class mappings
*
* This is not to be included by the application.
*/
/*
* Copyright (c) 2018 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __TC_MAPPING_H
#define __TC_MAPPING_H
#include <zephyr/types.h>
/* All the maps below use priorities and indexes, below is the list of them
* according to 802.1Q - table I-2.
*
* Priority Acronym Traffic types
* 1 (lowest) BK Background
* 0 (default) BE Best effort
* 2 EE Excellent effort
* 3 CA Critical applications
* 4 VI Video, < 100 ms latency and jitter
* 5 VO Voice, < 10 ms latency and jitter
* 6 IC Internetwork control
* 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 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
*/
#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
#endif
#endif /* __TC_MAPPING_H */