merge mac80211, iw, hostapd from trunk to backfire
[openwrt-10.03/.git] / package / hostapd / patches / 380-ap_isolate.patch
1 --- a/hostapd/config_file.c
2 +++ b/hostapd/config_file.c
3 @@ -1266,6 +1266,8 @@ struct hostapd_config * hostapd_config_r
4                         }
5                 } else if (os_strcmp(buf, "wds_sta") == 0) {
6                         bss->wds_sta = atoi(pos);
7 +               } else if (os_strcmp(buf, "ap_isolate") == 0) {
8 +                       bss->isolate = atoi(pos);
9                 } else if (os_strcmp(buf, "ap_max_inactivity") == 0) {
10                         bss->ap_max_inactivity = atoi(pos);
11                 } else if (os_strcmp(buf, "country_code") == 0) {
12 --- a/src/ap/ap_config.h
13 +++ b/src/ap/ap_config.h
14 @@ -199,6 +199,7 @@ struct hostapd_bss_config {
15         struct mac_acl_entry *deny_mac;
16         int num_deny_mac;
17         int wds_sta;
18 +       int isolate;
19  
20         int auth_algs; /* bitfield of allowed IEEE 802.11 authentication
21                         * algorithms, WPA_AUTH_ALG_{OPEN,SHARED,LEAP} */
22 --- a/src/drivers/driver.h
23 +++ b/src/drivers/driver.h
24 @@ -1626,6 +1626,14 @@ struct wpa_driver_ops {
25                            const char *bridge_ifname);
26  
27         /**
28 +        * set_ap_isolate - Enable/disable AP isolation
29 +        * @priv: private driver interface data
30 +        * @val: 1 = enabled; 0 = disabled
31 +        * Returns: 0 on success, -1 on failure
32 +        */
33 +       int (*set_ap_isolate)(void *priv, int val);
34 +
35 +       /**
36          * send_action - Transmit an Action frame
37          * @priv: Private driver interface data
38          * @freq: Frequency (in MHz) of the channel
39 --- a/src/drivers/driver_nl80211.c
40 +++ b/src/drivers/driver_nl80211.c
41 @@ -4339,6 +4339,29 @@ static int i802_set_rate_sets(void *priv
42         return -ENOBUFS;
43  }
44  
45 +static int i802_set_ap_isolate(void *priv, int val)
46 +{
47 +       struct i802_bss *bss = priv;
48 +       struct wpa_driver_nl80211_data *drv = bss->drv;
49 +       struct nl_msg *msg;
50 +       int i;
51 +
52 +       msg = nlmsg_alloc();
53 +       if (!msg)
54 +               return -ENOMEM;
55 +
56 +       genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0,
57 +                   NL80211_CMD_SET_BSS, 0);
58 +
59 +       NLA_PUT_U8(msg, NL80211_ATTR_AP_ISOLATE, !!val);
60 +
61 +       NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
62 +
63 +       return send_and_recv_msgs(drv, msg, NULL, NULL);
64 + nla_put_failure:
65 +       return -ENOBUFS;
66 +}
67 +
68  #endif /* HOSTAPD */
69  
70  
71 @@ -5448,6 +5471,7 @@ const struct wpa_driver_ops wpa_driver_n
72         .set_tx_queue_params = i802_set_tx_queue_params,
73         .set_sta_vlan = i802_set_sta_vlan,
74         .set_wds_sta = i802_set_wds_sta,
75 +       .set_ap_isolate = i802_set_ap_isolate,
76  #endif /* HOSTAPD */
77         .set_freq = i802_set_freq,
78         .send_action = wpa_driver_nl80211_send_action,
79 --- a/src/ap/ap_drv_ops.c
80 +++ b/src/ap/ap_drv_ops.c
81 @@ -180,6 +180,14 @@ static int hostapd_set_radius_acl_expire
82  }
83  
84  
85 +static int hostapd_set_ap_isolate(struct hostapd_data *hapd, int value)
86 +{
87 +       if (hapd->driver == NULL || hapd->driver->set_ap_isolate == NULL)
88 +               return 0;
89 +       hapd->driver->set_ap_isolate(hapd->drv_priv, value);
90 +}
91 +
92 +
93  static int hostapd_set_bss_params(struct hostapd_data *hapd,
94                                   int use_protection)
95  {
96 @@ -229,6 +237,12 @@ static int hostapd_set_bss_params(struct
97                            "driver");
98                 ret = -1;
99         }
100 +       if (hostapd_set_ap_isolate(hapd, hapd->conf->isolate) &&
101 +           !hapd->conf->isolate) {
102 +               wpa_printf(MSG_ERROR, "Could not enable AP isolation in "
103 +                          "kernel driver");
104 +               ret = -1;
105 +       }
106  
107         return ret;
108  }