• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Linux cfgp2p driver
4  *
5  * Copyright (C) 1999-2019, Broadcom.
6  *
7  *      Unless you and Broadcom execute a separate written software license
8  * agreement governing use of this software, this software is licensed to you
9  * under the terms of the GNU General Public License version 2 (the "GPL"),
10  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
11  * following added to such license:
12  *
13  *      As a special exception, the copyright holders of this software give you
14  * permission to link this software with independent modules, and to copy and
15  * distribute the resulting executable under terms of your choice, provided that
16  * you also meet, for each linked independent module, the terms and conditions of
17  * the license of that module.  An independent module is a module which is not
18  * derived from this software.  The special exception does not apply to any
19  * modifications of the software.
20  *
21  *      Notwithstanding the above, under no circumstances may you combine this
22  * software in any way with any other Broadcom software provided under a license
23  * other than the GPL, without Broadcom's express prior written consent.
24  *
25  *
26  * <<Broadcom-WL-IPTag/Open:>>
27  *
28  * $Id: wl_cfgp2p.h 794110 2018-12-12 05:03:21Z $
29  */
30 #ifndef _wl_cfgp2p_h_
31 #define _wl_cfgp2p_h_
32 #include <802.11.h>
33 #include <p2p.h>
34 
35 struct bcm_cfg80211;
36 extern u32 wl_dbg_level;
37 
38 typedef struct wifi_p2p_ie wifi_wfd_ie_t;
39 /* Enumeration of the usages of the BSSCFGs used by the P2P Library.  Do not
40  * confuse this with a bsscfg index.  This value is an index into the
41  * saved_ie[] array of structures which in turn contains a bsscfg index field.
42  */
43 typedef enum {
44 	P2PAPI_BSSCFG_PRIMARY, /**< maps to driver's primary bsscfg */
45 	P2PAPI_BSSCFG_DEVICE, /**< maps to driver's P2P device discovery bsscfg */
46 	P2PAPI_BSSCFG_CONNECTION1, /**< maps to driver's P2P connection bsscfg */
47 	P2PAPI_BSSCFG_CONNECTION2,
48 	P2PAPI_BSSCFG_MAX
49 } p2p_bsscfg_type_t;
50 
51 typedef enum {
52 	P2P_SCAN_PURPOSE_MIN,
53 	P2P_SCAN_SOCIAL_CHANNEL, /**< scan for social channel */
54 	P2P_SCAN_AFX_PEER_NORMAL, /**< scan for action frame search */
55 	P2P_SCAN_AFX_PEER_REDUCED, /**< scan for action frame search with short time */
56 	P2P_SCAN_DURING_CONNECTED, /**< scan during connected status */
57 	P2P_SCAN_CONNECT_TRY, /**< scan for connecting */
58 	P2P_SCAN_NORMAL, /**< scan during not-connected status */
59 	P2P_SCAN_PURPOSE_MAX
60 } p2p_scan_purpose_t;
61 
62 /** vendor ies max buffer length for probe response or beacon */
63 #define VNDR_IES_MAX_BUF_LEN	1400
64 /** normal vendor ies buffer length */
65 #define VNDR_IES_BUF_LEN 		512
66 
67 struct p2p_bss {
68 	s32 bssidx;
69 	struct net_device *dev;
70 	void *private_data;
71 	struct ether_addr mac_addr;
72 };
73 
74 struct p2p_info {
75 	bool on;    /**< p2p on/off switch */
76 	bool scan;
77 	int16 search_state;
78 	s8 vir_ifname[IFNAMSIZ];
79 	unsigned long status;
80 	struct p2p_bss bss[P2PAPI_BSSCFG_MAX];
81 	timer_list_compat_t listen_timer;
82 	wl_p2p_sched_t noa;
83 	wl_p2p_ops_t ops;
84 	wlc_ssid_t ssid;
85 	s8 p2p_go_count;
86 };
87 
88 #define MAX_VNDR_IE_NUMBER	10
89 
90 struct parsed_vndr_ie_info {
91 	const char *ie_ptr;
92 	u32 ie_len;	/**< total length including id & length field */
93 	vndr_ie_t vndrie;
94 };
95 
96 struct parsed_vndr_ies {
97 	u32 count;
98 	struct parsed_vndr_ie_info ie_info[MAX_VNDR_IE_NUMBER];
99 };
100 
101 /* dongle status */
102 enum wl_cfgp2p_status {
103 	WLP2P_STATUS_DISCOVERY_ON = 0,
104 	WLP2P_STATUS_SEARCH_ENABLED,
105 	WLP2P_STATUS_IF_ADDING,
106 	WLP2P_STATUS_IF_DELETING,
107 	WLP2P_STATUS_IF_CHANGING,
108 	WLP2P_STATUS_IF_CHANGED,
109 	WLP2P_STATUS_LISTEN_EXPIRED,
110 	WLP2P_STATUS_ACTION_TX_COMPLETED,
111 	WLP2P_STATUS_ACTION_TX_NOACK,
112 	WLP2P_STATUS_SCANNING,
113 	WLP2P_STATUS_GO_NEG_PHASE,
114 	WLP2P_STATUS_DISC_IN_PROGRESS
115 };
116 
117 #define wl_to_p2p_bss_ndev(cfg, type)		((cfg)->p2p->bss[type].dev)
118 #define wl_to_p2p_bss_bssidx(cfg, type)		((cfg)->p2p->bss[type].bssidx)
119 #define wl_to_p2p_bss_macaddr(cfg, type)     &((cfg)->p2p->bss[type].mac_addr)
120 #define wl_to_p2p_bss_saved_ie(cfg, type)	((cfg)->p2p->bss[type].saved_ie)
121 #define wl_to_p2p_bss_private(cfg, type)		((cfg)->p2p->bss[type].private_data)
122 #define wl_to_p2p_bss(cfg, type)			((cfg)->p2p->bss[type])
123 #define wl_get_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
124 		test_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
125 #define wl_set_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
126 		set_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
127 #define wl_clr_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
128 		clear_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
129 #define wl_chg_p2p_status(cfg, stat) ((!(cfg)->p2p_supported) ? 0 : \
130 	change_bit(WLP2P_STATUS_ ## stat, &(cfg)->p2p->status))
131 #define p2p_on(cfg) ((cfg)->p2p->on)
132 #define p2p_scan(cfg) ((cfg)->p2p->scan)
133 #define p2p_is_on(cfg) ((cfg)->p2p && (cfg)->p2p->on)
134 
135 /* dword align allocation */
136 #define WLC_IOCTL_MAXLEN 8192
137 
138 #define CFGP2P_ERROR_TEXT		DHD_LOG_PREFIXS "CFGP2P-ERROR) "
139 
140 #ifdef DHD_LOG_DUMP
141 #define	CFGP2P_ERR_MSG(x, args...)	\
142 	do {	\
143 		if (wl_dbg_level & WL_DBG_ERR) {	\
144 			printk(KERN_INFO CFGP2P_ERROR_TEXT "%s : " x, __func__, ## args);	\
145 			DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__);	\
146 			DHD_LOG_DUMP_WRITE(x, ## args);	\
147 		}	\
148 	} while (0)
149 #define CFGP2P_ERR(x) CFGP2P_ERR_MSG x
150 #define	CFGP2P_INFO_MSG(x, args...)									\
151 	do {										\
152 		if (wl_dbg_level & WL_DBG_INFO) {				\
153 			printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-INFO) %s : " x, __func__, ## args);	\
154 			DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__);	\
155 			DHD_LOG_DUMP_WRITE(x, ## args);	\
156 		}									\
157 	} while (0)
158 #define CFGP2P_INFO(x) CFGP2P_INFO_MSG x
159 #define	CFGP2P_ACTION_MSG(x, args...)								\
160 	do {									\
161 		if (wl_dbg_level & WL_DBG_P2P_ACTION) {			\
162 			printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-ACTION) %s :" x, __func__, ## args);	\
163 			DHD_LOG_DUMP_WRITE("[%s] %s: ", dhd_log_dump_get_timestamp(), __func__);	\
164 			DHD_LOG_DUMP_WRITE(x, ## args);	\
165 		}									\
166 	} while (0)
167 #define CFGP2P_ACTION(x) CFGP2P_ACTION_MSG x
168 #else
169 #define CFGP2P_ERR_MSG(x, args...)									\
170 	do {										\
171 		if (wl_dbg_level & WL_DBG_ERR) {				\
172 			printk(KERN_INFO CFGP2P_ERROR_TEXT "%s : " x, __func__, ## args);	\
173 		}									\
174 	} while (0)
175 #define CFGP2P_ERR(x) CFGP2P_ERR_MSG x
176 #define	CFGP2P_INFO_MSG(x, args...)									\
177 	do {										\
178 		if (wl_dbg_level & WL_DBG_INFO) {				\
179 			printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-INFO) %s : " x, __func__, ## args);	\
180 		}									\
181 	} while (0)
182 #define CFGP2P_INFO(x) CFGP2P_INFO_MSG x
183 #define	CFGP2P_ACTION_MSG(x, args...)								\
184 	do {									\
185 		if (wl_dbg_level & WL_DBG_P2P_ACTION) {			\
186 			printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-ACTION) %s :" x, __func__, ## args);	\
187 		}									\
188 	} while (0)
189 #define CFGP2P_ACTION(x) CFGP2P_ACTION_MSG x
190 #endif /* DHD_LOG_DUMP */
191 
192 #define	CFGP2P_DBG_MSG(x, args...)								\
193 	do {									\
194 		if (wl_dbg_level & WL_DBG_DBG) {			\
195 			printk(KERN_INFO DHD_LOG_PREFIXS "CFGP2P-DEBUG) %s :" x, __func__, ## args);	\
196 		}									\
197 	} while (0)
198 #define CFGP2P_DBG(x) CFGP2P_DBG_MSG x
199 
200 #define INIT_TIMER(timer, func, duration, extra_delay)	\
201 	do {				   \
202 		init_timer_compat(timer, func, cfg); \
203 		timer_expires(timer) = jiffies + msecs_to_jiffies(duration + extra_delay); \
204 		add_timer(timer); \
205 	} while (0);
206 
207 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(3, 0, 8))
208 #ifdef WL_SUPPORT_BACKPORTED_KPATCHES
209 #undef WL_SUPPORT_BACKPORTED_KPATCHES
210 #endif
211 #endif
212 
213 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0))
214 #ifdef WL_CFG80211_STA_EVENT
215 #undef WL_CFG80211_STA_EVENT
216 #endif
217 #endif
218 
219 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) && !defined(WL_CFG80211_P2P_DEV_IF)
220 #define WL_CFG80211_P2P_DEV_IF
221 
222 #ifdef WL_SUPPORT_BACKPORTED_KPATCHES
223 #undef WL_SUPPORT_BACKPORTED_KPATCHES
224 #endif // endif
225 #else
226 #ifdef WLP2P
227 /* Enable P2P network Interface if P2P support is enabled */
228 #define WL_ENABLE_P2P_IF
229 #endif /* WLP2P */
230 #endif /* (LINUX_VERSION >= VERSION(3, 8, 0)) */
231 
232 #ifndef WL_CFG80211_P2P_DEV_IF
233 #endif /* WL_CFG80211_P2P_DEV_IF */
234 
235 #if defined(WL_ENABLE_P2P_IF) && (defined(WL_CFG80211_P2P_DEV_IF) || \
236 	(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)))
237 #error Disable 'WL_ENABLE_P2P_IF', if 'WL_CFG80211_P2P_DEV_IF' is enabled \
238 	or kernel version is 3.8.0 or above
239 #endif /* WL_ENABLE_P2P_IF && (WL_CFG80211_P2P_DEV_IF || (LINUX_VERSION >= VERSION(3, 8, 0))) */
240 
241 #if !defined(WLP2P) && (defined(WL_ENABLE_P2P_IF) || defined(WL_CFG80211_P2P_DEV_IF))
242 #error WLP2P not defined
243 #endif /* !WLP2P && (WL_ENABLE_P2P_IF || WL_CFG80211_P2P_DEV_IF) */
244 
245 #if defined(WL_CFG80211_P2P_DEV_IF)
246 #define bcm_struct_cfgdev	struct wireless_dev
247 #else
248 #define bcm_struct_cfgdev	struct net_device
249 #endif /* WL_CFG80211_P2P_DEV_IF */
250 
251 #define P2P_ECSA_CNT 50
252 
253 extern void
254 wl_cfgp2p_listen_expired(unsigned long data);
255 extern bool
256 wl_cfgp2p_is_pub_action(void *frame, u32 frame_len);
257 extern bool
258 wl_cfgp2p_is_p2p_action(void *frame, u32 frame_len);
259 extern bool
260 wl_cfgp2p_is_gas_action(void *frame, u32 frame_len);
261 extern bool
262 wl_cfgp2p_find_gas_subtype(u8 subtype, u8* data, u32 len);
263 extern bool
264 wl_cfgp2p_is_p2p_gas_action(void *frame, u32 frame_len);
265 extern void
266 wl_cfgp2p_print_actframe(bool tx, void *frame, u32 frame_len, u32 channel);
267 extern s32
268 wl_cfgp2p_init_priv(struct bcm_cfg80211 *cfg);
269 extern void
270 wl_cfgp2p_deinit_priv(struct bcm_cfg80211 *cfg);
271 extern s32
272 wl_cfgp2p_set_firm_p2p(struct bcm_cfg80211 *cfg);
273 extern s32
274 wl_cfgp2p_set_p2p_mode(struct bcm_cfg80211 *cfg, u8 mode,
275             u32 channel, u16 listen_ms, int bssidx);
276 extern s32
277 wl_cfgp2p_ifadd(struct bcm_cfg80211 *cfg, struct ether_addr *mac, u8 if_type,
278             chanspec_t chspec);
279 extern s32
280 wl_cfgp2p_ifdisable(struct bcm_cfg80211 *cfg, struct ether_addr *mac);
281 extern s32
282 wl_cfgp2p_ifdel(struct bcm_cfg80211 *cfg, struct ether_addr *mac);
283 extern s32
284 wl_cfgp2p_ifchange(struct bcm_cfg80211 *cfg, struct ether_addr *mac, u8 if_type,
285 	chanspec_t chspec, s32 conn_idx);
286 
287 extern s32
288 wl_cfgp2p_ifidx(struct bcm_cfg80211 *cfg, struct ether_addr *mac, s32 *index);
289 
290 extern s32
291 wl_cfgp2p_init_discovery(struct bcm_cfg80211 *cfg);
292 extern s32
293 wl_cfgp2p_enable_discovery(struct bcm_cfg80211 *cfg, struct net_device *dev, const u8 *ie,
294 	u32 ie_len);
295 extern s32
296 wl_cfgp2p_disable_discovery(struct bcm_cfg80211 *cfg);
297 extern s32
298 wl_cfgp2p_escan(struct bcm_cfg80211 *cfg, struct net_device *dev, u16 active, u32 num_chans,
299 	u16 *channels,
300 	s32 search_state, u16 action, u32 bssidx, struct ether_addr *tx_dst_addr,
301 	p2p_scan_purpose_t p2p_scan_purpose);
302 
303 extern s32
304 wl_cfgp2p_act_frm_search(struct bcm_cfg80211 *cfg, struct net_device *ndev,
305 	s32 bssidx, s32 channel, struct ether_addr *tx_dst_addr);
306 
307 extern const wpa_ie_fixed_t *
308 wl_cfgp2p_find_wpaie(const u8 *parse, u32 len);
309 
310 extern const wpa_ie_fixed_t *
311 wl_cfgp2p_find_wpsie(const u8 *parse, u32 len);
312 
313 extern wifi_p2p_ie_t *
314 wl_cfgp2p_find_p2pie(const u8 *parse, u32 len);
315 
316 extern const wifi_wfd_ie_t *
317 wl_cfgp2p_find_wfdie(const u8 *parse, u32 len);
318 extern s32
319 wl_cfgp2p_set_management_ie(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bssidx,
320             s32 pktflag, const u8 *vndr_ie, u32 vndr_ie_len);
321 extern s32
322 wl_cfgp2p_clear_management_ie(struct bcm_cfg80211 *cfg, s32 bssidx);
323 
324 extern struct net_device *
325 wl_cfgp2p_find_ndev(struct bcm_cfg80211 *cfg, s32 bssidx);
326 extern s32
327 wl_cfgp2p_find_type(struct bcm_cfg80211 *cfg, s32 bssidx, s32 *type);
328 
329 extern s32
330 wl_cfgp2p_listen_complete(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
331 	const wl_event_msg_t *e, void *data);
332 extern s32
333 wl_cfgp2p_discover_listen(struct bcm_cfg80211 *cfg, s32 channel, u32 duration_ms);
334 
335 extern s32
336 wl_cfgp2p_discover_enable_search(struct bcm_cfg80211 *cfg, u8 enable);
337 
338 extern s32
339 wl_cfgp2p_action_tx_complete(struct bcm_cfg80211 *cfg, bcm_struct_cfgdev *cfgdev,
340 	const wl_event_msg_t *e, void *data);
341 
342 extern s32
343 wl_cfgp2p_tx_action_frame(struct bcm_cfg80211 *cfg, struct net_device *dev,
344 	wl_af_params_t *af_params, s32 bssidx);
345 
346 extern void
347 wl_cfgp2p_generate_bss_mac(struct bcm_cfg80211 *cfg, struct ether_addr *primary_addr);
348 
349 extern void
350 wl_cfg80211_change_ifaddr(u8* buf, struct ether_addr *p2p_int_addr, u8 element_id);
351 
352 extern s32
353 wl_cfgp2p_supported(struct bcm_cfg80211 *cfg, struct net_device *ndev);
354 
355 extern s32
356 wl_cfgp2p_down(struct bcm_cfg80211 *cfg);
357 
358 extern s32
359 wl_cfgp2p_set_p2p_noa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
360 
361 extern s32
362 wl_cfgp2p_get_p2p_noa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
363 
364 extern s32
365 wl_cfgp2p_set_p2p_ps(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
366 
367 extern s32
368 wl_cfgp2p_set_p2p_ecsa(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
369 
370 extern s32
371 wl_cfgp2p_increase_p2p_bw(struct bcm_cfg80211 *cfg, struct net_device *ndev, char* buf, int len);
372 
373 extern const u8 *
374 wl_cfgp2p_retreive_p2pattrib(const void *buf, u8 element_id);
375 
376 extern const u8*
377 wl_cfgp2p_find_attrib_in_all_p2p_Ies(const u8 *parse, u32 len, u32 attrib);
378 
379 extern const u8 *
380 wl_cfgp2p_retreive_p2p_dev_addr(wl_bss_info_t *bi, u32 bi_length);
381 
382 extern s32
383 wl_cfgp2p_register_ndev(struct bcm_cfg80211 *cfg);
384 
385 extern s32
386 wl_cfgp2p_unregister_ndev(struct bcm_cfg80211 *cfg);
387 
388 extern bool
389 wl_cfgp2p_is_ifops(const struct net_device_ops *if_ops);
390 
391 extern u32
392 wl_cfgp2p_vndr_ie(struct bcm_cfg80211 *cfg, u8 *iebuf, s32 pktflag,
393                   s8 *oui, s32 ie_id, const s8 *data, s32 datalen, const s8* add_del_cmd);
394 
395 extern int wl_cfgp2p_get_conn_idx(struct bcm_cfg80211 *cfg);
396 
397 extern
398 int wl_cfg_multip2p_operational(struct bcm_cfg80211 *cfg);
399 
400 extern
401 int wl_cfgp2p_vif_created(struct bcm_cfg80211 *cfg);
402 
403 #if defined(WL_CFG80211_P2P_DEV_IF)
404 extern struct wireless_dev *
405 wl_cfgp2p_add_p2p_disc_if(struct bcm_cfg80211 *cfg);
406 
407 extern int
408 wl_cfgp2p_start_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev);
409 
410 extern void
411 wl_cfgp2p_stop_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev);
412 
413 extern int
414 wl_cfgp2p_del_p2p_disc_if(struct wireless_dev *wdev, struct bcm_cfg80211 *cfg);
415 
416 #endif /* WL_CFG80211_P2P_DEV_IF */
417 
418 extern void
419 wl_cfgp2p_need_wait_actfrmae(struct bcm_cfg80211 *cfg, void *frame, u32 frame_len, bool tx);
420 
421 extern int
422 wl_cfgp2p_is_p2p_specific_scan(struct cfg80211_scan_request *request);
423 
424 /* WiFi Direct */
425 #define SOCIAL_CHAN_1 1
426 #define SOCIAL_CHAN_2 6
427 #define SOCIAL_CHAN_3 11
428 #define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \
429 					(channel == SOCIAL_CHAN_2) || \
430 					(channel == SOCIAL_CHAN_3))
431 #define SOCIAL_CHAN_CNT 3
432 #define AF_PEER_SEARCH_CNT 2
433 #define WL_P2P_WILDCARD_SSID "DIRECT-"
434 #define WL_P2P_WILDCARD_SSID_LEN 7
435 #define WL_P2P_INTERFACE_PREFIX "p2p"
436 #define WL_P2P_TEMP_CHAN 11
437 #define WL_P2P_TEMP_CHAN_5G 36
438 #define WL_P2P_AF_STATUS_OFFSET 9
439 
440 /* If the provision discovery is for JOIN operations,
441  * or the device discoverablity frame is destined to GO
442  * then we need not do an internal scan to find GO.
443  */
444 #define IS_ACTPUB_WITHOUT_GROUP_ID(p2p_ie, len) \
445 	(wl_cfgp2p_retreive_p2pattrib(p2p_ie, P2P_SEID_GROUP_ID) == NULL)
446 
447 #define IS_GAS_REQ(frame, len) (wl_cfgp2p_is_gas_action(frame, len) && \
448 					((frame->action == P2PSD_ACTION_ID_GAS_IREQ) || \
449 					(frame->action == P2PSD_ACTION_ID_GAS_CREQ)))
450 
451 #define IS_P2P_PUB_ACT_RSP_SUBTYPE(subtype) ((subtype == P2P_PAF_GON_RSP) || \
452 							((subtype == P2P_PAF_GON_CONF) || \
453 							(subtype == P2P_PAF_INVITE_RSP) || \
454 							(subtype == P2P_PAF_PROVDIS_RSP)))
455 #define IS_P2P_SOCIAL(ch) ((ch == SOCIAL_CHAN_1) || (ch == SOCIAL_CHAN_2) || (ch == SOCIAL_CHAN_3))
456 #define IS_P2P_SSID(ssid, len) (!memcmp(ssid, WL_P2P_WILDCARD_SSID, WL_P2P_WILDCARD_SSID_LEN) && \
457 					(len == WL_P2P_WILDCARD_SSID_LEN))
458 #endif				/* _wl_cfgp2p_h_ */
459