目前想做个功能, 一些简单转发就在内核中直接转发走,所以想到了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