wwan-helper

wwan-helper is a script that establishes a UMTS connection using a Ericsson F3507g Mobile Broadband Module. It was designed to be used with a ThinkPad T420s.

View on GitHub

wwan-helper — WWAN setup integration with ifupdown

Released under the terms of the ISC licence.

If the script turns out to be helpful to you, consider sending some donation:

Introduction

This hook started out as a helper for Volker to reliably establish a UMTS connection with his ThinkPad T420s using the Ericsson F3507g Mobile Broadband Module. If that hardware fails to get a WWAN connection, the modem often needs a complete reset and reinitialization. Also, the network device needs some reset during that phase, and so it was only logical to automate the process.

The wwan-helper is meant to run as hook script for Debian’s ifupdown mechanism, but should also work on other networking systems. We’re looking forward to your patches…

Martin’s Thinkpad X240 came with a slightly different Ericsson card, but a tiny modification made it work with Volker’s script. However, the Thinkpad T460s no longer permitted the use of these cards, forcing Martin to acquire a Huawei LTE card, which required a slightly different approach than the Ericsson cards.

So Martin factored out the card handling and the current framework hopefully provides enough future-proof flexibility.

Supported cards

Please refer to the section on Adding Cards for information on how to add support for other cards.

Getting started

The hook script uses the chat tool, contained in the ppp package, which needs to be installed:

sudo apt-get install ppp

Then, clone the Git repository. You can place it wherever you want, e.g. /etc/wwan-helper or /usr/local/src/wwan-helper. For the purpose of this document, we’ll assume the former. It’s a good idea not to use root for this:

sudo install -d -o $LOGNAME /etc/wwan-helper
git clone https://github.com/vog/wwan-helper /etc/wwan-helper

Next, install the ifupdown hooks using symlinks:

cd /etc/network
sudo ln -s /etc/wwan-helper/wwan-helper    if-pre-up.d/local-wwan-helper
sudo ln -s /etc/wwan-helper/wwan-helper if-post-down.d/local-wwan-helper

Finally, configure your SIM card and carrier in a stanza in /etc/network/interfaces:

iface wwan0 inet dhcp
  wwan-apn web.vodafone.de
  wwan-pin 1234

For more configuration options, please refer to the section on configurable options. The above two options are the required ones (technically, the PIN is only required for locked SIM cards, but we advise that you protect yours with a PIN, if you have not done so already).

If you don’t want other users of the system to be able to read the PIN, protect the file:

sudo chmod 600 /etc/network/interfaces

To bring up the interface, now all you need to do is call:

sudo ifup wwan0

and wait — the Huawei card takes almost a full minute to initialise. You might want to add wwan_verbose 1 to your interface stanza to get some more verbose output on the process.

Eventually, you’ll see your DHCP client obtaining a lease, however:

Internet Systems Consortium DHCP Client 4.3.5b1
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wwan0/02:1e:10:1f:00:00
Sending on   LPF/wwan0/02:1e:10:1f:00:00
Sending on   Socket/fallback
DHCPDISCOVER on wwan0 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on wwan0 to 255.255.255.255 port 67 interval 8
DHCPREQUEST of 10.7.133.178 on wwan0 to 255.255.255.255 port 67
DHCPOFFER of 10.7.133.178 from 10.7.133.177
DHCPACK of 10.7.133.178 from 10.7.133.177
bound to 10.7.133.178 -- renewal in 230821 seconds.

You can take the connection offline with:

sudo ifdown wwan0

There’s even a way to automatically down the interface on suspend with systemd, which is particularly useful with laptops.

Please note that your interfaces name might well differ. Common names include usb0, as well as the unique naming schemes introduced by systemd, e.g. wwp0s29u1u4i6. The output of:

ip link list

will tell you which name’s been assigned to your card. You can always configure systemd to assign a static name if you so prefer, or use the description configuration option for the interface (see IFACE OPTIONS in the interfaces(8) manpage).

Configuration options

The following options are available:

Option Domain Description Default
wwan-apn text The carrier’s APN (none)
wwan-pin numeric The SIM PIN (PIN1) (none)
wwan-retries numeric The number of retries 0
wwan-usbid hex:hex The USB ID of the WWAN card (autodetected)
wwan-verbose numeric Script verbosity, see «_debugging,Debugging» 0
wwan-allow-roaming boolean Connect the carrier when roaming false

Individual card handler scripts can add their own options. For instance, the Ericsson handler also reads wwan-enforce-umts (boolean).

Debugging

If you have any trouble, you can disable wwan-helper by appending wwan-helper-disable to the stanza in /etc/network/interfaces:

iface wwan0 inet dhcp
  […]
  wwan-helper-disable 1

To get more verbose output, add wwan-verbose to the stanza, using the following integer values:

wwan-verbose value Effect
0 Only warnings and errors
1 + Informational messages
2 + Chat dialog
5 + Shell script trace (+x)
10 + Shell script echo (+v)

Advanced topics

Adding support for your WWAN card

Once you know the AT commands involved to set up and deconfigure your WWAN card, it should require no more than a bit of trial and error to teach wwan-helper how to handle it. These are the steps required:

  1. Start by copying the file cards/TEMPLATE to a meaningful filename in the same directory.

  2. Populate the functions therein with the appropriate commands. You can use whatever tools are required, including the helper functions defined in the wwan-helper file.

  3. Identify the USB ID(s) that your script can handle and provide a symlink to your handler from usbids/abcd:1234. The format of these link names is standardised to be two sets of 4 hexadecimal digits each (including leading zeroes if necessary), and limited to lower-case characters.

Once you create a new handler, please submit it upstream so we can include it for others to use.

Using logical interfaces for multiple configurations

The ifupdown system allows one to separate logical configuration from physical interfaces. This can come in particularly handy if you have multiple SIM cards that you switch between.

The following excerpt should give you all the input you need to bootstrap your imagination for how to make it work for your case:

iface wwan-de-vodafone inet dhcp
  wwan-apn web.vodafone.de
  wwan-pin 1234
  wwan-max-retries 1

iface wwan-at-aon
  wwan-apn apn.aon.at
  wwan-pin 4321

To tell ifupdown which logical configuration to use, append it to the name of the physical interface, like so:

sudo ifup wwan0=wwan-de-vodafone

It should also be possible to write a mapping script (cf. interfaces(8)) to auto-select the configuration stanza based on SIM card features. Send us patches when you’re done.

Configuring static interface names

If you prefer static interface names like wwan0 over the unique naming scheme introduced by systemd, you could create a file /etc/systemd/network/01-rename-wwan.link with the following content — don’t forget to configure the MAC address of your card in the [Match] section:

[Match]
MACAddress=02:1e:14:ef:05:6c

[Link]
Name=wwan0

Now run:

systemctl daemon-reload

and reinsert the module for your card… or just reboot your machine, and the new, static name should be used instead.

Deconfiguration on suspend

Most cards won’t handle the system being suspended and might not be usable anymore after resume. The following systemd service takes the interface down on suspend.

Create a file /etc/systemd/system/local-ifdown.service with the following content:

[Unit]
Description=Down the %I interface

[Service]
Type=oneshot
ExecStart=/sbin/ifdown --force %I

[Install]
WantedBy=sleep.target

Which you then install like this:

systemctl enable local-ifdown@wwan0.service
systemctl daemon-reload

The output of the first command should be:

Created symlink /etc/systemd/system/sleep.target.wants/local-ifdown@wwan0.service → /etc/systemd/system/local-ifdown@.service.