openflow协议以及协议的代码实现

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

openflow openflow协议
openflow协议
•of 协议支持三种消息类型:controller-to-switch,asynchronous(异步)和symmetric(对称),每一类消息又有多个子消息类型。

•controller-to-switch 消息由控制器发起,用来管理或获取switch 状态;•asynchronous 消息由switch 发起,用来将网络事件或交换机状态变化更新到控制器;•symmetric 消息可由交换机或控制器发起。

controller-to-switch
•Features
•在建立传输层安全会话(Transport Layer Security Session)的时候,控制器发送feature请求消息给交换机,交换机需要应答自身支持的功能。

•Configuration
•控制器设置或查询交换机上的配置信息。

交换机仅需要应答查询消息。

•Modify-state
•控制器管理交换机流表项和端口状态等。

•Read-state
•控制器向交换机请求一些诸如流、网包等统计信息。

•Send-packet
•控制器通过交换机指定端口发出网包。

•Barrier
•控制器确保消息依赖满足,或接收完成操作的通知
asynchronous
•Packet-in
•交换机收到一个网包,在流表中没有匹配项,则发送Packet-in 消息给控制器。

如果交换机缓存足够多,网包被临时放在缓存中,网包的部分内容(默认128 字节)和在交换机缓存中的的序号也一同发给控制器;如果交换机缓存不足以存储网包,则将整个网包作为消息的附带内容发给控制器。

•Flow-removed
•交换机中的流表项因为超时或修改等原因被删除掉,会触发Flow-removed 消息。

•Port-status
•交换机端口状态发生变化时(例如down 掉),触发Port-status 消息。

symmetric
•Hello
•交换机和控制器用来建立连接。

•Echo()
•交换机和控制器均可以向对方发出Echo 消息,接收者则需要回复Echo reply。

该消息用来测量延迟、是否连接保持等。

•Vendor
•交换机提供额外的附加信息功能。

为未来版本预留。

ofpt 协议头
•struct ofp_header {
•uint8_t version; /* 协议版本*/
•uint8_t type; /* 消息类型*/
•uint16_t length; /* 消息长度*/
•uint32_t xid;/* 该报文的ID,要求返回的报文ID相同,以使它们配对*/
•};
代码的大体结构
•涉及报文传输与生成的mian函数•udatapath.c 负责datapat •controller.c 负责controller •secchan.c 负责安全通道•dpctl.c 负责管理dp
接受报文后的处理
•secchan负责连接controller和udatapath,controller和switch的数据交互要经过secchan。

•如果网络的拓扑结构发生变化,导致IP地址的变化,secchan调用ofp-discover重新连接IP变化的peer
•dpctl.c可以发出任何协议包,所以它可以用来修改switch的一些状态,比如生成树什么的。

echo只能由dpctl发出。

setting的参数由它设置。

controller协议报文相关
•controller的大体流程
调用do_switching(struct switch_ *sw)/*返回发出的报文总数、读取报文、分析header、处理报文、并且维护连接。

调用lswitch_process_packet(sw-
>lswitch, sw->rconn, msg)
读取报文,根据报文的类型处理报文
•type为:OFPT_ECHO_REQUEST
调用:process_echo_request(…,…,*rp)调用queue_tx()排队,最多排10对
调用make_echo_reply()创建一个
echo_reply的消息,这个消息跟rp中的消息匹配
•OFPT_FEATURES_REPLY
调用:process_switch_features 交换机返回自身状态datapath_ID、能力
调用:process_phy_port了解交换机的port状态
stp:listening、learning、forwarding、blocking、disable
non-stp:forwarding
•OFPT_PACKET_IN
调用函数process_packet_in 根据报文的长度判断报文打给controller的原因:流表项指定发给controller(max-len);查不到匹配流表项(miss-send-len字节)。

源端口是保留的广播地址、stp显示源端口不能接受节点、源端口和目的端口是同一个端口时,drop it。

若成功,发出,setup new flow
交换机有无缓存报文
不setup flow 只能指定一次
•报文为:OFPT_PORT_STATUS 调用process_port_status
调用process_phy_port 修改port的状态port为stp时:P_LISTENING、
P_LEARNING、P_FORWARDING、
P_BLOCKING、P_DISABLED。

非stp:P_FORWARDING
报文头部:OFPT_STATS_REPLY(流、网
包等统计信息的反馈)
调用process_stats_reply(读取交换机的信息,比如最后reply的时间)
调用process_flow_stats(根据读取的信
息判断流表是否应该删除)
调用make_openflow以及rconn_send发出type为(OFPT_FLOW_MOD或者OFPFC_DELETE_STRICT的报文)
报文头部为:OFPT_FLOW_REMOVED NUll
udatapath.c •udatapath.c大体流程
•调用dp-run()
调用netdev-recv 接收报文,放入buffer中调用fed-port-input (接受报文,遍历流表寻找匹配的流表项,没有就发给controller)调用run-flow-through-table(遍历流表,并且处理报文)
调用dp-output-control 负责组建ofp-packet-in 报文、确定发多少数据给controller(根据reason和switch的缓存能力)
调用remote-run(做一些保持连接的处理,并且接受remote发来的报文并且处理它们,最高迭代50次,以防止其他进程饿死。

)调用fwd-controller-input读取报文,分析报文头部,判断是否是来自controller的报文,并且处理来自controller的报文
•报文头部:OFPT_BARRIER_REQUEST 调用recv_barrier_request
先make_barrier_reply
后send_openflow_buffer分析接受数据,判断Send back to the sender或者是Broadcast to all remotes
•OFPT_FEATURES_REQUEST
调用recv_features_request
调用dp_send_features_reply
先make_openflow_reply
后将sw的状态放入报文datapath_id、n_tables 、n_buffers、capabilities、actions
send_openflow_buffer
报文头部:OFPT_GET_CONFIG_REQUEST 调用recv_get_config_request
先make_openflow_reply
后flags、miss_send_len
•OFPT_SET_CONFIG
调用recv_set_config
flags、miss_send_len的赋值
•OFPT_PACKET_OUT
判断通过
调用execute_actions
判断通过
调用do_output
判断目标
调用dp_output_port
调用dp_output_control
•OFPT_FLOW_MOD
调用recv_flow
OFPFC_ADD add_flow
OFPFC_MODIFY || OFPFC_MODIFY_STRICT mod_flow
OFPFC_DELETE 先flow_extract_match 后chain_delete
OFPFC_DELETE_STRICT 先flow_extract_match后判断priority = key.wildcards 再chain_delete
•OFPT_PORT_MOD
•OFPT_STATS_REQUEST
•OFPT_ECHO_REQUEST
•OFPT_ECHO_REPLY
•OFPT_QUEUE_GET_CONFIG_REQUEST •OFPT_VENDOR
•报文type都是以上类型
•调用dp-send-error-msg
调用make-openflow-reply(ofpt-error)
报文的产生
secchan
•vconn-openflow 读取ofp-version
•调用relay-run
调用rconn-send
调用try-send
调用vconn-send
调用vconn-connect
调用vsc-send-hello发出hello报文(调用vcs-recv-hello接受hello报文)。

相关文档
最新文档