Openflow 消息处理流程笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
一系列初始化;