open wrt netifd netlink

static void
handle_hotplug_msg(char *data, int size)
{       
        const char *subsystem = NULL, *interface = NULL;
        char *cur, *end, *sep;
        struct device *dev;
        int skip;
        bool add;
        
        if (!strncmp(data, "add@", 4))
                add = true;
        else if (!strncmp(data, "remove@", 7))
                add = false;
        else    
                return;
        
        skip = strlen(data) + 1;
        end = data + size;
        
        for (cur = data + skip; cur < end; cur += skip) {
                skip = strlen(cur) + 1;
                
                sep = strchr(cur, '=');
                if (!sep)
                        continue;
                
                *sep = 0;
                if (!strcmp(cur, "INTERFACE"))
                        interface = sep + 1;
                else if (!strcmp(cur, "SUBSYSTEM")) {
                        subsystem = sep + 1;
                        if (strcmp(subsystem, "net") != 0)
                                return;
                }
                if (subsystem && interface)
                        goto found;
        }
        return;

found:  
        dev = device_get(interface, false);
        if (!dev)
                return;
        
        if (dev->type != &simple_device_type)
                return;

        if (add && system_if_force_external(dev->ifname))
                return;

        device_set_present(dev, add);
}


static void
handle_hotplug_event(struct uloop_fd *u, unsigned int events)
{
        struct event_socket *ev = container_of(u, struct event_socket, uloop);
        struct sockaddr_nl nla;
        unsigned char *buf = NULL;
        int size;

        while ((size = nl_recv(ev->sock, &nla, &buf, NULL)) > 0) {
                if (nla.nl_pid == 0)
                        handle_hotplug_msg((char *) buf, size);

                free(buf);
        }
}


static int cb_rtnl_event(struct nl_msg *msg, void *arg)
{
        struct nlmsghdr *nh = nlmsg_hdr(msg);
        struct nlattr *nla[__IFLA_MAX];
        int link_state = 0;
        char buf[10];

        if (nh->nlmsg_type != RTM_NEWLINK)
                goto out;

        nlmsg_parse(nh, sizeof(struct ifinfomsg), nla, __IFLA_MAX - 1, NULL);
        if (!nla[IFLA_IFNAME])
                goto out;

        struct device *dev = device_get(nla_data(nla[IFLA_IFNAME]), false);
        if (!dev || dev->type->keep_link_status)
                goto out;

        if (!system_get_dev_sysctl("/sys/class/net/%s/carrier", dev->ifname, buf, sizeof(buf)))
                link_state = strtoul(buf, NULL, 0);

        device_set_link(dev, link_state ? true : false);

out:
        return 0;
}


int system_init(void)
{
        static struct event_socket rtnl_event;
        static struct event_socket hotplug_event;

        sock_ioctl = socket(AF_LOCAL, SOCK_DGRAM, 0);
        system_fd_set_cloexec(sock_ioctl);

        // Prepare socket for routing / address control
        sock_rtnl = create_socket(NETLINK_ROUTE, 0);
        if (!sock_rtnl)
                return -1;

        if (!create_event_socket(&rtnl_event, NETLINK_ROUTE, cb_rtnl_event))
                return -1;

        if (!create_raw_event_socket(&hotplug_event, NETLINK_KOBJECT_UEVENT, 1,
                                     handle_hotplug_event, 0))
                return -1;

        // Receive network link events form kernel
        nl_socket_add_membership(rtnl_event.sock, RTNLGRP_LINK);

        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于OpenWrt系统,打补丁通常是用来修复或增强系统的功能和安全性。下面是一些关于如何打补丁的基本步骤: 1. 获取补丁文件:您可以从OpenWrt官方网站或其他可靠的源获取所需的补丁文件。确保选择与您当前安装的OpenWrt版本兼容的补丁。 2. 将补丁文件复制到OpenWrt设备:将补丁文件复制到OpenWrt设备的合适目录下。可以使用scp命令通过SSH将补丁文件从本地计算机复制到设备上。 3. 进入OpenWrt设备:使用SSH连接到OpenWrt设备。您可能需要提供用户名和密码。 4. 应用补丁:使用patch命令应用补丁文件。例如,如果补丁文件为patch.diff,并且要将其应用到某个软件包的源代码中,可以使用以下命令: ```shell cd /path/to/package/source patch -p1 < /path/to/patch.diff ``` 注意:根据补丁的具体情况,可能需要调整-p参数的值。请查阅补丁文件中的说明或相关文档以获取更多细节。 5. 编译和安装:完成补丁应用后,您可能需要重新编译并安装相关软件包或整个OpenWrt系统。具体步骤可能因您的需求和环境而有所不同,请参考OpenWrt的文档或指南以获取更多详细信息。 请注意,打补丁可能需要一些技术知识和经验,因此在进行任何更改之前,请务必备份重要的数据和配置。如果您对此不确定,请寻求专业人士的帮助或咨询OpenWrt社区以获取支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值