hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
 
#ifndef _wl_android_ext_
#define _wl_android_ext_
 
typedef struct wl_chan_info {
   uint band;
   uint16 chan;
} wl_chan_info_t;
 
typedef struct bcol_gtk_para {
   int enable;
   int ptk_len;
   char ptk[64];
   char replay[8];
} bcol_gtk_para_t;
#define ACS_FW_BIT        (1<<0)
#define ACS_DRV_BIT        (1<<1)
int wl_ext_autochannel(struct net_device *dev, uint acs, uint32 band);
chanspec_band_t wl_ext_wlcband_to_chanspec_band(int band);
int wl_android_ext_priv_cmd(struct net_device *net, char *command, int total_len,
   int *bytes_written);
void wl_ext_get_sec(struct net_device *dev, int ifmode, char *sec, int total_len, bool dump);
bool wl_ext_check_scan(struct net_device *dev, dhd_pub_t *dhdp);
int wl_ext_set_scan_time(struct net_device *dev, int scan_time,
   uint32 scan_get, uint32 scan_set);
void wl_ext_wait_event_complete(struct dhd_pub *dhd, int ifidx);
int wl_ext_add_del_ie(struct net_device *dev, uint pktflag, char *ie_data, const char* add_del_cmd);
#ifdef WL_ESCAN
int wl_construct_ctl_chanspec_list(struct net_device *dev, wl_uint32_list_t *chan_list);
int wl_ext_drv_scan(struct net_device *dev, uint band, bool fast_scan);
#endif
#ifdef WL_EXT_GENL
int wl_ext_genl_init(struct net_device *net);
void wl_ext_genl_deinit(struct net_device *net);
#endif
#ifdef WL_EXT_IAPSTA
#ifndef strtoul
#define strtoul(nptr, endptr, base) bcm_strtoul((nptr), (endptr), (base))
#endif
int wl_ext_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len, u32 set);
int wl_ext_iovar_getint(struct net_device *dev, s8 *iovar, s32 *val);
int wl_ext_iovar_setint(struct net_device *dev, s8 *iovar, s32 val);
int wl_ext_iovar_getbuf(struct net_device *dev, s8 *iovar_name,
   void *param, s32 paramlen, void *buf, s32 buflen, struct mutex* buf_sync);
int wl_ext_iovar_setbuf(struct net_device *dev, s8 *iovar_name,
   void *param, s32 paramlen, void *buf, s32 buflen, struct mutex* buf_sync);
int wl_ext_iovar_setbuf_bsscfg(struct net_device *dev, s8 *iovar_name,
   void *param, s32 paramlen, void *buf, s32 buflen, s32 bsscfg_idx,
   struct mutex* buf_sync);
chanspec_t wl_ext_chspec_driver_to_host(int ioctl_ver, chanspec_t chanspec);
chanspec_t wl_ext_chspec_host_to_driver(int ioctl_ver, chanspec_t chanspec);
bool wl_ext_dfs_chan(struct wl_chan_info *chan_info);
uint16 wl_ext_get_default_chan(struct net_device *dev,
   uint16 *chan_2g, uint16 *chan_5g, bool nodfs);
int wl_ext_set_chanspec(struct net_device *dev, struct wl_chan_info *chan_info,
   chanspec_t *ret_chspec);
int wl_ext_get_ioctl_ver(struct net_device *dev, int *ioctl_ver);
#endif
#if defined(WL_CFG80211) || defined(WL_ESCAN)
void wl_ext_user_sync(struct dhd_pub *dhd, int ifidx, bool lock);
#endif
#if defined(WL_CFG80211)
bool wl_legacy_chip_check(struct net_device *net);
bool wl_new_chip_check(struct net_device *net);
bool wl_extsae_chip(struct dhd_pub *dhd);
#endif
#if defined(WL_EXT_IAPSTA) || defined(WL_CFG80211)
void wl_ext_bss_iovar_war(struct net_device *dev, s32 *val);
#endif /* WL_EXT_IAPSTA ||WL_CFG80211 */
 
typedef struct wl_conn_info {
   uint8 bssidx;
   wlc_ssid_t ssid;
   struct ether_addr bssid;
   uint16 channel;
} wl_conn_info_t;
#if defined(WL_EXT_IAPSTA) || defined(USE_IW)
s32 wl_ext_connect(struct net_device *dev, wl_conn_info_t *conn_info);
#endif /* WL_EXT_IAPSTA || USE_IW */
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))
#define strnicmp(str1, str2, len) strncasecmp((str1), (str2), (len))
#endif
 
/* terence:
 * BSSCACHE: Cache bss list
 * RSSAVG: Average RSSI of BSS list
 * RSSIOFFSET: RSSI offset
 * SORT_BSS_BY_RSSI: Sort BSS by RSSI
 */
//#define BSSCACHE
//#define RSSIAVG
//#define RSSIOFFSET
//#define RSSIOFFSET_NEW
 
#define RSSI_MAXVAL -2
#define RSSI_MINVAL -200
 
#if defined(ESCAN_RESULT_PATCH)
#define REPEATED_SCAN_RESULT_CNT    2
#else
#define REPEATED_SCAN_RESULT_CNT    1
#endif
 
#if defined(RSSIAVG) || defined(RSSIOFFSET)
extern int g_wifi_on;
#endif
 
#if defined(RSSIAVG)
#define RSSIAVG_LEN (4*REPEATED_SCAN_RESULT_CNT)
#define RSSICACHE_TIMEOUT 15
 
typedef struct wl_rssi_cache {
   struct wl_rssi_cache *next;
   int dirty;
   struct osl_timespec tv;
   struct ether_addr BSSID;
   int16 RSSI[RSSIAVG_LEN];
} wl_rssi_cache_t;
 
typedef struct wl_rssi_cache_ctrl {
   wl_rssi_cache_t *m_cache_head;
} wl_rssi_cache_ctrl_t;
 
void wl_free_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl);
void wl_delete_dirty_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl);
void wl_delete_disconnected_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, u8 *bssid);
void wl_reset_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl);
void wl_update_rssi_cache(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, wl_scan_results_v109_t *ss_list);
int wl_update_connected_rssi_cache(struct net_device *net, wl_rssi_cache_ctrl_t *rssi_cache_ctrl, int *rssi_avg);
int16 wl_get_avg_rssi(wl_rssi_cache_ctrl_t *rssi_cache_ctrl, void *addr);
#endif
 
#if defined(RSSIOFFSET)
#define RSSI_OFFSET    5
#if defined(RSSIOFFSET_NEW)
#define RSSI_OFFSET_MAXVAL -80
#define RSSI_OFFSET_MINVAL -94
#define RSSI_OFFSET_INTVAL ((RSSI_OFFSET_MAXVAL-RSSI_OFFSET_MINVAL)/RSSI_OFFSET)
#endif
#define BCM4330_CHIP_ID        0x4330
#define BCM4330B2_CHIP_REV      4
int wl_update_rssi_offset(struct net_device *net, int rssi);
#endif
 
#if defined(BSSCACHE)
#define BSSCACHE_TIMEOUT    30
#define BSSCACHE_MAXCNT        20
#define BSSCACHE_DIRTY        4
#define SORT_BSS_CHANNEL
//#define SORT_BSS_RSSI
 
typedef struct wl_bss_cache {
   struct wl_bss_cache *next;
   int dirty;
   struct osl_timespec tv;
   wl_scan_results_v109_t results;
} wl_bss_cache_t;
 
typedef struct wl_bss_cache_ctrl {
   wl_bss_cache_t *m_cache_head;
} wl_bss_cache_ctrl_t;
 
void wl_free_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl);
void wl_delete_dirty_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl);
void wl_delete_disconnected_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl, u8 *bssid);
int wl_bss_cache_size(wl_bss_cache_ctrl_t *bss_cache_ctrl);
void wl_reset_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl);
void wl_update_bss_cache(wl_bss_cache_ctrl_t *bss_cache_ctrl,
#if defined(RSSIAVG)
   wl_rssi_cache_ctrl_t *rssi_cache_ctrl,
#endif
   wl_scan_results_v109_t *ss_list);
void wl_release_bss_cache_ctrl(wl_bss_cache_ctrl_t *bss_cache_ctrl);
#endif
int wl_ext_get_best_channel(struct net_device *net,
#if defined(BSSCACHE)
   wl_bss_cache_ctrl_t *bss_cache_ctrl,
#else
   wl_scan_results_v109_t *bss_list,
#endif
   int ioctl_ver, int *best_2g_ch, int *best_5g_ch, int *best_6g_ch
);
 
#ifdef WL_6G_BAND
#define CHSPEC2BANDSTR(chspec) (CHSPEC_IS2G(chspec) ? "2g" : CHSPEC_IS5G(chspec) ? \
   "5g" : CHSPEC_IS6G(chspec) ? "6g" : "0g")
#define WLCBAND2STR(band) ((band == WLC_BAND_2G) ? "2g" : (band == WLC_BAND_5G) ? \
   "5g" : (band == WLC_BAND_6G) ? "6g" : "0g")
#else
#define CHSPEC2BANDSTR(chspec) (CHSPEC_IS2G(chspec) ? "2g" : CHSPEC_IS5G(chspec) ? \
   "5g" : "0g")
#define WLCBAND2STR(band) ((band == WLC_BAND_2G) ? "2g" : (band == WLC_BAND_5G) ? \
   "5g" : "0g")
#endif /* WL_6G_BAND */
#endif