summaryrefslogtreecommitdiffstats
path: root/src/vnet/qos/qos_egress_map.h
blob: 0dab7adc2dd647887fe4b8afa04d3be162424cb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 *------------------------------------------------------------------
 * Copyright (c) 2018 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *------------------------------------------------------------------
 */

/**
 * A QOS egress map translates from the COS bits stored in the packet's
 * meta-data into a per-protocol COS value
 */

#ifndef __QOS_EGRESS_MAP_H__
#define __QOS_EGRESS_MAP_H__

#include <vnet/qos/qos_types.h>
#include <vnet/dpo/dpo.h>

/**
 * An attempt at type safety
 */
typedef u32 qos_egress_map_id_t;

/**
 * For a given output source a table maps each value of every input source.
 */
typedef struct qos_egress_map_t_
{
  /**
   * Required for pool_get_aligned
   */
  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);

  /**
   * The array of output mapped values;
   *   output = eq_qos[input-source][input-value]
   */
  qos_bits_t qem_output[QOS_N_SOURCES][256];
} qos_egress_map_t;

extern u8 *format_qos_egress_map (u8 * s, va_list * args);

/**
 * Add a qos-egress map to an interface. If sw_if_index = ~0
 * then the configuration is for the 'default' table.
 * If the table is ~0, this is a removal.
 * the egress mapping is applied. For example, is output is MPLS then
 * the QoS markings will occur for MPLS packets.
 */
extern void qos_egress_map_update (qos_egress_map_id_t tid,
				   qos_source_t input_source,
				   qos_bits_t * values);
extern void qos_egress_map_delete (qos_egress_map_id_t tid);

/**
 * Get the VPP QoS map index from the user's map-ID
 */
extern index_t qos_egress_map_find (qos_egress_map_id_t tid);
extern qos_egress_map_id_t qos_egress_map_get_id (index_t qemi);

/**
 * Walk each of the configured maps
 */
typedef walk_rc_t (*qos_egress_map_walk_cb_t) (qos_egress_map_id_t id,
					       const qos_egress_map_t * m,
					       void *c);
void qos_egress_map_walk (qos_egress_map_walk_cb_t fn, void *c);

/**
 * Data-plane functions
 */

/**
 * Pool from which to allocate map
 */
extern qos_egress_map_t *qem_pool;

#endif

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
efine foreach_vpe_api_reply_msg \ _(CDP_ENABLE_DISABLE_REPLY, cdp_enable_disable_reply) static int api_cdp_enable_disable (vat_main_t * vam) { unformat_input_t *i = vam->input; int enable_disable = 1; vl_api_cdp_enable_disable_t *mp; int ret; /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { if (unformat (i, "disable")) enable_disable = 0; else if (unformat (i, "enable")) enable_disable = 1; else break; } /* Construct the API message */ M (CDP_ENABLE_DISABLE, mp); mp->enable_disable = enable_disable; /* send it... */ S (mp); /* Wait for a reply... */ W (ret); return ret; } /* * List of messages that the api test plugin sends, * and that the data plane plugin processes */ #define foreach_vpe_api_msg \ _(cdp_enable_disable, "enable | disable") static void cdp_api_hookup (vat_main_t * vam) { cdp_test_main_t *sm = &cdp_test_main; /* Hook up handlers for replies from the data plane plug-in */ #define _(N,n) \ vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \ #n, \ vl_api_##n##_t_handler, \ vl_noop_handler, \ vl_api_##n##_t_endian, \ vl_api_##n##_t_print, \ sizeof(vl_api_##n##_t), 1); foreach_vpe_api_reply_msg; #undef _ /* API messages we can send */ #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n); foreach_vpe_api_msg; #undef _ /* Help strings */ #define _(n,h) hash_set_mem (vam->help_by_name, #n, h); foreach_vpe_api_msg; #undef _ } VAT_PLUGIN_REGISTER (cdp); /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */