@@ -130,3 +130,44 @@ interface that accepts commands as described in `using the
application`_. Individual call-back functions handle the detail
associated with each command, which make use of librte_ethtool
library.
+
+Control Interface
+~~~~~~~~~~~~~~~~~
+
+If Kernel Control Path (KCP) kernel module (rte_kcp.ko) inserted,
+virtual interfaces created for each DPDK port for control purposes.
+
+Created interfaces are named as dpdk#, like:
+
+.. code-block:: console
+
+ # ifconfig dpdk0; ifconfig dpdk1
+ dpdk0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
+ ether 90:e2:ba:0e:49:b9 txqueuelen 1000 (Ethernet)
+ RX packets 0 bytes 0 (0.0 B)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 0 bytes 0 (0.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+ dpdk1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
+ ether 00:1b:21:76:fa:21 txqueuelen 1000 (Ethernet)
+ RX packets 0 bytes 0 (0.0 B)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 0 bytes 0 (0.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+Regular Linux commands can be issued on interfaces:
+
+.. code-block:: console
+
+ # ethtool -i dpdk0
+ driver: rte_ixgbe_pmd
+ version: RTE 2.3.0-rc0
+ firmware-version:
+ expansion-rom-version:
+ bus-info: 0000:08:00.1
+ supports-statistics: yes
+ supports-test: no
+ supports-eeprom-access: yes
+ supports-register-dump: yes
+ supports-priv-flags: no
@@ -1,7 +1,7 @@
/*-
* BSD LICENSE
*
- * Copyright(c) 2015 Intel Corporation. All rights reserved.
+ * Copyright(c) 2015-2016 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -44,6 +44,7 @@
#include <rte_memory.h>
#include <rte_mempool.h>
#include <rte_mbuf.h>
+#include <rte_ctrl_if.h>
#include "ethapp.h"
@@ -54,7 +55,6 @@
#define PKTPOOL_EXTRA_SIZE 512
#define PKTPOOL_CACHE 32
-
struct txq_port {
uint16_t cnt_unsent;
struct rte_mbuf *buf_frames[MAX_BURST_LENGTH];
@@ -259,11 +259,32 @@ static int slave_main(__attribute__((unused)) void *ptr_data)
return 0;
}
+static void *
+control_function(__attribute__((unused)) void *arg)
+{
+ int port_id;
+
+ while (1) {
+ /* blocking call with 1 sec timeout */
+ port_id = rte_eth_control_interface_msg_exist(1);
+ if (port_id < 0)
+ continue;
+
+ lock_port(port_id);
+ rte_eth_control_interface_msg_process(
+ RTE_ETHTOOL_CTRL_IF_PROCESS_MSG);
+ unlock_port(port_id);
+ }
+
+ return 0;
+}
+
int main(int argc, char **argv)
{
int cnt_args_parsed;
uint32_t id_core;
uint32_t cnt_ports;
+ pthread_t control_thread;
/* Init runtime enviornment */
cnt_args_parsed = rte_eal_init(argc, argv);
@@ -293,6 +314,9 @@ int main(int argc, char **argv)
id_core = rte_get_next_lcore(id_core, 1, 1);
rte_eal_remote_launch(slave_main, NULL, id_core);
+ pthread_create(&control_thread, NULL, control_function, NULL);
+ rte_eth_control_interface_create();
+
ethapp_main();
app_cfg.exit_now = 1;
@@ -301,5 +325,8 @@ int main(int argc, char **argv)
return -1;
}
+ rte_eth_control_interface_destroy();
+ pthread_cancel(control_thread);
+
return 0;
}