zoukankan      html  css  js  c++  java
  • Netlink 内核实现分析 4

    netlink 库函数:

    http://www.infradead.org/~tgr/libnl/doc/core.html#core_netlink_fundamentals

    #define NETLINK_TEST            (31)
    
    static
    int s_send_ack_to_test(struct lua_nl_ack *ack)
    {
        struct sk_buff *nl_skb;
        struct nlmsghdr *nlh;
    
        int ret;
        int len = sizeof(*ack);
    
        nl_skb = nlmsg_new(len, GFP_ATOMIC);
        if (!nl_skb) {
            pr_err("netlink: nlmsg_new fail\n");
            return -1;
        }
    
        nlh = nlmsg_put(nl_skb, 0, 0, NETLINK_WNS, len, 0);
        if(nlh == NULL) {
            pr_err("netlink: nlmsg_put fail\n");
            nlmsg_free(nl_skb);
            return -1;
        }
    
        memcpy(nlmsg_data(nlh), (void *)ack, len);
        ret = netlink_unicast(nlsk, nl_skb, NETLINK_WNS_LUA, MSG_DONTWAIT);
        
        return ret;
    }
    
    static
    void test_input_cb(struct sk_buff *skb)
    {
        struct nlmsghdr *nlh = NULL;
        struct lua_nl_req *req = NULL;
        struct lua_nl_ack ack;
    
        nlh = (struct nlmsghdr *)skb->data;
    
        if (NLMSG_OK(nlh, skb->len) && skb->len >= NLMSG_HDRLEN + sizeof(struct lua_nl_req)) {
            req = (struct lua_nl_req *)NLMSG_DATA(nlh);
    
            (void)s_get_ip_mac(req, &ack);
    
            if (s_send_ack_to_test(&ack) < 0) {
                pr_err("netlink: s_send_ack_to_lua error\n");
            }
    
            //TODO: netlink消息失败的情况需要再仔细考虑下,可能导致阻塞
            
        }
        else {
            pr_err("netlink: parameters error\n");
        }
    
        return ;
    }
    
    static struct netlink_kernel_cfg cfg = {
        .input = test_input_cb,
    };
    
    static
    int s_init_netlink()
    {
        nlsk = netlink_kernel_create(&init_net, NETLINK_TEST, THIS_MODULE, &cfg);
        if (!nlsk) {
            pr_err("netlink: init fail\n");
            return -1;
        }
    
        return 0;
    }
    http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
  • 相关阅读:
    Xcode 6 下添加pch头文件
    兵器簿之github的配置和使用
    sql 2005性能调优
    C#遍历枚举(Enum)值
    使用 jQuery 调用 ASP.NET AJAX Page Method
    强制不使用“兼容性视图”的HTML代码
    HR在ERP实施过程中的作用
    WdatePicker日历添加事件,在任意月改变时处理日期事件
    JQuery实现表格自动增加行,对新行添加事件
    获取元素离文档各边的距离
  • 原文地址:https://www.cnblogs.com/codestack/p/10850608.html
Copyright © 2011-2022 走看看