===================================
Testing OF-config support with LINC
===================================

This page describes how to setup LINC and test Ryu OF-config with it.

The procedure is as follows.
Although all the procedure is written for reader's convenience,
please refer to LINC document for latest informations of LINC.

    https://github.com/FlowForwarding/LINC-Switch

The test procedure

* install Erlang environment
* build LINC
* configure LINC switch
* setup for LINC
* run LINC switch
* run Ryu test_of_config app

For getting/installing Ryu itself, please refer to http://osrg.github.io/ryu/


Install Erlang environment
==========================

Since LINC is written in Erlang, you need to install Erlang execution
environment. Required version is R15B+.

The easiest way is to use binary package from
https://www.erlang-solutions.com/downloads/download-erlang-otp

The distribution may also provide Erlang package.


build LINC
==========

install necessary packages for build
------------------------------------

install necessary build tools
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

On Ubuntu::

    # apt-get install git-core bridge-utils libpcap0.8 libpcap-dev libcap2-bin uml-utilities

On RedHat/CentOS::

    # yum install git sudo bridge-utils libpcap libpcap-devel libcap tunctl

Note that on RedHat/CentOS 5.x you need a newer version of libpcap::

    # yum erase libpcap libpcap-devel
    # yum install flex byacc
    # wget http://www.tcpdump.org/release/libpcap-1.2.1.tar.gz
    # tar xzf libpcap-1.2.1.tar.gz
    # cd libpcap-1.2.1
    # ./configure
    # make && make install

get LINC repo and built
^^^^^^^^^^^^^^^^^^^^^^^

Clone LINC repo::

    % git clone git://github.com/FlowForwarding/LINC-Switch.git

Then compile everything::

    % cd LINC-Switch
    % make

.. NOTE::
    At the time of this writing, test_of_config fails due to a bug of LINC. You can try this test with LINC which is built by the following methods.

    ::

        % cd LINC-Switch
        % make
        % cd deps/of_config
        % git reset --hard f772af4b765984381ad024ca8e5b5b8c54362638
        % cd ../..
        % make offline


Setup LINC
==========

edit LINC switch configuration file. ``rel/linc/releases/0.1/sys.config``
Here is the sample sys.config for test_of_config.py to run.

::

    [{linc,
         [{of_config,enabled},
          {capable_switch_ports,
              [{port,1,[{interface,"linc-port"}]},
               {port,2,[{interface,"linc-port2"}]},
               {port,3,[{interface,"linc-port3"}]},
               {port,4,[{interface,"linc-port4"}]}]},
          {capable_switch_queues,
              [
                {queue,991,[{min_rate,10},{max_rate,120}]},
                {queue,992,[{min_rate,10},{max_rate,130}]},
                {queue,993,[{min_rate,200},{max_rate,300}]},
                {queue,994,[{min_rate,400},{max_rate,900}]}
                ]},
          {logical_switches,
              [{switch,0,
                   [{backend,linc_us4},
                    {controllers,[{"Switch0-Default-Controller","127.0.0.1",6633,tcp}]},
                    {controllers_listener,{"127.0.0.1",9998,tcp}},
                    {queues_status,enabled},
                    {ports,[{port,1,{queues,[]}},{port,2,{queues,[991,992]}}]}]}
                    ,
               {switch,7,
                   [{backend,linc_us3},
                    {controllers,[{"Switch7-Controller","127.0.0.1",6633,tcp}]},
                    {controllers_listener,disabled},
                    {queues_status,enabled},
                    {ports,[{port,4,{queues,[]}},{port,3,{queues,[993,994]}}]}]}
            ]}]},
     {enetconf,
         [{capabilities,
              [{base,{1,0}},
               {base,{1,1}},
               {startup,{1,0}},
               {'writable-running',{1,0}}]},
          {callback_module,linc_ofconfig},
          {sshd_ip,{127,0,0,1}},
          {sshd_port,1830},
          {sshd_user_passwords,[{"linc","linc"}]}]},
     {lager,
         [{handlers,
              [{lager_console_backend,debug},
               {lager_file_backend,
                   [{"log/error.log",error,10485760,"$D0",5},
                    {"log/console.log",info,10485760,"$D0",5}]}]}]},
     {sasl,
         [{sasl_error_logger,{file,"log/sasl-error.log"}},
          {errlog_type,error},
          {error_logger_mf_dir,"log/sasl"},
          {error_logger_mf_maxbytes,10485760},
          {error_logger_mf_maxfiles,5}]},
     {sync,[{excluded_modules,[procket]}]}].


setup for LINC
==============

As the above sys.config requires some network interface, create them::

    # ip link add linc-port type veth peer name linc-port-peer
    # ip link set linc-port up
    # ip link add linc-port2 type veth peer name linc-port-peer2
    # ip link set linc-port2 up
    # ip link add linc-port3 type veth peer name linc-port-peer3
    # ip link set linc-port3 up
    # ip link add linc-port4 type veth peer name linc-port-peer4
    # ip link set linc-port4 up

After stopping LINC, those created interfaces can be deleted::

    # ip link delete linc-port
    # ip link delete linc-port2
    # ip link delete linc-port3
    # ip link delete linc-port4


Starting LINC OpenFlow switch
=============================

Then run LINC::

    # rel/linc/bin/linc console


Run Ryu test_of_config app
==========================

Run test_of_config app::

    # ryu-manager --verbose ryu.tests.integrated.test_of_config ryu.app.rest

If you don't install ryu and are working in the git repo directly::

    # PYTHONPATH=. ./bin/ryu-manager --verbose ryu.tests.integrated.test_of_config ryu.app.rest
