OVS原始碼結構分析

2021-08-03 14:24:08 字數 2868 閱讀 7173

下圖是ovs(open vswitch)系統層面的邏輯圖。

其中datapath是處於系統的核心層(kernel space),我們可以將datapath理解為乙個網橋(linux bridge)。處於使用者態(user space)的主要是openvswitch client、openflow client、ofproto library、netdev等等。

如上圖中,ofproto即openflow protocol的縮寫,它是乙個openflow的庫,ovs的客戶端(如ovs-vswitchd、ovs-openflowd)就是通過呼叫這個庫來操作ovs的控制中心。

netdev則是裝置抽象的api,它是由linux核心提供的,通過netdev這個api,可以直接與核心層的網路裝置通訊。

同時flow table也處在核心層中,這樣當datapath依照flow table的規則處理資料流時就可以直接將操作傳送給核心層的網路裝置進行操作,這樣的傳輸效能是十分強悍的。

openvwitch進行資料流交換的主要邏輯都是在ovs-vswitchd和openvswitch.ko裡面實現的。

ovs-vswitchd會從ovsdb-server讀取配置,然後呼叫ofproto層進行虛擬網絡卡的建立或者流表的操作。

ofproto是乙個庫,實現了軟體的交換機和對流表的操作。

netdev層抽象了連線到虛擬交換機上的網路裝置。

dpif層實現了對於流表的操作。

對於ovs來講,有以下幾種網絡卡型別

1). netdev: 通用網絡卡裝置 eth0 veth

接收: 乙個netdev在l2收到報文後回直接通過ovs接收函式處理,不會再走傳統核心協議棧.

傳送: ovs中的一條流指定從該netdev發出的時候就通過該網絡卡裝置傳送

2). internal: 一種虛擬網絡卡裝置

接收: 當從系統發出的報文路由查詢通過該裝置傳送的時候,就進入ovs接收處理函式

傳送: ovs中的一條流制定從該internal裝置發出的時候,該報文被重新注入核心協議棧

3). gre device: gre裝置. 不管使用者態建立多少個gre tunnel, 在核心態有且只有乙個gre裝置

接收: 當系統收到gre報文後,傳遞給l4層解析gre header, 然後傳遞給ovs接收處理函式

傳送: ovs中的一條流制定從該gre裝置傳送, 報文會根據流表規則加上gre頭以及外層包裹ip,查詢路由傳送

1.通過ovs-vsctl 建立網橋,將建立引數傳送給ovsdb-server,ovsdb-server將資料寫入資料庫。

2.ovs-vswitchd從ovsdb-server中讀取建立網橋的資訊,在ovs-vswithd層建立乙個bridge結構體資訊

3.然後將brdige資訊應用到ofproto層,在ofproto層通過ofproto_create建立網橋,ofproto_create通過使用者指定的網橋型別查詢包含該型別的ofproto provider(目前只支援乙個ofproto provider)。

查詢後建立ofproto結構體(該結構體也表示乙個bridge),並通過ofproto provider 建構函式建立ofproto provider的私有資訊。

4.ofproto-dpif 層,建構函式完成如下:ofproto-dpif會為相同型別的ofproto建立乙個backer結構體,所有型別的ofproto的backer使用全域性列表表示。ofproto-dpif通過backer關聯dpif。同時backer關聯upcall處理執行緒

netdev沒有實現upcall註冊函式,所以對應的backer執行緒實際上不做任何處理,但依然會有該處理執行緒。netlink 通過backer啟動的執行緒實現處理upcall資料報的處理。

vswitchd是ovs中最核心的元件,openflow的相關邏輯都在vswitchd裡實現,一般來說ovs分為datapath, vswitchd以及ovsdb三個部分,datapath一般是和具體是資料面平台相關的,比如白盒交換機,或者linux核心等。ovsdb用於儲存vswitch本身的配置資訊,比如埠,拓撲,規則等。vswitchd本身是分層的結構,最上層daemon主要用於和ovsdb通訊,做配置的下發和更新等,中間層ofproto,用於和openflow控制器通訊,以及通過ofproto_class暴露了ofproto provider介面,不同平台上openflow的具體實現就通過ofproto_class統一。

open vswitch實現了兩種dpif。lib/dpif-netlink.c 特定linux實現的dpif,該dpif與open vswith實現的核心模組通訊。核心模組執行所有的交換工作,將核心態不匹配的資料報傳送到使用者態。dpif封裝呼叫核心介面。lib/dpif-netdev.c 是一種通用的 dpif 實現。該dpif就是open vswith在使用者態的實現。資料報的交換不會進入核心。struct dpif_class是datapath inte***ce實現的工廠介面類,用於和實際的datapath, e.g. openvswitch.ko, 或者userspace datapath互動。目前已有的兩個dpif的實現是dpif-netlink和dpif-netdev,前者是基於核心datapath的dpif實現,後者基於使用者態datapath。**可以在lib/dpif-netlink.c以及lib/dpif-netdev.c裡找到。

shared ptr原始碼結構分析

shared ptr是智慧型指標的一種,相較於unique ptr,引入了引用計數的概念,可以支援多個智慧型指標指向同一資源,由引用計數的增減來描述資源的共享或記憶體釋放,引用計數降為0的時候,資源所占用的記憶體空間會被釋放。觀察其原始碼結構,可以發現shared ptr是乙個模板派生類,ptr b...

Tachyon原始碼結構分析(三)

tachyon目前剛剛發布了新版本0.6.1,最新的開發版仍為0.7.0 snapshot。本篇我們仍然選擇tachyon 0.6.0版本保持與前兩篇同步。master模組 master模組是tachyon的核心模組,負責管理和協調worker與client的正常工作。master儲存了tachyo...

Druid原始碼分析 整體結構

版本 0.9.1 專案位址 整體結構 api 核心介面層,整個 庫的最底層 common 公共方法,依賴api examples 例項 indexing hadoop 基於mr的索引服務 indexing service 索引服務 processing 資料處理模組,包括查詢 寫入 切分 傳輸等 s...