Building a B4 Element for Dual-Stack Lite

1. Get OpenWrt

For development, testing, and demonstration purposes, ISC and Comcast have primarily used Linksys WRT54GL devices. There is no reason to think it won’t work on other devices running OpenWrt; however, only devices sharing the brcm47xx architecture will be able to use the pre-built binary modules.

To see if OpenWrt will run on your device, refer to

Get OpenWrt images or source from

If you use a precompiled image, make sure you get one with the Linux 2.6 kernel (e.g. from directory kamikaze/8.09.1/brcm47xx).

2. Get the ISC DHCP/AFTR package for OpenWrt

Visit Downloads to download the AFTR tarball. This tarball includes both pre-build binary modules for the brcm47xx architecture, and a package directory for building from source.

3. Configure and build OpenWrt

If you wish to build OpenWrt from source, run ‘make menuconfig’, and make the following selections:

  • Select 2.6 kernel: Target System > Broadcom BCM947xx/953xx
  • Deselect busybox udhcp client: Base system > busybox > Configuration > Networking Utilities
  • Select dhcp4-client and dhcpv6: Network > isc-dhcp
  • Select the non-busybox version of ‘ip’: Network > ip
  • Select ip6-tunnel: Kernel modules > Network Support > kmod-ip6-tunnel

4. Configure the B4 with the AFTR Tunnel Endpoint Address

draft-ietf-softwire-dual-stack-lite-04.txt states:

In order to configure the IPv4-in-IPv6 tunnel, the B4 element needs the IPv6 address of the AFTR element. This IPv6 address can be configured using a variety of methods, ranging from an out-of-band mechanism, manual configuration or a variety of DHCPv6 options.

In order to guarantee interoperability, a B4 element SHOULD implement the DHCPv6 option defined in (draft-dhankins-softwire-tunnel-option-05).

NOTE: For testing, we use an unassigned DHCPv6 option code. DO NOT use this option code in production, as it is likely to change when the draft reaches RFC status.

The DHCP server does not have to run on the same computer as the AFTR, but it must be reachable via normal DHCP request channels from the B4, and it must be configured with the AFTR address.

On the server, add something like the following to dhcpd6.conf:

  • option dhcp6.softwire code 54 = ip6-address; option dhcp6.softwire 2001::1;

This IPv6 address must be the same as the ‘address endpoint’ option in aftr.conf.

On the B4, dhclient6.conf contains the following to request the option:

  • option dhcp6.softwire code 54 = ip6-address; also request dhcp6.softwire;

5. Configuring DNS

draft-ietf-softwire-dual-stack-lite-04.txt recommends configuring the B4 with a DNS proxy resolver, which will forward queries to an external recursive resolver over IPv6.

To configure the B4 with an upstream resolver address, add something like the following to dhcpd6.conf:

  • option 3ffe:501:ffff:100:200:ff:fe00:3f3e;

Alternately, the B4 proxy resolver can be statically configured with the IPv4 address of an external recursive resolver. In this case, DNS traffic to the external resolver will be tunneled through IPv6 to the AFTR. Note that the B4 must also be statically configured with an IPv4 address in order to source packets; the draft recommends an address in the range.

Even more simply, you could eliminate the DNS proxy, and configure the DHCP server on the B4 to give its clients the IPv4 address of an external recursive resolver.

Because of the extra traffic through the AFTR, and because of the need to statically configure the B4, these alternate solutions are likely to be unsatisfactory in a production environment. However, they may be desirable in a testing or demonstration environment.