首先每個packet都會被datapath/vport.c : line 481的ovs_vport_receive函式接受。這個是第一步。
int
ovs_vport_receive
(struct vport *vport,
struct sk_buff *skb,
const
struct ip_tunnel_info *tun_info)
ovs_skb_init_inner_protocol
(skb)
;skb_clear_ovs_gso_cb
(skb)
;/* extract flow from 'skb' into 'key'. */
error =
ovs_flow_key_extract
(tun_info, skb,
&key);if
(unlikely
(error)
)ovs_dp_process_packet
(skb,
&key)
;// 處理包。。這是重點。
return0;
}
然後由datapath/datapath.c中的ovs_dp_process_packet函式處理:
void
ovs_dp_process_packet
(struct sk_buff *skb,
struct sw_flow_key *key)
// 如果匹配到,則執行action
ovs_flow_stats_update
(flow, key->tp.flags, skb)
; sf_acts =
rcu_dereference
(flow->sf_acts)
;ovs_execute_actions
(dp, skb, sf_acts, key)
; stats_counter =
&stats->n_hit;
out:
/* update datapath statistics. */
u64_stats_update_begin
(&stats->syncp);(
*stats_counter)++;
stats->n_mask_hit +
= n_mask_hit;
u64_stats_update_end
(&stats->syncp)
;}
如果流表匹配成功,則執行流表相對應的action。函式是datapath/actions中的ovs_execute_actions函式對資料報執行action。**如下:
int
ovs_execute_actions
(struct datapath *dp,
struct sk_buff *skb,
const
struct sw_flow_actions *acts,
struct sw_flow_key *key)
err =
do_execute_actions
(dp, skb, key,
acts->actions, acts->actions_len);if
(level ==1)
process_deferred_actions
(dp)
;out:
__this_cpu_dec
(exec_actions_level)
;return err;
}
在上面的函式中有個do_execute_actions函式,裡面是針對ovs_action_attr_*來執行相對應的action函式。最終如果從某個埠**出去,則會執行do_output函式,通過呼叫datapath/vport.c/ovs_vport_send函式進行埠**。這就是乙個資料報如果在datapath中匹配到流表的大致流程。
如果沒有匹配成功,則執行upcall,函式是datapath/ovs_dp_upcall函式,**如下:
int
ovs_dp_upcall
(struct datapath *dp,
struct sk_buff *skb,
const
struct sw_flow_key *key,
const
struct dp_upcall_info *upcall_info,
uint32_t cutlen)if(
!skb_is_gso
(skb)
)// 如果不是gso資料報,則直接傳送到使用者佇列,這個在之前有說明
err =
queue_userspace_packet
(dp, skb, key, upcall_info, cutlen)
;else
// 如果是gso資料報,則先處理gso協議,然後繼續傳送到使用者佇列
// 函式裡最終會把資料報傳送到上面的函式中 queue_userspace_packet
err =
queue_gso_packets
(dp, skb, key, upcall_info, cutlen);if
(err)
goto err;
return0;
err:
stats =
this_cpu_ptr
(dp->stats_percpu)
;u64_stats_update_begin
(&stats->syncp)
; stats->n_lost++
;u64_stats_update_end
(&stats->syncp)
;return err;
}
瀑布流處理
瀑布流就是用來解決展示時出現空白頁面的問題 這裡可以再前端頁面直接寫 2.js裡物件中,this 物件 再函式中,this window 注釋都寫在 裡,簡單明瞭 前端頁面 105西 modelsfrom django.db import models class img models.model ...
節點流和處理流(2)
注意事項細節說明 讀寫要一致 要求實現序列化和反序列化物件,需要實現 serializable 序列化類中建議新增 serialversionuid,為了提高版本的相容性 序列化物件時,預設將裡面所有屬性都進行序列化,但除了static 或 transient 修飾的成員 序列化物件時,要求裡面屬性...
流緩衝處理通訊
開源中國參考 為了方便描述,這裡只分析一下同步實現,非同步實現方式和同步方式的流程是一致的,只是在函式呼叫的方式上有些區別.分析清楚了同步方式,在看非同步實現,也很容易.這個http範例實現了客戶端向服務端請求檔案內容的功能,客戶端給出乙個檔名稱,服務端在本地尋找檔案,並將檔案內容 文字檔案 返回給...