最近在调试Hostapd,尝试通过配置使能一个支持MLO的AP,不过不知道hostapd conf里面哪些选项开启后可以使能,所以对Hostapd做一个整体解析.本篇分析介绍hostapd如何通过nl80211控制驱动。原理驱动在内核注册一个nl80211接口struct netlink_kernel_cfg cfg { .input nl_recv_msg, }; nl_sock netlink_kernel_create(init_net, NETLINK_USER, cfg);应用层想要调用就向NETLINK_USER发送即可sock_fd socket(PF_NETLINK, SOCK_RAW, NETLINK_USER); // 建立 socket sendmsg(sock_fd, msg, 0); // 发送消息到内核实现hostapd 2.11像这样初始化netlink-sock socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (netlink-sock 0) { wpa_printf(MSG_ERROR, netlink: Failed to open netlink socket: %s, strerror(errno)); netlink_deinit(netlink); return NULL; } os_memset(local, 0, sizeof(local)); local.nl_family AF_NETLINK; local.nl_groups RTMGRP_LINK; if (bind(netlink-sock, (struct sockaddr *) local, sizeof(local)) 0) { wpa_printf(MSG_ERROR, netlink: Failed to bind netlink socket: %s, strerror(errno)); netlink_deinit(netlink); return NULL; }linux内核像这样初始化static int __net_init rtnetlink_net_init(struct net *net) { struct sock *sk; struct netlink_kernel_cfg cfg { .groups RTNLGRP_MAX, .input rtnetlink_rcv, .cb_mutex rtnl_mutex, .flags NL_CFG_F_NONROOT_RECV, .bind rtnetlink_bind, }; sk netlink_kernel_create(net, NETLINK_ROUTE, cfg); if (!sk) return -ENOMEM; net-rtnl sk; return 0; }