Mesh RPi

This article describes the needed modifications for PirateBox RPi image 1.1.3 to get a similar setup like on OpenWrt. Similar setup means a bridged network between AP and Mesh.

Note: Due to kernel incompatibilities of BATMAN-advanced betweeen OpenWrt and RPi, both Systems can not talk to each other.

Requirements:

  1. 2nd wifi card for mesh only
  2. some time ;)

All the scripts will be executed on the Pi. The configuration consists of the following steps:

  1. Setup a software bridge
  2. Reconfigure PirateBox to make use use of the bridge interface
  3. Enable IPv6 configuration for PirateBox
  4. Create Mesh setup script & make it bootable
  5. Configure Avahi to announce PirateBox

Prereq.

Check the internet is working and sudo is active:

sudo touch /tmp/sudo_test
sudo rm /etc/resolv.conf
sudo sh -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
dig google.de | grep -q -e 192.168.77.1 && echo "error, Internet is not working!"

Software bridge

Create the network configuration file for the bridge:

cat <<EOF > piratebox_bridge
Description="General bridge interface for PirateBox"
Connection=bridge
Interface=br-lan
BindsToInterfaces=()
ForceConnect=yes
#Enabling DHCP stuff
SkipForwardingDelay=yes
IP=static
Address=(192.168.77.1/24)
EOF
sudo mv piratebox_bridge /etc/netctl/
sudo netctl enable piratebox_bridge
sudo netctl start piratebox_bridge

Reconfigure PirateBox

sudo sed -i -e 's|DO_IFCONFIG="yes"|DO_IFCONFIG="no"|' \
    -e 's|DO_BRIDGE="no"|DO_BRIDGE="yes"|' \
    -e 's|DNSMASQ_INTERFACE="wlan0"|DNSMASQ_INTERFACE="br-lan"|' \
    /opt/piratebox/conf/piratebox.conf

Edit piratebox.service file for system dependencies

sudo nano /etc/systemd/system/piratebox.service

The top of the file needs to look like this:

[Unit]
Description=PirateBox Service
PartOf=netctl@piratebox_bridge.service

IPv6 Setup

Let's start with fixes on PirateBox 1.1.3

  sudo sed -i -e 's| radvd|/usr/bin/radvd|g' /opt/piratebox/init.d/piratebox_alt

Do the following commands..

PREFIX="fdc0:ffea"
FIXED=$(hexdump -n8 -e '/2 ":%03x" ' /dev/random )
V6_GEN_RESULT="$PREFIX:$FIXED"
prefix=`</dev/urandom tr -dc a-zA-Z1-9 | head -c8`
work_hostname="$prefix.piratebox.lan"
sudo touch /opt/piratebox/conf/node.conf
sudo sed -i -e "s|NODE_CONFIG_ACTIVE='no'|NODE_CONFIG_ACTIVE='yes'|" /opt/piratebox/conf/node.conf
sudo sed -i -e "s|NODE_IPV6_IP=''|NODE_IPV6_IP='$V6_GEN_RESULT'|" \
    -e "s|NODE_NAME=''|NODE_NAME='$prefix'|" \
    /opt/piratebox/conf/node.conf
sudo sed -i -e 's|IPV6_ENABLE="no"|IPV6_ENABLE="yes"|' \
            -e "s|fdc0:ffea::1|$V6_GEN_RESULT|" \
            /opt/piratebox/conf/ipv6.conf
echo "IP6=static
Address6=($V6_GEN_RESULT/64)" > ipv6.netctl 
sudo sh -c 'cat ipv6.netctl >> /etc/netctl/piratebox_bridge'
echo "
OK.
Please note the following infos:
   Generated node name: $work_hostname
   Generated IPv6: $V6_GEN_RESULT
   Prefix: /64
"

Mesh config script

This step assumes, that you have a working network connection and the wifi adapter for mesh is the 2nd (phy1).

sudo sh -c 'echo "br_netfilter" > /etc/modules-load.d/netfilter.conf'
sudo modprobe br_netfilter
sudo pacman -Sy --noconfirm batctl
wget https://github.com/PirateBox-Dev/PirateBox-Mesh/releases/download/1.1.4/piratebox-mesh_1.1.4_all_NON_WRT.sh
chmod a+x piratebox-mesh_1.1.4_all_NON_WRT.sh
sudo mv piratebox-mesh_1.1.4_all_NON_WRT.sh /bin/piratebox-mesh.sh
sudo sed -i -e 's|phy0|phy1|g'  \
   -e 's|MESH_CHANNEL=0|MESH_CHANNEL=6|' \
   -e 's|EXCHANGE_MAC="yes"|EXCHANGE_MAC="no"|' \
   /bin/piratebox-mesh.sh

Create a start/stop script:

cat <<EOF > ~/mesh.service
[Unit]
Description=PirateBox Mesh Service
PartOf=netctl@piratebox_bridge.service 

[Service]
Type=idle
RemainAfterExit=yes
ExecStart=/bin/piratebox-mesh.sh start 
ExecStop=/bin/piratebox-mesh.sh stop

[Install]
WantedBy=multi-user.target
EOF
sudo mv ~/mesh.service /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl start mesh.service 
sudo systemctl enable mesh.service 

AVAHI

sudo mv /etc/avahi /etc/avahi.old
sudo ln -s /opt/piratebox/conf/avahi/ /etc/avahi
sudo systemctl start avahi-daemon
sudo systemctl enable  avahi-daemon

Finalize

At the end you should do a reboot

sudo reboot