@@ -2074,12 +2074,26 @@ static int vwifi_join_ibss(struct wiphy *wiphy,
2074
2074
return - ERESTARTSYS ;
2075
2075
/* Retrieve IBSS configuration parameters */
2076
2076
memcpy (vif -> ssid , params -> ssid , params -> ssid_len );
2077
+ vif -> ibss_chandef = params -> chandef ;
2078
+ vif -> ssid_len = params -> ssid_len ;
2077
2079
/* When the BSSID is automatically generated by the system, it will not be
2078
2080
* passed as a parameter to the join function. */
2079
2081
if (params -> bssid )
2080
2082
memcpy (vif -> bssid , params -> bssid , ETH_ALEN );
2081
- vif -> ibss_chandef = params -> chandef ;
2082
- vif -> ssid_len = params -> ssid_len ;
2083
+ else {
2084
+ /* Search for IBSS networks with WPA settings in the IBSS list. If a
2085
+ * matching network exists, join it. Otherwise, create one. */
2086
+ memcpy (vif -> bssid , ndev -> dev_addr , ETH_ALEN );
2087
+ struct vwifi_vif * ibss_vif = NULL ;
2088
+ list_for_each_entry (ibss_vif , & vwifi -> ibss_list , ibss_list ) {
2089
+ if (!memcmp (ibss_vif -> ssid , vif -> ssid , vif -> ssid_len ) &&
2090
+ ibss_vif -> ibss_chandef .center_freq1 ==
2091
+ vif -> ibss_chandef .center_freq1 ) {
2092
+ memcpy (vif -> bssid , ibss_vif -> ndev -> dev_addr , ETH_ALEN );
2093
+ break ;
2094
+ }
2095
+ }
2096
+ }
2083
2097
vif -> beacon_ie_len = params -> ie_len ;
2084
2098
memcpy (vif -> beacon_ie , params -> ie , params -> ie_len );
2085
2099
vif -> ibss_beacon_int = params -> beacon_interval ;
0 commit comments