kni 源码讲解

 1     /* Initialise EAL */
 2     ret = rte_eal_init(argc, argv);
 3     if (ret < 0)
 4         rte_exit(EXIT_FAILURE, "Could not initialise EAL (%d)\n", ret);
 5     argc -= ret;
 6     argv += ret;
 7
 8     /* Parse application arguments (after the EAL ones) */
 9     ret = parse_args(argc, argv);
10     if (ret < 0)
11         rte_exit(EXIT_FAILURE, "Could not parse input parameters\n");
12
13     /* Create the mbuf pool */
14     pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF,
15         MEMPOOL_CACHE_SZ, 0, MBUF_DATA_SZ, rte_socket_id());
16     if (pktmbuf_pool == NULL) {
17         rte_exit(EXIT_FAILURE, "Could not initialise mbuf pool\n");
18         return -1;
19     }
20
21     /* Get number of ports found in scan */
22     nb_sys_ports = rte_eth_dev_count_avail();
23     if (nb_sys_ports == 0)
24         rte_exit(EXIT_FAILURE, "No supported Ethernet device found\n");
25
26     /* Check if the configured port ID is valid */
27     for (i = 0; i < RTE_MAX_ETHPORTS; i++)
28         if (kni_port_params_array[i] && !rte_eth_dev_is_valid_port(i))
29             rte_exit(EXIT_FAILURE, "Configured invalid "
30                         "port ID %u\n", i);
31
32     /* Initialize KNI subsystem */
33     init_kni();
34
35     /* Initialise each port */
36     RTE_ETH_FOREACH_DEV(port) {
37         /* Skip ports that are not enabled */
38         if (!(ports_mask & (1 << port)))
39             continue;
40         init_port(port);
41
42         if (port >= RTE_MAX_ETHPORTS)
43             rte_exit(EXIT_FAILURE, "Can not use more than "
44                 "%d ports for kni\n", RTE_MAX_ETHPORTS);
45
46         kni_alloc(port);
47     }
48     check_all_ports_link_status(ports_mask);
49
50     pid = getpid();
51     RTE_LOG(INFO, APP, "========================\n");
52     RTE_LOG(INFO, APP, "KNI Running\n");
53     RTE_LOG(INFO, APP, "kill -SIGUSR1 %d\n", pid);
54     RTE_LOG(INFO, APP, "    Show KNI Statistics.\n");
55     RTE_LOG(INFO, APP, "kill -SIGUSR2 %d\n", pid);
56     RTE_LOG(INFO, APP, "    Zero KNI Statistics.\n");
57     RTE_LOG(INFO, APP, "========================\n");
58     fflush(stdout);
59
60     ret = rte_ctrl_thread_create(&kni_link_tid,
61                      "KNI link status check", NULL,
62                      monitor_all_ports_link_status, NULL);
63     if (ret < 0)
64         rte_exit(EXIT_FAILURE,
65             "Could not create link status thread!\n");
66
67     /* Launch per-lcore function on every lcore */
68     rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER);
69     RTE_LCORE_FOREACH_SLAVE(i) {
70         if (rte_eal_wait_lcore(i) < 0)
71             return -1;
72     }
73     monitor_links = 0;
74     pthread_join(kni_link_tid, &retval);
75
76     /* Release resources */
77     RTE_ETH_FOREACH_DEV(port) {
78         if (!(ports_mask & (1 << port)))
79             continue;
80         kni_free_kni(port);
81     }
82     for (i = 0; i < RTE_MAX_ETHPORTS; i++)
83         if (kni_port_params_array[i]) {
84             rte_free(kni_port_params_array[i]);
85             kni_port_params_array[i] = NULL;
86         }
87
88     return 0;

main 主要完成步骤:

  1.进行EAL层的初始化

  2.解析DPDK和应用层的参数

  3.分配报文的mempool,为接收报文做准备

  4.初始化以及启动接口

  5.启动各个核上的线程

转载于:https://www.cnblogs.com/mysky007/p/11219609.html

DPDK KNI 接口2相关推荐

  1. DPDK KNI介绍

    DPDK KNI KNI = Kernel NIC Interface 可以通过KNI与内核交互数据包.一些不便于用户态的处理的包可以通过KNI交于内核处理. DPDK KNI 优势 比 linux ...

  2. dpdk kni 口 ifconfig up、down 的执行流程

    问题描述 用户执行 ifconfig netcard down.up 时 rte_kni 模块中的哪部分起作用? ifconfig up down 接口的正常流程 ifconfig 是通过调用 ioc ...

  3. dpdk 程序接口 down、up 问题定位的一般流程

    接口 up.down 失败问题排查 接口 up 失败问题 排查硬件接线情况 确认网卡是否 bypass 卡,检查 bypass 状态 收集 ifconfig x/x.ethtool x/x.ethto ...

  4. DPDK KNI实现(二十五)

    一.为什么要用kni 通常情况下dpdk用于二三层报文转发,接收到来自网卡的报文后,如果是二层报文则查找fdb表: 如果是三层报文,则进行dnat, snat处理后,查找路由表, 将报文转发给下一跳路 ...

  5. 企业级负载均衡解决方案之七:京东四层负载均衡解决方案ContainerLB

    一.前言 根据文章<京东商城ContainerLB实践>里面的描述,京东在2016年的时候几乎已经把他的所有业务系统转成容器模式,"线上20万+容器实例承载着数千个业务应用&qu ...

  6. DPDK — 安装部署(CentOS 7)

    目录 文章目录 目录 官方手册 环境参数 环境准备 RT Kernel 基础软件依赖 设置大页内存 安装 DPDK 获取 DPDK 代码 设置环境变量 编译安装 目标环境目录 加载内核模块 绑定网卡到 ...

  7. DPDK — 架构解析

    目录 文章目录 目录 前文列表 DPDK 架构 内核态模块 IGB_UIO KNI PMD DPDK Lib(核心部件库) 组件代码 平台相关模块 Classify 库 QoS 库 前文列表 < ...

  8. DPDK 初识DPDK(十五)

    EAL 首先必须明白的一点就是, DPDK 是以若干个 lib 的形式提供给应用链接使用,其中最终要的一个 lib 就是 EAL 了, EAL 的全称是(Environment Abstraction ...

  9. lwip协议栈优化_干货分享 | KNI性能优化实践

    友情提示:全文5000多文字,预计阅读时间15分钟 文章源自现网实践对支撑及用户态/内核态网络报文交换场景的认识,欢迎有Linux/FreeBSD内核.网络协议栈.DPDK优化实践经验的同学留言探讨- ...

最新文章

  1. 2022-2028年中国智能眼镜行业深度调研及投资前景预测报告
  2. SAP MM 某项目上产品层次的设计
  3. 告诉你你也学不会!中台灵感 SuperCell 的管理之道!
  4. python菜鸟教程h-Python 命令行参数
  5. 深入探究递归神经网络:大牛级的训练和优化如何修成?
  6. C# 字符、字符串过滤,只能输入数字、中文、英文、大写、小写(转)
  7. 改变mysql的菜单栏的颜色_导航条——动态改变导航菜单的背景颜色
  8. python基于svm的异常检测_[scikit learn]:异常检测-OneClassSVM的替代方案
  9. UVA 847 - A Multiplication Game(游戏)
  10. QueryRunner实战(query_update)、BeanList\BeanHandler、MapList\MapHandler、ScalarHandler
  11. VTK系列12_VTK读取PNG图像并显示
  12. conda 解决An HTTP error occurred when trying to retrieve this URL.
  13. 解决nacos不停刷日志 ClientWorker get changedGroupKeys:[] 问题
  14. ECC椭圆曲线加密的特点以及在有限域(Fp)的三点共线问题
  15. 企业网站用什么服务器操作系统?
  16. 分享一些Python导图与速查表
  17. 计算机开机最快设置,怎样让电脑开机更快
  18. 字符串去掉小数点后取整数
  19. 【排序算法】归并排序(C语言)
  20. 线性滤波、非线性滤波区别

热门文章

  1. Jive学习(四)--Jive缓存
  2. 【我解C语言面试题系列】013 以单词为单位的翻转字符串
  3. Castle ActiveRecord学习实践(4):实现One-Many关系的映射
  4. 编程软件python下载怎么读-使用最方便的计算机编程软件,Python下载使用完美教程...
  5. 不是计算机专业学python能找到工作吗-非计算机行业为什么要转行学习Python编程...
  6. python3安装pip3-python3安装pip3
  7. python可以在线编程吗-有哪些 python 的在线练习题或编程挑战的网站?
  8. python绘制三维曲面图-Python中使用Matplotlib绘制3D图形示例
  9. python爬虫用途-Python爬虫入门知识:解析数据篇
  10. python web-2019年Python Web五大主流框架