当前位置:文档之家› Openflow 消息处理流程笔记

Openflow 消息处理流程笔记

何腾飞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.c1.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消息给dpa5.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一系列初始化;判断action_type(组帧action_array):Output;TTL_out;...PUSH_VLAN;...sptn_exp_action_type;...用action_array 组帧bucket_entry;7.ofp_snd_dpa_ips()File:ofpdpa.c调用N-base接口函数NBB_SEND_IPS();NBB_SEND_IPS(haf_mj_cb->partner_data_pid, USER_TO_DPA_Q, ips);二、Dpa处理流程简介:接收OFP消息,发送给TNE。

前期处理流程均类似,参考上面的ofp处理流程。

dpa_create_proc();dpa_receive_proc();Case USER_TO_DPA_Q: dpa_rcv_dpa_ips();1.dpa_rcv_dpa_ips()File: dparecv.c判断ips消息类型:Dpa_register;...Flow_mod:dpa_rcv_flow_mod();Group_mod;dpa_rcv_group_mod();...2.dpa_rcv_flow_mod()File: dpa_flow_mod_recv.cdpa_save_match();判断flow_mand 指令类型:ADD(添加新的流表项):flow_entry_cb非空判断,dpa_send_tne_flow_mod();DELETE:flow_entry_cb中command修改为del,dpa_send_tne_flow_mod();MODIFY:flow_entry_cb非空判断,dpa_send_tne_flow_mod();3. dpa_send_tne_flow_mod()通过flow_entry_cb组帧flow_mod_array[];组帧flow_mod_ips;判断send_data_ind_type 类型;发送消息dpa_snd_dpa_ips();*. dpa_rcv_group_mod()File: dpa_flow_mod_recv.c判断group_mand 指令类型:ADD(添加新的流表项):group_entry_cb非空判断,dpa_send_tne_group_mod();DELETE:group_entry_cb中command修改为del,dpa_send_tne_group_mod();MODIFY:group_entry_cb非空判断,dpa_send_tne_group_mod();*. dpa_send_tne_group_mod()通过group_entry_cb组帧group_mod_array[];组帧group_mod_ips;判断send_data_ind_type 类型;发送消息dpa_snd_dpa_ips();4. dpa_snd_dpa_ips()File: dparecv.c调用N-base接口函数NBB_SEND_IPS();三、TNE处理流程简介:接收DPA消息,发送给?。

前期处理流程均类似,参考上面的ofp处理流程。

Tne_create_proc();tne_receive_proc();判断queue_id类型:...Case DPA_TO_USER_Q : tne_rcv_dpa_ips();...Case SCK_TO_APPL_Q : tne_rcv_sck_ips();...Case USER_TO_DCI_Q : tne_rcv_dci_ips();1.tne_rcv_dpa_ips()判断ips消息类型:Dpa_register;...Flow_mod:tne_rcv_dpa_flow_mod();Group_mod:tne_rcv_dpa_group_mod();...2.tne_rcv_dpa_flow_mod()file: tnedpa1.cParms : ips判断table_id类型:9 : tne_assemble_injected_flow_table()10 (V ALN_FLOW_TABLE):tne_assemble_vlan_flow_table();//流表编码13 : tne_assemble_mpls_l2_port_flow_table()...tne_save_config();//?tne_send_set_rq();//?3. tne_assemble_vlan_flow_table()流表编码函数。

...tne_code_key_vlan_table();//Match field编码判断flow_mand指令类型:ADD / MODIFY :tne_code_goto_table();// 流表动作goto编码。

tne_code_apply_action();// 流表动作apply编码。

...3.1 tne_code_apply_action()判断actiontype行动类型:Output;Group;Pop_VLAN;...*. tne_rcv_dpa_group_mod() file: tnedpa1.cParms : ipsFunc: 对group按类型编码。

判断group_id类型:9 :Interface: tne_assemble_mpls_interface_group()L2 VPN : tne_assemble_mpls_l2_vpn_label_group()Tunnel ;SWAP;10 :L2 Tag: tne_assemble_mpls_l2_tag_group()Fast : tne_assemble_mpls_fast_failover_group()11: tne_assemble_l2_unfiltered_group()0: tne_assemble_l2_interface_group()tne_save_config();//?tne_send_set_rq(..., TNE_SET_SDN_CFG,...);//?*. tne_assemble_mpls_interface_group()File: tnegroup.cFunc: group编码...判断group_mand指令类型,设置Pcur;判断group_mand指令类型:ADD / MODIFY :基本配置pcur;bucket配置;tne_code_bucket_action(); //group动作bucket编码。

相关主题