Iperf застрял в мининет пользовательской топологии - PullRequest
0 голосов
/ 22 ноября 2018

Я использую mininet на виртуальной машине Vagrant, которая эмулирует Ubuntu Xenial (мой ноутбук работает под управлением Windows 10).

Топология следующая, когда удаленный контроллер, статический ARP и коммутатор ядра OVS работают впробел:

h1---s1----s4---h3
     | \  / |
     |  s3  |
     | /  \ |
h2---s2----s5---h4

и я сделал это с помощью следующего скрипта Python:

from mininet.topo import Topo
from mininet.node import Host

class MyTopo(Topo):
    def __init__(self):
        "Create custom topo."
         Topo.__init__(self)

         leftTopHost = self.addHost('h1')
         leftBottomHost = self.addHost('h2')
         rightTopHost = self.addHost('h3')
         rightBottomHost = self.addHost('h4')
         Switch1 = self.addSwitch('s1')
         Switch2 = self.addSwitch('s2')
         Switch3 = self.addSwitch('s3')
         Switch4 = self.addSwitch('s4')
         Switch5 = self.addSwitch('s5')

         self.addLink(leftTopHost, Switch1)
         self.addLink(Switch1, Switch2)
         self.addLink(Switch1, Switch3)
         self.addLink(Switch1, Switch4)

         self.addLink(leftBottomHost, Switch2)
         self.addLink(Switch2, Switch3)
         self.addLink(Switch2, Switch5)

         self.addLink(Switch3, Switch4)
         self.addLink(Switch3, Switch5)

         self.addLink(rightTopHost, Switch4)
         self.addLink(Switch4, Switch5)

         self.addLink(rightBottomHost, Switch5)

topos = {'mytopo': (lambda: MyTopo())}

Основная идея - это туннель MPLS между h1 и h4, проходящий через коммутаторы s1, s4и с5.Я включил часть приложения Ryu, которое я разработал («часть», потому что MPLS совпадает и последующее ping h1 h4 works отлично);предположим, что номера выходных портов совпадают с кодами в коде

Правила потока в s1 :

#path h1->h4
...
match = parser.OFPMatch(in_port=1, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(4)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match, 
                        instructions=inst)
datapath.send_msg(mod)

#path h4->h1    
match = parser.OFPMatch(in_port=4, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(1)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match, 
                        instructions=inst)
datapath.send_msg(mod)

Правила потока в s4 :

#path h1->h4
...
match = parser.OFPMatch(in_port=1, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(4)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match, 
                        instructions=inst)
datapath.send_msg(mod)

#path h4->h1
match = parser.OFPMatch(in_port=4, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(1)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match, 
                        instructions=inst)
datapath.send_msg(mod)

Правила потока в s5 :

#path h1->h4
...
match = parser.OFPMatch(in_port=3, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(4)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match, 
                        instructions=inst)
datapath.send_msg(mod)

#path h4->h1
match = parser.OFPMatch(in_port=4, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(3)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match, 
                        instructions=inst)
datapath.send_msg(mod)

Итак, моя проблема: я хочу генерировать TCP-трафик между h1 и h4, но я не могу понять, почемукогда я набираю команду iperf h1 h4 в приглашении mininet, это приводит к таймауту соединения;тот же результат, если я запускаю и клиент, и сервер на отдельных терминалах.

Конечно, я знаю, что должен что-то добавить в свой код, но я не могу понять, где ... Любая помощь будет высоко оценена!

...