Agora  1.2.0
Agora project
dpdk_transport.h
Go to the documentation of this file.
1 
6 #ifndef DPDK_TRANSPORT_H_
7 #define DPDK_TRANSPORT_H_
8 
9 #include <netinet/ether.h>
10 #include <rte_byteorder.h>
11 #include <rte_cycles.h>
12 #include <rte_debug.h>
13 #include <rte_distributor.h>
14 #include <rte_eal.h>
15 #include <rte_ethdev.h>
16 #include <rte_ether.h>
17 #include <rte_flow.h>
18 #include <rte_ip.h>
19 #include <rte_malloc.h>
20 #include <rte_pause.h>
21 #include <rte_prefetch.h>
22 #include <rte_udp.h>
23 #include <unistd.h>
24 
25 #include <cinttypes>
26 #include <string>
27 
28 // #include "eth_common.h"
29 #include "utils.h"
30 
31 static constexpr size_t kRxRingSize = 2048;
32 static constexpr size_t kTxRingSize = 2048;
33 static constexpr size_t kNumMBufs = ((64 * 1024) - 1);
34 static constexpr size_t kMBufCacheSize = 128;
35 static constexpr size_t kMacAddrBtyes = 17;
36 
37 // allow max jumbo frame 9.5 KB
38 static constexpr size_t kJumboFrameMaxSize = 0x2600;
40 static constexpr size_t kRxBatchSize = 16;
41 static constexpr size_t kTxBatchSize = 1;
42 
44 //static constexpr size_t kPayloadOffset =
45 // sizeof(rte_ether_hdr) + sizeof(rte_ipv4_hdr) + sizeof(rte_udp_hdr) + 22;
46 //static_assert(kPayloadOffset == 64, "kPayloadOffset must equal 64");
47 
48 static constexpr size_t kPayloadOffset =
49  sizeof(rte_ether_hdr) + sizeof(rte_ipv4_hdr) + sizeof(rte_udp_hdr);
50 
52  public:
53  DpdkTransport();
55 
56  static std::vector<uint16_t> GetPortIDFromMacAddr(
57  size_t port_num, const std::string& mac_addrs);
58 
59  static int NicInit(uint16_t port, struct rte_mempool* mbuf_pool,
60  int thread_num, size_t pkt_len = kJumboFrameMaxSize);
61 
62  // Steer the flow [src_ip, dest_ip, src_port, dst_port] arriving on
63  // [port_id] to RX queue [rx_q]
64  static void InstallFlowRule(uint16_t port_id, uint16_t rx_q, uint32_t src_ip,
65  uint32_t dest_ip, uint16_t src_port,
66  uint16_t dst_port);
67 
68  static void InstallFlowRuleDropAll(uint16_t port_id);
69 
70  static void FastMemcpy(void* pvDest, void* pvSrc, size_t nBytes);
71  static void PrintPkt(rte_be32_t src_ip, rte_be32_t dst_ip,
72  rte_be16_t src_port, rte_be16_t dst_port, size_t len,
73  size_t tid);
74 
76  static std::string PktToString(const rte_mbuf* pkt);
77 
80  static rte_mbuf* AllocUdp(rte_mempool* mbuf_pool, rte_ether_addr src_mac_addr,
81  rte_ether_addr dst_mac_addr, uint32_t src_ip_addr,
82  uint32_t dst_ip_addr, uint16_t src_udp_port,
83  uint16_t dst_udp_port, size_t buffer_length,
84  uint16_t pkt_id);
85 
87  static void DpdkInit(uint16_t core_offset, size_t thread_num);
88  static rte_mempool* CreateMempool(size_t num_ports,
89  size_t packet_length = kJumboFrameMaxSize);
90 };
91 
92 #endif // DPDK_TRANSPORT_H_
DpdkTransport::InstallFlowRule
static void InstallFlowRule(uint16_t port_id, uint16_t rx_q, uint32_t src_ip, uint32_t dest_ip, uint16_t src_port, uint16_t dst_port)
__attribute__
class RadioSocket __attribute__
kMBufCacheSize
static constexpr size_t kMBufCacheSize
Definition: dpdk_transport.h:34
fmt::v8::printf
auto printf(const S &fmt, const T &... args) -> int
Definition: printf.h:631
DpdkTransport::AllocUdp
static rte_mbuf * AllocUdp(rte_mempool *mbuf_pool, rte_ether_addr src_mac_addr, rte_ether_addr dst_mac_addr, uint32_t src_ip_addr, uint32_t dst_ip_addr, uint16_t src_udp_port, uint16_t dst_udp_port, size_t buffer_length, uint16_t pkt_id)
src_port
uint16_t src_port
Definition: eth_common.h:60
DpdkTransport::GetPortIDFromMacAddr
static std::vector< uint16_t > GetPortIDFromMacAddr(size_t port_num, const std::string &mac_addrs)
fmt::v8::detail::digits::error
@ error
Definition: format-inl.h:643
DpdkTransport::DpdkTransport
DpdkTransport()
src_ip
uint32_t src_ip
Definition: eth_common.h:70
dst_port
uint16_t dst_port
Definition: eth_common.h:61
AGORA_LOG_TRACE
#define AGORA_LOG_TRACE(...)
Definition: logger.h:92
frame_header_to_string
static std::string frame_header_to_string(const uint8_t *buf)
Definition: eth_common.h:150
DpdkTransport::PrintPkt
static void PrintPkt(rte_be32_t src_ip, rte_be32_t dst_ip, rte_be16_t src_port, rte_be16_t dst_port, size_t len, size_t tid)
DpdkTransport
Definition: dpdk_transport.h:51
message.h
Self defined functions for message storage and passing.
DpdkTransport::InstallFlowRuleDropAll
static void InstallFlowRuleDropAll(uint16_t port_id)
kNumMBufs
static constexpr size_t kNumMBufs
Definition: dpdk_transport.h:33
nlohmann::json_v3_11_1NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON::detail2::begin
begin_tag begin(T &&...)
len
uint16_t len
Definition: eth_common.h:62
i
for i
Definition: generate_data.m:107
DpdkTransport::FastMemcpy
static void FastMemcpy(void *pvDest, void *pvSrc, size_t nBytes)
u
Plot Rx waveform for u
Definition: inspect_single_frame.m:108
sp
sp
Definition: simulate_performance.m:5
Packet
Definition: message.h:164
eth_common.h
Common definitons for Ethernet-based transports.
DpdkTransport::CreateMempool
static rte_mempool * CreateMempool(size_t num_ports, size_t packet_length=kJumboFrameMaxSize)
kTxRingSize
static constexpr size_t kTxRingSize
Definition: dpdk_transport.h:32
kInetHdrsTotSize
static constexpr size_t kInetHdrsTotSize
Definition: eth_common.h:144
DpdkTransport::~DpdkTransport
~DpdkTransport()
kRxRingSize
static constexpr size_t kRxRingSize
Definition: dpdk_transport.h:31
DpdkTransport::NicInit
static int NicInit(uint16_t port, struct rte_mempool *mbuf_pool, int thread_num, size_t pkt_len=kJumboFrameMaxSize)
GetPhysicalCoreId
size_t GetPhysicalCoreId(size_t core_id)
Definition: utils.cc:128
AGORA_LOG_INFO
#define AGORA_LOG_INFO(...)
Definition: logger.h:62
kMacAddrBtyes
static constexpr size_t kMacAddrBtyes
Definition: dpdk_transport.h:35
core_list
static std::list< CoreInfo > core_list
Definition: utils.cc:49
RtAssert
static void RtAssert(bool condition, const char *throw_str)
Definition: utils.h:104
AGORA_LOG_WARN
#define AGORA_LOG_WARN(...)
Definition: logger.h:53
DpdkTransport::PktToString
static std::string PktToString(const rte_mbuf *pkt)
Return a string representation of this packet.
to_string
std::string to_string() const
Definition: eth_common.h:64
kPayloadOffset
static constexpr size_t kPayloadOffset
Offset to the payload starting from the beginning of the UDP frame.
Definition: dpdk_transport.h:48
kRxBatchSize
static constexpr size_t kRxBatchSize
Maximum number of packets received in rx_burst.
Definition: dpdk_transport.h:40
kTxBatchSize
static constexpr size_t kTxBatchSize
Definition: dpdk_transport.h:41
utils.h
Utility functions for file and text processing.
dpdk_transport.h
Declaration file for the DpdkTransport class.
kJumboFrameMaxSize
static constexpr size_t kJumboFrameMaxSize
Definition: dpdk_transport.h:38
DpdkTransport::DpdkInit
static void DpdkInit(uint16_t core_offset, size_t thread_num)
Init dpdk on core [core_offset:core_offset+thread_num].
dst_ip
uint32_t dst_ip
Definition: eth_common.h:71
nlohmann::json_v3_11_1NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON::detail2::end
end_tag end(T &&...)
Packet::ToString
std::string ToString() const
Definition: message.h:177