驱动粗暴改了改后,AP模式就有了,phy0-ap0也创建出来了。
但是在wifi起来后,手机却连不上。radio能连上,申请dhcp超时。
这驱动貌似没改对阿。
Licheepi 4a 上WIFI起不来的原因是,WIFI不支持AP模式:
Supported interface modes:
* managed
* monitor
WIFI不支持AP的原因是,rtw88这个驱动它认为8723ds是sta_only的:
bool sta_mode_only = rtwdev->hci.type == RTW_HCI_TYPE_SDIO;
郁闷了,想了一个月了,没往capability上去想,而是把openwrt的wifi整个研究了一遍。
Ubuntu给了我的x86软路由以第二春:能重启。
Debian和openwrt都不能让它们重启,reboot会死机。
wdev_create中会判断MAC类型,fullmac就用改名的方式,softmac则创建新的虚接口。mac80211模块被openwrt补过,不会自动创建wlan0,所以所有使用mc80211的softmac网卡开机时都是没有虚接口的。
这串调用位于hostapd之前,hostapd期待在其开始执行前虚接口已经就位。
现在在lichee pi 4a上的问题就在这里:NL80211命令下发到了内核,没有报错,却也没有生效。
在lichee pi 4a上实测,调用nl80211.request的参数为:
{ "wiphy": 0, "ifname": "phy0-ap0", "iftype": 3 }`
明后天有空的话要在内核里加trace才能查了。
再推翻昨天的结论。
揭晓答案,负责创建三层网络接口的代码是一段ucode:
wdev_create()
> nl80211.request(
nl80211.const.NL80211_CMD_NEW_INTERFACE,
nl80211.const.NLM_F_CREATE,
req);
这样就直通内核nl80211子系统了,创建虚接口就是在这发生的。
接下来是调用栈:
首先在netifd中,根据网络类型mac80211而调用mac80211.sh中:
drv_mac80211_setup
> hostapd_set_config
>> ubus_call hostapd config_set
>>> ubus config_set (位于hostapd.uc)
>>>> iface_set_config
>>>>> iface_restart
>>>>>> iface_pending_init
>>>>>>> iface_pending_next
>>>>>>>> wdev_add
>>>>>>>>> wdev_create (位于common.uc)
再往上是ucode:
iface_pending_next (hostapd.uc)
> __iface_pending_next (hostapd.uc)
>> iface_add (hostapd.uc)
>>> hostapd.add_iface (hostapd.uc)
>>>> uc_hostapd_add_iface (ucode.c)
>>>>> hostapd_add_iface (hostapd.c)
推翻了昨天的结论。实际函数调用关系如下:
hostapd_add_iface
> interfaces->driver_init (hostapd_driver_init)
>> hapd->driver->hapd_init (i802_init)
>>> wpa_driver_nl80211_drv_init
>>>> wpa_driver_nl80211_finish_drv_init
>>>> wpa_driver_nl80211_deinit
研究得知,wifi接口phy0-ap0其实是由hostapd创建的。函数调用关系如下:
main
hostapd_setup_interface
setup_interface
setup_interface2
hostapd_setup_interface_complete
hostapd_setup_interface_complete_sync
hostapd_setup_bss
hostapd_if_add
wpa_driver_nl80211_if_add (wpa_driver_nl80211_ops->if_add)
nl80211_create_iface
nl80211_create_iface_once
特此记录,明天再查,我要睡觉了