/*-
* BSD LICENSE
*
- * Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include <rte_memcpy.h>
#include <rte_memzone.h>
#include <rte_launch.h>
-#include <rte_tailq.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
uint16_t nb_tx_queue_stats_mappings = 0;
uint16_t nb_rx_queue_stats_mappings = 0;
+unsigned max_socket = 0;
+
/* Forward function declarations */
static void map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port);
static void check_all_ports_link_status(uint32_t port_mask);
if (ports == NULL)
rte_exit(-EINVAL, "failed to find a next port id\n");
- while ((ports[p].enabled == 0) && (p < size))
+ while ((p < size) && (ports[p].enabled == 0))
p++;
return p;
}
{
unsigned int i;
unsigned int nb_lc;
+ unsigned int sock_num;
nb_lc = 0;
for (i = 0; i < RTE_MAX_LCORE; i++) {
if (i == rte_get_master_lcore())
continue;
fwd_lcores_cpuids[nb_lc++] = i;
+ sock_num = rte_lcore_to_socket_id(i) + 1;
+ if (sock_num > max_socket) {
+ if (sock_num > RTE_MAX_NUMA_NODES)
+ rte_exit(EXIT_FAILURE, "Total sockets greater than %u\n", RTE_MAX_NUMA_NODES);
+ max_socket = sock_num;
+ }
}
nb_lcores = (lcoreid_t) nb_lc;
nb_cfg_lcores = nb_lcores;
/*
* Configuration initialisation done once at init time.
*/
-struct mbuf_ctor_arg {
- uint16_t seg_buf_offset; /**< offset of data in data segment of mbuf. */
- uint16_t seg_buf_size; /**< size of data segment in mbuf. */
-};
-
-struct mbuf_pool_ctor_arg {
- uint16_t seg_buf_size; /**< size of data segment in mbuf. */
-};
-
-static void
-testpmd_mbuf_ctor(struct rte_mempool *mp,
- void *opaque_arg,
- void *raw_mbuf,
- __attribute__((unused)) unsigned i)
-{
- struct mbuf_ctor_arg *mb_ctor_arg;
- struct rte_mbuf *mb;
-
- mb_ctor_arg = (struct mbuf_ctor_arg *) opaque_arg;
- mb = (struct rte_mbuf *) raw_mbuf;
-
- mb->pool = mp;
- mb->buf_addr = (void *) ((char *)mb + mb_ctor_arg->seg_buf_offset);
- mb->buf_physaddr = (uint64_t) (rte_mempool_virt2phy(mp, mb) +
- mb_ctor_arg->seg_buf_offset);
- mb->buf_len = mb_ctor_arg->seg_buf_size;
- mb->ol_flags = 0;
- mb->data_off = RTE_PKTMBUF_HEADROOM;
- mb->nb_segs = 1;
- mb->tx_offload = 0;
- mb->vlan_tci = 0;
- mb->hash.rss = 0;
-}
-
-static void
-testpmd_mbuf_pool_ctor(struct rte_mempool *mp,
- void *opaque_arg)
-{
- struct mbuf_pool_ctor_arg *mbp_ctor_arg;
- struct rte_pktmbuf_pool_private *mbp_priv;
-
- if (mp->private_data_size < sizeof(struct rte_pktmbuf_pool_private)) {
- printf("%s(%s) private_data_size %d < %d\n",
- __func__, mp->name, (int) mp->private_data_size,
- (int) sizeof(struct rte_pktmbuf_pool_private));
- return;
- }
- mbp_ctor_arg = (struct mbuf_pool_ctor_arg *) opaque_arg;
- mbp_priv = rte_mempool_get_priv(mp);
- mbp_priv->mbuf_data_room_size = mbp_ctor_arg->seg_buf_size;
-}
-
static void
mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf,
unsigned int socket_id)
{
char pool_name[RTE_MEMPOOL_NAMESIZE];
struct rte_mempool *rte_mp;
- struct mbuf_pool_ctor_arg mbp_ctor_arg;
- struct mbuf_ctor_arg mb_ctor_arg;
uint32_t mb_size;
- mbp_ctor_arg.seg_buf_size = (uint16_t) (RTE_PKTMBUF_HEADROOM +
- mbuf_seg_size);
- mb_ctor_arg.seg_buf_offset =
- (uint16_t) RTE_CACHE_LINE_ROUNDUP(sizeof(struct rte_mbuf));
- mb_ctor_arg.seg_buf_size = mbp_ctor_arg.seg_buf_size;
- mb_size = mb_ctor_arg.seg_buf_offset + mb_ctor_arg.seg_buf_size;
+ mb_size = sizeof(struct rte_mbuf) + mbuf_seg_size;
mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name));
#ifdef RTE_LIBRTE_PMD_XENVIRT
rte_mp = rte_mempool_gntalloc_create(pool_name, nb_mbuf, mb_size,
- (unsigned) mb_mempool_cache,
- sizeof(struct rte_pktmbuf_pool_private),
- testpmd_mbuf_pool_ctor, &mbp_ctor_arg,
- testpmd_mbuf_ctor, &mb_ctor_arg,
- socket_id, 0);
+ (unsigned) mb_mempool_cache,
+ sizeof(struct rte_pktmbuf_pool_private),
+ rte_pktmbuf_pool_init, NULL,
+ rte_pktmbuf_init, NULL,
+ socket_id, 0);
rte_mp = mempool_anon_create(pool_name, nb_mbuf, mb_size,
(unsigned) mb_mempool_cache,
sizeof(struct rte_pktmbuf_pool_private),
- testpmd_mbuf_pool_ctor, &mbp_ctor_arg,
- testpmd_mbuf_ctor, &mb_ctor_arg,
+ rte_pktmbuf_pool_init, NULL,
+ rte_pktmbuf_init, NULL,
socket_id, 0);
else
- rte_mp = rte_mempool_create(pool_name, nb_mbuf, mb_size,
- (unsigned) mb_mempool_cache,
- sizeof(struct rte_pktmbuf_pool_private),
- testpmd_mbuf_pool_ctor, &mbp_ctor_arg,
- testpmd_mbuf_ctor, &mb_ctor_arg,
- socket_id, 0);
+ /* wrapper to rte_mempool_create() */
+ rte_mp = rte_pktmbuf_pool_create(pool_name, nb_mbuf,
+ mb_mempool_cache, 0, mbuf_seg_size, socket_id);
#endif
{
static int warning_once = 0;
- if (socket_id >= MAX_SOCKET) {
+ if (socket_id >= max_socket) {
if (!warning_once && numa_support)
printf("Warning: NUMA should be configured manually by"
" using --port-numa-config and"
struct rte_mempool *mbp;
unsigned int nb_mbuf_per_pool;
lcoreid_t lc_id;
- uint8_t port_per_socket[MAX_SOCKET];
+ uint8_t port_per_socket[RTE_MAX_NUMA_NODES];
- memset(port_per_socket,0,MAX_SOCKET);
+ memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
/* Configuration of logical cores. */
fwd_lcores = rte_zmalloc("testpmd: fwd_lcores",
sizeof(struct fwd_lcore *) * nb_lcores,
if (param_total_num_mbufs)
nb_mbuf_per_pool = nb_mbuf_per_pool/nb_ports;
- for (i = 0; i < MAX_SOCKET; i++) {
+ for (i = 0; i < max_socket; i++) {
nb_mbuf = (nb_mbuf_per_pool * RTE_MAX_ETHPORTS);
if (nb_mbuf)
mbuf_pool_create(mbuf_data_size,
FOREACH_PORT(pi, ports) {
port = &ports[pi];
/* Check if there is a port which is not started */
- if (port->port_status != RTE_PORT_STARTED)
+ if ((port->port_status != RTE_PORT_STARTED) &&
+ (port->slave_flag == 0))
return 0;
}
FOREACH_PORT(pi, ports) {
port = &ports[pi];
- if (port->port_status != RTE_PORT_STOPPED)
+ if ((port->port_status != RTE_PORT_STOPPED) &&
+ (port->slave_flag == 0))
return 0;
}
return -1;
}
+ if (port_id_is_invalid(pid, ENABLED_WARN))
+ return 0;
+
if (init_fwd_streams() < 0) {
printf("Fail from init_fwd_streams()\n");
return -1;
dcb_test = 0;
dcb_config = 0;
}
+
+ if (port_id_is_invalid(pid, ENABLED_WARN))
+ return;
+
printf("Stopping ports...\n");
FOREACH_PORT(pi, ports) {
- if (!port_id_is_invalid(pid, DISABLED_WARN) && pid != pi)
+ if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
continue;
port = &ports[pi];
return;
}
+ if (port_id_is_invalid(pid, ENABLED_WARN))
+ return;
+
printf("Closing ports...\n");
FOREACH_PORT(pi, ports) {
- if (!port_id_is_invalid(pid, DISABLED_WARN) && pid != pi)
+ if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
continue;
port = &ports[pi];
+ if (rte_atomic16_cmpset(&(port->port_status),
+ RTE_PORT_CLOSED, RTE_PORT_CLOSED) == 1) {
+ printf("Port %d is already closed\n", pi);
+ continue;
+ }
+
if (rte_atomic16_cmpset(&(port->port_status),
RTE_PORT_STOPPED, RTE_PORT_HANDLING) == 0) {
printf("Port %d is now not stopped\n", pi);
return;
}
- rte_eth_promiscuous_disable(port_id);
-
if (rte_eth_dev_detach(port_id, name))
return;
{
portid_t pt_id;
+ if (test_done == 0)
+ stop_packet_forwarding();
+
FOREACH_PORT(pt_id, ports) {
printf("Stopping port %d...", pt_id);
fflush(stdout);
}
}
+void set_port_slave_flag(portid_t slave_pid)
+{
+ struct rte_port *port;
+
+ port = &ports[slave_pid];
+ port->slave_flag = 1;
+}
+
+void clear_port_slave_flag(portid_t slave_pid)
+{
+ struct rte_port *port;
+
+ port = &ports[slave_pid];
+ port->slave_flag = 0;
+}
+
const uint16_t vlan_tags[] = {
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
{
uint8_t i;
- /*
- * Builds up the correct configuration for dcb+vt based on the vlan tags array
- * given above, and the number of traffic classes available for use.
- */
+ /*
+ * Builds up the correct configuration for dcb+vt based on the vlan tags array
+ * given above, and the number of traffic classes available for use.
+ */
if (dcb_conf->dcb_mode == DCB_VT_ENABLED) {
struct rte_eth_vmdq_dcb_conf vmdq_rx_conf;
struct rte_eth_vmdq_dcb_tx_conf vmdq_tx_conf;