思科VPP原始碼分析(dpo機制原始碼分析)

2021-07-27 14:24:10 字數 2243 閱讀 3207

vpp的dpo機制跟路由緊密結合在一起。路由表查詢(ip4_lookup)的最後結果是乙個load_balance_t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。

dpo標準型別有:

dpo_drop,

dpo_ip_null,

dpo_punt,

dpo_load_balance,

dpo_adjacency,

dpo_adjacency_incomplete,

dpo_adjacency_midchain,

dpo_adjacency_glean,

dpo_receive,

dpo_lookup,

dpo_lisp_cp,

dpo_classify,

dpo_mpls_label,

dpo_last,

可以理解為每個型別都可以有自己的私有資料(可能有也可能沒有),它們都繼承自標準的dpo_id_t結構。

比如dpo_load_balance有自己的私有資料結構:load_balance_t。可以通過dpo_id_t中的dpoi_index來索引到具體的例項。

load_balance_t比較特殊,既是路由的查詢最終結果,也是乙個dpo。好繞。在lb外掛程式中利用了該特性,處理完自己的修改資料報的邏輯後,又把資料報丟給了load_balance_t,讓修改後的資料報能正確的進行下一步處理。

typedef struct dpo_id_t_  __attribute__ ((aligned(sizeof(u64)))) dpo_id_t;
dpo_drop

將資料報送往」***-drop」 node。簡單處理後再傳給」error-drop」 node,完成最後資料報丟棄**工作。

dpo_ip_null

將資料報送往」ipx-null」 node。該node將決定是否針對資料報回icmp不可達包或者icmp禁止包。

dpo_punt

這兩個函式並不是字面意義上的加鎖/解鎖操作。上文提到,某些dpo型別有自己的私有資料,這對函式即是增加私有資料結構的引用計數用,如果dpo型別沒有自己的私有資料,則這對函式為空。其內部具體實現,呼叫的是dpo型別註冊時提供的函式指標。

void dpo_lock(dpo_id_t *dpo);

void dpo_unlock(dpo_id_t *dpo);

dpo的設定操作

void

dpo_set (dpo_id_t *dpo,

dpo_type_t type,

dpo_proto_t proto,

index_t index)

}//增加引用計數

dpo_lock(dpo);

//減少引用計數

dpo_unlock(&tmp);

}

假設資料報到了dpo中(child),處理完後我希望資料報交給下乙個dpo(parent)來處理,那麼該函式就派上用場了。本dpo對應的node中增加乙個slot,指向下乙個dpo(parent)對應的node。slot的索引儲存在本dpo(child)的dpoi_next_node中。

void

dpo_stack (dpo_type_t child_type,

dpo_proto_t child_proto,

dpo_id_t *dpo,

const dpo_id_t *parent)

dpo_edges是乙個四重指標,看起來很繞很複雜,它其實就是乙個快取功能,記錄了dpo(child)對應的node的指向下一跳dpo(parent)對應node的slot索引號。如果沒有則新建乙個。

static u32

dpo_get_next_node (dpo_type_t child_type,

dpo_proto_t child_proto,

const dpo_id_t *parent_dpo)

else

pp++;

}cc++;}}

return (dpo_edges[child_type][child_proto][parent_type][parent_proto]);

}

vpp原始碼之Makefile分析(編譯除錯)

下面是vpp的命令 root localhost vpp 18.07 make make targets install dep install software dependencies wipe wipe all products of debug build wipe release wipe...

4 VPP原始碼分析(graph node 2

每個process結點是由jump機制構成的乙個協程,協程主要用於等待 處理事件。使用longjmp setjmp的輕量級多工協程,由應用程序自行進行排程,不受作業系統排程機制的影響,上下文切換只損耗呼叫longjmp setjmp的時間。協程中執行的函式類似於執行緒函式,區別在於協程函式can b...

HiveHA機制原始碼分析

hive讓大資料飛了起來,不再需要專人寫mr。平常我們都可以用基於thrift的任意語言來呼叫hive。不過愛恨各半,hive的thrift不穩定也是出了名的。很容易就出問題,讓人無計可施。唯一的辦法就是不斷kill,不斷restart。當然,我們可以用haproxy來解決這個問題,關鍵,hapro...