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...