openflow 1.0中交换机对OFPT_QUEUE_GET_CONFIG_REQUEST消息的响应

        前段时间了解了一下openflow的原理,刚开始看openflow的源码,对于整体的实现还欠缺了解,只是对其中几个关键的函数进行简单的解读。

        OFPT_QUEUE_GET_CONFIG_REQUEST是一个Controller-to-switch消息,由控制器发给交换机,要求获取交换机队列配置的。交换机收到控制器消息后,对openflow包进行解析,通过获取header中type字段,然后进行相应的响应。如type字段为OFPT_QUEUE_GET_CONFIG_REQUEST,则调用recv_queue_get_config_request函数进行处理,并最终返回 OFPT_QUEUE_GET_CONFIG_REPLY消息,其中包含了所请求端口上已配置队列信息的列表。

        recv_queue_get_config_request函数所完成的功能就是构造 OFPT_QUEUE_GET_CONFIG_REPLY消息并返回给控制器。

1、首先是根据查询消息中的端口号port_no在交换机端口中进行查找(dp_lookup_port(dp,port_no)),查找成功获得端口信息,并进一步构造repley消息,返回给控制器;否则直接向控制器返回错误信息。

2、根据端口信息构造reply消息。

根据该消息的结构,

/* Queue configuration for a given port. */

struct ofp_queue_get_config_reply {
    struct ofp_header header;
    uint16_t port;
    uint8_t pad[6];
    struct ofp_packet_queue queues[0]; /* List of configured queues. */
};
OFP_ASSERT(sizeof(struct ofp_queue_get_config_reply) == 16);

构造也需要分成几个步骤:

(1)构造openflow报文头make_openflow_reply(这是每个消息都包含的)。主要调用的函数是make_openflow_xid,该函数再次调用put_openflow_xid,根据ofp_header结构,完成对报文头中各个字段(version、type、length、xid)的设置。

(2)返回消息中包含的端口号即所要查询队列配置信息的端口号ofq_reply->port = htons(port_no)。

(3)添加已配置队列列表。此处使用的LIST_FOR_EACH(...)(这个循环条件还没完全明白,需要进一步考虑)是由宏定义的一个for循环,在list.h中定义。而这个循环中所做的主要工作由fill_queue_desc来完成,顾名思义,就是添加队列描述。队列结构如下:

/* Full description for a queue. */
struct ofp_packet_queue {
    uint32_t queue_id;     /* id for the specific queue. */
    uint16_t len;          /* Length in bytes of this queue desc. */
    uint8_t pad[2];        /* 64-bit alignment. */
    struct ofp_queue_prop_header properties[0]; /* List of properties. */
};
OFP_ASSERT(sizeof(struct ofp_packet_queue) == 8);
fill_queue_desc函数首先完成queue_id、和len的配置,然后添加队列特性properties。

3、 最后向控制前返回响应消息(send_openflow_buffer)。
此处维护一个sender,表示request消息的来源,也最为reply消息的目的。当sender为真,则向该目的返回reply消息,否则广播reply消息。


你可能感兴趣的:(struct,properties,list,header,buffer,each)