Openflow 消息处理流程笔记

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

何腾飞2017.04.25更新

Openflow 消息处理

源码:sptn_code中ofp/dpa/tne模块。

简介:ofp模块接收sck的flow_mod消息,处理后发送给DPA, DPA处理后在发送给TNE。

以下消息处理过程均以flow_mod消息为例,*部分为group_mod消息的处理。*、Sck处理流程

sck_create_proc()

sck_receive_proc()

一、Ofp处理流程

简介:接收SCK消息,发送给DPA。

File:ofpmain.c

1.ofp_create_proc()

File:ofprecv.c

一系列初始化操作;

设置接收函数ofp_receive_proc() ;

...

2.ofp_receive_proc()

in: ips消息,queue_id队列id

判断queue_id:

Sck : 调用ofp_rcv_sck_ips();

...

3.ofp_rcv_sck_ips()

In: ips消息

判断ips_type消息类型:

Sck_register;

Sck_unregister;

Sck_rsp;

Sck_error;

Sck_data;

Openflow协议数据:

ofp_message_reassemble() ;

ofp_check_of_msg_list();

Netconf协议数据:

...

Sck_close;

4.ofp_message_reassemble()

收到ofp消息后,首先需要存入ofp消息队列,此时先要判断是否需要新建一个ofp消息块节点or使用现有的LQE队列对应的ofp消息块节点,

Ofp消息队列如下:

1---2---3---4---5---...---N

该消息队列为一个双向循环链表;

N为全局变量v_ofp_shared->ofp_msgs始终不变;初始化时N.next和N.prev均指向N自身,N自身是没有数据域的(N.self==null);

有数据节点时,N.next始终指向第1个结点,N.prev始终指向最后1个结点;

故只有满足以下条件才不需要新建LQE节点:

1.队列为空(N.next == N时);

2.队列不为空但尾结点为NULL

代码实现如下,

解释:A --- B---N

(N为当前的全局ofp消息的LQE )

ofp_alloc_sck_mssage_cb()

申请分配并初始化一个OFP_SCK_MSG_CB结构类型的ofp_message,

然后插入ofp消息队列(LQE类型的ofp_msgs)的前面;

NBB_INSERT_BEFORE()说明:

N为目前的全局ofp消息LQE;

E为新分配的ofp消息的LQE;

ASSERT宏只有DEBUG模式下有效,用于验证入参E的指针为null,N的指针不为null;

5.ofp_check_of_msg_list()

File:ofpsck2.c

依次处理ofp_msg,对符合条件的msg执行以下处理:

ofp_save_of_data();

ofp_rcv_of_data(ofp_message);

ofp_free_ofp_message(ofp_message);

6.ofp_rcv_of_data()

File:ofpdpa1.c

提取ofp_header(openflow头);

关闭Timer()定时器,其他一些处理;

判断header_type类型:

Hello;

Echo_request;

...

Flow_mod:

Ofp_rcv_flow_mod();

Group_mod:

ofp_rcv_group_mod();

...

Mulyipart_request;

...

其他自定义类型;

5.1 ofp_rcv_flow_mod()

赋值flow_mod header;

赋值flow_mod body(行动);

赋值match ,判断处理;(只有type,length ?)判断指令类型:

Goto_table;

...

Write_actions;

Ofp_fill_action_list();

...

构造ips;

将flow_mod ,match拷贝到ips;

判断各类偏移:

...

ofp_snd_dpa_ips(); //发送ips消息给dpa

5.2 ofp_fill_action_list()

一系列初始化;

判断action_type(组帧action_array): Output;

TTL_out;

...

PUSH_VLAN;

...

sptn_exp_action_type;

...

用action_array 组帧instruction_entry;*. ofp_rcv_group_mod()

赋值group_mod header;

赋值group_mod body(行动);

ofp_fill_bucket_action();

构造ips;

将group_mod 拷贝到ips;

ofp_snd_dpa_ips();

*. ofp_fill_bucket_action()

File: ofpdpa2.c

一系列初始化;

相关文档
最新文档