The fabric has lacked support for IPv6 in previous release (ONOS 1.8). In the 1.10.4 release, we add partial support for routing and bridging IPv6 packets with the capability to support neighbor solicitation and advertisement, static routes, and vrouter support with BGPv6 for communicating with the upstream router.


There are multiple places where configuration changes are needed to support IPv6. These include device, host and port config.

Configuring Switches

The device (switch) configuration has changed to include an IPv6 loopback IP address.

 "devices" : {
    "of:0000000000000225" : {
      "segmentrouting" : {
        "name" : "SpineToma-0",
        "ipv4NodeSid" : 225,
        "ipv4Loopback" : "",
        "ipv6NodeSid" : 235,
        "ipv6Loopback" : "2000::c0a8:00e1",
        "routerMac" : "00:00:02:25:00:01",
        "isEdgeRouter" : false,
        "adjacencySids" : [ ]


Note that previously we used to refer to the loopback IP as “routerIp”. It has now been changed to two fields - “ipv4Loopback” and “ipv6Loopback”.  As before it is best to not use these addresses from the range of addresses used in the dataplane or management network.

In addition, the NodeSid corresponding to the loopback IP has been replaced with two nodeSids one for IPv4 and the other for IPv6. (Note: Please do not use the same node SID for both IPv4 and IPv6.) There are no other changes in device configuration.

Configuring IPv6 Hosts

In this release we do not support IPv6 autoconfiguration of v6 hosts. Neither do we support DHCPv6 in ONOS 1.10.4 (See ONOS 1.11.1 for DHCPv6 support). While ONOS can learn v6 hosts when they speak (via NDP), ONOS does not proactively try to discover an IPv6 host if it hasn’t spoken. Thus it is best to configure IPv6 host information via network-config.

  "hosts" : {
    "F6:08:56:79:E2:27/30" : {
      "basic" : {
        "ips" : [ "2000::2" ],
        "location" : "of:0000000000000204/32"
    "0A:55:D1:0E:32:5D/None" : {
      "basic" : {
        "ips" : [ "2000::101" ],
        "location" : "of:0000000000000205/32"



Hosts in ONOS are defined as “MAC/VLAN”.

Untagged hosts are configured as "0A:55:D1:0E:32:5D/None".

Hosts (including v6 hosts) can be configured on vlan tagged ports as well "F6:08:56:79:E2:27/30"

Note that a host with the same MAC address but different VLAN tags is treated in ONOS as separate hosts.

Configuring Edge Ports

Similar to IPv4, we need to configure switchports with subnet/gateway IPs for V6 hosts.

 "of:0000000000000205/32" : {
      "interfaces" : [ {
        "ips" : [ "2000::1ff/120" ],
        "vlan-untagged" : 40
      } ]
"of:0000000000000205/24" : {
      "interfaces" : [ {
        "ips" : [ "", "2000::1ff/120" ],
        "vlan-tagged" : [ 20, 40 ]
      } ]


The config above shows an untagged port (32 on switch of:205) on vlan 40 with a gateway IP 2000::1ff/128 in a v6 subnet 2000::100/120. It also shows a tagged port (24) with vlan tags 20 and 40, where the subnet for vlan 20 is, and for vlan 40 is 2000::100/120.

Configuring Upstream Port

The upstream interface configuration is similar to the description for connecting external routers for IPv4. The switch port connecting to Quagga (eg. of:205/48) and the external router (eg. of:205/1) both need to be configured with the same IP and VLAN.

In the example below, the ports are in the same vlan (100), are expected to send/receive untagged traffic, and have the same subnet address (2000::6400/125) and interface-IP (2000::6403)

"of:0000000000000205/1" : {
	    "interfaces" : [{
		"ips" : [ "", "2000::6403/125" ],
		"vlan-untagged": 100,
		"name" : "internet-router"

	"of:0000000000000205/48" : {
	    "interfaces" : [{
		"ips" : [ "", "2000::6403/125" ],
		"vlan-untagged": 100,
		"name" : "quagga"


Continuing this example, the upstream router and quagga are expected to have addresses in the same link. Assume Quagga interface address is 2000::6402 and external router interface is 2000::6401. As before, Quagga (and thus Trellis) and the external routers are in different Autonomous Systems (AS). 

Configuring Quagga

Quagga configuration for v6 has the following steps:

The IPv6 neighbor has to be declared in the IPv4 section, but not activated:


! IPv4                                                                                                                                                                              
neighbor remote-as 65001                                                                                                                                                 
neighbor timers connect 5                                                                                                                                                
neighbor advertisement-interval 1                                                                                                                                        
neighbor route-map NEXTHOP4 out 
neighbor 2000::6401 remote-as 65001                                                                                                                                                 
neighbor 2000::6401 timers connect 5                                                                                                                                                
neighbor 2000::6401 advertisement-interval 1                                                                                                                                        
no neighbor 2000::6401 activate                                                                                                                                                     




The address family has to be defined and the neighbor activated along with the prefixes to be advertised:


! IPv6                                                                                                                                                                              
address-family ipv6                                                                                                                                                                 
network 2000::/120                                                                                                                                                                  
network 2000::100/120                                                                                                                                                               
neighbor 2000::6401 activate                                                                                                                                                        
neighbor 2000::6401 route-map NEXTHOP6 out                                                                                                                                          


As in the IPv4 case, we need to advertise v6 routes with next-hop IP as that of the fabric interface.


ipv6 prefix-list 2 seq 10 permit 2000::/120                                                                                                                                         
ipv6 prefix-list 2 seq 20 permit 2000::100/120                                                                                                                                      
route-map NEXTHOP6 permit 10                                                                                                                                                        
match ipv6 address prefix-list 2                                                                                                                                                    
set ipv6 next-hop global 2000::6403                                                                                                                                                 
set ipv6 next-hop local 2000::6403   



With correct configuration, hosts command on ONOS cli should show the configured hosts

onos> hosts -s
id=00:90:0B:1F:9D:12/None, mac=00:90:0B:1F:9D:12, location=of:0000000000000205/1, vlan=None, ip(s)=[2000::c000:6401,, fe80::290:bff:fe1f:9d12]
id=06:34:BF:9E:9F:B3/None, mac=06:34:BF:9E:9F:B3, location=of:0000000000000205/12, vlan=None, ip(s)=[fe80::434:bfff:fe9e:9fb3,]
id=FE:60:03:40:3D:07/20, mac=FE:60:03:40:3D:07, location=of:0000000000000205/24, vlan=20, ip(s)=[fe80::fc60:3ff:fe40:3d07,]
id=FE:60:03:40:3D:07/40, mac=FE:60:03:40:3D:07, location=of:0000000000000205/24, vlan=40, ip(s)=[2000::102]

Also, routes received from the upstream router should be relayed to ONOS with resolved next-hops (which happen to be link-local addresses in this case).

onos> routes
Table: ipv4
   Network            Next Hop        Source   FPM    FPM    FPM       
   Total: 3
Table: ipv6
   Network            Next Hop        Source
   ::/0               fe80::290:bff:fe1f:9d12 FPM       
   2000::c000:6400/120 fe80::290:bff:fe1f:9d12 FPM       
   Total: 2
onos> next-hops
ip=fe80::290:bff:fe1f:9d12, mac=00:90:0B:1F:9D:12, loc=of:0000000000000205/1, numRoutes=2
ip=, mac=00:90:0B:1F:9D:12, loc=of:0000000000000205/1, numRoutes=3


Use ping6 and netstat -nr6 to verify connectivity and route-table correctness in the v6 hosts.