1/*
2 * FST module - FST interface object definitions
3 * Copyright (c) 2014, Qualcomm Atheros, Inc.
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 */
8
9
10#ifndef FST_IFACE_H
11#define FST_IFACE_H
12
13#include "utils/includes.h"
14#include "utils/common.h"
15#include "list.h"
16#include "fst.h"
17
18struct fst_iface {
19	struct fst_group *group;
20	struct fst_wpa_obj iface_obj;
21	u8 own_addr[ETH_ALEN];
22	struct wpabuf *mb_ie;
23	char ifname[IFNAMSIZ + 1];
24	struct fst_iface_cfg cfg;
25	struct dl_list group_lentry;
26};
27
28struct fst_iface * fst_iface_create(struct fst_group *g, const char *ifname,
29				    const u8 *own_addr,
30				    const struct fst_wpa_obj *iface_obj,
31				    const struct fst_iface_cfg *cfg);
32void fst_iface_delete(struct fst_iface *i);
33
34static inline struct fst_group * fst_iface_get_group(struct fst_iface *i)
35{
36	return i->group;
37}
38
39static inline const char * fst_iface_get_name(struct fst_iface *i)
40{
41	return i->ifname;
42}
43
44static inline const u8 * fst_iface_get_addr(struct fst_iface *i)
45{
46	return i->own_addr;
47}
48
49static inline const char * fst_iface_get_group_id(struct fst_iface *i)
50{
51	return i->cfg.group_id;
52}
53
54static inline u8 fst_iface_get_priority(struct fst_iface *i)
55{
56	return i->cfg.priority;
57}
58
59static inline u32 fst_iface_get_llt(struct fst_iface *i)
60{
61	return i->cfg.llt;
62}
63
64static inline const struct wpabuf * fst_iface_get_mbie(struct fst_iface *i)
65{
66	return i->mb_ie;
67}
68
69static inline const u8 * fst_iface_get_bssid(struct fst_iface *i)
70{
71	return i->iface_obj.get_bssid(i->iface_obj.ctx);
72}
73
74static inline void fst_iface_get_channel_info(struct fst_iface *i,
75					      enum hostapd_hw_mode *hw_mode,
76					      u8 *channel)
77{
78	i->iface_obj.get_channel_info(i->iface_obj.ctx, hw_mode, channel);
79}
80
81static inline int fst_iface_get_hw_modes(struct fst_iface *i,
82					 struct hostapd_hw_modes **modes)
83{
84	return i->iface_obj.get_hw_modes(i->iface_obj.ctx, modes);
85}
86
87static inline void fst_iface_set_ies(struct fst_iface *i,
88				     const struct wpabuf *fst_ies)
89{
90	i->iface_obj.set_ies(i->iface_obj.ctx, fst_ies);
91}
92
93static inline int fst_iface_send_action(struct fst_iface *i,
94					const u8 *addr, struct wpabuf *data)
95{
96	return i->iface_obj.send_action(i->iface_obj.ctx, addr, data);
97}
98
99static inline const struct wpabuf *
100fst_iface_get_peer_mb_ie(struct fst_iface *i, const u8 *addr)
101{
102	return i->iface_obj.get_mb_ie(i->iface_obj.ctx, addr);
103}
104
105static inline void fst_iface_update_mb_ie(struct fst_iface *i,
106					  const u8 *addr,
107					  const u8 *buf, size_t size)
108{
109	i->iface_obj.update_mb_ie(i->iface_obj.ctx, addr, buf, size);
110}
111
112static inline const u8 * fst_iface_get_peer_first(struct fst_iface *i,
113						  struct fst_get_peer_ctx **ctx,
114						  Boolean mb_only)
115{
116	return i->iface_obj.get_peer_first(i->iface_obj.ctx, ctx, mb_only);
117}
118
119static inline const u8 * fst_iface_get_peer_next(struct fst_iface *i,
120						 struct fst_get_peer_ctx **ctx,
121						 Boolean mb_only)
122{
123	return i->iface_obj.get_peer_next(i->iface_obj.ctx, ctx, mb_only);
124}
125
126Boolean fst_iface_is_connected(struct fst_iface *iface, const u8 *addr,
127			       Boolean mb_only);
128void fst_iface_attach_mbie(struct fst_iface *i, struct wpabuf *mbie);
129enum mb_band_id fst_iface_get_band_id(struct fst_iface *i);
130
131static inline void * fst_iface_get_wpa_obj_ctx(struct fst_iface *i)
132{
133	return i->iface_obj.ctx;
134}
135
136#endif /* FST_IFACE_H */
137