app/testpmd: rework softnic forward mode
Modied the testpmd softnic forwarding mode as per the changes in softnic PMD. To run testpmd application with softnic fwd mode, following command is used; $ ./testpmd -c 0xc -n 4 --vdev 'net_softnic0,firmware=script.cli' -- -i --forward-mode=softnic Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com> Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
This commit is contained in:
parent
d16eaa369c
commit
0ad778b398
@ -35,8 +35,8 @@ SRCS-y += icmpecho.c
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_IEEE1588) += ieee1588fwd.c
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_BPF) += bpf_cmd.c
|
||||
|
||||
ifeq ($(CONFIG_RTE_LIBRTE_PMD_SOFTNIC)$(CONFIG_RTE_LIBRTE_SCHED),yy)
|
||||
SRCS-y += tm.c
|
||||
ifeq ($(CONFIG_RTE_LIBRTE_PMD_SOFTNIC), y)
|
||||
SRCS-y += softnicfwd.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
|
||||
|
@ -69,6 +69,9 @@
|
||||
#ifdef RTE_LIBRTE_I40E_PMD
|
||||
#include <rte_pmd_i40e.h>
|
||||
#endif
|
||||
#ifdef RTE_LIBRTE_PMD_SOFTNIC
|
||||
#include <rte_eth_softnic.h>
|
||||
#endif
|
||||
#ifdef RTE_LIBRTE_BNXT_PMD
|
||||
#include <rte_pmd_bnxt.h>
|
||||
#endif
|
||||
@ -14817,20 +14820,14 @@ static void cmd_set_port_tm_hierarchy_default_parsed(void *parsed_result,
|
||||
|
||||
p = &ports[port_id];
|
||||
|
||||
/* Port tm flag */
|
||||
if (p->softport.tm_flag == 0) {
|
||||
printf(" tm not enabled on port %u (error)\n", port_id);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Forward mode: tm */
|
||||
if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
|
||||
printf(" tm mode not enabled(error)\n");
|
||||
if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "softnic")) {
|
||||
printf(" softnicfwd mode not enabled(error)\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set the default tm hierarchy */
|
||||
p->softport.tm.default_hierarchy_enable = 1;
|
||||
p->softport.default_tm_hierarchy_enable = 1;
|
||||
}
|
||||
|
||||
cmdline_parse_inst_t cmd_set_port_tm_hierarchy_default = {
|
||||
@ -17554,15 +17551,50 @@ cmdline_read_from_file(const char *filename)
|
||||
void
|
||||
prompt(void)
|
||||
{
|
||||
int status;
|
||||
|
||||
/* initialize non-constant commands */
|
||||
cmd_set_fwd_mode_init();
|
||||
cmd_set_fwd_retry_mode_init();
|
||||
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC
|
||||
portid_t softnic_portid, pid;
|
||||
uint8_t softnic_enable = 0;
|
||||
|
||||
if (strcmp(cur_fwd_eng->fwd_mode_name, "softnic") == 0) {
|
||||
RTE_ETH_FOREACH_DEV(pid) {
|
||||
struct rte_port *port = &ports[pid];
|
||||
const char *driver = port->dev_info.driver_name;
|
||||
|
||||
if (strcmp(driver, "net_softnic") == 0) {
|
||||
softnic_portid = pid;
|
||||
softnic_enable = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> ");
|
||||
if (testpmd_cl == NULL)
|
||||
return;
|
||||
cmdline_interact(testpmd_cl);
|
||||
cmdline_stdin_exit(testpmd_cl);
|
||||
|
||||
for (;;) {
|
||||
status = cmdline_poll(testpmd_cl);
|
||||
if (status < 0)
|
||||
rte_panic("CLI poll error (%" PRId32 ")\n", status);
|
||||
else if (status == RDLINE_EXITED) {
|
||||
cmdline_stdin_exit(testpmd_cl);
|
||||
rte_exit(0, "\n");
|
||||
}
|
||||
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC
|
||||
|
||||
if ((softnic_enable == 1) &&
|
||||
(strcmp(cur_fwd_eng->fwd_mode_name, "softnic") == 0))
|
||||
rte_pmd_softnic_manage(softnic_portid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -2332,6 +2332,55 @@ icmp_echo_config_setup(void)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC
|
||||
static void
|
||||
softnic_fwd_config_setup(void)
|
||||
{
|
||||
struct rte_port *port;
|
||||
portid_t pid, softnic_portid;
|
||||
queueid_t i;
|
||||
uint8_t softnic_enable = 0;
|
||||
|
||||
RTE_ETH_FOREACH_DEV(pid) {
|
||||
port = &ports[pid];
|
||||
const char *driver = port->dev_info.driver_name;
|
||||
|
||||
if (strcmp(driver, "net_softnic") == 0) {
|
||||
softnic_portid = pid;
|
||||
softnic_enable = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (softnic_enable == 0) {
|
||||
printf("Softnic mode not configured(%s)!\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
cur_fwd_config.nb_fwd_ports = 1;
|
||||
cur_fwd_config.nb_fwd_streams = (streamid_t) nb_rxq;
|
||||
|
||||
/* Re-initialize forwarding streams */
|
||||
init_fwd_streams();
|
||||
|
||||
/*
|
||||
* In the softnic forwarding test, the number of forwarding cores
|
||||
* is set to one and remaining are used for softnic packet processing.
|
||||
*/
|
||||
cur_fwd_config.nb_fwd_lcores = 1;
|
||||
setup_fwd_config_of_each_lcore(&cur_fwd_config);
|
||||
|
||||
for (i = 0; i < cur_fwd_config.nb_fwd_streams; i++) {
|
||||
fwd_streams[i]->rx_port = softnic_portid;
|
||||
fwd_streams[i]->rx_queue = i;
|
||||
fwd_streams[i]->tx_port = softnic_portid;
|
||||
fwd_streams[i]->tx_queue = i;
|
||||
fwd_streams[i]->peer_addr = fwd_streams[i]->tx_port;
|
||||
fwd_streams[i]->retry_enabled = retry_enabled;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
fwd_config_setup(void)
|
||||
{
|
||||
@ -2340,6 +2389,14 @@ fwd_config_setup(void)
|
||||
icmp_echo_config_setup();
|
||||
return;
|
||||
}
|
||||
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC
|
||||
if (strcmp(cur_fwd_eng->fwd_mode_name, "softnic") == 0) {
|
||||
softnic_fwd_config_setup();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((nb_rxq > 1) && (nb_txq > 1)){
|
||||
if (dcb_config)
|
||||
dcb_fwd_config_setup();
|
||||
|
@ -35,7 +35,7 @@ if dpdk_conf.has('RTE_LIBRTE_IXGBE_PMD')
|
||||
deps += 'pmd_ixgbe'
|
||||
endif
|
||||
if dpdk_conf.has('RTE_LIBRTE_SOFTNIC_PMD')
|
||||
sources += files('tm.c')
|
||||
sources += files('softnicfwd.c')
|
||||
deps += 'pmd_softnic'
|
||||
endif
|
||||
if dpdk_conf.has('RTE_LIBRTE_DPAA_PMD')
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include <rte_cycles.h>
|
||||
#include <rte_mbuf.h>
|
||||
#include <rte_malloc.h>
|
||||
#include <rte_ethdev.h>
|
||||
#include <rte_flow.h>
|
||||
#include <rte_meter.h>
|
||||
@ -71,170 +72,17 @@ struct tm_hierarchy {
|
||||
uint32_t n_shapers;
|
||||
};
|
||||
|
||||
#define BITFIELD(byte_array, slab_pos, slab_mask, slab_shr) \
|
||||
({ \
|
||||
uint64_t slab = *((uint64_t *) &byte_array[slab_pos]); \
|
||||
uint64_t val = \
|
||||
(rte_be_to_cpu_64(slab) & slab_mask) >> slab_shr; \
|
||||
val; \
|
||||
})
|
||||
|
||||
#define RTE_SCHED_PORT_HIERARCHY(subport, pipe, \
|
||||
traffic_class, queue, color) \
|
||||
((((uint64_t) (queue)) & 0x3) | \
|
||||
((((uint64_t) (traffic_class)) & 0x3) << 2) | \
|
||||
((((uint64_t) (color)) & 0x3) << 4) | \
|
||||
((((uint64_t) (subport)) & 0xFFFF) << 16) | \
|
||||
((((uint64_t) (pipe)) & 0xFFFFFFFF) << 32))
|
||||
|
||||
|
||||
static void
|
||||
pkt_metadata_set(struct rte_port *p, struct rte_mbuf **pkts,
|
||||
uint32_t n_pkts)
|
||||
{
|
||||
struct softnic_port_tm *tm = &p->softport.tm;
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < (n_pkts & (~0x3)); i += 4) {
|
||||
struct rte_mbuf *pkt0 = pkts[i];
|
||||
struct rte_mbuf *pkt1 = pkts[i + 1];
|
||||
struct rte_mbuf *pkt2 = pkts[i + 2];
|
||||
struct rte_mbuf *pkt3 = pkts[i + 3];
|
||||
|
||||
uint8_t *pkt0_data = rte_pktmbuf_mtod(pkt0, uint8_t *);
|
||||
uint8_t *pkt1_data = rte_pktmbuf_mtod(pkt1, uint8_t *);
|
||||
uint8_t *pkt2_data = rte_pktmbuf_mtod(pkt2, uint8_t *);
|
||||
uint8_t *pkt3_data = rte_pktmbuf_mtod(pkt3, uint8_t *);
|
||||
|
||||
uint64_t pkt0_subport = BITFIELD(pkt0_data,
|
||||
tm->tm_pktfield0_slabpos,
|
||||
tm->tm_pktfield0_slabmask,
|
||||
tm->tm_pktfield0_slabshr);
|
||||
uint64_t pkt0_pipe = BITFIELD(pkt0_data,
|
||||
tm->tm_pktfield1_slabpos,
|
||||
tm->tm_pktfield1_slabmask,
|
||||
tm->tm_pktfield1_slabshr);
|
||||
uint64_t pkt0_dscp = BITFIELD(pkt0_data,
|
||||
tm->tm_pktfield2_slabpos,
|
||||
tm->tm_pktfield2_slabmask,
|
||||
tm->tm_pktfield2_slabshr);
|
||||
uint32_t pkt0_tc = tm->tm_tc_table[pkt0_dscp & 0x3F] >> 2;
|
||||
uint32_t pkt0_tc_q = tm->tm_tc_table[pkt0_dscp & 0x3F] & 0x3;
|
||||
uint64_t pkt1_subport = BITFIELD(pkt1_data,
|
||||
tm->tm_pktfield0_slabpos,
|
||||
tm->tm_pktfield0_slabmask,
|
||||
tm->tm_pktfield0_slabshr);
|
||||
uint64_t pkt1_pipe = BITFIELD(pkt1_data,
|
||||
tm->tm_pktfield1_slabpos,
|
||||
tm->tm_pktfield1_slabmask,
|
||||
tm->tm_pktfield1_slabshr);
|
||||
uint64_t pkt1_dscp = BITFIELD(pkt1_data,
|
||||
tm->tm_pktfield2_slabpos,
|
||||
tm->tm_pktfield2_slabmask,
|
||||
tm->tm_pktfield2_slabshr);
|
||||
uint32_t pkt1_tc = tm->tm_tc_table[pkt1_dscp & 0x3F] >> 2;
|
||||
uint32_t pkt1_tc_q = tm->tm_tc_table[pkt1_dscp & 0x3F] & 0x3;
|
||||
|
||||
uint64_t pkt2_subport = BITFIELD(pkt2_data,
|
||||
tm->tm_pktfield0_slabpos,
|
||||
tm->tm_pktfield0_slabmask,
|
||||
tm->tm_pktfield0_slabshr);
|
||||
uint64_t pkt2_pipe = BITFIELD(pkt2_data,
|
||||
tm->tm_pktfield1_slabpos,
|
||||
tm->tm_pktfield1_slabmask,
|
||||
tm->tm_pktfield1_slabshr);
|
||||
uint64_t pkt2_dscp = BITFIELD(pkt2_data,
|
||||
tm->tm_pktfield2_slabpos,
|
||||
tm->tm_pktfield2_slabmask,
|
||||
tm->tm_pktfield2_slabshr);
|
||||
uint32_t pkt2_tc = tm->tm_tc_table[pkt2_dscp & 0x3F] >> 2;
|
||||
uint32_t pkt2_tc_q = tm->tm_tc_table[pkt2_dscp & 0x3F] & 0x3;
|
||||
|
||||
uint64_t pkt3_subport = BITFIELD(pkt3_data,
|
||||
tm->tm_pktfield0_slabpos,
|
||||
tm->tm_pktfield0_slabmask,
|
||||
tm->tm_pktfield0_slabshr);
|
||||
uint64_t pkt3_pipe = BITFIELD(pkt3_data,
|
||||
tm->tm_pktfield1_slabpos,
|
||||
tm->tm_pktfield1_slabmask,
|
||||
tm->tm_pktfield1_slabshr);
|
||||
uint64_t pkt3_dscp = BITFIELD(pkt3_data,
|
||||
tm->tm_pktfield2_slabpos,
|
||||
tm->tm_pktfield2_slabmask,
|
||||
tm->tm_pktfield2_slabshr);
|
||||
uint32_t pkt3_tc = tm->tm_tc_table[pkt3_dscp & 0x3F] >> 2;
|
||||
uint32_t pkt3_tc_q = tm->tm_tc_table[pkt3_dscp & 0x3F] & 0x3;
|
||||
|
||||
uint64_t pkt0_sched = RTE_SCHED_PORT_HIERARCHY(pkt0_subport,
|
||||
pkt0_pipe,
|
||||
pkt0_tc,
|
||||
pkt0_tc_q,
|
||||
0);
|
||||
uint64_t pkt1_sched = RTE_SCHED_PORT_HIERARCHY(pkt1_subport,
|
||||
pkt1_pipe,
|
||||
pkt1_tc,
|
||||
pkt1_tc_q,
|
||||
0);
|
||||
uint64_t pkt2_sched = RTE_SCHED_PORT_HIERARCHY(pkt2_subport,
|
||||
pkt2_pipe,
|
||||
pkt2_tc,
|
||||
pkt2_tc_q,
|
||||
0);
|
||||
uint64_t pkt3_sched = RTE_SCHED_PORT_HIERARCHY(pkt3_subport,
|
||||
pkt3_pipe,
|
||||
pkt3_tc,
|
||||
pkt3_tc_q,
|
||||
0);
|
||||
|
||||
pkt0->hash.sched.lo = pkt0_sched & 0xFFFFFFFF;
|
||||
pkt0->hash.sched.hi = pkt0_sched >> 32;
|
||||
pkt1->hash.sched.lo = pkt1_sched & 0xFFFFFFFF;
|
||||
pkt1->hash.sched.hi = pkt1_sched >> 32;
|
||||
pkt2->hash.sched.lo = pkt2_sched & 0xFFFFFFFF;
|
||||
pkt2->hash.sched.hi = pkt2_sched >> 32;
|
||||
pkt3->hash.sched.lo = pkt3_sched & 0xFFFFFFFF;
|
||||
pkt3->hash.sched.hi = pkt3_sched >> 32;
|
||||
}
|
||||
|
||||
for (; i < n_pkts; i++) {
|
||||
struct rte_mbuf *pkt = pkts[i];
|
||||
|
||||
uint8_t *pkt_data = rte_pktmbuf_mtod(pkt, uint8_t *);
|
||||
|
||||
uint64_t pkt_subport = BITFIELD(pkt_data,
|
||||
tm->tm_pktfield0_slabpos,
|
||||
tm->tm_pktfield0_slabmask,
|
||||
tm->tm_pktfield0_slabshr);
|
||||
uint64_t pkt_pipe = BITFIELD(pkt_data,
|
||||
tm->tm_pktfield1_slabpos,
|
||||
tm->tm_pktfield1_slabmask,
|
||||
tm->tm_pktfield1_slabshr);
|
||||
uint64_t pkt_dscp = BITFIELD(pkt_data,
|
||||
tm->tm_pktfield2_slabpos,
|
||||
tm->tm_pktfield2_slabmask,
|
||||
tm->tm_pktfield2_slabshr);
|
||||
uint32_t pkt_tc = tm->tm_tc_table[pkt_dscp & 0x3F] >> 2;
|
||||
uint32_t pkt_tc_q = tm->tm_tc_table[pkt_dscp & 0x3F] & 0x3;
|
||||
|
||||
uint64_t pkt_sched = RTE_SCHED_PORT_HIERARCHY(pkt_subport,
|
||||
pkt_pipe,
|
||||
pkt_tc,
|
||||
pkt_tc_q,
|
||||
0);
|
||||
|
||||
pkt->hash.sched.lo = pkt_sched & 0xFFFFFFFF;
|
||||
pkt->hash.sched.hi = pkt_sched >> 32;
|
||||
}
|
||||
}
|
||||
static struct fwd_lcore *softnic_fwd_lcore;
|
||||
static uint16_t softnic_port_id;
|
||||
struct fwd_engine softnic_fwd_engine;
|
||||
|
||||
/*
|
||||
* Soft port packet forward
|
||||
* Softnic packet forward
|
||||
*/
|
||||
static void
|
||||
softport_packet_fwd(struct fwd_stream *fs)
|
||||
softnic_fwd(struct fwd_stream *fs)
|
||||
{
|
||||
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
|
||||
struct rte_port *rte_tx_port = &ports[fs->tx_port];
|
||||
uint16_t nb_rx;
|
||||
uint16_t nb_tx;
|
||||
uint32_t retry;
|
||||
@ -258,14 +106,6 @@ softport_packet_fwd(struct fwd_stream *fs)
|
||||
fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
|
||||
#endif
|
||||
|
||||
if (rte_tx_port->softnic_enable) {
|
||||
/* Set packet metadata if tm flag enabled */
|
||||
if (rte_tx_port->softport.tm_flag)
|
||||
pkt_metadata_set(rte_tx_port, pkts_burst, nb_rx);
|
||||
|
||||
/* Softport run */
|
||||
rte_pmd_softnic_run(fs->tx_port);
|
||||
}
|
||||
nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue,
|
||||
pkts_burst, nb_rx);
|
||||
|
||||
@ -298,7 +138,34 @@ softport_packet_fwd(struct fwd_stream *fs)
|
||||
}
|
||||
|
||||
static void
|
||||
set_tm_hiearchy_nodes_shaper_rate(portid_t port_id, struct tm_hierarchy *h)
|
||||
softnic_fwd_run(struct fwd_stream *fs)
|
||||
{
|
||||
rte_pmd_softnic_run(softnic_port_id);
|
||||
softnic_fwd(fs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Softnic init
|
||||
*/
|
||||
static int
|
||||
softnic_begin(void *arg __rte_unused)
|
||||
{
|
||||
for (;;) {
|
||||
if (!softnic_fwd_lcore->stopped)
|
||||
break;
|
||||
}
|
||||
|
||||
do {
|
||||
/* Run softnic */
|
||||
rte_pmd_softnic_run(softnic_port_id);
|
||||
} while (!softnic_fwd_lcore->stopped);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
set_tm_hiearchy_nodes_shaper_rate(portid_t port_id,
|
||||
struct tm_hierarchy *h)
|
||||
{
|
||||
struct rte_eth_link link_params;
|
||||
uint64_t tm_port_rate;
|
||||
@ -306,7 +173,7 @@ set_tm_hiearchy_nodes_shaper_rate(portid_t port_id, struct tm_hierarchy *h)
|
||||
memset(&link_params, 0, sizeof(link_params));
|
||||
|
||||
rte_eth_link_get(port_id, &link_params);
|
||||
tm_port_rate = (uint64_t)link_params.link_speed * BYTES_IN_MBPS;
|
||||
tm_port_rate = (uint64_t)ETH_SPEED_NUM_10G * BYTES_IN_MBPS;
|
||||
|
||||
if (tm_port_rate > UINT32_MAX)
|
||||
tm_port_rate = UINT32_MAX;
|
||||
@ -374,7 +241,8 @@ softport_tm_root_node_add(portid_t port_id, struct tm_hierarchy *h,
|
||||
}
|
||||
|
||||
static int
|
||||
softport_tm_subport_node_add(portid_t port_id, struct tm_hierarchy *h,
|
||||
softport_tm_subport_node_add(portid_t port_id,
|
||||
struct tm_hierarchy *h,
|
||||
struct rte_tm_error *error)
|
||||
{
|
||||
uint32_t subport_parent_node_id, subport_node_id = 0;
|
||||
@ -442,7 +310,8 @@ softport_tm_subport_node_add(portid_t port_id, struct tm_hierarchy *h,
|
||||
}
|
||||
|
||||
static int
|
||||
softport_tm_pipe_node_add(portid_t port_id, struct tm_hierarchy *h,
|
||||
softport_tm_pipe_node_add(portid_t port_id,
|
||||
struct tm_hierarchy *h,
|
||||
struct rte_tm_error *error)
|
||||
{
|
||||
uint32_t pipe_parent_node_id;
|
||||
@ -511,7 +380,8 @@ softport_tm_pipe_node_add(portid_t port_id, struct tm_hierarchy *h,
|
||||
}
|
||||
|
||||
static int
|
||||
softport_tm_tc_node_add(portid_t port_id, struct tm_hierarchy *h,
|
||||
softport_tm_tc_node_add(portid_t port_id,
|
||||
struct tm_hierarchy *h,
|
||||
struct rte_tm_error *error)
|
||||
{
|
||||
uint32_t tc_parent_node_id;
|
||||
@ -674,63 +544,9 @@ softport_tm_queue_node_add(portid_t port_id, struct tm_hierarchy *h,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* TM Packet Field Setup
|
||||
*/
|
||||
static void
|
||||
softport_tm_pktfield_setup(portid_t port_id)
|
||||
{
|
||||
struct rte_port *p = &ports[port_id];
|
||||
uint64_t pktfield0_mask = 0;
|
||||
uint64_t pktfield1_mask = 0x0000000FFF000000LLU;
|
||||
uint64_t pktfield2_mask = 0x00000000000000FCLLU;
|
||||
|
||||
p->softport.tm = (struct softnic_port_tm) {
|
||||
.n_subports_per_port = SUBPORT_NODES_PER_PORT,
|
||||
.n_pipes_per_subport = PIPE_NODES_PER_SUBPORT,
|
||||
|
||||
/* Packet field to identify subport
|
||||
*
|
||||
* Default configuration assumes only one subport, thus
|
||||
* the subport ID is hardcoded to 0
|
||||
*/
|
||||
.tm_pktfield0_slabpos = 0,
|
||||
.tm_pktfield0_slabmask = pktfield0_mask,
|
||||
.tm_pktfield0_slabshr =
|
||||
__builtin_ctzll(pktfield0_mask),
|
||||
|
||||
/* Packet field to identify pipe.
|
||||
*
|
||||
* Default value assumes Ethernet/IPv4/UDP packets,
|
||||
* UDP payload bits 12 .. 23
|
||||
*/
|
||||
.tm_pktfield1_slabpos = 40,
|
||||
.tm_pktfield1_slabmask = pktfield1_mask,
|
||||
.tm_pktfield1_slabshr =
|
||||
__builtin_ctzll(pktfield1_mask),
|
||||
|
||||
/* Packet field used as index into TC translation table
|
||||
* to identify the traffic class and queue.
|
||||
*
|
||||
* Default value assumes Ethernet/IPv4 packets, IPv4
|
||||
* DSCP field
|
||||
*/
|
||||
.tm_pktfield2_slabpos = 8,
|
||||
.tm_pktfield2_slabmask = pktfield2_mask,
|
||||
.tm_pktfield2_slabshr =
|
||||
__builtin_ctzll(pktfield2_mask),
|
||||
|
||||
.tm_tc_table = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
}, /**< TC translation table */
|
||||
};
|
||||
}
|
||||
|
||||
static int
|
||||
softport_tm_hierarchy_specify(portid_t port_id, struct rte_tm_error *error)
|
||||
softport_tm_hierarchy_specify(portid_t port_id,
|
||||
struct rte_tm_error *error)
|
||||
{
|
||||
|
||||
struct tm_hierarchy h;
|
||||
@ -766,75 +582,96 @@ softport_tm_hierarchy_specify(portid_t port_id, struct rte_tm_error *error)
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
/* TM packet fields setup */
|
||||
softport_tm_pktfield_setup(port_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Soft port Init
|
||||
* Softnic TM default configuration
|
||||
*/
|
||||
static void
|
||||
softport_tm_begin(portid_t pi)
|
||||
softnic_tm_default_config(portid_t pi)
|
||||
{
|
||||
struct rte_port *port = &ports[pi];
|
||||
struct rte_tm_error error;
|
||||
int status;
|
||||
|
||||
/* Soft port TM flag */
|
||||
if (port->softport.tm_flag == 1) {
|
||||
printf("\n\n TM feature available on port %u\n", pi);
|
||||
/* Stop port */
|
||||
rte_eth_dev_stop(pi);
|
||||
|
||||
/* Soft port TM hierarchy configuration */
|
||||
if ((port->softport.tm.hierarchy_config == 0) &&
|
||||
(port->softport.tm.default_hierarchy_enable == 1)) {
|
||||
struct rte_tm_error error;
|
||||
int status;
|
||||
|
||||
/* Stop port */
|
||||
rte_eth_dev_stop(pi);
|
||||
|
||||
/* TM hierarchy specification */
|
||||
status = softport_tm_hierarchy_specify(pi, &error);
|
||||
if (status) {
|
||||
printf(" TM Hierarchy built error(%d) - %s\n",
|
||||
error.type, error.message);
|
||||
return;
|
||||
}
|
||||
printf("\n TM Hierarchy Specified!\n\v");
|
||||
|
||||
/* TM hierarchy commit */
|
||||
status = rte_tm_hierarchy_commit(pi, 0, &error);
|
||||
if (status) {
|
||||
printf(" Hierarchy commit error(%d) - %s\n",
|
||||
error.type, error.message);
|
||||
return;
|
||||
}
|
||||
printf(" Hierarchy Committed (port %u)!", pi);
|
||||
port->softport.tm.hierarchy_config = 1;
|
||||
|
||||
/* Start port */
|
||||
status = rte_eth_dev_start(pi);
|
||||
if (status) {
|
||||
printf("\n Port %u start error!\n", pi);
|
||||
return;
|
||||
}
|
||||
printf("\n Port %u started!\n", pi);
|
||||
return;
|
||||
}
|
||||
/* TM hierarchy specification */
|
||||
status = softport_tm_hierarchy_specify(pi, &error);
|
||||
if (status) {
|
||||
printf(" TM Hierarchy built error(%d) - %s\n",
|
||||
error.type, error.message);
|
||||
return;
|
||||
}
|
||||
printf("\n TM feature not available on port %u", pi);
|
||||
printf("\n TM Hierarchy Specified!\n");
|
||||
|
||||
/* TM hierarchy commit */
|
||||
status = rte_tm_hierarchy_commit(pi, 0, &error);
|
||||
if (status) {
|
||||
printf(" Hierarchy commit error(%d) - %s\n",
|
||||
error.type, error.message);
|
||||
return;
|
||||
}
|
||||
printf(" Hierarchy Committed (port %u)!\n", pi);
|
||||
|
||||
/* Start port */
|
||||
status = rte_eth_dev_start(pi);
|
||||
if (status) {
|
||||
printf("\n Port %u start error!\n", pi);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Reset the default hierarchy flag */
|
||||
port->softport.default_tm_hierarchy_enable = 0;
|
||||
}
|
||||
|
||||
struct fwd_engine softnic_tm_engine = {
|
||||
.fwd_mode_name = "tm",
|
||||
.port_fwd_begin = softport_tm_begin,
|
||||
.port_fwd_end = NULL,
|
||||
.packet_fwd = softport_packet_fwd,
|
||||
};
|
||||
/*
|
||||
* Softnic forwarding init
|
||||
*/
|
||||
static void
|
||||
softnic_fwd_begin(portid_t pi)
|
||||
{
|
||||
struct rte_port *port = &ports[pi];
|
||||
uint32_t lcore, fwd_core_present = 0, softnic_run_launch = 0;
|
||||
int status;
|
||||
|
||||
struct fwd_engine softnic_tm_bypass_engine = {
|
||||
.fwd_mode_name = "tm-bypass",
|
||||
.port_fwd_begin = NULL,
|
||||
softnic_fwd_lcore = port->softport.fwd_lcore_arg[0];
|
||||
softnic_port_id = pi;
|
||||
|
||||
/* Launch softnic_run function on lcores */
|
||||
for (lcore = 0; lcore < RTE_MAX_LCORE; lcore++) {
|
||||
if (!rte_lcore_is_enabled(lcore))
|
||||
continue;
|
||||
|
||||
if (lcore == rte_get_master_lcore())
|
||||
continue;
|
||||
|
||||
if (fwd_core_present == 0) {
|
||||
fwd_core_present++;
|
||||
continue;
|
||||
}
|
||||
|
||||
status = rte_eal_remote_launch(softnic_begin, NULL, lcore);
|
||||
if (status)
|
||||
printf("softnic launch on lcore %u failed (%d)\n",
|
||||
lcore, status);
|
||||
|
||||
softnic_run_launch = 1;
|
||||
}
|
||||
|
||||
if (!softnic_run_launch)
|
||||
softnic_fwd_engine.packet_fwd = softnic_fwd_run;
|
||||
|
||||
/* Softnic TM default configuration */
|
||||
if (port->softport.default_tm_hierarchy_enable == 1)
|
||||
softnic_tm_default_config(pi);
|
||||
}
|
||||
|
||||
struct fwd_engine softnic_fwd_engine = {
|
||||
.fwd_mode_name = "softnic",
|
||||
.port_fwd_begin = softnic_fwd_begin,
|
||||
.port_fwd_end = NULL,
|
||||
.packet_fwd = softport_packet_fwd,
|
||||
.packet_fwd = softnic_fwd,
|
||||
};
|
@ -155,9 +155,8 @@ struct fwd_engine * fwd_engines[] = {
|
||||
&tx_only_engine,
|
||||
&csum_fwd_engine,
|
||||
&icmp_echo_engine,
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED
|
||||
&softnic_tm_engine,
|
||||
&softnic_tm_bypass_engine,
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC
|
||||
&softnic_fwd_engine,
|
||||
#endif
|
||||
#ifdef RTE_LIBRTE_IEEE1588
|
||||
&ieee1588_fwd_engine,
|
||||
@ -815,6 +814,19 @@ init_config(void)
|
||||
"rte_gro_ctx_create() failed\n");
|
||||
}
|
||||
}
|
||||
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC
|
||||
if (strcmp(cur_fwd_eng->fwd_mode_name, "softnic") == 0) {
|
||||
RTE_ETH_FOREACH_DEV(pid) {
|
||||
port = &ports[pid];
|
||||
const char *driver = port->dev_info.driver_name;
|
||||
|
||||
if (strcmp(driver, "net_softnic") == 0)
|
||||
port->softport.fwd_lcore_arg = fwd_lcores;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -2390,17 +2402,6 @@ init_port_config(void)
|
||||
(rte_eth_devices[pid].data->dev_flags &
|
||||
RTE_ETH_DEV_INTR_RMV))
|
||||
port->dev_conf.intr_conf.rmv = 1;
|
||||
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED
|
||||
/* Detect softnic port */
|
||||
if (!strcmp(port->dev_info.driver_name, "net_softnic")) {
|
||||
port->softnic_enable = 1;
|
||||
memset(&port->softport, 0, sizeof(struct softnic_port));
|
||||
|
||||
if (!strcmp(cur_fwd_eng->fwd_mode_name, "tm"))
|
||||
port->softport.tm_flag = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -57,10 +57,10 @@ typedef uint16_t streamid_t;
|
||||
|
||||
#define MAX_QUEUE_ID ((1 << (sizeof(queueid_t) * 8)) - 1)
|
||||
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED
|
||||
#define TM_MODE 1
|
||||
#if defined RTE_LIBRTE_PMD_SOFTNIC
|
||||
#define SOFTNIC 1
|
||||
#else
|
||||
#define TM_MODE 0
|
||||
#define SOFTNIC 0
|
||||
#endif
|
||||
|
||||
enum {
|
||||
@ -135,35 +135,13 @@ struct port_flow {
|
||||
uint8_t data[]; /**< Storage for pattern/actions. */
|
||||
};
|
||||
|
||||
#ifdef TM_MODE
|
||||
/**
|
||||
* Soft port tm related parameters
|
||||
*/
|
||||
struct softnic_port_tm {
|
||||
uint32_t default_hierarchy_enable; /**< def hierarchy enable flag */
|
||||
uint32_t hierarchy_config; /**< set to 1 if hierarchy configured */
|
||||
|
||||
uint32_t n_subports_per_port; /**< Num of subport nodes per port */
|
||||
uint32_t n_pipes_per_subport; /**< Num of pipe nodes per subport */
|
||||
|
||||
uint64_t tm_pktfield0_slabpos; /**< Pkt field position for subport */
|
||||
uint64_t tm_pktfield0_slabmask; /**< Pkt field mask for the subport */
|
||||
uint64_t tm_pktfield0_slabshr;
|
||||
uint64_t tm_pktfield1_slabpos; /**< Pkt field position for the pipe */
|
||||
uint64_t tm_pktfield1_slabmask; /**< Pkt field mask for the pipe */
|
||||
uint64_t tm_pktfield1_slabshr;
|
||||
uint64_t tm_pktfield2_slabpos; /**< Pkt field position table index */
|
||||
uint64_t tm_pktfield2_slabmask; /**< Pkt field mask for tc table idx */
|
||||
uint64_t tm_pktfield2_slabshr;
|
||||
uint64_t tm_tc_table[64]; /**< TC translation table */
|
||||
};
|
||||
|
||||
#ifdef SOFTNIC
|
||||
/**
|
||||
* The data structure associate with softnic port
|
||||
*/
|
||||
struct softnic_port {
|
||||
unsigned int tm_flag; /**< set to 1 if tm feature is enabled */
|
||||
struct softnic_port_tm tm; /**< softnic port tm parameters */
|
||||
uint32_t default_tm_hierarchy_enable; /**< default tm hierarchy */
|
||||
struct fwd_lcore **fwd_lcore_arg; /**< softnic fwd core parameters */
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -202,9 +180,8 @@ struct rte_port {
|
||||
uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */
|
||||
uint8_t slave_flag; /**< bonding slave port */
|
||||
struct port_flow *flow_list; /**< Associated flows. */
|
||||
#ifdef TM_MODE
|
||||
unsigned int softnic_enable; /**< softnic flag */
|
||||
struct softnic_port softport; /**< softnic port params */
|
||||
#ifdef SOFTNIC
|
||||
struct softnic_port softport; /**< softnic params */
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -266,9 +243,8 @@ extern struct fwd_engine rx_only_engine;
|
||||
extern struct fwd_engine tx_only_engine;
|
||||
extern struct fwd_engine csum_fwd_engine;
|
||||
extern struct fwd_engine icmp_echo_engine;
|
||||
#ifdef TM_MODE
|
||||
extern struct fwd_engine softnic_tm_engine;
|
||||
extern struct fwd_engine softnic_tm_bypass_engine;
|
||||
#ifdef SOFTNIC
|
||||
extern struct fwd_engine softnic_fwd_engine;
|
||||
#endif
|
||||
#ifdef RTE_LIBRTE_IEEE1588
|
||||
extern struct fwd_engine ieee1588_fwd_engine;
|
||||
|
Loading…
Reference in New Issue
Block a user