Skip to content

Commit

Permalink
Align with recent cfg80211 header (#63)
Browse files Browse the repository at this point in the history
Starting from Linux v6.7, several significant changes have been made to
the cfg80211 subsystem.
1. The scan_width field is no longer present in the cfg80211_inform_bss
   structure. There really is not any support for scanning at different
   channel widths than 20 MHz since there is no way to set it.
2. The parameters in the change_beacon function have been updated to
   cfg80211_ap_update. The change_beacon function now includes two
   additional parameters, fils_discovery and unsol_bcast_probe_resp.
   These two additional parameters are part of the cfg80211_ap_update
   structure.
  • Loading branch information
jychen0611 authored May 21, 2024
1 parent 308459f commit 35ca058
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions vwifi.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,9 @@ static void inform_bss(struct vwifi_vif *vif)
struct cfg80211_inform_bss data = {
/* the only channel */
.chan = &ap->wdev.wiphy->bands[NL80211_BAND_2GHZ]->channels[0],
#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 7, 0)
.scan_width = NL80211_BSS_CHAN_WIDTH_20,
#endif
.signal = DBM_TO_MBM(rand_int_smooth(-100, -30, jiffies)),
};
int capability = WLAN_CAPABILITY_ESS;
Expand Down Expand Up @@ -529,7 +531,7 @@ static enum hrtimer_restart vwifi_beacon(struct hrtimer *timer)
.boottime_ns = ktime_get_boottime_ns(),
.chan = vif->channel,
};

#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 7, 0)
switch (vif->bw) {
case NL80211_CHAN_WIDTH_5:
bss_meta.scan_width = NL80211_BSS_CHAN_WIDTH_5;
Expand All @@ -541,7 +543,7 @@ static enum hrtimer_restart vwifi_beacon(struct hrtimer *timer)
bss_meta.scan_width = NL80211_BSS_CHAN_WIDTH_20;
break;
}

#endif
int capability = WLAN_CAPABILITY_ESS;

if (vif->privacy)
Expand Down Expand Up @@ -1580,7 +1582,12 @@ static int vwifi_stop_ap(struct wiphy *wiphy, struct net_device *ndev)

static int vwifi_change_beacon(struct wiphy *wiphy,
struct net_device *ndev,
struct cfg80211_beacon_data *info)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
struct cfg80211_ap_update *info
#else
struct cfg80211_beacon_data *info
#endif
)
{
struct vwifi_vif *vif = ndev_get_vwifi_vif(ndev);
int ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN;
Expand All @@ -1591,15 +1598,23 @@ static int vwifi_change_beacon(struct wiphy *wiphy,
* 2. tail: beacon IEs after TIM IE
* We combine them and store them in vif->beacon_ie.
*/
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
head_ie_len = info->beacon.head_len - ie_offset;
tail_ie_len = info->beacon.tail_len;
#else
head_ie_len = info->head_len - ie_offset;
tail_ie_len = info->tail_len;

#endif
if (likely(head_ie_len + tail_ie_len <= IE_MAX_LEN)) {
vif->beacon_ie_len = head_ie_len + tail_ie_len;
memset(vif->beacon_ie, 0, IE_MAX_LEN);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
memcpy(vif->beacon_ie, &info->beacon.head[ie_offset], head_ie_len);
memcpy(vif->beacon_ie + head_ie_len, info->beacon.tail, tail_ie_len);
#else
memcpy(vif->beacon_ie, &info->head[ie_offset], head_ie_len);
memcpy(vif->beacon_ie + head_ie_len, info->tail, tail_ie_len);

#endif
pr_info(
"%s: head_ie_len (before TIM IE) = %d, tail_ie_len = "
"%d",
Expand Down Expand Up @@ -2550,7 +2565,9 @@ static void vwifi_virtio_mgmt_rx_scan_response(
};
struct cfg80211_inform_bss data = {
.chan = &rx_channel,
#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 7, 0)
.scan_width = NL80211_BSS_CHAN_WIDTH_20,
#endif
.signal = DBM_TO_MBM(rand_int_smooth(-100, -30, jiffies)),
};

Expand Down

0 comments on commit 35ca058

Please sign in to comment.