hostapd閱讀(openwrt)-2


  深入追蹤openwrt下的hostapd之后,發現openwrt無線管理機制格外的復雜,幾乎所以的觸發與回調均離不開ubus,關於ubus這里不作解釋,先大概了解其用途即可(出門左轉:https://wiki.openwrt.org/doc/techref/ubus)。咱們先來了解openwrt下無線啟動,我們首先查看系統啟動腳本:/etc/preinit,發現該腳本主要是系統的檢驗與初始化,然后我們進入/etc/init.d/:

root@openwrt:/etc/init.d# ls cron done firewall log odhcpd rpcd sysfixtime system uhttpd boot dropbear led network protectx sysctl sysntpd telnet umount

 

通過查看與網絡相關的啟動腳本,最后發現network文件里面,出現:

start_service() { init_switch procd_open_instance procd_set_param command /sbin/netifd procd_set_param respawn procd_set_param watch network.interface [ -e /proc/sys/kernel/core_pattern ] && { procd_set_param limits core="unlimited"
                echo '/tmp/%e.%p.%s.%t.core' > /proc/sys/kernel/core_pattern } procd_close_instance }

 

通過查閱相關資料發現netifd大有文章(https://wiki.openwrt.org/doc/techref/netifd), 簡單的來說,netifd是老版本openwrt腳本初始化與配置網絡的替代品,主要底層構建在netlink之上。netifd可以監視/etc/config/network配置文件,這樣一來可能通過/etc/init.d/network reload重新加載網絡,而不用每次重啟全部的網絡組件,netifd主要的組成有:

openwrt編譯目錄為:package/network/config/netifd 1. Shell腳本: /sbin/ifup, /sbin/ifdown(link to ifup), /sbin/ifstatus, /sbin/devstatus 2. init.d腳本: /etc/init.d/network 3. hotplug2腳本: /etc/hotplug.d/iface/00-netstate, /etc/hotplug.d/iface/10-sysctl 4. udhcpc腳本: /usr/share/udhcpc/default.script 5. netifd守護進程binary: /sbin/netifd 其它相關: hostapd(hostapd.sh) dhcp 等等

 

netifd在啟動時候會調用網絡相關組件進行初始化:

void netifd_init_script_handlers(int dir_fd, script_dump_cb cb) { glob_t g; int i, prev_fd; prev_fd = netifd_dir_push(dir_fd); glob("./*.sh", 0, NULL, &g); for (i = 0; i < g.gl_pathc; i++) netifd_parse_script_handler(g.gl_pathv[i], cb); netifd_dir_pop(prev_fd); }

上述函數中即調用了hostapd的啟動腳本:
lib/netifd/wireless/mac80211.sh 向ubus注冊了網絡接口處理函數
int netifd_ubus_init(const char *path) { uloop_init(); ubus_path = path; ubus_ctx = ubus_connect(path); if (!ubus_ctx) return -EIO; DPRINTF("connected as %08x\n", ubus_ctx->local_id); ubus_ctx->connection_lost = netifd_ubus_connection_lost; netifd_ubus_add_fd(); netifd_add_object(&main_object); netifd_add_object(&dev_object); netifd_add_object(&wireless_object); netifd_add_iface_object(); return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM