cfg80211_ready_on_channel函数永达
时间: 2024-11-24 13:43:12 浏览: 8
`cfg80211_ready_on_channel` 是 Linux 内核中 Wi-Fi 驱动框架(cfg80211 API)的一部分,它用于指示无线网络设备已经准备就绪并可以在这个特定的频道上接收或发送数据。这个函数通常在硬件驱动完成频道扫描,确定了最佳频道,并配置好无线链路层后调用。
当调用 `cfg80211_ready_on_channel` 时,网络管理模块(例如iwconfig或wpa_supplicant)会接收到信号,表明设备已准备好连接到指定的Wi-Fi频道,此时客户端应用程序可以发起连接请求或者用户可以通过CLI工具设置无线网络。
示例用法可能像这样:
```c
struct wireless_dev *wdev = ...; // 获取到无线设备句柄
int channel = ...; // 设备将使用的频道号
if (cfg80211_send_cmd(wdev, NL80211_CMD_CHANNEL_CHANGE, &channel)) {
pr_info("%s: Ready on channel %d\n", dev->name, channel);
} else {
perror("Failed to set channel");
}
```
相关问题
Linux内核中的net/wireless/core.c文件cfg80211_cancel_remain_on_channel函数代码
好的,下面是 `cfg80211_cancel_remain_on_channel()` 函数的代码:
```
void cfg80211_cancel_remain_on_channel(struct wireless_dev *wdev,
unsigned int cookie)
{
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
struct ieee80211_channel_switch *sw;
struct ieee80211_sub_if_data *sdata;
unsigned long flags;
bool found = false;
spin_lock_irqsave(&rdev->wowlan.lock, flags);
list_for_each_entry(sw, &rdev->wowlan.offchannel_tx_roc_list, list) {
if (sw->cookie == cookie) {
list_del(&sw->list);
found = true;
break;
}
}
spin_unlock_irqrestore(&rdev->wowlan.lock, flags);
if (!found) {
wdev_dbg(wdev, "ROC: cancel failed - no matching cookie found\n");
return;
}
sdata = container_of(sw->vif, struct ieee80211_sub_if_data, vif);
if (sw->type == IEEE80211_CHANNEL_SWITCH_TYPE_ROC) {
wdev_dbg(wdev, "ROC: cancel %dms remain-on-channel period on %pM\n",
sw->duration, sdata->dev->dev_addr);
cfg80211_remain_on_channel_expired(sdata->dev, sw->cookie,
sw->freq, GFP_KERNEL);
} else {
wdev_dbg(wdev, "ROC: cancel non-ROC channel switch on %pM\n",
sdata->dev->dev_addr);
}
kfree(sw);
}
```
该函数用于取消一个 ROC(Remain-on-Channel)操作,ROC 是一个在 Wi-Fi 网络中非常有用的操作。通过 ROC 操作,一个设备可以留在一个特定的 Wi-Fi 频道上一段时间,以便接收来自其他设备的数据包。在 ROC 操作期间,设备不会发送数据包,只是被动地监听信道上的数据包。
在函数中,它首先在 `wowlan.offchannel_tx_roc_list` 列表中查找与给定 cookie 相匹配的 ROC 操作。如果找到了匹配的 ROC 操作,则从列表中删除该操作。接下来,它检查该 ROC 操作是否是 ROC 操作(还是其他类型的操作),并相应地取消该操作。如果是 ROC 操作,则通过 `cfg80211_remain_on_channel_expired()` 函数通知内核该操作已经过期。最后,释放该 ROC 操作的内存。
cfg80211_remain_on_channel代码具体实现
cfg80211_remain_on_channel函数的具体实现代码如下:
```
int cfg80211_remain_on_channel(struct wiphy *wiphy,
struct net_device *dev,
struct ieee80211_channel *chan,
unsigned int duration,
u64 *cookie)
{
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
struct cfg80211_roc_request *roc_req;
int err;
if (!rdev->ops->remain_on_channel)
return -EOPNOTSUPP;
roc_req = kzalloc(sizeof(*roc_req), GFP_KERNEL);
if (!roc_req)
return -ENOMEM;
roc_req->cookie = get_wiphy_cookie(wiphy);
roc_req->wdev = dev_to_wdev(dev);
roc_req->chan = chan;
roc_req->duration = duration;
roc_req->aborted = false;
roc_req->wait = wait_event_interruptible(rdev->roc_wait, roc_req->aborted);
if (roc_req->wait < 0) {
/* user cancelled */
kfree(roc_req);
return roc_req->wait;
}
err = rdev_remain_on_channel(rdev, roc_req);
if (err) {
kfree(roc_req);
return err;
}
*cookie = roc_req->cookie;
return 0;
}
```
在此实现中,首先检查设备是否支持ROC功能。如果不支持,则返回-EOPNOTSUPP。如果支持ROC,则会创建一个新的cfg80211_roc_request结构体,该结构体用于保存ROC请求信息。然后,会将ROC请求添加到设备的ROC请求列表中,并调用驱动程序的remain_on_channel函数启动ROC操作。最后,会等待ROC操作完成,并将ROC请求从设备的ROC请求列表中删除。
需要注意的是,实际的ROC操作是由驱动程序完成的,因此具体的实现方式可能会因不同的硬件平台而有所不同。
阅读全文