OVS datapath包處理流程(二十)

2021-10-06 20:07:52 字數 2944 閱讀 6267

首先每個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範例實現了客戶端向服務端請求檔案內容的功能,客戶端給出乙個檔名稱,服務端在本地尋找檔案,並將檔案內容 文字檔案 返回給...