Experiment 4: Open vSwitch experiment -- using OVS command in Mininet

1, Experimental purpose

After Mininet installation, Open vSwitch will be installed together. You can directly call the Open vSwitch command through Python script, so as to directly control the Open vSwitch, and understand the method of calling control through experiments.

2, Experimental task

In this experiment, Mininet Python based script is used to call "OVS vsctl" command to directly control Open vSwitch. Use the default switch flooding rule and set a higher priority rule to forward the predefined IP message. In multiple switches, packets with different TOS values will reach the destination address in different ways to verify the connectivity between hosts and the time to reach the destination address.

3, Experimental requirements

Learn ovssinglebr Py and ovsmultibr Py, implement a VLAN in the topology shown in the figure below.

The above code divides h0 and h2 into VLAN 0 and h1 and h3 into VLAN 1. Because the topology has no controller and all flow tables in the switch are deleted during initialization, the network between hosts cannot be connected unless the flow table is issued. Please try to modify the code and directly issue the flow table item of VLAN setting with OVS command. Finally, test the interworking between h0 and h2, and the interworking between h1 and h3. The other hosts are not connected. The results are shown in the figure below. For OVS VLAN implementation, please refer to the blog: VLAN implementation based on OVS command

3, Experimental steps

1. Experimental environment

Virtual machine with Ubuntu 16.04.6 Desktop amd64 installed

2. Experimental process

Here is the modified ovsmultibr Py code to realize the requirements of the vlan. There is about ovsmultibr Py can refer to this article Open vSwitch use case extension experiment

The specific codes are as follows

#!/usr/bin/python

from mininet.net import Mininet
from mininet.node import Node
from mininet.link import TCLink
from mininet.log import  setLogLevel, info

def myNet():
    "Create network from scratch using Open vSwitch."

    info( "*** Creating nodes\n" )
    switch0 = Node( 's0', inNamespace=False )
    switch1 = Node( 's1', inNamespace=False )
    h0 = Node( 'h0' )
    h1 = Node( 'h1' )
    h2 = Node( 'h2' )
    h3 = Node( 'h3' )

    info( "*** Creating links\n" )
    linkopts0=dict(bw=100, delay='1ms', loss=0)
    linkopts1=dict(bw=1, delay='100ms', loss=0)
    linkopts2=dict(bw=10, delay='50ms', loss=0)
    linkopts3=dict(bw=100, delay='1ms', loss=0)
    TCLink( h0, switch0, **linkopts0)
    TCLink( h1, switch0, **linkopts0)
    TCLink( h2, switch1, **linkopts1)
    TCLink( h3, switch1, **linkopts1)
    TCLink( switch0, switch1, **linkopts0)

    info( "*** Configuring hosts\n" )
    h0.setIP( '192.168.123.1/24' )
    h1.setIP( '192.168.123.2/24' )
    h2.setIP( '192.168.123.3/24' )
    h3.setIP( '192.168.123.4/24' )
    info( str( h0 ) + '\n' )
    info( str( h1 ) + '\n' )
    info( str( h2 ) + '\n' )
    info( str( h3 ) + '\n' )
   
    info( "*** Starting network using Open vSwitch\n" )
    switch0.cmd( 'ovs-vsctl del-br dp0' )
    switch0.cmd( 'ovs-vsctl add-br dp0' )
    switch1.cmd( 'ovs-vsctl del-br dp1' )
    switch1.cmd( 'ovs-vsctl add-br dp1' )

    for intf in switch0.intfs.values():
        print intf
        print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf )

    for intf in switch1.intfs.values():
        print intf
        print switch1.cmd( 'ovs-vsctl add-port dp1 %s' % intf )

    print switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3') 
    print switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3')
    print switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,dl_vlan=0,actions=pop_vlan,output:1') 
    print switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,dl_vlan=1,actions=pop_vlan,output:2')
    print switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3') 
    print switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3')
    print switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,dl_vlan=0,actions=pop_vlan,output:1') 
    print switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,dl_vlan=1,actions=pop_vlan,output:2')

    info( "*** Running test\n" )
    h0.cmdPrint( 'ping -Q 0x10 -c 3 ' + h1.IP() )
    h0.cmdPrint( 'ping -Q 0x20 -c 3 ' + h2.IP() )
    h0.cmdPrint( 'ping -Q 0x30 -c 3 ' + h3.IP() )
    h1.cmdPrint( 'ping -Q 0x40 -c 3 ' + h2.IP() )
    h1.cmdPrint( 'ping -Q 0x50 -c 3 ' + h3.IP() )
    h2.cmdPrint( 'ping -Q 0x60 -c 3 ' + h3.IP() )


    info( "*** Stopping network\n" )
    switch0.cmd( 'ovs-vsctl del-br dp0' )
    switch0.deleteIntfs()
    switch1.cmd( 'ovs-vsctl del-br dp1' )
    switch1.deleteIntfs()
    info( '\n' )

if __name__ == '__main__':
    setLogLevel( 'info' )
    info( '*** Scratch network demo (kernel datapath)\n' )
    Mininet.init()
    myNet()

3. Experimental results



Tags: SDN

Posted by Canman2005 on Sun, 15 May 2022 17:11:16 +0300