Wifi Hotspot on i.MX6 boards (through cellular or ethernet)

Published on February 12, 2015

Archived Notice

This article has been archived and may contain broken links, photos and out-of-date information. If you have any questions, please Contact Us.

Our i.MX6 Nitrogen6x and especially Nitrogen6_Max boards have great connectivity options and can be useful in server applications as well as the more typical client uses. In this post, we'll describe how to use the built-in WiFi adapter to create a WiFi hotspot and router under Ubuntu.The process involves configuration of three primary components:

  1. hostapd to provide access point software,
  2. dnsmasq to supply IP addresses to clients through DHCP, and
  3. iptables to provide routing and NAT support

For the impatient

If you just want to boot up with this functionality, we've uploaded an image that will run on either our Nitrogen6x or Nitrogen6_Max board and provide AP support as described below.The image contains Freescale-licensed content, so you will need to register on our web-site and log in before you can accept the license agreement and download the image from here:

The detailed description of our changes is here:

Programming the image

The images are slightly-less-than-4GiB image files containing the partition table, so you can copy it to an SD card or SATA drive on /dev/sdc using zcat and dd like so:

~/Downloads$ sudo umount /dev/sdc*
~/Downloads$ zcat 201501*.img.gz | sudo dd of=/dev/sdc bs=1M
~/Downloads$ sync

Or you can use Alex Page's USB Image Tool under Windows.If you're using our latest U-Boot and a Nitrogen6 Max board, you can use the new USB Mass Storage Gadget to program the eMMC. If not, there were some notes in our first release that describe a more complicated way of programming eMMC. 

Configuring this in your own image

The image above contains things pre-configured for immediate use. The steps below describe how you can add this functionality into your own image.Make sure you have installed the latest kernel, but at least ABI >=36 :

ubuntu@trusty-dev:/$ uname -r
3.10.17-36-boundary-4t3
ubuntu@trusty-dev:/$

If this is not the case, please type :

ubuntu@trusty-dev:/$ sudo apt-get update && sudo apt-get dist-upgrade
ubuntu@trusty-dev:~$ sync
ubuntu@trusty-dev:~$ sudo reboot

 Now you need to install the packages listed above:

ubuntu@trusty-dev:/$ sudo apt-get install hostapd dnsmasq iptables

The package hostapd is a user space daemon for access point and authentication servers. It implements IEEE 802.11 access point management, and IEEE 802.1X/WPA/WPA2/EAP Authenticators . The package dnsmasq is a small DHCP server and DNS forwarder, exactly what we need.  The package iptables is a user-space application program that allows a system administrator to configure the tables provided by the Linux kernel firewall (implemented as different netfilter modules) and the chains and rules it stores. The necessary netfilter modules were added to our kernel in this patch.

Configuring hostapd

 Let us start with the hostapd configuration file. Create a hostapd.conf file with the following contents :

ubuntu@trusty-dev:/$ sudo cat /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=BoundaryDevices
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_passphrase=Boundary
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ubuntu@trusty-dev:/$

Of course ssid (the name of the wifi network appears for the wifi devices scanning for available networks) and the password (wpa_passphrase) can be anything what you prefer, its your choice. The password must be at least 8 characters long.Make sure you have set the defaults of hostapd :

ubuntu@trusty-dev:~$ cat /etc/default/hostapd | grep DAEMON_CONF
# Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration
DAEMON_CONF="/etc/hostapd/hostapd.conf"
ubuntu@trusty-dev:~$

Now you need to edit the interfaces file and you need to add wlan0 (thats the onboard WiFi) interface :

ubuntu@trusty-dev:~$ sudo cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
#auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
auto lo
iface lo inet loopback
auto wlan0
iface wlan0 inet static
hostapd /etc/hostapd/hostapd.conf
address 192.168.10.1
netmask 255.255.255.0

This sets the WiFi hotspot IP address to 192.168.10.1. You may want to use something else to match your local network.

Configuring dnsmasq

Now you need to add the following lines to /etc/dnsmasq.conf file to provide DHCP services to WiFi clients:

ubuntu@trusty-dev:~$ sudo cat /etc/dnsmasq.conf | tail -n3
interface=lo,wlan0
no-dhcp-interface=lo
dhcp-range=192.168.10.10,192.168.10.254,255.255.255.0,12h
ubuntu@trusty-dev:~$

This provides a 192.168.10.10 ... 192.168.10.254 DHCP IP pool for the WiFi clients.

IP forwarding

Now you need to edit the file /etc/sysctl.conf . Make sure this line is added to the end :

ubuntu@trusty-dev:~$ sudo cat /etc/sysctl.conf | tail -n1
net.ipv4.ip_forward=1
ubuntu@trusty-dev:~$

Configuring IP tables

Now you need to activate NAT in the built-in firewall of linux, you have to edit the file /etc/rc.local:

ubuntu@trusty-dev:~$ sudo cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE
exit 0
ubuntu@trusty-dev:~$

Thats it! Now you have to to reboot the system.

Configure cellular networking

If you want to use a cell modem as your up-stream Internet connection as described in our earlier post, you may need to disable ethernet.

root@trusty-dev:~# nmcli con status
NAME UUID DEVICES DEFAULT VPN MASTER-PATH
Wired connection 1 93b31726-2a2b-4559-a637-bef1ca0d2371 eth1 no no --
root@trusty-dev:~# ifdown eth0
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/eth0/00:19:b8:01:5d:f9
Sending on LPF/eth0/00:19:b8:01:5d:f9
Sending on Socket/fallback
DHCPRELEASE on eth0 to 192.168.0.1 port 67 (xid=0x51d23a2c)
root@trusty-dev:~# nmcli con status
NAME UUID DEVICES DEFAULT VPN MASTER-PATH
root@trusty-dev:~#

Now we connect with the MU609 modem as usual, as described in the cell post:

root@trusty-dev:~# nmcli con up id MyMU609
root@trusty-dev:~#

Now login from your smartphone/tablet android device to this Wifi nitrogen-hotspot, (by selecting BoundaryDevices network to connect to, and give Boundary as password) and do your internet business.Disconnecting GSM internet is the usual, as described in the cell post :

root@trusty-dev:~# nmcli con down id MyMU609
root@trusty-dev:~#

This is how the Nitrogen6x or Nitrogen6_Max board can be turned into a WiFi-hotspot and internet gateway to share internet with the WiFi devices around it:

Wifi Hotspot on i.MX6 boards

Figure 1: Creating Wifi Hotspot using i.MX6 boards  As always please tell us how this works for you. Contact us if you have any trouble or ask a question by posting a reply below.