1/*
2 * Copyright 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package [email protected];
18
19import [email protected]::Ssid;
20
21/**
22 * Top-level object for managing SoftAPs.
23 */
24interface IHostapd {
25    /**
26     * Size limits for some of the params used in this interface.
27     */
28    enum ParamSizeLimits : uint32_t {
29        /** Max length of SSID param. */
30        SSID_MAX_LEN_IN_BYTES = 32,
31
32        /** Min length of PSK passphrase param. */
33        WPA2_PSK_PASSPHRASE_MIN_LEN_IN_BYTES = 8,
34
35        /** Max length of PSK passphrase param. */
36        WPA2_PSK_PASSPHRASE_MAX_LEN_IN_BYTES = 63,
37    };
38
39    /** Possble Security types. */
40    enum EncryptionType : uint32_t {
41        NONE,
42        WPA,
43        WPA2
44    };
45
46    /**
47     * Band to use for the SoftAp operations.
48     * When using ACS, special value |BAND_ANY| can be
49     * used to indicate that any supported band can be used. This special
50     * case is currently supported only with drivers with which
51     * offloaded ACS is used.
52     */
53    enum Band : uint32_t {
54        BAND_2_4_GHZ,
55        BAND_5_GHZ,
56        BAND_ANY
57    };
58
59    /**
60     * Parameters to control the HW mode for the interface.
61     */
62    struct HwModeParams {
63        /**
64         * Whether IEEE 802.11n (HT) is enabled or not.
65         * Note: hwMode=G (2.4 GHz) and hwMode=A (5 GHz) is used to specify
66         * the band.
67         */
68        bool enable80211N;
69         /**
70          * Whether IEEE 802.11ac (VHT) is enabled or not.
71          * Note: hw_mode=a is used to specify that 5 GHz band is used with VHT.
72          */
73        bool enable80211AC;
74    };
75
76    /**
77     * Parameters to control the channel selection for the interface.
78     */
79    struct ChannelParams {
80        /**
81         * Whether to enable ACS (Automatic Channel Selection) or not.
82         * The channel can be selected automatically at run time by setting
83         * this flag, which must enable the ACS survey based algorithm.
84         */
85        bool enableAcs;
86        /**
87         * This option can be used to exclude all DFS channels from the ACS
88         * channel list in cases where the driver supports DFS channels.
89         **/
90        bool acsShouldExcludeDfs;
91        /**
92         * Channel number (IEEE 802.11) to use for the interface.
93         * If ACS is enabled, this field is ignored.
94         */
95        uint32_t channel;
96        /**
97         * Band to use for the SoftAp operations.
98         */
99        Band band;
100    };
101
102    /**
103     * Parameters to use for setting up the access point interface.
104     */
105    struct IfaceParams {
106        /** Name of the interface */
107        string ifaceName;
108        /** Hw mode params for the interface */
109        HwModeParams hwModeParams;
110        /** Chanel params for the interface */
111        ChannelParams channelParams;
112    };
113
114    /**
115     * Parameters to use for setting up the access point network.
116     */
117    struct NetworkParams {
118        /** SSID to set for the network */
119        Ssid ssid;
120        /** Whether the network needs to be hidden or not. */
121        bool isHidden;
122        /** Key management mask for the network. */
123        EncryptionType encryptionType;
124        /** Passphrase for WPA_PSK network. */
125        string pskPassphrase;
126    };
127
128    /**
129     * Adds a new access point for hostapd to control.
130     *
131     * This should trigger the setup of an access point with the specified
132     * interface and network params.
133     *
134     * @param ifaceParams AccessPoint Params for the access point.
135     * @param nwParams Network Params for the access point.
136     * @return status Status of the operation.
137     *         Possible status codes:
138     *         |HostapdStatusCode.SUCCESS|,
139     *         |HostapdStatusCode.FAILURE_ARGS_INVALID|,
140     *         |HostapdStatusCode.FAILURE_UNKNOWN|,
141     *         |HostapdStatusCode.FAILURE_IFACE_EXISTS|
142     */
143    addAccessPoint(IfaceParams ifaceParams, NetworkParams nwParams)
144        generates(HostapdStatus status);
145
146    /**
147     * Removes an existing access point from hostapd.
148     *
149     * This should bring down the access point previously setup on the
150     * interface.
151     *
152     * @param ifaceName Name of the interface.
153     * @return status Status of the operation.
154     *         Possible status codes:
155     *         |HostapdStatusCode.SUCCESS|,
156     *         |HostapdStatusCode.FAILURE_UNKNOWN|,
157     *         |HostapdStatusCode.FAILURE_IFACE_UNKNOWN|
158     */
159    removeAccessPoint(string ifaceName) generates(HostapdStatus status);
160
161    /**
162     * Terminate the service.
163     * This must de-register the service and clear all state. If this HAL
164     * supports the lazy HAL protocol, then this may trigger daemon to exit and
165     * wait to be restarted.
166     */
167    oneway terminate();
168};
169