Ad-hoc networking

From ArchWiki
Revision as of 09:44, 21 August 2013 by Lahwaacz (Talk | contribs) (WPA supplicant: rm pid - not required)

Jump to: navigation, search

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end An IBSS (Independent Basic Service Set) network, often called an ad-hoc network, is a way to have a group of devices talk to each other wirelessly, without a central controller. It is an example of an peer-to-peer network, in which all devices talk directly to each other, with no inherent relaying.

For example, you can set up ad-hoc networking to share an internet connection.

Requirements

  • A nl80211 compatible wireless device (e.g. ath9k) on all devices which will connect to the network

Wifi link layer

Since IBSS network is a peer-to-peer network, the steps necessary to set up wifi link layer should be the same on all devices.

Tip: It is possible to create complex network topologies, see Linux Wireless documentation for advanced examples.

Manual method

Warning: This method creates unencrypted ad-hoc network. See #WPA supplicant for method using WPA encryption.

This section is very similar to Wireless Setup#Manual setup, see there for better explanation of the following commands. Also make sure that iw is installed.

Set the operation mode to ibss:

# iw interface set type ibss

Bring the interface up (additional step like rfkill unblock wifi might be needed):

# ip link set interface up

Now you can create ad-hoc network. Replace your_ssid with the name of the network and frequency with the frequency in MHz, depending on which channel you want to use. See the Wikipedia page List of WLAN channels for a table showing frequencies of individual channels.

# iw interface ibss join your_ssid frequency

WPA supplicant

Note: This method creates ad-hoc network using WPA encryption. WPA2 is currently not supported (August 2013).

Create configuration file for wpa_supplicant. See WPA supplicant for details. Also make sure that wpa_supplicant is installed.

/etc/wpa_supplicant-adhoc.conf
ctrl_interface=DIR=/run/wpa_supplicant GROUP=wheel

# use 'ap_scan=2' on all devices connected to the network
ap_scan=2

network={
    ssid="MySSID"
    mode=1
    frequency=2432
    proto=WPA
    key_mgmt=WPA-NONE
    pairwise=NONE
    group=TKIP
    psk="secret passphrase"
}

Run wpa_supplicant on all devices connected to the network with the following command:

# wpa_supplicant -B -i interface -c /etc/wpa_supplicant-adhoc.conf -D nl80211,wext

Network configuration

The final step is to assign an IP address to all devices in the network. There are multiple ways to do this, choose what suits you best:

Additionally, if you want to share an internet connection to the ad-hoc network, see Internet Share.

Tips and tricks

Using NetworkManager

If you use NetworkManager, you don't have to use the manual method described above, you can use nm-applet for the configuration instead. See NetworkManager#Ad-hoc for details.

Note: NetworkManager does not support WPA encryption in ad-hoc mode.

Custom systemd service (with wpa_supplicant and static IP)

You can use the following templates to enable wireless ad-hoc networking:

/etc/conf.d/network-wireless-adhoc@<interface>
addr=192.168.0.2
mask=24
ssid=MySSID
freq=2432
/etc/systemd/system/network-wireless-adhoc@.service
[Unit]
Description=Network connectivity for %i
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/conf.d/network@%i
ExecStart=/usr/bin/iw %i set type ibss
ExecStart=/usr/bin/ip link set %i up
ExecStart=/usr/bin/ip addr add ${addr}/${mask} dev %i
ExecStart=/usr/bin/iw dev %i ibss join ${ssid} ${freq}
ExecStart=/usr/bin/wpa_supplicant -B -i %i -D nl80211,wext -c /etc/wpa_supplicant/adhoc.conf -P /run/wpa_supplicant_%i.pid
ExecStop=/usr/bin/ip addr flush dev %i
ExecStop=/usr/bin/ip link set %i down

[Install]
WantedBy=multi-user.target

See also