通过opendaylight源码解读控制器与openflow交换机建立过程

本文详细介绍了opendaylight如何通过源码解析OF协议,建立与openflow交换机的连接。从OF协议模块启动、消息处理到链路发现服务,阐述了控制器与交换机的交互过程,包括Hello报文、端口状态、流表修改等关键步骤,以及LLDP在链路发现中的作用。
摘要由CSDN通过智能技术生成

opendaylight两大技术特色:1采用了osgi框架2引入了SAL,而今天我们主要介绍服务抽象层(SAL)适配的南向协议之一OF协议模块

OF协议模块启动与消息处理

osgi框架实例化controller类,初始化其变量包括事件队列、消息监听及交换机监听器集合,然后创建事件处理线程,在创建I/O处理线程。controllerIOThread监听底层交换机连接请求,建立连接则监听消息,当收到消息后判断消息类型再调用相应方法处理:

while (running) {
    try {
        // wait for an incoming connection
        // check interface state every 5sec
        selector.select(5000);
        Iterator<SelectionKey> selectedKeys = selector
                     .selectedKeys().iterator();
        netInterfaceUp = isNetInterfaceUp(netInterfaceUp);
        while (selectedKeys.hasNext()) {
           SelectionKey skey = selectedKeys.next();
           selectedKeys.remove();
           //selector选择器接收连接请求
           if (skey.isValid() && skey.isAcceptable()) {
                  ((Controller)listener).handleNewConnection(
                               selector,serverSelectionKey);
           }
        }
    } catch (Exception e) {
          continue;
    }
}

handleNewConnection从事件队列中获取处理事件,如果是新增交换机事件,则换存该交换机并通知监听器交换机信息改变;如果是删除或异常事件,则断开I/O连接;如果是OFMessage消息,则通知SwitchHandler来处理该消息。

I/O处理线程中的消息处理

TCP 连接建立后,交换机和控制器就会互相发送 hello 报文(SwitchHandler处理函数handleMessages处理的第一个消息类型)。Hello 报文是使用 OpenFlow 协议的一个对称的数据包。Hello 报文中唯一的内容 是 OpenFlow 报文头中的“类型值=0”。

for (OFMessage msg : msgs) {
    logger.trace("Message received: {}", msg);
    this.lastMsgReceivedTimeStamp = System.currentTimeMillis();
    OFType type = msg.getType();
    switch (type) {
    case HELLO:
        sendFeaturesRequest();
        break;
    case ECHO_REQUEST:
        OFEchoReply echoReply = (OFEchoReply) factory.getMessage(OFType.ECHO_REPLY);

        byte []payload = ((OFEchoRequest)msg).getPayload();
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值