How To Create An Android-friendly Hotspot In Linux
This article walks readers through the process of setting up an Android-friendly hotspot.
Let’s suppose you have a laptop and a phone, and you want to share your laptop's Internet connection with the phone (reverse tethering). You might think it's as simple as going to a network connection and creating a wireless connection. Unfortunately, it's not, because the hotspot created by laptops generally supports only two modes—Ad-Hoc and Infrastructure (which can be seen in Figure 1). Both these modes are not supported by most of the Android and Windows phones in the market. So let us go about creating an Android-friendly or a ‘phone-friendly’ hotspot. For this article, I’ll be using Ubuntu 12.04 LTS.
Installation
Let’s first install Hostapd from the Ubuntu software centre.
If you prefer the command line, then just type the following command:
sudo apt-get install hostapd
You can also download and compile Hostapd from source, from its site http://w1.fi/hostapd/.
For other distributions, search for the package named hostapd in your repository.
As explained in http://acx100.erley.org/git.html, Hostapd has the following levels in managing Wi-Fi and each level is explained as follows:
“Wireless card: Should be self-explanatory... handles sending/receiving wireless packets
Linux kernel: The Linux kernel contains the driver for the wireless card, and the nl80211 sub-system, which handles the configuring of wireless interfaces for user space
libnl: libnl is the transport layer used to communicate with the kernel via netlink
udev: udev is the facility the kernel uses to pass events/calls to crda
iw: iw is a userspace utility that we can use to test that libnl is working correctly, as well as to create additional virtual wireless interfaces on the wireless card
crda: crda is a userspace program that the kernel queries (through udev) to find what channels/frequencies are usable, and at what powers. This moves the information out of static tables maintained in the kernel to userspace, which allows them to be updated without reloading drivers or rebooting
Wireless regulatory database: This is the database of allowable frequencies and transmit power levels used by crda
Hostapd: This is the daemon that handles the generation of beacons and other wireless packets, as well as wpa-psk, wpa2, etc, encryptions.”
Checking your Wi-Fi card
Hostapd supports the following drivers: mac80211-based drivers with support for master mode [linux] Linux drivers that support nl80211/cfg80211 in AP mode
Host AP driver for Prism2/2.5/3 [linux] Driver interface for FreeBSD net80211 layer [kfreebsd] Any wired Ethernet driver for wired IEEE 802.1X authentication Now let’s check whether your Wi-Fi card is supported by Hostapd. Most commonly used Wi-Fi cards are supported in Hostapd, but just to be sure, we could check. First, check which kernel driver is used for your card, then type the following command:
lspci -k | grep -A 3 -i "network" Network controller: Ralink corp. RT3290 Wireless 802.11n 1T/1R PCIe Subsystem: Hewlett-Packard Company Device 18ec Kernel driver in use: rt2800pci Kernel modules: rt2800pci
The driver used by the kernel is rt2800pci. This will vary depending on your kernel and your Wi-Fi card. Now, let’s check the interface part, which will tell us whether our card is supported or not. Next, type the following command:
modinfo rt2800pci | grep ‘depends’
…replacing driver with your appropriate one, which in my case is rt2800pci.
This will vary depending on your Wi-Fi card. In my case, it is:
rt2x00lib,rt2800lib,rt2x00pci,compat,eeprom_93cx6 Check each interface with the compatibility list either by checking if your interface satisfies one of the conditions required by Hostapd or by ‘googling’ with the keyword ‘interface_name hostapd’. You might get some clue if one or more interfaces match with the list needed by Hostapd—then you are good to go. Otherwise, cross your fingers and give it a try by configuring it as explained below.
Configuration
Now, let’s create a configuration file named test.conf with your favourite text editor in your home directory. Lines starting with # are just comments to explain the configuration; you can skip them while writing the configuration file: # sets the wifi interface to use, is wlan0 in most case interface=wlan0 # driver to use, nl80211 works in most cases driver=nl80211 # Choose suitable name for SSID, or simply the name of your wifi as visible on list of networks ssid=Put_your_desried_name_here # sets the mode of wifi, depends upon the device used, can be a,b,g,n. g ensures backward #compatibility. hw_mode=g # sets the channel for your wifi , 11 will work fine for most of the people channel=11 #####Sets WPA and WPA2 authentication , they are stronger than WEP##### #wpa option sets which wpa implementation to use #1 - wpa only #2 - wpa2 only #3 - both wpa=3 # sets password for the access point, choose a strong one :) wpa_passphrase=Put_here_your_desired_password # sets wpa key management wpa_key_mgmt=WPA-PSK #sets encryption used wpa_pairwise=TKIP CCMP # Rekeys after 10 minutes,if there is interference, the wifi
connection between AP and laptop will #break. For CCMP, during rekeying, there is a break of approximately 10 seconds which may #be the time for random key generation and reconnection. #If you face any error you can skip the last option, but will work in most cases flawlessly wpa_ptk_rekey=600 # For more options refer to manual pages or Hostapd Website http://w1.fi/hostapd/
Testing
We are now almost done but we need to create some arrangements. Using the command line would take a long time. The easy way would be to create a normal Ad-Hoc Wi-Fi hotspot (SSID not mandatory) to be the same as for Hostapd. Creating an Ad-Hoc hotspot is as easy as going to Network Connections, and then creating a New Wireless Connection.
Choose the SSID and key of your choice, because it doesn’t matter, as this will be overridden by the WPA security of Hostapd.
In my case, the key is named Hotspot. After getting the notification that a successful connection has been established, fire up the terminal and type the following command:
This command will invoke Hostapd with options specified by the configuration file named test.conf (which we created earlier). It will make a hotspot on the specified interface, wlan0, at the MAC address of your Wi-Fi card, as shown in Figure 4.
Now, try to connect your phone by specifying the necessary arguments. As soon as your phone tries to connect, you will see your device’s MAC address along with its status, which would be something like what’s shown in Figure 5.
Note: 1. Users have to first create an Ad-Hoc network, before issuing the Hostapd command.
Run the Hostapd command with sudo or with root privileges.
2. It would also help you to track who is connected to your network. MAC address filtering can be set up by just adding the following line: #macaddr_acl sets options for mac address filtering. 0 means "accept unless in deny list" macaddr_acl=0
References
[1] http://acx100.erley.org/git.html— for an explanation of how Hostapd manages Wi-Fi and an understanding of each component in the level. [2] httpnims11.wordpress.com/2012/04/27/hostapd-the-linux-wayto-create-virtual-wifi-access-point/— For an understanding of the rest of the process [3] http://w1.fi/hostapd/ [4] https://bugs.archlinux.org/task/27406 — for an explanation of the errors associated with wpa_ptk_rekey=600