summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-11-16 17:26:59 +0200
committerimarom <imarom@cisco.com>2016-11-16 17:26:59 +0200
commite46e3f598e52112b9db21d6faabde7a5c87341cb (patch)
tree1d2879e82277bfe17788c788ddcf4584f1be42e1 /src
parent558ce764c2a5feaf376b562e455a2e9c1115701a (diff)
RX features - ARP resolve
Signed-off-by: imarom <imarom@cisco.com>
Diffstat (limited to 'src')
-rw-r--r--src/rpc-server/commands/trex_rpc_cmd_general.cpp66
-rw-r--r--src/rpc-server/commands/trex_rpc_cmds.h4
-rw-r--r--src/stateless/dp/trex_stateless_dp_core.cpp29
-rw-r--r--src/trex_port_attr.cpp6
-rwxr-xr-xsrc/trex_port_attr.h17
5 files changed, 44 insertions, 78 deletions
diff --git a/src/rpc-server/commands/trex_rpc_cmd_general.cpp b/src/rpc-server/commands/trex_rpc_cmd_general.cpp
index e7f0de7b..14b38165 100644
--- a/src/rpc-server/commands/trex_rpc_cmd_general.cpp
+++ b/src/rpc-server/commands/trex_rpc_cmd_general.cpp
@@ -385,13 +385,11 @@ TrexRpcCmdSetPortAttr::parse_dest(const Json::Value &msg, uint8_t port_id, Json:
uint8_t mac[6];
if (utl_ipv4_to_uint32(addr.c_str(), ipv4_addr)) {
- if (port_attr->get_src_ipv4() == 0) {
- generate_parse_err(result, "unable to configure 'dest' as IPv4 without source IPv4 address configured");
- }
port_attr->get_dest().set_dest_ipv4(ipv4_addr);
} else if (utl_str_to_macaddr(addr, mac)) {
port_attr->get_dest().set_dest_mac(mac);
+
} else {
std::stringstream ss;
ss << "'dest' is not an IPv4 address or a MAC address: '" << addr << "'";
@@ -404,33 +402,22 @@ TrexRpcCmdSetPortAttr::parse_dest(const Json::Value &msg, uint8_t port_id, Json:
/**
- * attributes in the high priority pass must be handled first
- * for example, IPv4 configuration should be handled before dest
- *
+ * set port commands
+ *
+ * @author imarom (24-Feb-16)
+ *
+ * @param params
+ * @param result
+ *
+ * @return trex_rpc_cmd_rc_e
*/
-void
-TrexRpcCmdSetPortAttr::high_priority_pass(const Json::Value &attr, uint8_t port_id, Json::Value &result) {
- int ret = 0;
-
- /* first iteration - high priority attributes */
- for (const std::string &name : attr.getMemberNames()) {
- if (name == "ipv4") {
- const Json::Value &ipv4 = parse_object(attr, name, result);
- ret = parse_ipv4(ipv4, port_id, result);
- }
-
- /* check error code */
- if ( ret == -ENOTSUP ) {
- generate_execute_err(result, "Error applying " + name + ": operation is not supported for this NIC.");
- } else if (ret) {
- generate_execute_err(result, "Error applying " + name + " attribute, return value: " + to_string(ret));
- }
- }
-}
+trex_rpc_cmd_rc_e
+TrexRpcCmdSetPortAttr::_run(const Json::Value &params, Json::Value &result) {
+ uint8_t port_id = parse_port(params, result);
+
+ const Json::Value &attr = parse_object(params, "attr", result);
-void
-TrexRpcCmdSetPortAttr::regular_priority_pass(const Json::Value &attr, uint8_t port_id, Json::Value &result) {
int ret = 0;
/* iterate over all attributes in the dict */
@@ -462,7 +449,8 @@ TrexRpcCmdSetPortAttr::regular_priority_pass(const Json::Value &attr, uint8_t po
}
else if (name == "ipv4") {
- /* ignore - was already taken care of in the high priority pass */
+ const Json::Value &ipv4 = parse_object(attr, name, result);
+ ret = parse_ipv4(ipv4, port_id, result);
}
else if (name == "dest") {
@@ -483,28 +471,6 @@ TrexRpcCmdSetPortAttr::regular_priority_pass(const Json::Value &attr, uint8_t po
generate_execute_err(result, "Error applying " + name + " attribute, return value: " + to_string(ret));
}
}
-}
-
-
-/**
- * set port commands
- *
- * @author imarom (24-Feb-16)
- *
- * @param params
- * @param result
- *
- * @return trex_rpc_cmd_rc_e
- */
-trex_rpc_cmd_rc_e
-TrexRpcCmdSetPortAttr::_run(const Json::Value &params, Json::Value &result) {
-
- uint8_t port_id = parse_port(params, result);
-
- const Json::Value &attr = parse_object(params, "attr", result);
-
- high_priority_pass(attr, port_id, result);
- regular_priority_pass(attr, port_id, result);
result["result"] = Json::objectValue;
return (TREX_RPC_CMD_OK);
diff --git a/src/rpc-server/commands/trex_rpc_cmds.h b/src/rpc-server/commands/trex_rpc_cmds.h
index fab81f67..2b2178e2 100644
--- a/src/rpc-server/commands/trex_rpc_cmds.h
+++ b/src/rpc-server/commands/trex_rpc_cmds.h
@@ -94,9 +94,7 @@ TREX_RPC_CMD_DEFINE(TrexRpcCmdGetPortXStatsValues, "get_port_xstats_values", 1,
TREX_RPC_CMD_DEFINE(TrexRpcCmdGetPortXStatsNames, "get_port_xstats_names", 1, false, APIClass::API_CLASS_TYPE_CORE);
TREX_RPC_CMD_DEFINE_EXTENDED(TrexRpcCmdSetPortAttr, "set_port_attr", 2, true, APIClass::API_CLASS_TYPE_CORE,
-
- void high_priority_pass(const Json::Value &attr, uint8 port_id, Json::Value &result);
- void regular_priority_pass(const Json::Value &attr, uint8_t port_id, Json::Value &result);
+
int parse_rx_filter_mode(const Json::Value &msg, uint8_t port_id, Json::Value &result);
int parse_ipv4(const Json::Value &msg, uint8_t port_id, Json::Value &result);
int parse_dest(const Json::Value &msg, uint8_t port_id, Json::Value &result);
diff --git a/src/stateless/dp/trex_stateless_dp_core.cpp b/src/stateless/dp/trex_stateless_dp_core.cpp
index 43b77bee..857ac8f9 100644
--- a/src/stateless/dp/trex_stateless_dp_core.cpp
+++ b/src/stateless/dp/trex_stateless_dp_core.cpp
@@ -26,7 +26,7 @@ limitations under the License.
#include "trex_stream_node.h"
#include "trex_streams_compiler.h"
#include "mbuf.h"
-#include "trex_stateless.h"
+
@@ -495,14 +495,12 @@ bool TrexStatelessDpPerPort::push_pcap(uint8_t port_id,
/* main port */
uint8_t mac_addr[12];
- TRexPortAttr *master_port_attr = get_stateless_obj()->get_platform_api()->getPortAttrObj(port_id);
- master_port_attr->update_src_dst_mac(mac_addr);
-
+ m_core->m_node_gen.m_v_if->update_mac_addr_from_global_cfg(dir, mac_addr);
+
/* for dual */
uint8_t slave_mac_addr[12];
- TRexPortAttr *slave_port_attr = get_stateless_obj()->get_platform_api()->getPortAttrObj(port_id ^ 0x1);
- slave_port_attr->update_src_dst_mac(slave_mac_addr);
-
+ m_core->m_node_gen.m_v_if->update_mac_addr_from_global_cfg(dir ^ 0x1, slave_mac_addr);
+
bool rc = pcap_node->create(port_id,
dir,
socket_id,
@@ -825,9 +823,8 @@ void TrexStatelessDpCore::update_mac_addr(TrexStream * stream,
CGenNodeStateless *node,
pkt_dir_t dir,
char *raw_pkt){
-
- bool ov_src = stream->get_override_src_mac_by_pkt_data();
- TrexStream::stream_dst_mac_t ov_dst = stream->get_override_dst_mac_mode();
+ bool ov_src = stream->get_override_src_mac_by_pkt_data();
+ TrexStream::stream_dst_mac_t ov_dst = stream->get_override_dst_mac_mode();
if ( (ov_src == true) && (ov_dst == TrexStream::stPKT) ) {
@@ -835,13 +832,11 @@ void TrexStatelessDpCore::update_mac_addr(TrexStream * stream,
return;
}
- TRexPortAttr *port_attr = get_stateless_obj()->get_platform_api()->getPortAttrObj(node->get_port_id());
-
- /* take from cfg_file */
+ /* take from cfg_file */
if ( (ov_src == false) &&
(ov_dst == TrexStream::stCFG_FILE) ){
-
- port_attr->update_src_dst_mac((uint8_t *)raw_pkt);
+
+ m_core->m_node_gen.m_v_if->update_mac_addr_from_global_cfg(dir,(uint8_t*)raw_pkt);
return;
}
@@ -849,8 +844,8 @@ void TrexStatelessDpCore::update_mac_addr(TrexStream * stream,
char tmp_pkt[12];
memcpy(tmp_pkt,raw_pkt,12);
- port_attr->update_src_dst_mac((uint8_t *)raw_pkt);
-
+ m_core->m_node_gen.m_v_if->update_mac_addr_from_global_cfg(dir,(uint8_t*)raw_pkt);
+
if ((ov_src == true) && (ov_dst == TrexStream::stCFG_FILE)) {
memcpy(raw_pkt+6,tmp_pkt+6,6);
}
diff --git a/src/trex_port_attr.cpp b/src/trex_port_attr.cpp
index 08e151b6..26199e33 100644
--- a/src/trex_port_attr.cpp
+++ b/src/trex_port_attr.cpp
@@ -20,6 +20,12 @@ limitations under the License.
const uint8_t DestAttr::g_dummy_mac[6] = {0x0,0x0,0x0,0x1,0x0,0x0};
+DestAttr::DestAttr(uint8_t port_id) {
+ m_port_id = port_id;
+
+ m_mac = CGlobalInfo::m_options.m_mac_addr[port_id].u.m_mac.dest;
+}
+
const uint8_t *
TRexPortAttr::get_src_mac() const {
return CGlobalInfo::m_options.get_src_mac_addr(m_port_id);
diff --git a/src/trex_port_attr.h b/src/trex_port_attr.h
index 68f9f82e..eb7c85de 100755
--- a/src/trex_port_attr.h
+++ b/src/trex_port_attr.h
@@ -24,6 +24,7 @@ limitations under the License.
#include "common/basic_utils.h"
#include <json/json.h>
#include "trex_stateless_rx_defs.h"
+#include <string.h>
/**
* destination port attribute
@@ -34,10 +35,7 @@ private:
static const uint8_t g_dummy_mac[6];
public:
- DestAttr() {
- /* use a dummy MAC as default */
- set_dest_mac(g_dummy_mac);
- }
+ DestAttr(uint8_t port_id);
enum dest_type_e {
DEST_TYPE_IPV4 = 1,
@@ -64,6 +62,7 @@ public:
m_src_ipv4 = ipv4;
memcpy(m_mac, mac, 6);
m_type = DEST_TYPE_IPV4;
+
}
/**
@@ -71,6 +70,7 @@ public:
*
*/
void set_dest_mac(const uint8_t *mac) {
+
m_src_ipv4 = 0;
memcpy(m_mac, mac, 6);
m_type = DEST_TYPE_MAC;
@@ -143,15 +143,16 @@ public:
private:
uint32_t m_src_ipv4;
- uint8_t m_mac[6];
+ uint8_t *m_mac;
dest_type_e m_type;
+ uint8_t m_port_id;
};
class TRexPortAttr {
public:
- TRexPortAttr() {
+ TRexPortAttr(uint8_t port_id) : m_dest(port_id) {
m_src_ipv4 = 0;
}
@@ -237,7 +238,7 @@ protected:
class DpdkTRexPortAttr : public TRexPortAttr {
public:
- DpdkTRexPortAttr(uint8_t port_id, bool is_virtual, bool fc_change_allowed) {
+ DpdkTRexPortAttr(uint8_t port_id, bool is_virtual, bool fc_change_allowed) : TRexPortAttr(port_id) {
m_port_id = port_id;
m_rx_filter_mode = RX_FILTER_MODE_HW;
@@ -288,7 +289,7 @@ private:
class SimTRexPortAttr : public TRexPortAttr {
public:
- SimTRexPortAttr() {
+ SimTRexPortAttr() : TRexPortAttr(0) {
m_link.link_speed = 10000;
m_link.link_duplex = 1;
m_link.link_autoneg = 0;