diff options
author | Ido Barnea <ibarnea@cisco.com> | 2016-11-20 14:06:38 +0200 |
---|---|---|
committer | Ido Barnea <ibarnea@cisco.com> | 2016-11-21 12:56:28 +0200 |
commit | fb823791cf8794dc367640a1f46ea051a0c79ccc (patch) | |
tree | 930830c09477242cb2cc530bdcec2fc11c68b3b0 /src/trex_client_config.h | |
parent | bf83f301e4fdbf333240af7f316735e35634c5fd (diff) |
Seperating ClientCfgDirBase/Ext and ClientCfgBase/Ext to save memory
Signed-off-by: Ido Barnea <ibarnea@cisco.com>
Diffstat (limited to 'src/trex_client_config.h')
-rw-r--r-- | src/trex_client_config.h | 167 |
1 files changed, 97 insertions, 70 deletions
diff --git a/src/trex_client_config.h b/src/trex_client_config.h index 1122c6f9..972f84fa 100644 --- a/src/trex_client_config.h +++ b/src/trex_client_config.h @@ -29,16 +29,19 @@ limitations under the License. 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, @@ -49,31 +52,36 @@ private: HAS_SRC_IPV6 = 0x40, }; - //???? do we need to save memory? Maybe do another class that inherit from ClientCfgDir to be used here? - uint32_t m_next_hop; - uint32_t m_src_ip; - uint16_t m_src_ipv6[8]; - uint16_t m_ipv6_next_hop[8]; MacAddress m_src_mac; MacAddress m_dst_mac; uint16_t m_vlan; uint8_t m_bitfield; - std::vector <MacAddress> m_resolved_macs; -public: - ClientCfgDir() { + public: + ClientCfgDirBase() { m_bitfield = 0; } - void dump(FILE *fd) const; - void set_resolved_macs(CManyIPInfo &pretest_result, uint16_t count); - bool need_resolve() const; - void set_no_resolve_needed(); - + virtual void dump(FILE *fd) const; bool has_src_mac_addr() const { return (m_bitfield & HAS_SRC_MAC); } + void set_src_mac_addr(uint64_t mac_addr) { + m_src_mac.set(mac_addr); + m_bitfield |= HAS_SRC_MAC; + } + + void set_dst_mac_addr(uint64_t mac_addr) { + m_dst_mac.set(mac_addr); + m_bitfield |= HAS_DST_MAC; + } + + void set_vlan(uint16_t vlan_id) { + m_vlan = vlan_id; + m_bitfield |= HAS_VLAN; + } + bool has_dst_mac_addr() const { return (m_bitfield & HAS_DST_MAC); } @@ -81,35 +89,65 @@ public: return (m_bitfield & HAS_VLAN); } - bool has_next_hop() const { - return (m_bitfield & HAS_NEXT_HOP); + const uint8_t *get_src_mac_addr() const { + assert(has_src_mac_addr()); + return m_src_mac.GetConstBuffer(); } - bool has_ipv6_next_hop() const { - return (m_bitfield & HAS_IPV6_NEXT_HOP); + const uint8_t *get_dst_mac_addr() const { + assert(has_dst_mac_addr()); + return m_dst_mac.GetConstBuffer(); } - bool has_src_ip() const { - return (m_bitfield & HAS_SRC_IP); + uint16_t get_vlan() const { + assert(has_vlan()); + return m_vlan; } - bool has_src_ipv6() const { - return (m_bitfield & HAS_SRC_IPV6); + /* updates a configuration with a group index member */ + void update(uint32_t index, const ClientCfgDirExt &cfg); +}; + +class ClientCfgDirExt : public ClientCfgDirBase { + friend class ClientCfgCompactEntry; + +private: + 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, + }; + + 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); } - void set_src_mac_addr(uint64_t mac_addr) { - m_src_mac.set(mac_addr); - m_bitfield |= HAS_SRC_MAC; + bool has_next_hop() const { + return (m_bitfield & HAS_NEXT_HOP); } - void set_dst_mac_addr(uint64_t mac_addr) { - m_dst_mac.set(mac_addr); - m_bitfield |= HAS_DST_MAC; + bool has_src_ip() const { + return (m_bitfield & HAS_SRC_IP); } - void set_vlan(uint16_t vlan_id) { - m_vlan = vlan_id; - m_bitfield |= HAS_VLAN; + bool has_src_ipv6() const { + return (m_bitfield & HAS_SRC_IPV6); } void set_src_ip(uint32_t src_ip) { @@ -136,56 +174,45 @@ public: m_bitfield |= HAS_IPV6_NEXT_HOP; } - /* updates a configuration with a group index member */ - - void update(uint32_t index, const ClientCfgDir &cfg) { - if (has_src_mac_addr()) { - m_src_mac += index; - } - - if (has_dst_mac_addr() || has_next_hop() || has_ipv6_next_hop()) { - m_dst_mac = cfg.m_resolved_macs[index]; - m_bitfield |= HAS_DST_MAC; - } - } - - const uint8_t *get_src_mac_addr() const { - assert(has_src_mac_addr()); - return m_src_mac.GetConstBuffer(); - } - - const uint8_t *get_dst_mac_addr() const { - assert(has_dst_mac_addr()); - return m_dst_mac.GetConstBuffer(); + virtual MacAddress get_resolved_mac(uint16_t index) const { + return m_resolved_macs[index]; } - uint16_t get_vlan() const { - assert(has_vlan()); - return m_vlan; - } }; +class ClientCfgExt; + /** * single client config * */ -class ClientCfg { +class ClientCfgBase { public: - - void dump (FILE *fd) const { + virtual void dump (FILE *fd) const { fprintf(fd, "initiator:\n"); m_initiator.dump(fd); fprintf(fd, "responder:\n"); m_responder.dump(fd); } - void update(uint32_t index, const ClientCfg &cfg) { - m_initiator.update(index, cfg.m_initiator); - m_responder.update(index, cfg.m_responder); + virtual void update(uint32_t index, const ClientCfgExt *cfg); + + 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 { @@ -201,7 +228,7 @@ class ClientCfgCompactEntry { uint16_t *get_src_ipv6() {return m_src_ip.ipv6;} public: - void fill_from_dir(ClientCfgDir cfg, uint8_t port_id); + void fill_from_dir(ClientCfgDirExt cfg, uint8_t port_id); private: uint16_t m_count; @@ -253,9 +280,9 @@ public: * * @param info */ - void assign(ClientCfg &info) { + void assign(ClientCfgBase &info) { info = m_cfg; - info.update(m_iterator, m_cfg); + info.update(m_iterator, &m_cfg); /* advance for the next assign */ m_iterator = (m_iterator + 1) % m_count; @@ -265,7 +292,7 @@ public: uint32_t m_ip_start; uint32_t m_ip_end; - ClientCfg m_cfg; + ClientCfgExt m_cfg; uint32_t m_count; @@ -320,7 +347,7 @@ public: 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); /** * verify the YAML file loaded in valid |