P2P: Move random channel selection into a helper function
The new p2p_channel_select() function can be re-used to implement random channel selection from a set of operating classes in all places that need such functonality. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
b17d89bd10
commit
5576663fba
3 changed files with 41 additions and 18 deletions
|
@ -348,6 +348,7 @@ void p2p_reselect_channel(struct p2p_data *p2p,
|
||||||
int freq;
|
int freq;
|
||||||
u8 op_reg_class, op_channel;
|
u8 op_reg_class, op_channel;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
const int op_classes_5ghz[] = { 115, 124, 0 };
|
||||||
|
|
||||||
if (p2p->own_freq_preference > 0 &&
|
if (p2p->own_freq_preference > 0 &&
|
||||||
p2p_freq_to_channel(p2p->own_freq_preference,
|
p2p_freq_to_channel(p2p->own_freq_preference,
|
||||||
|
@ -438,24 +439,11 @@ void p2p_reselect_channel(struct p2p_data *p2p,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prefer a 5 GHz channel */
|
/* Prefer a 5 GHz channel */
|
||||||
for (i = 0; i < intersection->reg_classes; i++) {
|
if (p2p_channel_select(intersection, op_classes_5ghz,
|
||||||
struct p2p_reg_class *c = &intersection->reg_class[i];
|
&p2p->op_reg_class, &p2p->op_channel) == 0) {
|
||||||
if ((c->reg_class == 115 || c->reg_class == 124) &&
|
p2p_dbg(p2p, "Pick possible 5 GHz channel (op_class %u channel %u) from intersection",
|
||||||
c->channels) {
|
p2p->op_reg_class, p2p->op_channel);
|
||||||
unsigned int r;
|
return;
|
||||||
|
|
||||||
/*
|
|
||||||
* Pick one of the available channels in the operating
|
|
||||||
* class at random.
|
|
||||||
*/
|
|
||||||
os_get_random((u8 *) &r, sizeof(r));
|
|
||||||
r %= c->channels;
|
|
||||||
p2p_dbg(p2p, "Pick possible 5 GHz channel (op_class %u channel %u) from intersection",
|
|
||||||
c->reg_class, c->channel[r]);
|
|
||||||
p2p->op_reg_class = c->reg_class;
|
|
||||||
p2p->op_channel = c->channel[r];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -581,6 +581,8 @@ int p2p_channels_includes(const struct p2p_channels *channels, u8 reg_class,
|
||||||
u8 channel);
|
u8 channel);
|
||||||
void p2p_channels_dump(struct p2p_data *p2p, const char *title,
|
void p2p_channels_dump(struct p2p_data *p2p, const char *title,
|
||||||
const struct p2p_channels *chan);
|
const struct p2p_channels *chan);
|
||||||
|
int p2p_channel_select(struct p2p_channels *chans, const int *classes,
|
||||||
|
u8 *op_class, u8 *op_channel);
|
||||||
|
|
||||||
/* p2p_parse.c */
|
/* p2p_parse.c */
|
||||||
int p2p_parse_p2p_ie(const struct wpabuf *buf, struct p2p_message *msg);
|
int p2p_parse_p2p_ie(const struct wpabuf *buf, struct p2p_message *msg);
|
||||||
|
|
|
@ -439,3 +439,36 @@ void p2p_channels_dump(struct p2p_data *p2p, const char *title,
|
||||||
|
|
||||||
p2p_dbg(p2p, "%s:%s", title, buf);
|
p2p_dbg(p2p, "%s:%s", title, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int p2p_channel_select(struct p2p_channels *chans, const int *classes,
|
||||||
|
u8 *op_class, u8 *op_channel)
|
||||||
|
{
|
||||||
|
unsigned int i, j, r;
|
||||||
|
|
||||||
|
for (i = 0; i < chans->reg_classes; i++) {
|
||||||
|
struct p2p_reg_class *c = &chans->reg_class[i];
|
||||||
|
|
||||||
|
if (c->channels == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (j = 0; classes[j]; j++) {
|
||||||
|
if (c->reg_class == classes[j])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!classes[j])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pick one of the available channels in the operating class at
|
||||||
|
* random.
|
||||||
|
*/
|
||||||
|
os_get_random((u8 *) &r, sizeof(r));
|
||||||
|
r %= c->channels;
|
||||||
|
*op_class = c->reg_class;
|
||||||
|
*op_channel = c->channel[r];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue