예제 #1
0
def filter_ecn_tcp_dpctl(interval_ms=0.0):
    """
    :param interval_ms : 用于 filter 的interval, 时间越长, 修改包的数量越多
    用我们自己修改的 OFCTL_CMD_MY, 更加快速
    :return:
    """
    os_popen("%s ecn_tcp %s del" % (OFCTL_CMD_MY, interval_ms * 1000))
예제 #2
0
def filter_ecn_tcp_dpctl(interval_ms=0.0):
    """
    :param interval_ms : 用于 filter 的interval, 时间越长, 修改包的数量越多
    用我们自己修改的 OFCTL_CMD_MY, 更加快速
    :return:
    """
    os_popen("%s ecn_tcp %s del" % (OFCTL_CMD_MY, interval_ms * 1000))
예제 #3
0
def mod_ecn(value):
    os_popen(
        "%s mod-flows s1 \"tcp,nw_dst=10.0.0.3, actions=mod_nw_ecn:%s, resubmit(,1)\""
        % (OFCTL_CMD, value))
    os_popen(
        "%s mod-flows s1 \"ip,nw_dst=10.0.0.3, actions=mod_nw_ecn:%s, resubmit(,1)\""
        % (OFCTL_CMD, value))
예제 #4
0
def switch_drop():
    """
    最生猛的 切换 drop 策略大法, 流量绝对走不起来
    :return:
    """
    os_popen('%s add-flow s1 "%s,nw_dst=10.0.0.3, actions=drop"' % (OFCTL_CMD, "tcp"))
    os_popen('%s del-flows s1 "%s,nw_dst=10.0.0.3"' % (OFCTL_CMD, "tcp"))
예제 #5
0
def init_switch():
    info("*** 初始化交换机 OpenFlow13 协议支持 \n")
    os_popen(
        "ovs-vsctl set bridge s1 protocols=OpenFlow10,OpenFlow13 # 设置s1 交换机 openflow 13 协议支持"
    )
    debug("".join(
        os.popen("ovs-vsctl list bridge s1 # | grep protocols #查看s1交换机现有协议").
        readlines()))
예제 #6
0
def switch_drop():
    """
    最生猛的 切换 drop 策略大法, 流量绝对走不起来
    :return:
    """
    os_popen('%s add-flow s1 "%s,nw_dst=10.0.0.3, actions=drop"' %
             (OFCTL_CMD, "tcp"))
    os_popen('%s del-flows s1 "%s,nw_dst=10.0.0.3"' % (OFCTL_CMD, "tcp"))
예제 #7
0
def switch_ecn_add():
    """
    比较友好的 ecn 方法
    :return:
    """
    os_popen('%s add-flow s1 "%s,nw_dst=10.0.0.3, actions=mod_nw_ecn:3, resubmit(,1)"' % (OFCTL_CMD, "tcp"))
    # 不去除mod_ecn策略的话, 带宽始终上不来, 维持在 0.5Mbps 左右
    os_popen('%s del-flows s1 "%s,nw_dst=10.0.0.3"' % (OFCTL_CMD, "tcp"))
예제 #8
0
def setup_ssh():
    # net.start()

    # 支持host ssh访问 # route add -net 10.0.0.0/16 root-eth0 出现路由丢失的情况则需要重新添加
    argvopts = '-D -o UseDNS=no -u0'
    sshd.sshd(net, opts=argvopts, ip="10.0.0.254", routes=["10.0.0.0/24"])
    sleep(3)
    ecn_qdisc_helper.os_popen('ifconfig root-eth0 10.0.0.254 netmask 255.255.255.0')  # 上面的设置路由接口会丢失, 改为ip设置
    ecn_qdisc_helper.os_popen('route add -net 10.0.0.0/24 gw 10.0.0.254')
예제 #9
0
def switch_ecn_add():
    """
    比较友好的 ecn 方法
    :return:
    """
    os_popen(
        '%s add-flow s1 "%s,nw_dst=10.0.0.3, actions=mod_nw_ecn:3, resubmit(,1)"'
        % (OFCTL_CMD, "tcp"))
    # 不去除mod_ecn策略的话, 带宽始终上不来, 维持在 0.5Mbps 左右
    os_popen('%s del-flows s1 "%s,nw_dst=10.0.0.3"' % (OFCTL_CMD, "tcp"))
예제 #10
0
def setup_ssh():
    # net.start()

    # 支持host ssh访问 # route add -net 10.0.0.0/16 root-eth0 出现路由丢失的情况则需要重新添加
    argvopts = '-D -o UseDNS=no -u0'
    sshd.sshd(net, opts=argvopts, ip="10.0.0.254", routes=["10.0.0.0/24"])
    sleep(3)
    ecn_qdisc_helper.os_popen(
        'ifconfig root-eth0 10.0.0.254 netmask 255.255.255.0'
    )  # 上面的设置路由接口会丢失, 改为ip设置
    ecn_qdisc_helper.os_popen('route add -net 10.0.0.0/24 gw 10.0.0.254')
예제 #11
0
def ecn_qos_init(remote=False):
    """
    :param remote 是否使用外部控制器
    :return:
    Create and test our QBB network standard"
    初始化拓扑qos; 包括
      四个存在带宽差异(big_link small_link)导致拥堵点的链路 qos 带宽 s1-eth3 s2-eth3 s3-eth3 s4-eth1
      将 5002, h1, icmp 所有流量转移到队列2中, 便于测试

    """

    topo = ECNTopo()  #
    global net
    # MMininet 类 API 参考: http://mininet.org/api/classmininet_1_1net_1_1Mininet.html#a1ed0f0c8ba06a398e02f3952cc4c8393
    # 命令行参数对应 --mac => autoSetMacs
    # 命令行参数对应 --arp => autoStaticArp
    # 命令行参数对应 -x => xterms
    net = Mininet(topo=topo,
                  controller=None,
                  link=ecn_util.ECNLink,
                  autoSetMacs=True,
                  xterms=False,
                  autoStaticArp=True)

    if remote:
        # ecn_qdisc_helper.os_popen("PYTHONPATH=/opt/ryu/ /opt/ryu/bin/ryu-manager
        # ryu.app.rest_qos cuc.book.qos_simple_switch_13 ryu.app.rest_conf_switch & ")
        net.addController('c0',
                          controller=RemoteController,
                          ip='127.0.0.1',
                          port=6653)
    else:
        c0 = Controller('c0', port=6633)  # buildin-controller
        net.addController(c0)

    enable_ssh = False  # 激活ssh如果系统 - 暂时不用
    if enable_ssh:
        setup_ssh()
    else:
        net.start()

    # 手工添加给 dpctl 使用的 s1 交换机的 6634 监听端口 (Why? 为什么用命令行增加的交换机不用手工加这个参数? )
    # 这样可以使用命令 dpctl dump-flows tcp:127.0.0.1:6634 查询内核流表
    ecn_qdisc_helper.os_popen(
        'ovs-vsctl  --id=@s1c0 create Controller target="tcp\:127.0.0.1\:6633" max_backoff=1000 '
        '-- --id=@s1-listen create Controller target="ptcp\:6634" max_backoff=1000 '
        '-- set bridge s1 controller=[@s1c0,@s1-listen] ')

    if remote:
        print "*** run this command for remote ryu controller"
        print "cd /opt/ryu; PYTHONPATH=/opt/ryu/ /opt/ryu/bin/ryu-manager " \
              "ryu.app.rest_qos cuc.book.qos_simple_switch_13 ryu.app.rest_conf_switch "

    setup_server(net)
    background = False  # 激活后台流量 - 暂时不用
    if background:  # backgroud traffice,
        net.get("h1").cmd("netperf -H h3 -l %s &" % 3600)

    # ecn_util.print_mininet_objs(net)  # 打印 mininet 拓扑对象
    # ecn_test_case.test_diff_bw(net)        # 设置不同带宽条件qos, 并使用 iperf测试
    # ecn_test_case.test_diff_latency(net)   # 设置不同延时条件qos, 并使用 ping 测试

    # ecn_test_case.test01_06_setup_queue_and_latency(net) # 初始化 TEST01_06 拓扑 qos

    # no ecn 测试
    # ecn_test_case.test01_base(net, "TEST01", duration=60)  # 独立测试TEST 01

    # ecn_red red ecn
    # ecn_test_case.test02_04_base_ecn_red(net, "red-ecn-200000",
    #    redminmax="min 200000  max  300000 avpkt 1500", duration=60)

    # ecn_test_case.test01_04_ecn_red_duration(net, duration=(60, 180))  # 设置不同时长, 进行TEST01-04测试
    # red ecn 进行TEST01-04测试
    # ecn_test_case.test01_04_ecn_red(net, duration=10)

    # - openflow ecn
    # -- ecn_ip 多组测试
    queue_mins = range(80000, 80001)  # only 1 test
    # queue_mins = range(80000, 80002) # 2 test
    # queue_mins = range(80000, 80003)  # 3 test
    ecn_test_case.ovs_openflow_ecn(net,
                                   "openflow-ecn_ip-",
                                   duration=60,
                                   qmins=queue_mins,
                                   wait_seconds=10,
                                   ecn_tcp_flag=False)

    # -- ecn_tcp 多组测试
    # ecn_test_case.ovs_openflow_ecn(net, "openflow-ecn_tcp-", duration=120,
    #                                qmins=queue_mins, wait_seconds=1, ecn_tcp_flag=True)

    CLI(net)  # 激活命令行交互

    net.stop()

    clean_server(net)  # 清楚所有残留服务
예제 #12
0
 def change_queue_len(self, tx_queue_len=200):
     # LOG.debug("  调整 %s 网络 队列长度 txqueuelen " )
     ecn_qdisc_helper.os_popen("sudo ip link set txqueuelen %s dev %s" %
                               (tx_queue_len, self.name))
예제 #13
0
def ecn_qos_init(remote=False):
    """
    :param remote 是否使用外部控制器
    :return:
    Create and test our QBB network standard"
    初始化拓扑qos; 包括
      四个存在带宽差异(big_link small_link)导致拥堵点的链路 qos 带宽 s1-eth3 s2-eth3 s3-eth3 s4-eth1
      将 5002, h1, icmp 所有流量转移到队列2中, 便于测试

    """

    topo = ECNTopo()  #
    global net
    # MMininet 类 API 参考: http://mininet.org/api/classmininet_1_1net_1_1Mininet.html#a1ed0f0c8ba06a398e02f3952cc4c8393
    # 命令行参数对应 --mac => autoSetMacs
    # 命令行参数对应 --arp => autoStaticArp
    # 命令行参数对应 -x => xterms
    net = Mininet(topo=topo, controller=None, link=ecn_util.ECNLink, autoSetMacs=True, xterms=False,
                  autoStaticArp=True)

    if remote:
        # ecn_qdisc_helper.os_popen("PYTHONPATH=/opt/ryu/ /opt/ryu/bin/ryu-manager
        # ryu.app.rest_qos cuc.book.qos_simple_switch_13 ryu.app.rest_conf_switch & ")
        net.addController('c0', controller=RemoteController, ip='127.0.0.1', port=6653)
    else:
        c0 = Controller('c0', port=6633)  # buildin-controller
        net.addController(c0)

    enable_ssh = False  # 激活ssh如果系统 - 暂时不用
    if enable_ssh:
        setup_ssh()
    else:
        net.start()

    # 手工添加给 dpctl 使用的 s1 交换机的 6634 监听端口 (Why? 为什么用命令行增加的交换机不用手工加这个参数? )
    # 这样可以使用命令 dpctl dump-flows tcp:127.0.0.1:6634 查询内核流表
    ecn_qdisc_helper.os_popen(
        'ovs-vsctl  --id=@s1c0 create Controller target="tcp\:127.0.0.1\:6633" max_backoff=1000 '
        '-- --id=@s1-listen create Controller target="ptcp\:6634" max_backoff=1000 '
        '-- set bridge s1 controller=[@s1c0,@s1-listen] ')

    if remote:
        print "*** run this command for remote ryu controller"
        print "cd /opt/ryu; PYTHONPATH=/opt/ryu/ /opt/ryu/bin/ryu-manager " \
              "ryu.app.rest_qos cuc.book.qos_simple_switch_13 ryu.app.rest_conf_switch "

    setup_server(net)
    background = False  # 激活后台流量 - 暂时不用
    if background:  # backgroud traffice,
        net.get("h1").cmd("netperf -H h3 -l %s &" % 3600)

    # ecn_util.print_mininet_objs(net)  # 打印 mininet 拓扑对象
    # ecn_test_case.test_diff_bw(net)        # 设置不同带宽条件qos, 并使用 iperf测试
    # ecn_test_case.test_diff_latency(net)   # 设置不同延时条件qos, 并使用 ping 测试

    # ecn_test_case.test01_06_setup_queue_and_latency(net) # 初始化 TEST01_06 拓扑 qos

    # no ecn 测试
    # ecn_test_case.test01_base(net, "TEST01", duration=60)  # 独立测试TEST 01

    # ecn_red red ecn
    # ecn_test_case.test02_04_base_ecn_red(net, "red-ecn-200000",
    #    redminmax="min 200000  max  300000 avpkt 1500", duration=60)

    # ecn_test_case.test01_04_ecn_red_duration(net, duration=(60, 180))  # 设置不同时长, 进行TEST01-04测试
    # red ecn 进行TEST01-04测试
    # ecn_test_case.test01_04_ecn_red(net, duration=10)


    # - openflow ecn
    # -- ecn_ip 多组测试
    queue_mins = range(80000, 80001) # only 1 test
    # queue_mins = range(80000, 80002) # 2 test
    # queue_mins = range(80000, 80003)  # 3 test
    ecn_test_case.ovs_openflow_ecn(net, "openflow-ecn_ip-", duration=60,
                                    qmins=queue_mins, wait_seconds=10, ecn_tcp_flag=False)

    # -- ecn_tcp 多组测试
    # ecn_test_case.ovs_openflow_ecn(net, "openflow-ecn_tcp-", duration=120,
    #                                qmins=queue_mins, wait_seconds=1, ecn_tcp_flag=True)

    CLI(net)  # 激活命令行交互

    net.stop()

    clean_server(net)  # 清楚所有残留服务
예제 #14
0
 def change_queue_len(self, tx_queue_len=200):
     # LOG.debug("  调整 %s 网络 队列长度 txqueuelen " )
     ecn_qdisc_helper.os_popen("sudo ip link set txqueuelen %s dev %s" % (tx_queue_len, self.name))
예제 #15
0
def init_switch():
    info("*** 初始化交换机 OpenFlow13 协议支持 \n")
    os_popen("ovs-vsctl set bridge s1 protocols=OpenFlow10,OpenFlow13 # 设置s1 交换机 openflow 13 协议支持")
    debug("".join(os.popen("ovs-vsctl list bridge s1 # | grep protocols #查看s1交换机现有协议").readlines()))
예제 #16
0
def mod_ecn(value):
    os_popen("%s mod-flows s1 \"tcp,nw_dst=10.0.0.3, actions=mod_nw_ecn:%s, resubmit(,1)\"" % (OFCTL_CMD, value))
    os_popen("%s mod-flows s1 \"ip,nw_dst=10.0.0.3, actions=mod_nw_ecn:%s, resubmit(,1)\"" % (OFCTL_CMD, value))