首页 > 其他分享 >内核通用xdp

内核通用xdp

时间:2023-02-21 21:58:57浏览次数:48  
标签:通用 generic skb act 内核 XDP prog xdp

目前想做个功能, 一些简单转发就在内核中直接转发走,所以想到了XDP,但是呢,部分网卡驱动不支持XDP程序,能不能在netif_recv收包接口或者驱动的hook钩子挂载一个通用接口来处理XDP,目前看linux-5-18内核是已经加了此功能!

///generic_xdp_needed_key定义为:static DEFINE_STATIC_KEY_FALSE(generic_xdp_needed_key);
if (static_branch_unlikely(&generic_xdp_needed_key)) {
		int ret2;
		preempt_disable();
// 禁止抢占 ?? 中断上下文又来禁止抢占? 难道是因为ksoftirq线程处理的时候在进程上下文。
		ret2 = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb);
		preempt_enable();
		if (ret2 != XDP_PASS) {
			ret = NET_RX_DROP;
			goto out;
                }
}
int do_xdp_generic(struct bpf_prog *xdp_prog, struct sk_buff *skb)
{
	if (xdp_prog) {
		struct xdp_buff xdp;
		u32 act;
		int err;
		act = netif_receive_generic_xdp(skb, &xdp, xdp_prog);
		if (act != XDP_PASS) {
			switch (act) {
			case XDP_REDIRECT:// 对 skb 进行转发处理
				err = xdp_do_generic_redirect(skb->dev, skb,
							      &xdp, xdp_prog);
				if (err)
					goto out_redir;
				break;
			case XDP_TX:// 对 skb 进行发包处理
				generic_xdp_tx(skb, xdp_prog);
				break;
			}
			return XDP_DROP;
		}
	}
	return XDP_PASS;
out_redir:
	kfree_skb(skb);
	return XDP_DROP;
}

标签:通用,generic,skb,act,内核,XDP,prog,xdp
From: https://www.cnblogs.com/codestack/p/17142595.html

相关文章