hostapd/src/fst/fst_group.h
Dedy Lansky c7f9d44825 FST: Fix search for peer's "other" connection
Upon receiving FST Setup Request from some peer on some interface,
search is made to see if same peer is connected on other interface with
specific band_id. With multiple peers, bug in
fst_group_does_iface_appear_in_other_mbies() caused wrong peer address
to be returned sometimes.

Fix this with a modified, simplified search algorithm of peer's "other"
connection.

Signed-off-by: Dedy Lansky <qca_dlansky@qca.qualcomm.com>
2016-09-08 11:17:45 +03:00

69 lines
1.9 KiB
C

/*
* FST module - FST group object definitions
* Copyright (c) 2014, Qualcomm Atheros, Inc.
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
#ifndef FST_GROUP_H
#define FST_GROUP_H
struct fst_group {
char group_id[IFNAMSIZ + 1];
struct dl_list ifaces;
u8 dialog_token;
u32 fsts_id;
struct dl_list global_groups_lentry;
};
struct session_transition_ie;
#define foreach_fst_group_iface(g, i) \
dl_list_for_each((i), &(g)->ifaces, struct fst_iface, group_lentry)
struct fst_group * fst_group_create(const char *group_id);
void fst_group_attach_iface(struct fst_group *g, struct fst_iface *i);
void fst_group_detach_iface(struct fst_group *g, struct fst_iface *i);
void fst_group_delete(struct fst_group *g);
void fst_group_update_ie(struct fst_group *g);
static inline Boolean fst_group_has_ifaces(struct fst_group *g)
{
return !dl_list_empty(&g->ifaces);
}
static inline struct fst_iface * fst_group_first_iface(struct fst_group *g)
{
return dl_list_first(&g->ifaces, struct fst_iface, group_lentry);
}
static inline const char * fst_group_get_id(struct fst_group *g)
{
return g->group_id;
}
Boolean fst_group_delete_if_empty(struct fst_group *group);
struct fst_iface * fst_group_get_iface_by_name(struct fst_group *g,
const char *ifname);
struct fst_iface *
fst_group_get_peer_other_connection(struct fst_iface *iface,
const u8 *peer_addr, u8 band_id,
u8 *other_peer_addr);
u8 fst_group_assign_dialog_token(struct fst_group *g);
u32 fst_group_assign_fsts_id(struct fst_group *g);
extern struct dl_list fst_global_groups_list;
#define foreach_fst_group(g) \
dl_list_for_each((g), &fst_global_groups_list, \
struct fst_group, global_groups_lentry)
static inline struct fst_group * fst_first_group(void)
{
return dl_list_first(&fst_global_groups_list, struct fst_group,
global_groups_lentry);
}
#endif /* FST_GROUP_H */