DPDK 网口链路状态监控

简介

在网络硬件产品中,需要对网口链路状态(UP/DOWN)进行监测,能够及时感知到链路状态的变更;这里介绍下dpdk中的实现方式,详细信息可以参考示例examples/link_status_interrupt。

示例

使能lsc中断

在rte_eth_dev_configure()端口配置中,对lsc位进行置1。

C 复制代码
static struct rte_eth_conf port_conf = {
 	...
	.intr_conf = {
		.lsc = 1, /**< lsc interrupt feature enabled */
	},
};

注册回调函数

注册的事件类型为RTE_ETH_EVENT_INTR_LSC,在链路状态变更的情况下会触发中断,并执行回调函数。

c 复制代码
rte_eth_dev_callback_register(portid, RTE_ETH_EVENT_INTR_LSC, lsi_event_callback, NULL);

回调函数处理

调用rte_eth_link_get_nowait()获取链路状态信息,并通过rte_eth_link_to_str()转换成字符串。

c 复制代码
/**
 * It will be called as the callback for specified port after a LSI interrupt
 * has been fully handled. This callback needs to be implemented carefully as
 * it will be called in the interrupt host thread which is different from the
 * application main thread.
 *
 * @param port_id
 *  Port id.
 * @param type
 *  event type.
 * @param param
 *  Pointer to(address of) the parameters.
 *
 * @return
 *  int.
 */

/* lsi_event_callback 8< */
static int
lsi_event_callback(uint16_t port_id, enum rte_eth_event_type type, void *param,
		    void *ret_param)
{
	struct rte_eth_link link;
	int ret;
	char link_status_text[RTE_ETH_LINK_MAX_STR_LEN];

	RTE_SET_USED(param);
	RTE_SET_USED(ret_param);

	printf("\n\nIn registered callback...\n");
	printf("Event type: %s\n", type == RTE_ETH_EVENT_INTR_LSC ? "LSC interrupt" : "unknown event");
	ret = rte_eth_link_get_nowait(port_id, &link);
	if (ret < 0) {
		printf("Failed link get on port %d: %s\n",
		       port_id, rte_strerror(-ret));
		return ret;
	}
	rte_eth_link_to_str(link_status_text, sizeof(link_status_text), &link);
	printf("Port %d %s\n\n", port_id, link_status_text);

	return 0;
}
/* >8 End of registering one or more callbacks. */
相关推荐
国思RDIF框架1 分钟前
RDIFramework.NET CS 敏捷开发框架 V6.3 版本重磅发布!.NET8+Framework双引擎,性能升级全维度进化
后端·.net
心在飞扬13 分钟前
ReRank重排序提升RAG系统效果
前端·后端
喝茶与编码13 分钟前
Python异步并发控制:asyncio.gather 与 Semaphore 协同设计解析
后端·python
不早睡不改名16 分钟前
网络编程基础:从BIO到NIO再到AIO(一)
后端
开源之眼17 分钟前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
心在飞扬18 分钟前
RAPTOR 递归文档树优化策略
前端·后端
zone773928 分钟前
003:RAG 入门-LangChain 读取图片数据
后端·python·面试
心在飞扬32 分钟前
LangChain Parent Document Retriever (父文档检索器)
后端
zone773940 分钟前
002:RAG 入门-LangChain 读取文本
后端·算法·面试
用户83562907805142 分钟前
在 PowerPoint 中用 Python 添加和定制形状的完整教程
后端·python