1.配置流程git
環境:centos 7.2.1511,內核版本3.10.0-327.el7.x86_64github
[1]下載內核源碼,https://buildlogs.cdn.centos.org/c7.1511.00/kernel/20151119220809/3.10.0-327.el7.x86_64/kernel-devel-3.10.0-327.el7.x86_64.rpmcentos
1)cp kernel-devel-3.10.0-327.el7.x86_64.rpm /usr/local/src函數
2)cd /usr/local/src/測試
3)rpm -ivh kernel-devel-3.10.0-327.el7.x86_64.rpm //此時內核源碼就安裝到了/usr/src/kernels/3.10.0-327.el7.x86_64ui
[2]下載netmap源碼:https://github.com/luigirizzo/netmapspa
1)cp netmap-master /usr/local/srccode
2)cd /usr/local/src/netmap-master/LINUXcdn
3)./configure --drivers=igb --kernel-sources=/usr/src/kernels/3.10.0-327.el7.x86_64 //表示只編譯igb驅動blog
4)make
5)make install //此時在當前目錄會生成netmap.ko和igb/igb.ko
[3]加載驅動(在當前LINUX目錄下執行)
1)rmmod igb //卸載當前的igb驅動
2)insmod netmap.ko //加載netmap.ko驅動
3)insmod igb/igb.ko //加載netmap的igb驅動,這個igb驅動和以前的igb驅動是不同的,另外若是當前管理口網卡用的就是igb驅動,執行第一步後會連不上設備,因此能夠把這三步寫到腳本里面執行。
2.測試代碼
下面的代碼從網卡eth1收包:
#include <stdio.h> #include <poll.h> #define NETMAP_WITH_LIBS #include <net/netmap_user.h> unsigned long pps = 0; static void receive_packets(struct netmap_ring *ring) { int i; char *buf; while (!nm_ring_empty(ring)) { i = ring->cur; buf = NETMAP_BUF(ring, ring->slot[i].buf_idx); pps++; ring->head = ring->cur = nm_ring_next(ring, i); } } int main(void) { struct nm_desc *d; struct pollfd fds; struct netmap_ring *ring; int i; d = nm_open("netmap:eth1", NULL, 0, 0); fds.fd = d->fd; fds.events = POLLIN; while (1) { if (poll(&fds, 1, 1) < 0) { perror("poll()"); exit(1); } for (i = d->first_rx_ring; i <= d->last_rx_ring; i++) { ring = NETMAP_RXRING(d->nifp, i); receive_packets(ring); } } return 0; }
3.說明
[1]安裝netmap的igb驅動後,全部當前使用igb的網卡都支持使用netmap處理報文。
[2]若是不調用nm_open()函數,全部網卡仍是正常進內核處理。對一個網卡調用了nm_open()函數以後,這個網卡的全部包就不會進內核處理,因此此時須要在程序中處理這些報文。