diff options
Diffstat (limited to 'src/pre_test.h')
-rw-r--r-- | src/pre_test.h | 185 |
1 files changed, 156 insertions, 29 deletions
diff --git a/src/pre_test.h b/src/pre_test.h index ad7608a6..ddf600b1 100644 --- a/src/pre_test.h +++ b/src/pre_test.h @@ -24,9 +24,13 @@ #include <iostream> #include <common/Network/Packet/Arp.h> +#include <common/Network/Packet/MacAddress.h> #include "bp_sim.h" #include "trex_defs.h" +#define IP4_VER 4 +#define IP6_VER 6 + class CPreTestStats { public: uint32_t m_rx_arp; // how many ARP packets we received @@ -39,60 +43,183 @@ class CPreTestStats { } }; -class CPretestPortInfo { - friend class CPretest; - +class COneIPInfo { + public: + virtual void get_mac(uint8_t *mac) { + m_mac.copyToArray(mac); + } + virtual void set_mac(uint8_t *mac) { + m_mac.set(mac); + } + uint16_t get_vlan() {return m_vlan;} + virtual void dump(FILE *fd) { + dump(fd, ""); + } + virtual void dump(FILE *fd, const char *offset); + virtual uint8_t ip_ver() {return 0;} + virtual uint32_t get_arp_req_len()=0; + virtual uint32_t get_grat_arp_len()=0; + virtual void fill_arp_req_buf(uint8_t *p, uint16_t port_id, COneIPInfo *sip)=0; + virtual void fill_grat_arp_buf(uint8_t *p)=0; + virtual bool resolve_needed(); + + protected: + COneIPInfo(uint16_t vlan, MacAddress mac) : m_mac(mac) { + m_vlan = vlan; + } + virtual const void get_ip_str(char str[100]){ + snprintf(str, 4, "Bad"); + } + + protected: + uint16_t m_vlan; + MacAddress m_mac; +}; + +class COneIPv4Info : public COneIPInfo { + friend bool operator== (const COneIPv4Info& lhs, const COneIPv4Info& rhs); + + public: + COneIPv4Info(uint32_t ip, uint16_t vlan, MacAddress mac) : COneIPInfo(vlan, mac) { + m_ip = ip; + } + COneIPv4Info(uint32_t ip, uint16_t vlan) : COneIPv4Info (ip, vlan, MacAddress()) { + } + uint32_t get_ip() {return m_ip;} + virtual uint8_t ip_ver() {return IP4_VER;} + virtual uint32_t get_arp_req_len() {return 60;} + virtual uint32_t get_grat_arp_len() {return 60;} + virtual void fill_arp_req_buf(uint8_t *p, uint16_t port_id, COneIPInfo *sip); + virtual void fill_grat_arp_buf(uint8_t *p); + private: - enum CPretestPortInfoStates { - INIT_NEEDED, + virtual const void get_ip_str(char str[100]){ + ip_to_str(m_ip, str); + }; + uint32_t m_ip; +}; + +inline bool operator== (const COneIPv4Info& lhs, const COneIPv4Info& rhs) { + if (lhs.m_vlan != rhs.m_vlan) + return false; + + if (lhs.m_ip != rhs.m_ip) + return false; + + return true; +} + +inline bool operator!= (const COneIPv4Info& lhs, const COneIPv4Info& rhs){ return !(lhs == rhs); } + +class COneIPv6Info : public COneIPInfo { + friend bool operator== (const COneIPv6Info& lhs, const COneIPv6Info& rhs); + + public: + COneIPv6Info(uint16_t ip[8], uint16_t vlan, MacAddress mac) : COneIPInfo(vlan, mac) { + memcpy(m_ip, ip, sizeof(m_ip)); + } + + COneIPv6Info(uint16_t ip[8], uint16_t vlan) : COneIPv6Info(ip, vlan, MacAddress()){ + } + + const uint8_t *get_ipv6() {return (uint8_t *)m_ip;} + virtual uint8_t ip_ver() {return IP6_VER;} + virtual uint32_t get_arp_req_len() {return 100; /* ??? put correct number*/} + virtual uint32_t get_grat_arp_len() {return 100; /* ??? put correct number*/} + virtual void fill_arp_req_buf(uint8_t *p, uint16_t port_id, COneIPInfo *sip); + virtual void fill_grat_arp_buf(uint8_t *p); + + private: + virtual const void get_ip_str(char str[100]) { + ipv6_to_str((ipaddr_t *)m_ip, str); + } + uint16_t m_ip[8]; +}; + +inline bool operator== (const COneIPv6Info& lhs, const COneIPv6Info& rhs) { + if (lhs.m_vlan != rhs.m_vlan) + return false; + + if (memcmp(&lhs.m_ip, &rhs.m_ip, sizeof(rhs.m_ip))) + return false; + + return true; +} + +inline bool operator!= (const COneIPv6Info& lhs, const COneIPv6Info& rhs){ return !(lhs == rhs); } + +class CPretestOnePortInfo { + friend class CPretest; + enum CPretestOnePortInfoStates { RESOLVE_NEEDED, - RESOLVE_DONE, RESOLVE_NOT_NEEDED, }; - CPretestPortInfo() { - m_state = INIT_NEEDED; - m_is_loopback = false; - m_stats.clear(); - } - void dump(FILE *fd); - uint8_t *create_arp_req(uint16_t &pkt_size, uint8_t port, bool is_grat); - void set_params(CPerPortIPCfg port_cfg, const uint8_t *src_mac, bool resolve_needed); - void set_dst_mac(const uint8_t *dst_mac); - + public: + CPretestOnePortInfo(); + void add_src(uint32_t ip, uint16_t vlan, MacAddress mac); + void add_dst(uint32_t ip, uint16_t vlan); + void add_src(uint16_t ip[8], uint16_t vlan, MacAddress mac); + void add_dst(uint16_t ip[8], uint16_t vlan); + bool get_mac(uint32_t ip, uint16_t vlan, uint8_t *mac); + bool get_mac(uint16_t ip[8], uint16_t vlan, uint8_t *mac); + bool get_mac(COneIPInfo *ip, uint8_t *mac); + COneIPInfo *get_src(uint16_t vlan, uint8_t ip_ver); + void set_port_id(uint16_t port_id) {m_port_id = port_id;} + void dump(FILE *fd, char *offset); + bool is_loopback() {return m_is_loopback;} + CPreTestStats get_stats() {return m_stats;} + bool resolve_needed(); + void send_grat_arp_all(); + void send_arp_req_all(); + + private: + COneIPv4Info *find_ip(uint32_t ip, uint16_t vlan); + COneIPv4Info *find_next_hop(uint32_t ip, uint16_t vlan); + COneIPv6Info *find_ipv6(uint16_t *ip, uint16_t vlan); + bool get_mac(COneIPInfo *ip, uint16_t vlan, uint8_t *mac, uint8_t ip_ver); + private: - uint32_t m_ip; - uint32_t m_def_gw; - uint16_t m_vlan; - uint8_t m_src_mac[6]; - uint8_t m_dst_mac[6]; - enum CPretestPortInfoStates m_state; bool m_is_loopback; + CPretestOnePortInfoStates m_state; CPreTestStats m_stats; + uint16_t m_port_id; + std::vector<COneIPInfo *> m_src_info; + std::vector<COneIPInfo *> m_dst_info; }; - class CPretest { public: CPretest(uint16_t max_ports) { m_max_ports = max_ports; + for (int i =0; i < max_ports; i++) { + m_port_info[i].set_port_id(i); + } } - bool get_mac(uint16_t port, uint32_t ip, uint8_t *mac); + void add_ip(uint16_t port, uint32_t ip, uint16_t vlan, MacAddress src_mac); + void add_ip(uint16_t port, uint32_t ip, MacAddress src_mac); + void add_next_hop(uint16_t port, uint32_t ip, uint16_t vlan); + void add_next_hop(uint16_t port, uint32_t ip); + void add_ip(uint16_t port, uint16_t ip[8], uint16_t vlan, MacAddress src_mac); + void add_ip(uint16_t port, uint16_t ip[8], MacAddress src_mac); + void add_next_hop(uint16_t port, uint16_t ip[8], uint16_t vlan); + void add_next_hop(uint16_t port, uint16_t ip[8]); + bool get_mac(uint16_t port, uint32_t ip, uint16_t vlan, uint8_t *mac); + bool get_mac(uint16_t port, uint16_t ip[8], uint16_t vlan, uint8_t *mac); CPreTestStats get_stats(uint16_t port_id); bool is_loopback(uint16_t port); - void set_port_params(uint16_t port_id, const CPerPortIPCfg &port_cfg, const uint8_t *src_mac, bool resolve_needed); bool resolve_all(); - void send_arp_req(uint16_t port, bool is_grat); + void send_arp_req_all(); void send_grat_arp_all(); - bool is_arp(const uint8_t *p, uint16_t pkt_size, ArpHdr *&arp); + bool is_arp(const uint8_t *p, uint16_t pkt_size, ArpHdr *&arp, uint16_t &vlan_tag); void dump(FILE *fd); void test(); - + private: int handle_rx(int port, int queue_id); private: - CPretestPortInfo m_port_info[TREX_MAX_PORTS]; + CPretestOnePortInfo m_port_info[TREX_MAX_PORTS]; uint16_t m_max_ports; }; |