summaryrefslogtreecommitdiffstats
path: root/src/trex_client_config.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/trex_client_config.h')
-rw-r--r--src/trex_client_config.h304
1 files changed, 211 insertions, 93 deletions
diff --git a/src/trex_client_config.h b/src/trex_client_config.h
index a5bb83b3..257d354f 100644
--- a/src/trex_client_config.h
+++ b/src/trex_client_config.h
@@ -24,57 +24,56 @@ limitations under the License.
#include <stdint.h>
#include <string>
#include <map>
+#include "utl_ip.h"
+#include "common/Network/Packet/MacAddress.h"
class YAMLParserWrapper;
+struct CTupleGenYamlInfo;
+class ClientCfgDirExt;
-
+// To save memory, we use here the ClientCfgExt and ClientCfgDirExt,
+// and in tuple_gen the ClientCfgBase and ClientCfgDirBase
/**
* client configuration per direction
- *
+ *
* @author imarom (29-Jun-16)
*/
-class ClientCfgDir {
+class ClientCfgDirBase {
+ friend class ClientCfgCompactEntry;
-private:
+ protected:
enum {
- HAS_SRC_MAC = 0x1,
- HAS_DST_MAC = 0x2,
- HAS_VLAN = 0x4,
+ HAS_SRC_MAC = 0x1,
+ HAS_DST_MAC = 0x2,
+ HAS_VLAN = 0x4,
+ HAS_NEXT_HOP = 0x8,
+ HAS_IPV6_NEXT_HOP = 0x10,
+ HAS_SRC_IP = 0x20,
+ HAS_SRC_IPV6 = 0x40,
};
- uint8_t m_src_mac[6];
- uint8_t m_dst_mac[6];
+ MacAddress m_src_mac;
+ MacAddress m_dst_mac;
uint16_t m_vlan;
uint8_t m_bitfield;
-
-public:
- ClientCfgDir() {
+ public:
+ ClientCfgDirBase() {
m_bitfield = 0;
}
+ virtual void dump(FILE *fd) const;
bool has_src_mac_addr() const {
return (m_bitfield & HAS_SRC_MAC);
}
- bool has_dst_mac_addr() const {
- return (m_bitfield & HAS_DST_MAC);
- }
- bool has_vlan() const {
- return (m_bitfield & HAS_VLAN);
- }
-
void set_src_mac_addr(uint64_t mac_addr) {
- for (int i = 0; i < 6; i++) {
- m_src_mac[i] = ( mac_addr >> ((5 - i) * 8) ) & 0xFF;
- }
+ m_src_mac.set(mac_addr);
m_bitfield |= HAS_SRC_MAC;
}
void set_dst_mac_addr(uint64_t mac_addr) {
- for (int i = 0; i < 6; i++) {
- m_dst_mac[i] = ( mac_addr >> ((5 - i) * 8) ) & 0xFF;
- }
+ m_dst_mac.set(mac_addr);
m_bitfield |= HAS_DST_MAC;
}
@@ -83,26 +82,21 @@ public:
m_bitfield |= HAS_VLAN;
}
- /* updates a configuration with a group index member */
-
- void update(uint32_t index) {
- if (has_src_mac_addr()) {
- mac_add(m_src_mac, index);
- }
-
- if (has_dst_mac_addr()) {
- mac_add(m_dst_mac, index);
- }
+ bool has_dst_mac_addr() const {
+ return (m_bitfield & HAS_DST_MAC);
+ }
+ bool has_vlan() const {
+ return (m_bitfield & HAS_VLAN);
}
const uint8_t *get_src_mac_addr() const {
assert(has_src_mac_addr());
- return m_src_mac;
+ return m_src_mac.GetConstBuffer();
}
const uint8_t *get_dst_mac_addr() const {
assert(has_dst_mac_addr());
- return m_dst_mac;
+ return m_dst_mac.GetConstBuffer();
}
uint16_t get_vlan() const {
@@ -110,64 +104,165 @@ public:
return m_vlan;
}
+ /* updates a configuration with a group index member */
+ void update(uint32_t index, const ClientCfgDirExt &cfg);
+};
+
+class ClientCfgDirExt : public ClientCfgDirBase {
+ friend class ClientCfgCompactEntry;
+
private:
- /**
- * transform MAC address to uint64_t
- * performs add and return to MAC format
- *
- */
- void mac_add(uint8_t *mac, uint32_t i) {
- uint64_t tmp = 0;
+ enum {
+ HAS_SRC_MAC = 0x1,
+ HAS_DST_MAC = 0x2,
+ HAS_VLAN = 0x4,
+ HAS_NEXT_HOP = 0x8,
+ HAS_IPV6_NEXT_HOP = 0x10,
+ HAS_SRC_IP = 0x20,
+ HAS_SRC_IPV6 = 0x40,
+ };
- for (int i = 0; i < 6; i++) {
- tmp <<= 8;
- tmp |= mac[i];
+ uint32_t m_next_hop;
+ uint32_t m_src_ip;
+ uint16_t m_src_ipv6[8];
+ uint16_t m_ipv6_next_hop[8];
+ std::vector <MacAddress> m_resolved_macs;
+
+public:
+ void dump(FILE *fd) const;
+ void set_resolved_macs(CManyIPInfo &pretest_result, uint16_t count);
+ bool need_resolve() const;
+ void set_no_resolve_needed();
+
+ bool has_ipv6_next_hop() const {
+ return (m_bitfield & HAS_IPV6_NEXT_HOP);
+ }
+
+ bool has_next_hop() const {
+ return (m_bitfield & HAS_NEXT_HOP);
+ }
+
+ bool has_src_ip() const {
+ return (m_bitfield & HAS_SRC_IP);
+ }
+
+ bool has_src_ipv6() const {
+ return (m_bitfield & HAS_SRC_IPV6);
+ }
+
+ void set_src_ip(uint32_t src_ip) {
+ m_src_ip = src_ip;
+ m_bitfield |= HAS_SRC_IP;
+ }
+
+ void set_src_ipv6(const uint16_t src_ipv6[8]) {
+ for (int i = 0; i < 8; i++) {
+ m_src_ipv6[i] = src_ipv6[i];
}
+ m_bitfield |= HAS_SRC_IPV6;
+ }
- tmp += i;
+ void set_next_hop(uint32_t next_hop) {
+ m_next_hop = next_hop;
+ m_bitfield |= HAS_NEXT_HOP;
+ }
- for (int i = 0; i < 6; i++) {
- mac[i] = ( tmp >> ((5 - i) * 8) ) & 0xFF;
+ void set_ipv6_next_hop(const uint16_t next_hop[8]) {
+ for (int i = 0; i < 8; i++) {
+ m_ipv6_next_hop[i] = next_hop[i];
}
+ m_bitfield |= HAS_IPV6_NEXT_HOP;
+ }
+ virtual MacAddress get_resolved_mac(uint16_t index) const {
+ return m_resolved_macs[index];
}
+
};
+class ClientCfgExt;
+
/**
* single client config
- *
+ *
*/
-class ClientCfg {
+class ClientCfgBase {
public:
+ virtual void dump (FILE *fd) const {
+ fprintf(fd, " initiator :\n");
+ m_initiator.dump(fd);
+ fprintf(fd, " responder :\n");
+ m_responder.dump(fd);
+ }
+ virtual void update(uint32_t index, const ClientCfgExt *cfg);
- void update(uint32_t index) {
- m_initiator.update(index);
- m_responder.update(index);
+ public:
+ ClientCfgDirBase m_initiator;
+ ClientCfgDirBase m_responder;
+};
+
+class ClientCfgExt : public ClientCfgBase {
+public:
+ virtual void dump (FILE *fd) const {
+ fprintf(fd, " initiator:\n");
+ m_initiator.dump(fd);
+ fprintf(fd, " responder:\n");
+ m_responder.dump(fd);
}
- ClientCfgDir m_initiator;
- ClientCfgDir m_responder;
+ ClientCfgDirExt m_initiator;
+ ClientCfgDirExt m_responder;
+};
+
+class ClientCfgCompactEntry {
+ friend class ClientCfgDB;
+ public:
+ uint16_t get_count() {return m_count;}
+ uint16_t get_vlan() {return m_vlan;}
+ uint16_t get_port() {return m_port;}
+ bool is_ipv4() {return m_is_ipv4;}
+ uint32_t get_dst_ip() {return m_next_hop_base.ip;}
+ uint16_t *get_dst_ipv6() {return m_next_hop_base.ipv6;}
+ uint32_t get_src_ip() {return m_src_ip.ip;}
+ uint16_t *get_src_ipv6() {return m_src_ip.ipv6;}
+
+ public:
+ void fill_from_dir(ClientCfgDirExt cfg, uint8_t port_id);
+
+ private:
+ uint16_t m_count;
+ uint16_t m_vlan;
+ uint8_t m_port;
+ bool m_is_ipv4;
+ union {
+ uint32_t ip;
+ uint16_t ipv6[8];
+ } m_next_hop_base;
+ union {
+ uint32_t ip;
+ uint16_t ipv6[8];
+ } m_src_ip;
+
};
/******************************** internal section ********************************/
/**
- * describes a single client config
+ * describes a single client config
* entry loaded from the config file
- *
+ *
*/
class ClientCfgEntry {
-
+ friend class basic_client_cfg_test1_Test;
public:
ClientCfgEntry() {
reset();
}
-
- void dump() const;
-
+ void dump(FILE *fd) const;
+ void set_resolved_macs(CManyIPInfo &pretest_result);
bool contains(uint32_t ip) const {
return ( (ip >= m_ip_start) && (ip <= m_ip_end) );
}
@@ -176,19 +271,19 @@ public:
m_iterator = 0;
}
-
+
/**
- * assings a client config from the group
- * it will advance MAC addresses andf etc.
- *
+ * assings a client config from the group
+ * it will advance MAC addresses andf etc.
+ *
* @author imarom (27-Jun-16)
- *
- * @param info
+ *
+ * @param info
*/
- void assign(ClientCfg &info) {
+ void assign(ClientCfgBase &info) {
info = m_cfg;
- info.update(m_iterator);
-
+ info.update(m_iterator, &m_cfg);
+
/* advance for the next assign */
m_iterator = (m_iterator + 1) % m_count;
}
@@ -197,69 +292,92 @@ public:
uint32_t m_ip_start;
uint32_t m_ip_end;
- ClientCfg m_cfg;
+ ClientCfgExt m_cfg;
uint32_t m_count;
private:
+ void set_params(uint32_t start, uint32_t end, uint32_t count) { // for tests
+ m_ip_start = start;
+ m_ip_end = end;
+ m_count = count;
+ }
+ void set_cfg(const ClientCfgExt &cfg) {
+ m_cfg = cfg;
+ }
uint32_t m_iterator;
};
/**
* holds all the configured clients groups
- *
+ *
*/
class ClientCfgDB {
-public:
+ friend class basic_client_cfg_test1_Test;
+ public:
ClientCfgDB() {
m_is_empty = true;
m_cache_group = NULL;
m_under_vlan = false;
+ m_tg = NULL;
}
+ ~ClientCfgDB() {
+ m_groups.clear();
+ }
+
+ void dump(FILE *fd) ;
+
/**
- * if no config file was loaded
- * this should return true
- *
+ * if no config file was loaded
+ * this should return true
+ *
*/
bool is_empty() {
return m_is_empty;
}
+ void set_resolved_macs(CManyIPInfo &pretest_result);
+ void get_entry_list(std::vector<ClientCfgCompactEntry *> &ret);
+
+
/**
- * loads a YAML file
- * configuration will be built
- * according to the YAML config
- *
+ * loads a YAML file
+ * configuration will be built
+ * according to the YAML config
+ *
*/
void load_yaml_file(const std::string &filename);
/**
- * lookup for a specific IP address for
- * a group that contains this IP
- *
+ * lookup for a specific IP address for
+ * a group that contains this IP
+ *
*/
ClientCfgEntry * lookup(uint32_t ip);
ClientCfgEntry * lookup(const std::string &ip);
+ void set_tuple_gen_info(CTupleGenYamlInfo *tg) {m_tg = tg;}
private:
void parse_single_group(YAMLParserWrapper &parser, const YAML::Node &node);
- void parse_dir(YAMLParserWrapper &parser, const YAML::Node &node, ClientCfgDir &dir);
-
+ void parse_dir(YAMLParserWrapper &parser, const YAML::Node &node, ClientCfgDirExt &dir);
+ void set_vlan(bool val) {m_under_vlan = val;} // for tests
+ void add_group(uint32_t ip, ClientCfgEntry cfg) { // for tests
+ m_groups.insert(std::make_pair(ip, cfg));
+ }
/**
* verify the YAML file loaded in valid
- *
+ *
*/
void verify(const YAMLParserWrapper &parser) const;
/* maps the IP start value to client groups */
std::map<uint32_t, ClientCfgEntry> m_groups;
- bool m_under_vlan;
-
- ClientCfgEntry *m_cache_group;
- bool m_is_empty;
+ bool m_under_vlan;
+ CTupleGenYamlInfo * m_tg;
+ ClientCfgEntry * m_cache_group;
+ bool m_is_empty;
};
#endif /* __TREX_CLIENT_CONFIG_H__ */
-