diff options
author | Ido Barnea <ibarnea@cisco.com> | 2016-11-15 16:27:08 +0200 |
---|---|---|
committer | Ido Barnea <ibarnea@cisco.com> | 2016-11-21 12:56:28 +0200 |
commit | bf83f301e4fdbf333240af7f316735e35634c5fd (patch) | |
tree | 667c001d36a1b1a95b0f6da82d9919977543746c /src/stateful_rx_core.cpp | |
parent | c39cdf89bee7999ba714eb31e8ec4bc8b5d52a60 (diff) |
client config ARP resolve working. Still missing IPv6 support.
Signed-off-by: Ido Barnea <ibarnea@cisco.com>
Diffstat (limited to 'src/stateful_rx_core.cpp')
-rw-r--r-- | src/stateful_rx_core.cpp | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/src/stateful_rx_core.cpp b/src/stateful_rx_core.cpp index cbf62a17..7ee802df 100644 --- a/src/stateful_rx_core.cpp +++ b/src/stateful_rx_core.cpp @@ -588,32 +588,56 @@ void CLatencyManager::send_pkt_all_ports(){ } } -void CLatencyManager::send_grat_arp_all_ports() { - for (int port_id = 0; port_id < m_max_ports; port_id++) { - if (! CGlobalInfo::m_options.m_ip_cfg[port_id].grat_arp_needed()) - continue; - - CLatencyManagerPerPort * lp = &m_ports[port_id]; - rte_mbuf_t *m = CGlobalInfo::pktmbuf_alloc_small(CGlobalInfo::m_socket.port_to_socket(port_id)); - assert(m); - uint8_t *p = (uint8_t *)rte_pktmbuf_append(m, 60); // ARP packet is shorter than 60 - uint32_t sip = CGlobalInfo::m_options.m_ip_cfg[port_id].get_ip(); - uint8_t *src_mac = CGlobalInfo::m_options.m_mac_addr[port_id].u.m_mac.src; - uint16_t vlan = CGlobalInfo::m_options.m_ip_cfg[port_id].get_vlan(); - // gratuitous ARP. Requested IP is our source. - CTestPktGen::create_arp_req(p, sip, sip, src_mac, vlan, port_id); +double CLatencyManager::grat_arp_timeout() { + return (double)CGlobalInfo::m_options.m_arp_ref_per / m_arp_info.size(); +} + +void CLatencyManager::add_grat_arp_src(COneIPv4Info &ip) { + m_arp_info.insert(ip); +} + +void CLatencyManager::send_one_grat_arp() { + const COneIPInfo *ip_info; + uint16_t port_id; + CLatencyManagerPerPort * lp; + rte_mbuf_t *m; + uint8_t src_mac[ETHER_ADDR_LEN]; + uint16_t vlan; + uint32_t sip; + + ip_info = m_arp_info.get_next(); + if (!ip_info) + ip_info = m_arp_info.get_next(); + // Two times NULL means there are no addresses + if (!ip_info) + return; + port_id = ip_info->get_port(); + lp = &m_ports[port_id]; + m = CGlobalInfo::pktmbuf_alloc_small(CGlobalInfo::m_socket.port_to_socket(port_id)); + assert(m); + uint8_t *p = (uint8_t *)rte_pktmbuf_append(m, ip_info->get_grat_arp_len()); + ip_info->get_mac(src_mac); + vlan = ip_info->get_vlan(); + switch(ip_info->ip_ver()) { + case COneIPInfo::IP4_VER: + sip = ((COneIPv4Info *)ip_info)->get_ip(); + CTestPktGen::create_arp_req(p, sip, sip, src_mac, vlan, port_id); if (CGlobalInfo::m_options.preview.getVMode() >= 3) { - printf("Sending gratuitous ARP on port %d vlan:%d, sip:0x%08x\n", port_id, vlan, sip); + printf("Sending gratuitous ARP on port %d vlan:%d, sip:%s\n", port_id, vlan + , ip_to_str(sip).c_str()); utl_DumpBuffer(stdout, p, 60, 0); } - if ( lp->m_io->tx(m) == 0 ) { lp->m_port.m_ign_stats.m_tx_arp++; lp->m_port.m_ign_stats.m_tot_bytes += 64; // mbuf size is smaller, but 64 bytes will be sent } else { lp->m_port.m_tx_pkt_err++; } + break; + case COneIPInfo::IP6_VER: + //??? implement ipv6 + break; } } @@ -815,9 +839,9 @@ void CLatencyManager::start(int iter, bool activate_watchdog) { case CGenNode::GRAT_ARP: m_cpu_dp_u.start_work1(); - send_grat_arp_all_ports(); + send_one_grat_arp(); m_p_queue.pop(); - node->m_time += (double)CGlobalInfo::m_options.m_arp_ref_per; + node->m_time += grat_arp_timeout(); m_p_queue.push(node); m_cpu_dp_u.commit1(); break; |