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.h265
1 files changed, 265 insertions, 0 deletions
diff --git a/src/trex_client_config.h b/src/trex_client_config.h
new file mode 100644
index 00000000..a5bb83b3
--- /dev/null
+++ b/src/trex_client_config.h
@@ -0,0 +1,265 @@
+/*
+ Itay Marom
+ Cisco Systems, Inc.
+*/
+
+/*
+Copyright (c) 2016 Cisco Systems, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+#ifndef __TREX_CLIENT_CONFIG_H__
+#define __TREX_CLIENT_CONFIG_H__
+
+#include <stdint.h>
+#include <string>
+#include <map>
+
+class YAMLParserWrapper;
+
+
+/**
+ * client configuration per direction
+ *
+ * @author imarom (29-Jun-16)
+ */
+class ClientCfgDir {
+
+private:
+ enum {
+ HAS_SRC_MAC = 0x1,
+ HAS_DST_MAC = 0x2,
+ HAS_VLAN = 0x4,
+ };
+
+ uint8_t m_src_mac[6];
+ uint8_t m_dst_mac[6];
+ uint16_t m_vlan;
+ uint8_t m_bitfield;
+
+
+public:
+ ClientCfgDir() {
+ m_bitfield = 0;
+ }
+
+ 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_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_bitfield |= HAS_DST_MAC;
+ }
+
+ void set_vlan(uint16_t vlan_id) {
+ m_vlan = vlan_id;
+ 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);
+ }
+ }
+
+ const uint8_t *get_src_mac_addr() const {
+ assert(has_src_mac_addr());
+ return m_src_mac;
+ }
+
+ const uint8_t *get_dst_mac_addr() const {
+ assert(has_dst_mac_addr());
+ return m_dst_mac;
+ }
+
+ uint16_t get_vlan() const {
+ assert(has_vlan());
+ return m_vlan;
+ }
+
+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;
+
+ for (int i = 0; i < 6; i++) {
+ tmp <<= 8;
+ tmp |= mac[i];
+ }
+
+ tmp += i;
+
+ for (int i = 0; i < 6; i++) {
+ mac[i] = ( tmp >> ((5 - i) * 8) ) & 0xFF;
+ }
+
+ }
+};
+
+/**
+ * single client config
+ *
+ */
+class ClientCfg {
+
+public:
+
+ void update(uint32_t index) {
+ m_initiator.update(index);
+ m_responder.update(index);
+ }
+
+ ClientCfgDir m_initiator;
+ ClientCfgDir m_responder;
+};
+
+/******************************** internal section ********************************/
+
+/**
+ * describes a single client config
+ * entry loaded from the config file
+ *
+ */
+class ClientCfgEntry {
+
+public:
+
+ ClientCfgEntry() {
+ reset();
+ }
+
+
+ void dump() const;
+
+ bool contains(uint32_t ip) const {
+ return ( (ip >= m_ip_start) && (ip <= m_ip_end) );
+ }
+
+ void reset() {
+ m_iterator = 0;
+ }
+
+
+ /**
+ * assings a client config from the group
+ * it will advance MAC addresses andf etc.
+ *
+ * @author imarom (27-Jun-16)
+ *
+ * @param info
+ */
+ void assign(ClientCfg &info) {
+ info = m_cfg;
+ info.update(m_iterator);
+
+ /* advance for the next assign */
+ m_iterator = (m_iterator + 1) % m_count;
+ }
+
+public:
+ uint32_t m_ip_start;
+ uint32_t m_ip_end;
+
+ ClientCfg m_cfg;
+
+ uint32_t m_count;
+
+private:
+ uint32_t m_iterator;
+};
+
+/**
+ * holds all the configured clients groups
+ *
+ */
+class ClientCfgDB {
+public:
+
+ ClientCfgDB() {
+ m_is_empty = true;
+ m_cache_group = NULL;
+ m_under_vlan = false;
+ }
+
+ /**
+ * if no config file was loaded
+ * this should return true
+ *
+ */
+ bool is_empty() {
+ return m_is_empty;
+ }
+
+ /**
+ * 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
+ *
+ */
+ ClientCfgEntry * lookup(uint32_t ip);
+ ClientCfgEntry * lookup(const std::string &ip);
+
+private:
+ void parse_single_group(YAMLParserWrapper &parser, const YAML::Node &node);
+ void parse_dir(YAMLParserWrapper &parser, const YAML::Node &node, ClientCfgDir &dir);
+
+ /**
+ * 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;
+};
+
+#endif /* __TREX_CLIENT_CONFIG_H__ */
+