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. */
相关推荐
陈随易1 天前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
鱼樱前端1 天前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
犀利豆1 天前
Claude code tools 研究系列-开篇(AskUserQuestion)
后端
颜酱1 天前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端
IT_陈寒1 天前
SpringBoot自动配置坑了我一周,原来问题这么蠢!
前端·人工智能·后端
iOS开发上架哦1 天前
Android代码混淆与iOS加固技术详解
后端·ios
Alan_6911 天前
商品详情优化三板斧-拆分-多级缓存-GC调参
后端·缓存
Conan在掘金1 天前
ArkTS 进阶之道(3):为哈禁解构声明?类型一眼可见 vs 推断链断裂
后端
晚安code1 天前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
feng尘1 天前
深度解析布隆过滤器(Bloom Filter):原理、优缺点与 1000 万黑名单实战
后端·面试