Jump to: navigation, search

FD.IO CICN project: VPP plugin

The CICN forwarder.

Quick Start

Install the dependencies

For the CICN plugin, you need VPP 17.07. For that do the following:


Add the repositories for VPP 17.07 and for the master branch. Edit the /etc/apt/sources.list.d/ file by running the following commands in a shell:

$ echo "deb [trusted=yes]$(lsb_release -sc).main/ ./" \
         | sudo tee -a /etc/apt/sources.list.d/
$ echo "deb [trusted=yes]$(lsb_release -sc).main/ ./" \
         | sudo tee -a /etc/apt/sources.list.d/

Set 17.04 as the priority version for CICN: edit the /etc/apt/preferences.d/ file with your favorite editor and write the following:

Package: vpp*
Pin: version 17.07.01-release
Pin-Priority: 1001
Package: vpp-dpdk*
Pin: version 17.05-vpp6
Pin-Priority: 1001

Then update your repositories:

$ sudo apt-get update

You now have two possibilities for installing the CICN plugin: from the packages or from source.

Install from repositories

$ sudo apt-get install cicn-plugin

Compile the plugin from source

Pull the code from
$ git clone -b cicn-plugin/master cicn-plugin
$ cd cicn-plugin

Using automake 
$ cd cicn-plugin 
$ autoreconf -i -f
$ mkdir -p build 
$ cd build
$ ../configure
OR, to omit UT code
$ ../configure --without-cicn-test
$ make
$ sudo make install

Using cmake
$ cd cicn-plugin
$ mkdir -p build
$ cd build
$ cmake ..
Or, to omit UT code
$ cmake .. -DNO_UNIT_TEST=TRUE
$ make
$ sudo make install


The high-performance CCNx ICN forwarder as a plugin to VPP.

The plugin provides the following functionalities:

  • Fast packet processing
  • Interest aggregation
  • Content caching

Using CICN plugin


CICN has been tested in:

  • Ubuntu 16.04 LTS (x86_64)
  • Ubuntu 14.04 LTS (x86_64)
  • Debian Stable/Testing (2017-03-01)
  • Red Hat Enterprise Linux 7
  • CentOS 7


Build dependencies:

  • VPP 17.07

Hardware dependencies:

  • DPDK compatible nic

Getting started

In order to start, the CICN plugin requires a running instance of VPP and at least one DPDK compatible nic. The steps required to successfully start CICN are:

  • Setup the host to run VPP
  • Configure VPP to use DPDK compatible nics
  • Start VPP
  • Configure VPP interfaces
  • Configure and start CICN

Detailed information for configuring VPP can be found at

Setup the host for VPP

VPP requires the uio and igb_uio modules to be loaded in the kernel:

$ sudo modprobe uio
$ sudo modprobe igb_uio

Hugepages must be enabled in the system:

$ sudo sysctl -w vm.nr_hugepages=1024

If the DPDK interface we want to assign to VPP is up, we must bring it down:

$ sudo ifconfig <interface_name> down
Configure VPP

The file /etc/vpp/startup.conf contains a set of parameters to setup VPP at startup. The following example sets up VPP to use a DPDK interfaces:

unix {
  log /var/log/vpp/vpp.log

api-trace {

api-segment {
  gid vpp

dpdk {
  socket-mem 1024
  dev 0000:08:00.0

Where 0000:08:00.0 must be replaced with the actual PCI address of the DPDK interface.

Start VPP

VPP can be started as a process or a service:

Start VPP as a service in Ubuntu 16.04
$ sudo systemctl start vpp

Start VPP as a service in Ubuntu 14.04
$ sudo service vpp start

Start VPP as a process in both 16.04 and 14.04
$ sudo vpp -c /etc/vpp/startup.conf
Configure VPP interfaces

ICN communications run on top of IP and UDP (encap), therefore we need to assign an IP address to the DPDK interface that enables IP connectivity through that interface:

Set an IP address on the DPDK interface
$ sudo vppctl set int ip address GigabitEthernet0/8/0

Bring the interface up
$ sudo vppctl set int state GigabitEthernet0/8/0 up

GigabitEthernet0/8/0 is the name that VPP assigned to the DPDK interface. It must be replaced with the actual name of the DPDK interface (sudo vppctl show interfaces shows the available interfaces in VPP).

Configure and start CICN

The following three commands enable CICN, set a face pointing to a remote host and add an entry in the FIB:

Start CICN plugin
$ sudo vppctl cicn control start

Create a face for the DPDK interface
$ sudo vppctl cicn cfg face add local remote
Face ID: 1

Add a FIB entry
$ sudo vppctl cicn cfg fib add prefix /cicn face 1
  • must be replaced with the IP address assigned to the DPDK interface in the previous step. The UDP port can be chosen as desired.
  • must be replaced with the IP address assigned to the remote host we want to connect to.
  • /cicn must be replaced with the ICN prefix to forward through face 1.

CICN commands

A full list of the available commands for CICN is available through:

  • sudo vppctl cicn help

If help is passed as a paramenter to a CICN command, the output will display information about the syntax of the command.

CICN statistics

A fine grained set of statistic for the ongoing communication is available through:

  • sudo vppctl cicn show
Setting PIT, FIB and CS parameters

If needed, it is possible to change the default values for the three CICN internal structures. The customizable parameters and the corresponding commands are:

  • PIT size:
    • sudo vppctl cicn control param pit size <# of entries>
  • PIT entry lifetime (default, min and max):
    • sudo vppctl cicn control param pit {dfltlife | minlife | maxlife} <seconds>
  • FIB size:
    • sudo vppctl cicn control param fib size <# of entries>
  • CS size:
    • sudo vppctl cicn control param cs size <# of entries>

Changes on PIT, FIB and CS can be made only before starting CICN.

Older Versions

The following versions are no longer supported. Improvements and bugfixes will be available only on the latest cicn-plugin version.


This software is distributed under the following license:

 * Copyright (c) 2017 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * See the License for the specific language governing permissions and
 * limitations under the License.