1. 選個example來改,哪個會比較快?
條件:要能完成所有初始化,並能解析L3層封包,得到source IP Address 跟 Packet Length
2. 目前挑選的是L3FWD這個example,有struct ipv4_5tuple 跟 function parse_max_pkt_len
5 tuple分別是IP source, IP dest. , Port source, Port dest. , Protocol
3. Example下面有三個.c檔,除了 main.c 外分別是 l3fwd_em.c (Exact Match) / l3fwd_lpm.c (Longest Prefix Match)
4. 目前在 l3fwd_em.c (Exact Match)做更動,因l3fwd_lpm.c (Longest Prefix Match)看不太出來有用到 ip_src
ipv4_5tuple_host 有五個function call 如 ipve4_hash_CRC, convert_ipv_5tuple 目前在裡面放printf(),但看起來執行階段都還在initial
TBD:
把CMS接起來,原輸入檔案是trace檔直接去parse出來 , 要改成能只讀檔 Source IP 跟 Packet Length兩欄
要怎麼把這個檔案直接放在CPU Cache裡面?
用別的example來改會比較快?
Starting program: /home/linux/dpdk/dpdk-stable-16.11.2/examples/l3fwd/build/l3fwd -l 1,2 -n 2 -- -p 0x3 --config="(0,0,1),(1,0,2)" -E --parse-ptype -P
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
EAL: Detected 32 lcore(s)
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
[New Thread 0x7ffff73e3700 (LWP 7664)]
[New Thread 0x7ffff6be2700 (LWP 7665)]
EAL: PCI device 0000:03:00.0 on NUMA socket 0
EAL: probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:03:00.1 on NUMA socket 0
EAL: probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:05:00.0 on NUMA socket 0
EAL: probe driver: 8086:1533 net_e1000_igb
EAL: PCI device 0000:06:00.0 on NUMA socket 0
EAL: probe driver: 8086:1533 net_e1000_igb
EAL: PCI device 0000:07:00.0 on NUMA socket 0
EAL: probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:07:00.1 on NUMA socket 0
EAL: probe driver: 8086:10fb net_ixgbe
L3FWD: Exact match selected
soft parse-ptype is enabled
L3FWD: Promiscuous mode selected
Initializing port 0 ... Creating queues: nb_rxq=1 nb_txq=2... Address:00:1B:21:BC:2D:0E, Destination:02:00:00:00:00:00, Allocated mbuf pool on socket 0
convert_ipv4_5tuple
100.10.0.1
ipv4_hash_crc
1.0.10.100
convert_ipv4_5tuple
200.20.0.1
ipv4_hash_crc
1.0.20.200
convert_ipv4_5tuple
100.30.0.1
ipv4_hash_crc
1.0.30.100
convert_ipv4_5tuple
200.40.0.1
ipv4_hash_crc
1.0.40.200
Hash: Adding 0x4 keys
txq=1,0,0 txq=2,1,0
Initializing port 1 ... Creating queues: nb_rxq=1 nb_txq=2... Address:00:1B:21:BC:2D:0F, Destination:02:00:00:00:00:01, txq=1,0,0 txq=2,1,0
Initializing rx queues on lcore 1 ... rxq=0,0,0
Initializing rx queues on lcore 2 ... rxq=1,0,0
Port 0: softly parse packet type info
Port 1: softly parse packet type info
Checking link statusdone
Port 0 Link Up - speed 10000 Mbps - full-duplex
Port 1 Link Up - speed 10000 Mbps - full-duplex
L3FWD: entering main loop on lcore 2
L3FWD: -- lcoreid=2 portid=1 rxqueueid=0
L3FWD: entering main loop on lcore 1
L3FWD: -- lcoreid=1 portid=0 rxqueueid=0
^C
Thread 1 "l3fwd" received signal SIGINT, Interrupt.
0x000000000043b3db in em_cb_parse_ptype (port=0 '\000', queue=0, pkts=0x7fffffffe1a0, nb_pkts=0, max_pkts=32, user_param=0x0)
at /home/linux/dpdk/dpdk-stable-16.11.2/examples/l3fwd/l3fwd_em.c:652
652 for (i = 0; i < nb_pkts; ++i)
(gdb) quit
A debugging session is active.
Inferior 1 [process 7660] will be killed.
Quit anyway? (y or n) y
C
Union跟Struct不同?
Union比Struct節省空間
https://www.ptt.cc/bbs/C_and_CPP/M.1135177982.A.902.html
目的: 拿5tuple的Parser跟Struct來用。
l3fwd
l3fwd_em.c
em_main_loop(__attribute__((unused)) void *dummy)
>>
static struct l3fwd_lkp_mode l3fwd_em_lkp = {
.setup = setup_hash,
.check_ptype = em_check_ptype,
.cb_parse_ptype = em_cb_parse_ptype,
.main_loop = em_main_loop,
.get_ipv4_lookup_struct = em_get_ipv4_l3fwd_lookup_struct,
.get_ipv6_lookup_struct = em_get_ipv6_l3fwd_lookup_struct,
};
>>
setup_l3fwd_lookup_tables(void)
{
/* Setup HASH lookup functions. */
if (l3fwd_em_on)
l3fwd_lkp = l3fwd_em_lkp;
/* Setup LPM lookup functions. */
else
l3fwd_lkp = l3fwd_lpm_lkp;
}
>>
main.c
/* Setup function pointers for lookup method. */
setup_l3fwd_lookup_tables();
>>
setup_hash(const int socketid)
ipv4_hash_crc(const void *data, __rte_unused uint32_t data_len,
convert_ipv4_5tuple(struct ipv4_5tuple *key1,