0c82d84d6baac31f8aac37e29476e0db289ec5e2
[oweals/openwrt.git] /
1 From 9a8ca54a264a2820af614043e7af853166b320b0 Mon Sep 17 00:00:00 2001
2 From: Peter Oh <peter.oh@bowerswilkins.com>
3 Date: Tue, 29 May 2018 14:39:14 -0700
4 Subject: [PATCH 10/18] mesh: consider mesh interface on dfs event handler
5
6 Once mesh starts supporting DFS channels, it has to handle DFS related events
7 from drivers, hence add mesh interface to the check list.
8
9 Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
10 Signed-off-by: Masashi Honma <masashi.honma@gmail.com>
11 ---
12  wpa_supplicant/ap.c     | 71 ++++++++++++++++++++++++++++++-----------
13  wpa_supplicant/events.c |  7 ++--
14  2 files changed, 57 insertions(+), 21 deletions(-)
15
16 --- a/wpa_supplicant/ap.c
17 +++ b/wpa_supplicant/ap.c
18 @@ -1379,13 +1379,18 @@ int ap_ctrl_iface_chanswitch(struct wpa_
19  void wpas_ap_ch_switch(struct wpa_supplicant *wpa_s, int freq, int ht,
20                        int offset, int width, int cf1, int cf2)
21  {
22 -       if (!wpa_s->ap_iface)
23 -               return;
24 +       struct hostapd_iface *iface = wpa_s->ap_iface;
25  
26 +       if (!wpa_s->ap_iface) {
27 +               if (!wpa_s->ifmsh)
28 +                       return;
29 +               else
30 +                       iface = wpa_s->ifmsh;
31 +       }
32         wpa_s->assoc_freq = freq;
33         if (wpa_s->current_ssid)
34                 wpa_s->current_ssid->frequency = freq;
35 -       hostapd_event_ch_switch(wpa_s->ap_iface->bss[0], freq, ht,
36 +       hostapd_event_ch_switch(iface->bss[0], freq, ht,
37                                 offset, width, cf1, cf2);
38  }
39  
40 @@ -1582,10 +1587,16 @@ int wpas_ap_pmksa_cache_add_external(str
41  void wpas_ap_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
42                                       struct dfs_event *radar)
43  {
44 -       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
45 -               return;
46 +       struct hostapd_iface *iface = wpa_s->ap_iface;
47 +
48 +       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]) {
49 +               if (!wpa_s->ifmsh || !wpa_s->ifmsh->bss[0])
50 +                       return;
51 +               else
52 +                       iface = wpa_s->ifmsh;
53 +       }
54         wpa_printf(MSG_DEBUG, "DFS radar detected on %d MHz", radar->freq);
55 -       hostapd_dfs_radar_detected(wpa_s->ap_iface, radar->freq,
56 +       hostapd_dfs_radar_detected(iface, radar->freq,
57                                    radar->ht_enabled, radar->chan_offset,
58                                    radar->chan_width,
59                                    radar->cf1, radar->cf2);
60 @@ -1595,10 +1606,16 @@ void wpas_ap_event_dfs_radar_detected(st
61  void wpas_ap_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
62                                    struct dfs_event *radar)
63  {
64 -       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
65 -               return;
66 +       struct hostapd_iface *iface = wpa_s->ap_iface;
67 +
68 +       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]) {
69 +               if (!wpa_s->ifmsh || !wpa_s->ifmsh->bss[0])
70 +                       return;
71 +               else
72 +                       iface = wpa_s->ifmsh;
73 +       }
74         wpa_printf(MSG_DEBUG, "DFS CAC started on %d MHz", radar->freq);
75 -       hostapd_dfs_start_cac(wpa_s->ap_iface, radar->freq,
76 +       hostapd_dfs_start_cac(iface, radar->freq,
77                               radar->ht_enabled, radar->chan_offset,
78                               radar->chan_width, radar->cf1, radar->cf2);
79  }
80 @@ -1607,10 +1624,16 @@ void wpas_ap_event_dfs_cac_started(struc
81  void wpas_ap_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
82                                     struct dfs_event *radar)
83  {
84 -       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
85 -               return;
86 +       struct hostapd_iface *iface = wpa_s->ap_iface;
87 +
88 +       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]) {
89 +               if (!wpa_s->ifmsh || !wpa_s->ifmsh->bss[0])
90 +                       return;
91 +               else
92 +                       iface = wpa_s->ifmsh;
93 +       }
94         wpa_printf(MSG_DEBUG, "DFS CAC finished on %d MHz", radar->freq);
95 -       hostapd_dfs_complete_cac(wpa_s->ap_iface, 1, radar->freq,
96 +       hostapd_dfs_complete_cac(iface, 1, radar->freq,
97                                  radar->ht_enabled, radar->chan_offset,
98                                  radar->chan_width, radar->cf1, radar->cf2);
99  }
100 @@ -1619,10 +1642,16 @@ void wpas_ap_event_dfs_cac_finished(stru
101  void wpas_ap_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
102                                    struct dfs_event *radar)
103  {
104 -       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
105 -               return;
106 +       struct hostapd_iface *iface = wpa_s->ap_iface;
107 +
108 +       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]) {
109 +               if (!wpa_s->ifmsh || !wpa_s->ifmsh->bss[0])
110 +                       return;
111 +               else
112 +                       iface = wpa_s->ifmsh;
113 +       }
114         wpa_printf(MSG_DEBUG, "DFS CAC aborted on %d MHz", radar->freq);
115 -       hostapd_dfs_complete_cac(wpa_s->ap_iface, 0, radar->freq,
116 +       hostapd_dfs_complete_cac(iface, 0, radar->freq,
117                                  radar->ht_enabled, radar->chan_offset,
118                                  radar->chan_width, radar->cf1, radar->cf2);
119  }
120 @@ -1631,10 +1660,16 @@ void wpas_ap_event_dfs_cac_aborted(struc
121  void wpas_ap_event_dfs_cac_nop_finished(struct wpa_supplicant *wpa_s,
122                                         struct dfs_event *radar)
123  {
124 -       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
125 -               return;
126 +       struct hostapd_iface *iface = wpa_s->ap_iface;
127 +
128 +       if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0]) {
129 +               if (!wpa_s->ifmsh || !wpa_s->ifmsh->bss[0])
130 +                       return;
131 +               else
132 +                       iface = wpa_s->ifmsh;
133 +       }
134         wpa_printf(MSG_DEBUG, "DFS NOP finished on %d MHz", radar->freq);
135 -       hostapd_dfs_nop_finished(wpa_s->ap_iface, radar->freq,
136 +       hostapd_dfs_nop_finished(iface, radar->freq,
137                                  radar->ht_enabled, radar->chan_offset,
138                                  radar->chan_width, radar->cf1, radar->cf2);
139  }
140 --- a/wpa_supplicant/events.c
141 +++ b/wpa_supplicant/events.c
142 @@ -3840,7 +3840,7 @@ static void wpas_event_dfs_cac_started(s
143                                        struct dfs_event *radar)
144  {
145  #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
146 -       if (wpa_s->ap_iface) {
147 +       if (wpa_s->ap_iface || wpa_s->ifmsh) {
148                 wpas_ap_event_dfs_cac_started(wpa_s, radar);
149         } else
150  #endif /* NEED_AP_MLME && CONFIG_AP */
151 @@ -3861,7 +3861,7 @@ static void wpas_event_dfs_cac_finished(
152                                         struct dfs_event *radar)
153  {
154  #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
155 -       if (wpa_s->ap_iface) {
156 +       if (wpa_s->ap_iface || wpa_s->ifmsh) {
157                 wpas_ap_event_dfs_cac_finished(wpa_s, radar);
158         } else
159  #endif /* NEED_AP_MLME && CONFIG_AP */
160 @@ -3877,7 +3877,7 @@ static void wpas_event_dfs_cac_aborted(s
161                                        struct dfs_event *radar)
162  {
163  #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
164 -       if (wpa_s->ap_iface) {
165 +       if (wpa_s->ap_iface || wpa_s->ifmsh) {
166                 wpas_ap_event_dfs_cac_aborted(wpa_s, radar);
167         } else
168  #endif /* NEED_AP_MLME && CONFIG_AP */
169 @@ -4328,6 +4328,7 @@ void wpa_supplicant_event(void *ctx, enu
170  #ifdef CONFIG_AP
171                 if (wpa_s->current_ssid->mode == WPAS_MODE_AP ||
172                     wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO ||
173 +                   wpa_s->current_ssid->mode == WPAS_MODE_MESH ||
174                     wpa_s->current_ssid->mode ==
175                     WPAS_MODE_P2P_GROUP_FORMATION) {
176                         wpas_ap_ch_switch(wpa_s, data->ch_switch.freq,