【OVS2.5.0源码分析】openflow连接实现分析(3)

本文详细分析了OVS2.5.0中openflow连接的接收流程,深入探讨connmgr_run函数的作用,为后续的openflow报文处理奠定基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上两篇分析了controller连接建立的完整流程,本篇分析下接收openflow报文的过程,openflow报文的处理在后续文章中分析。 整个调用过程,可以根据上一篇的对象关系图得出,本篇只是把调用关系细化到函数。


1、connmgr_run函数

    if (mgr->in_band) {
        if (!in_band_run(mgr->in_band)) {
            in_band_destroy(mgr->in_band);
            mgr->in_band = NULL;
        }
    }


    LIST_FOR_EACH_SAFE (ofconn, next_ofconn, node, &mgr->all_conns) {
        ofconn_run(ofconn, handle_openflow);    //all_conns有两部分组成:controller连接和ofservice
    }
    ofmonitor_run(mgr);


    /* Fail-open maintenance.  Do this after processing the ofconns since
     * fail-open checks the status of the controller rconn. */
    if (mgr->fail_open) {
        fail_open_run(mgr->fail_open);
    }

2、ofconn_run函数

static void
ofconn_run(struct ofconn *ofconn,
           void (*handle_openflow)(struct ofconn *,
                                   const struct ofpbuf *ofp_msg))
{
    struct connmgr *mgr = ofconn->connmgr;
    size_t i;

    for (i = 0; i < N_SCHEDULERS; i++) {
        struct ovs_list txq;

        pinsched_run(ofconn->schedulers[i], &txq);
        do_send_packet_ins(ofconn, &txq);
    }

    rconn_run(ofconn->rconn);      //该调用链为 vconn_run->stream_run, 对于tcp的连接,主要行为是判断是否有发送报文,有则发送之

    /* Limit the number of iterations to avoid starving other tasks. */
    for (i = 0; i < 50 && ofconn_may_recv(ofconn); i++) {
        struct ofpbuf *of_msg = rconn_recv(ofconn-
<think>首先,用户的问题是关于安装和部署软件定义网络(SDN)环境的。用户引用了几个参考内容,这些内容涉及在Ubuntu系统上部署SDN环境,包括安装操作系统、VMware Tools、JDK、OpenDaylight、Open vSwitch等。用户还提到了Docker部署SDN环境。 我的系统级指令要求: - 所有行内数学表达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如 [^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户意图是了解如何安装和部署SDN环境。参考引用提供了具体步骤: - 引用[1]:重新部署SDN实验Ubuntu系统,包括安装操作系统、更新系统、安装VMware Tools、JDK、OpenDaylight、Open vSwitch、OVS与ODL连接- 引用[2]:SDN环境搭建,在Ubuntu上安装VMware、Ubuntu系统、设置root、换源,然后安装git、mininet、测试mininet、安装pip、ryu等。 - 引用[3]:Docker部署SDN环境,介绍Docker入门和实践。 - 引用[4]:Ubuntu20.04上部署SDN环境,更新系统、安装mininet、安装ryu等。 用户可能是在询问通用的SDN环境部署方法,但引用集中在Ubuntu和Docker上。我应该基于这些参考,提供一个清晰的、逐步的指南。 回答结构: 1. **引言**:简要介绍SDN环境部署的重要性。 2. **步骤指南**:分步解释如何安装和部署SDN环境,参考提供的引用。 - 可能包括:准备环境(如安装Ubuntu)、更新系统、安装必要工具(如git、mininet、ryu、OpenDaylight等)。 - 由于引用提到Ubuntu和Docker,我可以覆盖两种方法:传统Ubuntu部署和Docker部署。 3. **生成相关问题**:在回答结束时,添加相关问题。 4. **引用标识**:在适当的地方添加引用标识,例如在描述具体步骤时引用[1]、[2]、[4]等。 确保使用中文回答。 生成相关问题: - 基于主题,如:SDN环境的性能优化、常见问题解决、其他部署方法等。 详细步骤: - **准备操作系统**:安装Ubuntu(如20.04),参考[1]和[4]。 - **系统更新**:运行 `sudo apt-get update` 和 `sudo apt-get upgrade`,参考[1]和[4]。 - **安装必要软件**: - 安装git:`sudo apt-get install git`,参考[2]。 - 安装mininet:克隆仓库并运行安装脚本,参考[2]和[4]。 - 安装ryu:克隆仓库并安装依赖,参考[2]和[4]。 - 安装OpenDaylight:参考[1]。 - 安装Open vSwitch:参考[1]。 - **测试环境**:如测试mininet和ryu,参考[2]和[4]。 - **Docker方法**:简要提及使用Docker部署SDN环境,参考[3]。 由于引用[3]是关于Docker的,我可以简要介绍Docker部署,但用户可能更关注传统方法。 回答应以清晰的结构呈现,使用标题或编号。 最终回答结构: 1. 介绍SDN环境部署。 2. 详细步骤(分步)。 3. 相关问题。</think>### 安装和部署软件定义网络(SDN)环境指南 软件定义网络(SDN)是一种通过中央控制器管理网络流量的技术,广泛应用于数据中心、云计算等领域。部署SDN环境通常涉及安装操作系统、SDN控制器(如OpenDaylight或Ryu)、虚拟交换机(如Open vSwitch)以及相关工具(如Mininet)。以下步骤基于Ubuntu系统(推荐20.04版本)进行部署,参考了站内引用内容,确保方法真实可靠。整个过程分为准备环境、安装核心组件、配置连接和测试验证四个阶段。 #### 1. **准备操作系统环境** - **安装Ubuntu系统**:首先,在虚拟机(如VMware Workstation)或物理机上安装Ubuntu 20.04。下载ISO镜像后,通过引导程序完成安装。安装时建议设置root账户密码以方便后续操作[^2]。 - **更新系统软件**:安装完成后,立即运行系统更新命令,确保所有软件包最新: ```bash sudo apt-get update sudo apt-get upgrade -y ``` 此步骤可修复潜在安全漏洞,参考引用[1]和[4]。 - **安装必要工具**:安装Git和pip,用于后续克隆代码库和管理Python包: ```bash sudo apt-get install git python3-pip -y ``` 参考引用[2]。 #### 2. **安装核心SDN组件** - **安装Mininet**:Mininet用于模拟SDN网络拓扑。克隆Mininet仓库并运行安装脚本: ```bash git clone git://github.com/mininet/mininet.git cd mininet/util sudo ./install.sh -n3v # -n3v选项安装Mininet、Open vSwitch和Wireshark ``` 安装完成后,测试是否成功:`sudo mn --test pingall`。如果输出连通性测试通过,表示Mininet安装正常[^2][^4]。 - **安装SDN控制器(选择一种)**: - **Ryu控制器**:Ryu是一个轻量级Python-based控制器。克隆仓库并安装依赖: ```bash git clone https://github.com/faucetsdn/ryu.git cd ryu pip3 install -r tools/optional-requires -i https://pypi.tuna.tsinghua.edu.cn/simple # 使用清华源加速 python3 setup.py install ``` 如果报错(如缺少msgpack),手动安装缺失包:`pip3 install msgpack netaddr oslo.conf>=2.5.0 ovs>=2.6.0`[^4]。 - **OpenDaylight控制器**:OpenDaylight(ODL)适合企业级部署。先安装Java JDK: ```bash sudo apt-get install openjdk-11-jdk -y ``` 然后下载ODL发行版(如Karaf),解压并运行: ```bash wget https://nexus.opendaylight.org/content/repositories/public/org/opendaylight/integration/karaf/0.16.0/karaf-0.16.0.tar.gz tar -xzf karaf-0.16.0.tar.gz cd karaf-0.16.0/bin ./karaf # 启动控制器 ``` 参考引用[1]。 - **安装Open vSwitch(OVS)**:如果Mininet安装脚本未包含OVS,手动安装: ```bash sudo apt-get install openvswitch-switch -y sudo systemctl start openvswitch-switch ``` OVS作为虚拟交换机,用于连接控制器和网络设备[^1]。 #### 3. **配置组件连接** - **连接OVS与控制器**:启动OVS服务后,将其连接到SDN控制器(以Ryu为例)。首先启动Ryu控制器: ```bash cd ryu/ryu/app ryu-manager simple_switch_13.py --verbose # 运行简单交换机应用 ``` 然后在另一个终端,启动Mininet并指定控制器IP(默认为localhost): ```bash sudo mn --controller=remote,ip=127.0.0.1,port=6633 --switch=ovsk,protocols=OpenFlow13 ``` 此命令将Mininet的交换机连接到Ryu控制器[^1][^4]。 - **使用Docker部署(可选)**:对于容器化环境,Docker可简化部署。安装Docker后,拉取SDN镜像(如OpenDaylight或Ryu的Docker镜像): ```bash sudo apt-get install docker.io -y docker pull opendaylight/odl # 示例:拉取ODL镜像 docker run -d -p 8181:8181 opendaylight/odl # 运行容器 ``` Docker方法适合快速测试,但需熟悉容器网络配置,参考引用[3]。 #### 4. **测试和验证环境** - **测试连通性**:在Mininet中创建简单拓扑(如`sudo mn`),然后执行ping测试: ```bash mininet> pingall # 应输出100%连通 ``` - **验证控制器**:访问控制器Web界面(如OpenDaylight的http://localhost:8181)或检查Ryu日志,确认交换机连接成功[^2]。 - **常见问题解决**: - 如果Mininet启动失败,运行`sudo mn --clean`清除残留配置。 - 依赖错误时,使用`pip3 install --upgrade setuptools`更新工具[^4]。 通过以上步骤,您可以成功部署一个基础SDN环境。整个过程需1-2小时,具体时间取决于网络速度和硬件性能。部署后,可进一步探索SDN应用开发或性能优化。如果您使用不同系统或遇到错误,请提供细节以便针对性建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值