天天看點

dpdk l2forward example + hyperscan

1. GITHUB路徑

https://github.com/MiterV1/dpdk-hyperscan

1.如何實作端口過濾

2.如何實作協定過濾

dpdk收包

nb_rx = rte_eth_rx_burst(portid, 0, pkts_burst, MAX_PKT_BURST);

 解析包的五元組 

l2fwd_parse_ipv4_5tuple(m, &tuple);

 判斷五元組中port與協定與給定值是否相同

if (tuple.port_src == get_ui_port_filter_src_port() || tuple.port_dst == get_ui_port_filter_dst_port()) {
    dump_pcap_write(dump_fd, m);
    continue;
}

if (tuple.proto == proto) {
    dump_pcap_write(dump_fd, m);
    continue;
}
           

相同則将包資料寫到pcap檔案中

3.如何實作應用過濾

先計算五元組的hash值,先在hash表中檢視是否包含該hash項
如果有該hash項則說明為某條應用流,直接dump到pcap檔案
           
m_data.hash = rte_hash_hash(m_data.handle, &tuple);
m_data.tuple = &tuple;

int ret = rte_hash_lookup_with_hash(m_data.handle, &tuple, m_data.hash);
if (ret > 0) {
    dump_pcap_write(dump_fd, m);

    如果在hash表中未找到該hash項,那麼說明需要對該資料包進行比對,使用hyperscan提取其中的特征資訊
    if (hs_scan_stream(g_streams[m_data.hash % 4096], rte_pktmbuf_mtod(m, char *),
            rte_pktmbuf_data_len(m), 0, g_scratch, eventHandler, &m_data) != HS_SUCCESS) {
        fprintf(stderr, "hs_scan_stream error.\n");
    }
    
    調用scan_stream函數對資料包比對之前編譯的規則資訊,如果比對成功則調用eventHandler函數
    該函數将添加該流資訊到流表中,用于後續的流表比對
static int eventHandler(unsigned int id, unsigned long long from,
                        unsigned long long to, unsigned int flags, void *ctx)
{
    printf("Match for pattern \"%d\" at offset %llu\n", id, to);

    struct matched_data *mdata = (struct matched_data *)ctx;
    rte_hash_add_key_with_hash(mdata->handle, mdata->tuple, mdata->hash);

    return 0;
}


           

https://github.com/MiterV1/dpdk-hyperscan#4-gtk30-gui%E7%95%8C%E9%9D%A2 4. GTK3.0 GUI界面

使用GTK3.0添加前端界面與後端程式進行互動,效果如圖所示:

dpdk l2forward example + hyperscan

4. 源碼安裝相關

工程目錄如下所示:

dpdk  hyperscan  l2fwd-hyperscan

1. 安裝hyperscan

sudo apt-get install cmake

sudo apt-get install libboost-all-dev

sudo apt-get install ragel

sudo apt-get install libpcap-dev

sudo apt-get install sqlite3

cmake CMakeLists.txt

make

2. 安裝并編譯DPDK

3. 綁定網卡

4. 編譯工具

    export RTE_SDK=你的DPDK路徑到x86_64-native-linuxapp-gcc級别:例如/home/user/work/dpdk/x86_64-native-linuxapp-gcc

    export HYPERSCAN_SDK=你的hyperscan路徑:例如/home/user/work/hyperscan

    cd l2fwd-hyperscan

    cd src

    make

5. 啟動工具

    cd ../

    ./l2fwd-hyperscan -c 1 -n 1 -- -p 1