3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #ifndef __MOBILEAP_SOFTAP_H__
19 #define __MOBILEAP_SOFTAP_H__
22 #include <dbus/dbus.h>
23 #include <dbus/dbus-glib.h>
24 #include <dbus/dbus-glib-lowlevel.h>
27 #include <netinet/in.h>
34 #define LOG_TAG "MOBILEAP_AGENT"
36 #define DBG(fmt, args...) LOGD(fmt, ##args)
37 #define ERR(fmt, args...) LOGE(fmt, ##args)
38 #define SDBG(fmt, args...) SECURE_LOGD(fmt, ##args)
39 #define SERR(fmt, args...) SECURE_LOGE(fmt, ##args)
41 #define DRIVER_DELAY 250000 /* micro seconds */
44 #define NET_BUF_LEN 12
45 #define INTERFACE_NAME_LEN 12
46 #define SECURITY_TYPE_LEN 32
48 /* Network Interface */
49 #define IP_SUBNET_MASK "255.255.255.0"
51 #define WIFI_IF "wlan0"
52 #define IP_ADDRESS_WIFI 0xC0A82B02 /* 192.168.43.2 */
54 #define SOFTAP_IF "wl0.1"
55 #define IP_ADDRESS_SOFTAP 0xC0A82B01 /* 192.168.43.1 */
58 #define IP_ADDRESS_USB 0xC0A88103 /* 192.168.129.3 */
60 #define BT_IF_PREFIX "bnep"
61 #define BT_IF_ALL BT_IF_PREFIX"+"
62 #define IP_ADDRESS_BT_1 0xC0A88201 /* 192.168.130.1 */
63 #define IP_ADDRESS_BT_2 0xC0A88301 /* 192.168.131.1 */
64 #define IP_ADDRESS_BT_3 0xC0A88401 /* 192.168.132.1 */
65 #define IP_ADDRESS_BT_4 0xC0A88501 /* 192.168.133.1 */
66 #define IP_ADDRESS_BT_5 0xC0A88601 /* 192.168.134.1 */
67 #define IP_ADDRESS_BT_6 0xC0A88701 /* 192.168.135.1 */
68 #define IP_ADDRESS_BT_7 0xC0A88801 /* 192.168.136.1 */
70 #define RET_FAILURE (-1)
71 #define RET_SUCCESS (0)
72 #define MAX_BUF_SIZE (256u)
74 #define DNSMASQ_CONF_LEN 1024
75 #define DNSMASQ_CONF \
76 "dhcp-range=192.168.43.3,192.168.43.254,255.255.255.0\n" \
77 "dhcp-range=192.168.130.2,192.168.130.150,255.255.255.0\n" \
78 "dhcp-range=192.168.131.2,192.168.131.150,255.255.255.0\n" \
79 "dhcp-range=192.168.132.2,192.168.132.150,255.255.255.0\n" \
80 "dhcp-range=192.168.133.2,192.168.133.150,255.255.255.0\n" \
81 "dhcp-range=192.168.134.2,192.168.134.150,255.255.255.0\n" \
82 "dhcp-range=192.168.135.2,192.168.135.150,255.255.255.0\n" \
83 "dhcp-range=192.168.136.2,192.168.136.150,255.255.255.0\n" \
84 "dhcp-range=192.168.137.2,192.168.137.150,255.255.255.0\n" \
85 "dhcp-range=set:blue,192.168.129.4,192.168.129.150,255.255.255.0\n"\
89 "dhcp-option=tag:blue,option:router,192.168.129.3\n"
90 #define DNSMASQ_CONF_FILE "/tmp/dnsmasq.conf"
92 /* Start of hostapd configuration */
93 #define MH_CTRL_INTF "/tmp/mh_wpa_ctrl"
94 #define MH_MONITOR_INTF "/tmp/mh_wpa_monitor"
96 #define HOSTAPD_BIN "/usr/sbin/hostapd"
97 #define HOSTAPD_ENTROPY_FILE "/opt/var/lib/misc/hostapd.bin"
98 #define HOSTAPD_CONF_FILE "/opt/var/lib/misc/hostapd.conf"
99 #define HOSTAPD_CTRL_INTF_DIR "/opt/var/lib/misc/hostapd"
100 #define HOSTAPD_CONF_LEN 1024
101 #define HOSTAPD_CONF "interface=%s\n" \
103 "ctrl_interface=%s\n" \
106 "ignore_broadcast_ssid=%d\n" \
110 #define HOSTAPD_DEBUG_FILE "/var/log/hostapd.log"
111 #define HOSTAPD_REQ_MAX_LEN 128
112 #define HOSTAPD_RETRY_MAX 5
113 #define HOSTAPD_RETRY_DELAY 500000 /* us */
114 #define HOSTAPD_STA_DISCONN "AP-STA-DISCONNECTED " /* from wpa_ctrl.h */
115 #define HOSTAPD_STA_CONN "AP-STA-CONNECTED "
116 #define HOSTAPD_STA_DISCONN_LEN 20
117 #define HOSTAPD_STA_CONN_LEN 17
118 #define HOSTAPD_MONITOR_ATTACH "ATTACH"
119 #define HOSTAPD_MONITOR_DETACH "DETACH"
120 #define HOSTAPD_DHCP_MAX_INTERVAL 30000 /* 30 seconds */
122 /* Samsung VSIE value in beacon / probe response.
123 * Wi-Fi station can identify AP whether it is tethering or AP only using this value.
125 #define HOSTAPD_VENDOR_ELEMENTS_TETH "DD050016328000" /* Samsung tethering device */
126 #define HOSTAPD_VENDOR_ELEMENTS_WIFI_AP "DD050016321000" /* Specific application mode AP (e.g. GroupPlay) */
127 /* End of hostapd configuration */
129 #define IP_FORWARD "/proc/sys/net/ipv4/ip_forward"
130 #define IP_CMD "/usr/sbin/ip"
131 #define GREP "/bin/grep"
132 #define AWK "/usr/bin/awk"
133 #define DATA_USAGE_FILE "/tmp/tethering_data_usage.txt"
135 #define TETHERING_ROUTING_TABLE 252
136 #define SRC_ROUTING_RULE "iif %s lookup %d"
137 #define DEFAULT_ROUTER "default via %s dev %s scope global table %d"
138 #define INTERFACE_ROUTING "%s/24 table %d dev %s"
140 #define TCP_DNS_FORWARD_RULE "-i %s -p tcp --dport 53 -j DNAT --to %s:53"
141 #define UDP_DNS_FORWARD_RULE "-i %s -p udp --dport 53 -j DNAT --to %s:53"
143 #define MOBILE_AP_STATE_NONE 0
144 #define MOBILE_AP_STATE_WIFI 1
145 #define MOBILE_AP_STATE_USB 2
146 #define MOBILE_AP_STATE_BT 4
147 #define MOBILE_AP_STATE_WIFI_AP 8
148 #define MOBILE_AP_STATE_ALL 15
150 #define DNSMASQ_DBUS_INTERFACE "uk.org.thekelleys.dnsmasq"
152 #define PROC_NET_DEV "/proc/net/dev"
153 #define TETHERING_CONN_TIMEOUT (1200) /* 20 Mins */
154 #define WIFI_AP_CONN_TIMEOUT (300) /* 5 Mins */
155 #define CHECK_NET_STATE_RETRY_COUNT 5
156 #define PSK_ITERATION_COUNT 4096
161 char ssid[MOBILE_AP_WIFI_SSID_MAX_LEN + 1];
162 /* in AP case, hex key will be passed from library, so one extra byte is needed */
163 char key[MOBILE_AP_WIFI_KEY_MAX_LEN + 1];
164 char security_type[SECURITY_TYPE_LEN];
168 /* The parent class object state. */
173 softap_settings_t softap_settings;
177 /* The parent class state. */
181 guint signals[E_SIGNAL_MAX];
182 } TetheringObjectClass;
185 unsigned int number; /* Number of connected device */
186 /* BSSID list of connected device */
187 char bssid[MOBILE_AP_MAX_WIFI_STA][MOBILE_AP_STR_INFO_LEN];
188 } softap_device_info_t;
192 vconf_callback_fn cb;
197 MOBILE_AP_DRV_INTERFACE_NONE,
200 } mobile_ap_drv_interface_e;
207 /* ssid : 32 key : 64 */
208 int _mh_core_enable_softap(const mobile_ap_type_e type, const char *ssid,
209 const char *security, const char *key, int hide_mode);
210 int _mh_core_disable_softap(void);
211 int _mh_core_get_device_info(softap_device_info_t *di);
212 int _mh_core_execute_dhcp_server(void);
213 int _mh_core_terminate_dhcp_server(void);
214 int _mh_core_enable_masquerade(const char *ext_if);
215 int _mh_core_disable_masquerade(const char *ext_if);
216 void _mh_core_add_data_to_array(GPtrArray *array, guint type, gchar *dev_name);
217 int _mh_core_set_ip_address(const char *if_name, const in_addr_t ip);
218 void _register_wifi_station_handler(void);
219 void _unregister_wifi_station_handler(void);
222 void _block_device_sleep(void);
223 void _unblock_device_sleep(void);
224 int _init_tethering(TetheringObject *obj);
225 gboolean _deinit_tethering(TetheringObject *obj);
226 gboolean _mobileap_clear_state(int state);
227 gboolean _terminate_mobileap_agent(gpointer user_data);
230 gboolean _mobileap_is_disabled(void);
231 gboolean _mobileap_is_enabled(int state);
232 gboolean _mobileap_is_enabled_by_type(mobile_ap_type_e type);
233 gboolean _mobileap_set_state(int state);
234 void _flush_dhcp_ack_timer(void);
235 void _destroy_dhcp_ack_timer(char *mac_addr);