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

1, Experimental purpose

After Mininet installation, Open vSwitch will be installed together, which can be called directly through Python script
Open vSwitch command, so as to directly control 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 the "OVS vsctl" command for direct control
Open vSwitch. Use the default switch flooding rules and set higher priority rules for predetermination
Forwarding of IP message. In multiple switches, packets with different TOS values will pass through different switches
Method to reach the destination address, verify the connectivity between hosts and the time to reach the destination address.

3, Experimental steps

1. Experimental environment

Virtual machine with Ubuntu 16.04.5 Desktop amd64 installed.

2. Experimental process

Implement a VLAN in the topology shown in the figure below.

Divide 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. Try to modify the code, use the ovs command to directly issue the flow table item set by VLAN, and finally test the interworking between h0 and h2, and the interworking between h1 and h3. The other hosts are not connected.

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='5ms', loss=0)
    linkopts1 = dict(bw=200, delay='10ms', loss=0)
    TCLink( h0, switch0, **linkopts0 )
    TCLink( h1, switch0, **linkopts0 )
    TCLink( h2, switch1, **linkopts0 )
    TCLink( h3, switch1, **linkopts0 )
    TCLink( switch0, switch1, **linkopts1)

    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(switch0.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(switch0.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(switch0.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,dl_vlan=0,actions=pop_vlan,output:1' ))
    print(switch0.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 -c 3 ' + h1.IP() )
    h0.cmdPrint( 'ping -c 3 ' + h2.IP() )
    h0.cmdPrint( 'ping -c 3 ' + h3.IP() )
    h1.cmdPrint( 'ping -c 3 ' + h2.IP() )
    h1.cmdPrint( 'ping -c 3 ' + h3.IP() )
    h2.cmdPrint( 'ping -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()

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 repair the code, directly issue the flow table item set by VLAN with ovs command, and 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.

 

 

 

Posted by Miko on Sat, 14 May 2022 13:03:59 +0300