代码之家  ›  专栏  ›  技术社区  ›  Andrew G

linux网络栈:使用lkm和dev_add_包添加协议

  •  7
  • Andrew G  · 技术社区  · 16 年前

    我最近一直试图熟悉linux网络栈和设备驱动程序(两者都有类似的o'reilly books),最终目标是卸载udp。我已经在网卡上实现了udp,但现在困难的是……

    与其在这个更大的目标上寻求帮助,我希望有人能为我澄清我发现的一个特定片段,这是lkm的一部分,它注册了一个新协议(otp),充当设备驱动程序和网络堆栈之间的过滤器。

    http://www.phrack.org/archives/55/p55_0x0c_Building%20Into%20The%20Linux%20Network%20Layer_by_lifeline%20&%20kossak.txt

    (注意:这篇phrack文章包含三个不同的模块,otp的代码在页面底部)

    在这个例子的init函数中,他有:

        otp_proto.type = htons(ETH_P_ALL); 
        otp_proto.func = otp_func;
        dev_add_pack(&otp_proto);
    

    如果我理解正确的话,它应该将otp_proto注册为一个包嗅探器,并将其放入ptype_all数据结构中。我的问题是关于dev_add_包。

    注册为筛选器的协议是否始终位于L2和设备驱动程序之间的这一层?或者,例如,我可以使用相同的过程在应用程序和传输层(分析套接字参数)之间进行这样的过滤吗?

    我很抱歉,如果这是混淆-我有一些困难包装我的头周围的大局,当涉及到模块改变内核堆栈功能。

    谢谢

    2 回复  |  直到 10 年前
        1
  •  2
  •   Jay Medina    10 年前

    当您向dev_add_pack注册协议处理程序时,将在数据包到达时调用处理程序回调函数。这就是IP协议处理程序的工作原理。从inet初始化:

    static int __init inet_init(void)
    {
        ...
        rc = proto_register(&tcp_prot, 1);
        ...
        rc = proto_register(&udp_prot, 1);
        ...
        dev_add_pack(&ip_packet_type);
        ....
    

    当nic为到达的数据包引发中断时,nic中断处理程序将运行,最终调用netif_rx(或napi_schedule),这将引发softirq net_rx_操作。这将结束为每个注册的协议处理程序调用deliver_skb。从netif_receive_skb_core

    static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc)
    {
        ...
        list_for_each_entry_rcu(ptype, &ptype_all, list) {
            if (pt_prev)
                ret = deliver_skb(skb, pt_prev, orig_dev);
            pt_prev = ptype;
        }
    

    所以是的,您的协议处理程序回调函数将在L2上被调用,并与IP协议处理程序的IP RCV一起被调用。

    如果要在该层调用,可以使用“proto_register”在l3注册协议处理程序。

        2
  •  1
  •   Cong Wang    14 年前

    注册为筛选器的协议是否会 总是放在L2和设备驱动程序之间的这一层?或者, 例如,我可以在 应用程序和传输层(分析套接字参数)使用 同样的过程?

    对.您注册的包类型的.func()在设备的rx处理程序处理它之前,在netif_receive_skb()中调用。

    推荐文章