kni

news/2024/12/23 3:31:19/
当dpdk不想在用户态实现协议栈的还,可以采用KNI 调用内核实现的协议栈
kni分为用户态和内核态
其内核态的入口为lib/librte_eal/linuxapp/kni/kni_misc.c中
#可以看这是个标准的ko的实现,其入口函数是kni_initmodule_init(kni_init);
static int __init
kni_init(void)
{int rc;#检查kthread_mode 这个参数是否等于single 或者 multipleif (kni_parse_kthread_mode() < 0) {pr_err("Invalid parameter for kthread_mode\n");return -EINVAL;}if (multiple_kthread_on == 0)pr_debug("Single kernel thread for all KNI devices\n");elsepr_debug("Multiple kernel thread mode enabled\n");#注册一个网络子系统
#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONSrc = register_pernet_subsys(&kni_net_ops);
#elserc = register_pernet_gen_subsys(&kni_net_id, &kni_net_ops);
#endifif (rc)return -EPERM;#注册一个misc设备,这个misc 设备包含ioctl操作rc = misc_register(&kni_misc);if (rc != 0) {pr_err("Misc registration failed\n");goto out;}#根据输入参数配置lo modekni_net_config_lo_mode(lo_mode);return 0;
}
这个模块可以接受的参数如下:
MODULE_PARM_DESC(lo_mode,
"KNI loopback mode (default=lo_mode_none):\n"
"    lo_mode_none        Kernel loopback disabled\n"
"    lo_mode_fifo        Enable kernel loopback with fifo\n"
"    lo_mode_fifo_skb    Enable kernel loopback with fifo and skb buffer\n"
"\n"
);module_param(kthread_mode, charp, S_IRUGO);
MODULE_PARM_DESC(kthread_mode,
"Kernel thread mode (default=single):\n"
"    single    Single kernel thread mode enabled.\n"
"    multiple  Multiple kernel thread mode enabled.\n"
"\n"
);可见可以配置lo mode和kthread_mode
用户态可以参考example/kni/main.c中的写法
int
main(int argc, char** argv)
{int ret;uint16_t nb_sys_ports, port;unsigned i;/* Associate signal_hanlder function with USR signals */#注册下面四个信号量的处理函数为signal_handlersignal(SIGUSR1, signal_handler);signal(SIGUSR2, signal_handler);signal(SIGRTMIN, signal_handler);signal(SIGINT, signal_handler);/* Initialise EAL */#初始化eal环境。ret = rte_eal_init(argc, argv);if (ret < 0)rte_exit(EXIT_FAILURE, "Could not initialise EAL (%d)\n", ret);argc -= ret;argv += ret;/* Parse application arguments (after the EAL ones) */ret = parse_args(argc, argv);if (ret < 0)rte_exit(EXIT_FAILURE, "Could not parse input parameters\n");/* Create the mbuf pool */#创建pktmbuf_pool pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF,MEMPOOL_CACHE_SZ, 0, MBUF_DATA_SZ, rte_socket_id());if (pktmbuf_pool == NULL) {rte_exit(EXIT_FAILURE, "Could not initialise mbuf pool\n");return -1;}/* Get number of ports found in scan */#得到网卡的port的个数nb_sys_ports = rte_eth_dev_count();if (nb_sys_ports == 0)rte_exit(EXIT_FAILURE, "No supported Ethernet device found\n");/* Check if the configured port ID is valid */#检查这些网口id 是否有效for (i = 0; i < RTE_MAX_ETHPORTS; i++)if (kni_port_params_array[i] && i >= nb_sys_ports)rte_exit(EXIT_FAILURE, "Configured invalid ""port ID %u\n", i);/* Initialize KNI subsystem */#初始化KNI 子系统init_kni();#让每个核都运行main_loop/* Launch per-lcore function on every lcore */rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER);RTE_LCORE_FOREACH_SLAVE(i) {if (rte_eal_wait_lcore(i) < 0)return -1;}}
具体的mail_loop实现如下:
static int
main_loop(__rte_unused void *arg)
{uint8_t i, nb_ports = rte_eth_dev_count();int32_t f_stop;const unsigned lcore_id = rte_lcore_id();enum lcore_rxtx {LCORE_NONE,LCORE_RX,LCORE_TX,LCORE_MAX};enum lcore_rxtx flag = LCORE_NONE;#具体是发送还是接受for (i = 0; i < nb_ports; i++) {if (!kni_port_params_array[i])continue;if (kni_port_params_array[i]->lcore_rx == (uint8_t)lcore_id) {flag = LCORE_RX;break;} else if (kni_port_params_array[i]->lcore_tx ==(uint8_t)lcore_id) {flag = LCORE_TX;break;}}#给你讲flag决定是发送数据还是接受手机if (flag == LCORE_RX) {RTE_LOG(INFO, APP, "Lcore %u is reading from port %d\n",kni_port_params_array[i]->lcore_rx,kni_port_params_array[i]->port_id);while (1) {f_stop = rte_atomic32_read(&kni_stop);if (f_stop)break;#循环接受数据kni_ingress(kni_port_params_array[i]);}} else if (flag == LCORE_TX) {RTE_LOG(INFO, APP, "Lcore %u is writing to port %d\n",kni_port_params_array[i]->lcore_tx,kni_port_params_array[i]->port_id);while (1) {f_stop = rte_atomic32_read(&kni_stop);if (f_stop)break;#循环发送数据kni_egress(kni_port_params_array[i]);}} elseRTE_LOG(INFO, APP, "Lcore %u has nothing to do\n", lcore_id);return 0;
}
我们看看接受数据的情况
static void
kni_ingress(struct kni_port_params *p)
{uint8_t i;uint16_t port_id;unsigned nb_rx, num;uint32_t nb_kni;struct rte_mbuf *pkts_burst[PKT_BURST_SZ];if (p == NULL)return;nb_kni = p->nb_kni;port_id = p->port_id;for (i = 0; i < nb_kni; i++) {/* Burst rx from eth */#首先从网口读数据到pkts_burstnb_rx = rte_eth_rx_burst(port_id, 0, pkts_burst, PKT_BURST_SZ);if (unlikely(nb_rx > PKT_BURST_SZ)) {RTE_LOG(ERR, APP, "Error receiving from eth\n");return;}/* Burst tx to kni */#将pkts_burst中的数据督导kni中num = rte_kni_tx_burst(p->kni[i], pkts_burst, nb_rx);kni_stats[port_id].rx_packets += num;rte_kni_handle_request(p->kni[i]);if (unlikely(num < nb_rx)) {/* Free mbufs not tx to kni interface */kni_burst_free_mbufs(&pkts_burst[num], nb_rx - num);kni_stats[port_id].rx_dropped += nb_rx - num;}}
}


http://www.ppmy.cn/news/162039.html

相关文章

KNN(K近邻)

物以类聚&#xff0c;人以群分&#xff1b;近朱者赤&#xff0c;近墨者黑。这两句话的大概意思就是&#xff0c;你周围大部分朋友是什么人&#xff0c;那么你大概率也就是这种人&#xff0c;这句话其实也就是KNN算法的核心思想。 所谓的物以类聚&#xff0c;人以群分&#xff0…

KNN(k近邻详解)

KNN&#xff08;k近邻详解&#xff09; 详细链接一 详细链接二 一句话说明白KNN算法原理 下面我们只讲关于分类的KNN&#xff0c;回归的不讲。 其实很简单&#xff0c;就是计算你要预测的点的周围最近的K个点&#xff0c;然后取这k个点中最多的类定义为你要预测的这个点所属…

Kibana

Kibana Kibana 是一款开源的数据分析和可视化平台&#xff0c;它是 Elastic Stack 成员之一&#xff0c;设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析…

电子发票(PDF)识别信息提取(JAVA)电子专票(OFD)在线预览

网上也有资料&#xff0c;有的只有jar包没有源码&#xff0c;整理好网上的资源&#xff0c;把源码开放出来。 https://gitee.com/kanen/invoice 欢迎使用和交流。 内容介绍 电子发票&#xff08;PDF&#xff09;识别与验真 1、支持电子发票&#xff08;PDF&#xff09;的读取…

Conan

# 环境 ubuntu:bionic的docker image shell docker run -it ubuntu:bionic 预装工具 shell apt-get install cmake # 安装conan shell # pip3 install conan Collecting conan # conan -v Conan version 1.33.0 # 使用conan >官方文档&#xff1a;https://docs.conan.io/…

Koin

Dagger 的麻烦 如果还不清楚什么是依赖注入&#xff0c;那么请参考之前写的 Dagger2 in Android&#xff08;一&#xff09;通俗基础开头部分。如果你不了解 Dagger 倒也无妨&#xff0c;本文会进行一定的对比&#xff0c;但仅针对接触过 Dagger 的同学&#xff0c;否则大可以忽…

KNN(K近邻算法)

一、KNN基本知识 KNN算法 -------- 做分类&#xff08;二分类、多分类&#xff09;、也可以做回归KNN的三要素&#xff1a;K值的影响&#xff1a;1. K值过小&#xff0c;可能会导致过拟合2. K值过大&#xff0c;可能会导致欠拟合距离的计算方式&#xff1a;一般使…

KNN——K近邻

KNN&#xff08;K-Nearest Neighbor&#xff09;最邻近分类算法是数据挖掘分类&#xff08;classification&#xff09;技术中最简单的算法之一&#xff0c;其指导思想是”近朱者赤&#xff0c;近墨者黑“&#xff0c;即由你的邻居来推断出你的类别。 K近邻(KNN)分类器是有监督…