summaryrefslogtreecommitdiffstats
path: root/src/rpc-server
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-12-13 18:15:22 +0200
committerimarom <imarom@cisco.com>2016-12-13 18:15:22 +0200
commit0fdd81a94d62592b0ec9888022d793f670c8476f (patch)
treeec52cd0f090793e26f67bc017d402b737acd71b5 /src/rpc-server
parent0c45815234abbb79b147b8093eb19e274ee65f52 (diff)
Major refactor - L2 / L3 modes for ports
Signed-off-by: imarom <imarom@cisco.com>
Diffstat (limited to 'src/rpc-server')
-rw-r--r--src/rpc-server/commands/trex_rpc_cmd_general.cpp128
-rw-r--r--src/rpc-server/commands/trex_rpc_cmds.h5
-rw-r--r--src/rpc-server/trex_rpc_cmds_table.cpp3
3 files changed, 63 insertions, 73 deletions
diff --git a/src/rpc-server/commands/trex_rpc_cmd_general.cpp b/src/rpc-server/commands/trex_rpc_cmd_general.cpp
index 5c397fcd..c8b4841a 100644
--- a/src/rpc-server/commands/trex_rpc_cmd_general.cpp
+++ b/src/rpc-server/commands/trex_rpc_cmd_general.cpp
@@ -357,53 +357,6 @@ TrexRpcCmdSetPortAttr::parse_rx_filter_mode(const Json::Value &msg, uint8_t port
return get_stateless_obj()->get_platform_api()->getPortAttrObj(port_id)->set_rx_filter_mode(filter_mode);
}
-int
-TrexRpcCmdSetPortAttr::parse_ipv4(const Json::Value &msg, uint8_t port_id, Json::Value &result) {
-
- const std::string ipv4_str = parse_string(msg, "addr", result);
-
- uint32_t ipv4_addr;
- if (!utl_ipv4_to_uint32(ipv4_str.c_str(), ipv4_addr)) {
- std::stringstream ss;
- ss << "invalid IPv4 address: '" << ipv4_str << "'";
- generate_parse_err(result, ss.str());
- }
-
- TrexStatelessPort *port = get_stateless_obj()->get_port_by_id(port_id);
- port->set_src_ipv4(ipv4_addr);
-
- return (0);
-}
-
-int
-TrexRpcCmdSetPortAttr::parse_dest(const Json::Value &msg, uint8_t port_id, Json::Value &result) {
-
- /* can be either IPv4 or MAC */
- const std::string addr = parse_string(msg, "addr", result);
-
- TRexPortAttr *port_attr = get_stateless_obj()->get_platform_api()->getPortAttrObj(port_id);
-
- /* try IPv4 */
- uint32_t ipv4_addr;
- uint8_t mac[6];
-
- if (utl_ipv4_to_uint32(addr.c_str(), ipv4_addr)) {
- port_attr->get_dest().set_dest(ipv4_addr);
-
- } else if (utl_str_to_macaddr(addr, mac)) {
- port_attr->get_dest().set_dest(mac);
-
- } else {
- std::stringstream ss;
- ss << "'dest' is not an IPv4 address or a MAC address: '" << addr << "'";
- generate_parse_err(result, ss.str());
- }
-
-
- return (0);
-}
-
-
/**
* set port commands
*
@@ -451,16 +404,6 @@ TrexRpcCmdSetPortAttr::_run(const Json::Value &params, Json::Value &result) {
ret = parse_rx_filter_mode(rx, port_id, result);
}
- else if (name == "ipv4") {
- const Json::Value &ipv4 = parse_object(attr, name, result);
- ret = parse_ipv4(ipv4, port_id, result);
- }
-
- else if (name == "dest") {
- const Json::Value &dest = parse_object(attr, name, result);
- ret = parse_dest(dest, port_id, result);
- }
-
/* unknown attribute */
else {
generate_execute_err(result, "unknown attribute type: '" + name + "'");
@@ -836,31 +779,78 @@ TrexRpcCmdGetRxQueuePkts::_run(const Json::Value &params, Json::Value &result) {
return (TREX_RPC_CMD_OK);
}
+
+/**
+ * configures a port in L2 mode
+ *
+ */
trex_rpc_cmd_rc_e
-TrexRpcCmdSetARPRes::_run(const Json::Value &params, Json::Value &result) {
+TrexRpcCmdSetL2::_run(const Json::Value &params, Json::Value &result) {
uint8_t port_id = parse_port(params, result);
TrexStatelessPort *port = get_stateless_obj()->get_port_by_id(port_id);
- const std::string ipv4_str = parse_string(params, "ipv4", result);
- const std::string mac_str = parse_string(params, "mac", result);
+ const std::string dst_mac_str = parse_string(params, "dst_mac", result);
+
+ uint8_t dst_mac[6];
+ if (!utl_str_to_macaddr(dst_mac_str, dst_mac)) {
+ std::stringstream ss;
+ ss << "'invalid MAC address: '" << dst_mac_str << "'";
+ generate_parse_err(result, ss.str());
+ }
+
+ port->set_l2_mode(dst_mac);
+
+ return (TREX_RPC_CMD_OK);
+}
+
+/**
+ * configures a port in L3 mode
+ *
+ */
+trex_rpc_cmd_rc_e
+TrexRpcCmdSetL3::_run(const Json::Value &params, Json::Value &result) {
+ uint8_t port_id = parse_port(params, result);
+
+ TrexStatelessPort *port = get_stateless_obj()->get_port_by_id(port_id);
+
+ const std::string src_ipv4_str = parse_string(params, "src_addr", result);
+ const std::string dst_ipv4_str = parse_string(params, "dst_addr", result);
- uint32_t ipv4_addr;
- if (!utl_ipv4_to_uint32(ipv4_str.c_str(), ipv4_addr)) {
+ uint32_t src_ipv4;
+ if (!utl_ipv4_to_uint32(src_ipv4_str.c_str(), src_ipv4)) {
std::stringstream ss;
- ss << "invalid IPv4 address: '" << ipv4_str << "'";
+ ss << "invalid source IPv4 address: '" << src_ipv4_str << "'";
generate_parse_err(result, ss.str());
}
- uint8_t mac[6];
- if (!utl_str_to_macaddr(mac_str, mac)) {
+ uint32_t dst_ipv4;
+ if (!utl_ipv4_to_uint32(dst_ipv4_str.c_str(), dst_ipv4)) {
std::stringstream ss;
- ss << "'invalid MAC address: '" << mac_str << "'";
+ ss << "invalid destination IPv4 address: '" << dst_ipv4_str << "'";
generate_parse_err(result, ss.str());
- }
+ }
+
+
- port->getPortAttrObj()->get_dest().set_dest(ipv4_addr, mac);
+ /* did we get a resolved MAC as well ? */
+ if (params["resolved_mac"] != Json::Value::null) {
+ const std::string resolved_mac = parse_string(params, "resolved_mac", result);
+
+ uint8_t mac[6];
+ if (!utl_str_to_macaddr(resolved_mac, mac)) {
+ std::stringstream ss;
+ ss << "'invalid MAC address: '" << resolved_mac << "'";
+ generate_parse_err(result, ss.str());
+ }
- return (TREX_RPC_CMD_OK);
+ port->set_l3_mode(src_ipv4, dst_ipv4, mac);
+
+ } else {
+
+ port->set_l3_mode(src_ipv4, dst_ipv4);
+ }
+
+ 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 2b2178e2..6639be7b 100644
--- a/src/rpc-server/commands/trex_rpc_cmds.h
+++ b/src/rpc-server/commands/trex_rpc_cmds.h
@@ -96,8 +96,6 @@ TREX_RPC_CMD_DEFINE(TrexRpcCmdGetPortXStatsNames, "get_port_xstats_names", 1,
TREX_RPC_CMD_DEFINE_EXTENDED(TrexRpcCmdSetPortAttr, "set_port_attr", 2, true, APIClass::API_CLASS_TYPE_CORE,
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);
);
@@ -159,8 +157,9 @@ TREX_RPC_CMD_DEFINE_EXTENDED(TrexRpcCmdSetRxFeature, "set_rx_feature", 3, false,
);
+TREX_RPC_CMD_DEFINE(TrexRpcCmdSetL2, "set_l2", 2, false, APIClass::API_CLASS_TYPE_CORE);
+TREX_RPC_CMD_DEFINE(TrexRpcCmdSetL3, "set_l3", 3, false, APIClass::API_CLASS_TYPE_CORE);
TREX_RPC_CMD_DEFINE(TrexRpcCmdGetRxQueuePkts, "get_rx_queue_pkts", 2, false, APIClass::API_CLASS_TYPE_CORE);
-TREX_RPC_CMD_DEFINE(TrexRpcCmdSetARPRes, "set_arp_resolution", 2, false, APIClass::API_CLASS_TYPE_CORE);
#endif /* __TREX_RPC_CMD_H__ */
diff --git a/src/rpc-server/trex_rpc_cmds_table.cpp b/src/rpc-server/trex_rpc_cmds_table.cpp
index 919be1f1..94a3e1b9 100644
--- a/src/rpc-server/trex_rpc_cmds_table.cpp
+++ b/src/rpc-server/trex_rpc_cmds_table.cpp
@@ -75,7 +75,8 @@ TrexRpcCommandsTable::TrexRpcCommandsTable() {
register_command(new TrexRpcCmdSetRxFeature());
register_command(new TrexRpcCmdGetRxQueuePkts());
- register_command(new TrexRpcCmdSetARPRes());
+ register_command(new TrexRpcCmdSetL2());
+ register_command(new TrexRpcCmdSetL3());
}