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

(1) Create ovssinglebr Py script and add content. Refer to SDNLAB for the code

The topology corresponding to the script is shown in the figure above. Execute ovssinglebr Py, without a controller, in
In the Mininet script, call the ovs command to directly issue the flow table to the switch0 switch, and set the incoming port as
1 / 2 / 3 of the data packet flood broadcast, and the data packet with the destination address of 192.168.123.1/2/3 is broadcast from
1 / 2 / 3 port forward. Then test h0 ping h1, h0 ping h2 and network connectivity.


(2) Create ovsmultibr Py script and add content. Refer to SDNLAB for the code

The topology corresponding to the script is shown in the figure above. Execute ovsmultibr Py, without a controller, in
In the Mininet script, the ovs command is called to send the flow table to multiple switches, and the operation is performed through h0 ping h1
Test and verify the connectivity between hosts, and check the connectivity between hosts through the tos value set by the - Q parameter
Sex. Through verification, it is found that the larger the tos value is set, the less time is used.

4, Experimental requirements

  1. Learn ovssinglebr Py and ovsmultibr Py, implement a VLAN in the topology shown in the figure below.
#!/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)
    TCLink( h0, switch0, **linkopts0)
    TCLink( h1, switch0, **linkopts0)
    TCLink( switch1, h2, **linkopts0)
    TCLink( switch1, h3, **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 ) + ' ' )
    info( str( h1 ) + ' ' )
    info( str( h2 ) + ' ' )
    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 -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()

The above code divides h0 and h2 into VLAN 0 and h1 and h3 into VLAN 1, because the topology is not
There is a controller, and all the flow tables in the switch are deleted during initialization. Therefore, unless the flow table is issued, the
The network between hosts cannot be connected. Please try to modify the code and issue the VLAN settings directly with ovs command
According to the flow table item, h0 and h2 are interworking, h1 and h3 are interworking, and other hosts are not connected. The results are shown in the figure below.


Posted by vinodkalpaka on Sat, 14 May 2022 17:43:45 +0300