WiFi to ethernet adapter for an ethernet-ready TV NEW VERSION

 

This article supersedes the original article here AND the follow up here and should be used for all new installations using the latest Raspbian images released on 2016-09-23

Further updates made on 2nd Jan 2017 to make starting of isc-dhcp-server more reliable. This uses a changed rc.local file and dispenses with the iscserver.service file
Changes are shown in green I have tested this configuration on a Raspberry Pi 3 with the latest Raspbian “Pixel” distribution.

One of the first articles I wrote on this blog was to detail a wifi to ethernet adapter which I made for my TV set. It turned out to be one of the most popular projects I have written about. However it is now well out of date, and with changes made to the latest Raspbian images it will no longer work properly.

I decided to bring it up to date. This new version was developed on the latest Raspbian Jessie light version dated 2016-09-23. If you want, it could also be installed on the full “Pixel” version of the same date, although if you are using it on a dedicated Pi then the light version is probably better.

Much of the original article still applies, The main differences are in the way that the newer distro handles internet connections. These are now based around a dhcpcd – dhcp client daemon –  and its configuration file /etc/dhcpcd.conf Details of the networks are added here rather than as formerly in /etc/network/interfaces. This latter file should be left in its default state copied below:

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpd
# For static IO, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
Source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback
iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

You can download and list the configuration files used in the new version of the project to your Pi home folder using

cd ~
wget http://r.newman.ch/rpi/ntvr2.zip
unzip ntvr2.zip
cd ntvr2
ls
cat contents.txt

Backup your existing dhcpcd.conf file using

sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.original

The /etc/dhcpcd.conf file should be edited to read:

# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.

# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel

# Inform the DHCP server of our hostname for DDNS.
hostname

# Use the hardware address of the interface for the Client ID.
clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
#duid

# Persist interface configuration when dhcpcd exits.
persistent

# Rapid commit support.
# Safe to enable by default because it requires the equivalent option set
# on the server to actually work.
option rapid_commit

# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
# Most distributions have NTP support.
option ntp_servers
# Respect the network MTU.
# Some interface drivers reset when changing the MTU so disabled by default.
#option interface_mtu

# A ServerID is required by RFC2131.
require dhcp_server_identifier

# Generate Stable Private IPv6 Addresses instead of hardware based ones
slaac private

# A hook script is provided to lookup the hostname if not set by the DHCP
# server, but it should not be run by default.
nohook lookup-hostname

interface wlan0
static ip_address=192.168.1.98/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

#following lines are added added
interface eth0
static ip_address=192.168.2.1/24
static routers= 192.168.2.0
static_domain_name_servers=192.168.2.1


This details the static settings for the two interfaces required: 192.168.2.1 for the ethernet interface, which will also have a dhcp server set up to run on it, and 192.168.1.98 for the wireless interface wlan0 which will connect to your existing wireless hub on your main network. The edited version is in the downloaded ntvr2 folder, and you can copy it from there if you don’t want to do the editing explicitly, using

sudo cp dhcpcd.conf /etc/dhcpcd.conf

NB there are two similar files dhcpcd.conf and dhcp.conf Make sure you choose the right one. The former configures the dhcp client daemon, the second configures the isc-dhcp-server daemon. From the nvtr2 folder you can also copy the iptables file to the etc folder using:

sudo cp iptables /etc/iptables

or you can create your own as detailed in the original article using the resetiptables, and setupiptables scripts, and then using

sudo iptables-save > /etc/iptables

to create the file in the correct location. The iptables is now loaded for use from the script rc.local at boot time. Save the original rc.local file by typing

sudo cp /etc/rc.local /etc/rc.local.original

Then insert the new rc.local file by typing

sudo cp rc.local /etc/rc.local

The new file looks like this:

#!/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.
#
# insert function definition to start dhcp server
startdhcp()
{
sleep 10 #should be sufficient. You may need to increase
systemctl start isc-dhcp-server
}
iptables-restore < /etc/iptables
startdhcp & #initiate starting the dhcp server. will occur 10 secs after boot
exit 0

It has one line added, iptables-restore < /etc/iptables as the third last line, and includes a function startdhcp to give a delayed start of the isc-dhcp-server, which is called with startdhcp & so that the rc.local script can exit without delay. When you boot the pi, the dhcp generated eth0 ip address of the connected TV or laptop may come up almost immediately, but will then disappear and reappear after about 10 seconds. This is the only reliable method I have come up with that works, despite readling a large number of posts on teh subject, with many and varied offered “solutions”

Backup your existing sysctl.conf file using

sudo cp /etc/sysctl.conf /etc/sysctl.conf.original

Uncomment the line that enables ip4 forwarding in the sysctl.conf file by using the nano editor

sudo nano /etc/sysctl.conf

and scroll down to the lines

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

and remove the # before the second line giving:

# Uncomment the next line to enable packet forwarding for IPv4
 net.ipv4.ip_forward=1

Then save the file by typing ctrl+X then Y then press the Return key.
Activate the changed file using

sudo sysctl --system

NB note the two – – in the above command before system.
There is now no need for the setup routes script as the routing table sets up correctly.
Install the dhcp server by typing

sudo apt-get install isc-dhcp-server

Backup the original dhcpd.conf file by typing

sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.original

Install the new dhcpd.conf file by typing

sudo cp dhcpd.conf /etc/dhcp/dhcpd.conf

The next section is dispensed with in favour of a simpler if slightly more kludgy change to the rc.local file

Ignore the following text in green entirely. It is retained just to show what has been removed!

Install a new service file to restart the dhcp server at the end of the booting process after all network interfaces are fully established

sudo cp iscserver.service /lib/systemd/system/iscserver.service

Enable this new service by typing

sudo systemctl enable iscserver.service

The contents of the iscserver.service file are:

[Unit]
description=restart isc-dhcp-server
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/bin/systemctl restart isc-dhcp-server

[Install]
WantedBy=multi-user.target

Install a suitable wpa_supplicant.conf file to suit your router wireless settings.
This is best done by making a backup of your existing file by typing

sudo cp /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf.original
and then editing the file by typing
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

and changing the contents to

country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="YourSSID"
        psk="YourPassword"
        key_mgmt=WPA-PSK
}

substituting your own network details for the ssid and psk
Use ctrl-X followed by Y and pressing the return key to exit, saving the modified file.

Two final changes to make, using the raspi-config file.
type:

 sudo raspi-config

You get an onscreen menu, which you can navigate with the arrow and tab keys, selecting options with the teturn key
Select number 3 from the on-screen menu (Boot Options) and set the pi to boot
to one of the two Console settings, depending on whether you want an automatic login or not.
Select number 4 and choose the option to wait for anetwork connection to be established.
You can then exit the program. You can select the option to reboot if you wish as that is the next step we require, but plug in your TV or laptop ethernet before doing so, or the ethernet socket may not initialise

Hopefully now everything should be ready to go. Plug in your TV or a laptop ethernet connection set to dhcp and reboot your Pi.  Your tv or laptop should pick up an address (probably 192.168.2.10) from the Pi dhcp server, and all being well be able to communicate with the internet via your main network.

Tests on the Pi include:

typing

ip address

This should list the eth0 and wlan0 interface info showing
192.168.2.1 and 192.168.1.98 respectively
typing

route

should list the routing table in the form

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         BThomehub.home  0.0.0.0         UG    303    0        0 wlan0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
192.168.2.0     *               255.255.255.0   U     202    0        0 eth0

You will have a different entry to BThomehub.home depending on your Wireless Router eg perhaps Brightbox.ee for an EE router, but the rest should be the same.

Check the iptables routing using

sudo iptables -L

which should give

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

and

sudo iptables -t nat -L

which should give

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  anywhere             anywhere             to:192.168.1.98

Troubleshooting.
If you have problems in getting the correct wlan0 address that you have specified, eg if you get a different address on the same network like 192.168.1.56 then it may be that the router is not picking op the call for a static address and is serving a different address. You can specify a reserved address of 192.168.1.98 for your Pi using the hardware address of the interface. This is probably a good idea anyway, to ensure that your router dhcp server does not allocate the address to a different device leading to potential problems.

If you find that the isc-dhcp server has not allocated an address to the TV or other device pluggd into your Pi ethernet port then first try rebooting the Pi, and if it still doesn’t work, try restariting the isc-dhcp-server by typing

sudo systemctl restart isc-dhcp-server

This is the reason I added the restart iscserver.service as I found that sometimes the dhcp server had not properly connected with the ethernet interface, and asking it to restart at the end of the booting process made this much more reliable.

Finally you do NOT require the extra script which was added to the first version of this project, detailed in the article here

I have run this new version of the project reliably on my Pi3 for the past week, using Raspbian Lite. In teh days ahead I hope to try it with other version of the Pi. I think it should work with some earlier raspbian systems (after the change to systemd configuration was introduced in early 2015), but I haven’t tested this yet.

Please note that as this project is essentially a router connecting an ethernet wired network to a wifi network, it does NOT allow use of DNLA to interconnect media products, Just as this doesn’t work for devices outside your main local network on the internet connecting to your local devices. DNLA connects devices on the SAME local network.

ntvr2.zip download contains files (amended) used in this article.