]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Add a mechanism for allowing 6 GHz channels in channel lists
authorSreeramya Soratkal <ssramya@codeaurora.org>
Tue, 4 May 2021 07:31:49 +0000 (13:01 +0530)
committerJouni Malinen <j@w1.fi>
Mon, 14 Jun 2021 17:24:37 +0000 (20:24 +0300)
Introduce a new allow_6ghz parameter to allow 6 GHz channels to be
filtered out when copying channel lists.

Signed-off-by: Sreeramya Soratkal <ssramya@codeaurora.org>
src/p2p/p2p.c
src/p2p/p2p.h
src/p2p/p2p_i.h
src/p2p/p2p_utils.c

index 09ee51089eb0fce683ec91a730794de92a518ead..88cdd4eab4a2a1a200392b472f3f582b63da5a30 100644 (file)
@@ -1397,8 +1397,8 @@ static int p2p_prepare_channel_pref(struct p2p_data *p2p,
                p2p->channels.reg_class[0].reg_class = p2p->op_reg_class;
                p2p->channels.reg_class[0].channel[0] = p2p->op_channel;
        } else {
-               os_memcpy(&p2p->channels, &p2p->cfg->channels,
-                         sizeof(struct p2p_channels));
+               p2p_copy_channels(&p2p->channels, &p2p->cfg->channels,
+                                 p2p->allow_6ghz);
        }
 
        return 0;
@@ -1485,8 +1485,7 @@ static void p2p_prepare_channel_best(struct p2p_data *p2p)
                        p2p->op_channel, p2p->op_reg_class);
        }
 
-       os_memcpy(&p2p->channels, &p2p->cfg->channels,
-                 sizeof(struct p2p_channels));
+       p2p_copy_channels(&p2p->channels, &p2p->cfg->channels, p2p->allow_6ghz);
 }
 
 
@@ -5593,6 +5592,7 @@ bool p2p_is_peer_6ghz_capab(struct p2p_data *p2p, const u8 *addr)
 void p2p_set_6ghz_dev_capab(struct p2p_data *p2p, bool allow_6ghz)
 {
        p2p->p2p_6ghz_capable = allow_6ghz;
+       p2p->allow_6ghz = allow_6ghz;
        p2p_dbg(p2p, "Set 6 GHz capability to %d", allow_6ghz);
 
        if (allow_6ghz)
@@ -5629,3 +5629,15 @@ bool p2p_peer_wfd_enabled(struct p2p_data *p2p, const u8 *peer_addr)
        return false;
 #endif /* CONFIG_WIFI_DISPLAY */
 }
+
+
+bool is_p2p_allow_6ghz(struct p2p_data *p2p)
+{
+       return p2p->allow_6ghz;
+}
+
+
+void set_p2p_allow_6ghz(struct p2p_data *p2p, bool value)
+{
+       p2p->allow_6ghz = value;
+}
index 17809a661bf4bc194b55fdfb017bc1c8b05525e4..4c6e8afef0ce5b4fc32e937546cef6fdee10383c 100644 (file)
@@ -2420,5 +2420,7 @@ bool is_p2p_6ghz_capable(struct p2p_data *p2p);
 bool p2p_is_peer_6ghz_capab(struct p2p_data *p2p, const u8 *addr);
 bool p2p_peer_wfd_enabled(struct p2p_data *p2p, const u8 *peer_addr);
 bool p2p_wfd_enabled(struct p2p_data *p2p);
+bool is_p2p_allow_6ghz(struct p2p_data *p2p);
+void set_p2p_allow_6ghz(struct p2p_data *p2p, bool value);
 
 #endif /* P2P_H */
index b778efad8632d1cf945a50506c7fe9a0d16cc017..8220e85506a3ea25493a14795211af3080c16b5e 100644 (file)
@@ -550,6 +550,7 @@ struct p2p_data {
        u8 override_pref_channel;
        bool p2p_6ghz_capable;
        bool include_6ghz;
+       bool allow_6ghz;
 };
 
 /**
@@ -700,6 +701,8 @@ int p2p_channel_random_social(struct p2p_channels *chans, u8 *op_class,
                              u8 *op_channel,
                              struct wpa_freq_range_list *avoid_list,
                              struct wpa_freq_range_list *disallow_list);
+void p2p_copy_channels(struct p2p_channels *dst, const struct p2p_channels *src,
+                      bool allow_6ghz);
 
 /* p2p_parse.c */
 void p2p_copy_filter_devname(char *dst, size_t dst_len,
index 1a62a44a2df395f95f0aeb97069747fda55c34f8..06ab799204b1af29c169c6ac0f45aca0db597899 100644 (file)
@@ -496,3 +496,24 @@ int p2p_channels_to_freqs(const struct p2p_channels *channels, int *freq_list,
 
        return idx;
 }
+
+
+void p2p_copy_channels(struct p2p_channels *dst,
+                      const struct p2p_channels *src, bool allow_6ghz)
+{
+       size_t i, j;
+
+       if (allow_6ghz) {
+               os_memcpy(dst, src, sizeof(struct p2p_channels));
+               return;
+       }
+
+       for (i = 0, j = 0; i < P2P_MAX_REG_CLASSES; i++) {
+               if (is_6ghz_op_class(src->reg_class[i].reg_class))
+                       continue;
+               os_memcpy(&dst->reg_class[j], &src->reg_class[i],
+                         sizeof(struct p2p_reg_class));
+               j++;
+       }
+       dst->reg_classes = j;
+}