ovs 資料報的處理過程

2022-05-08 11:24:09 字數 2215 閱讀 8763

openvswitch的核心模組openvswitch.ko會在網絡卡上註冊乙個函式netdev_frame_hook,每當有網路包到達網絡卡的時候,這個函式就會被呼叫。

static struct sk_buff *netdev_frame_hook(struct sk_buff *skb)

呼叫port_receive即是呼叫netdev_port_receive

void netdev_port_receive(struct sk_buff *skb, struct ip_tunnel_info *tun_info)

在函式int ovs_vport_receive(struct vport *vport, struct sk_buff *skb, const struct ip_tunnel_info *tun_info)實現如下

int ovs_vport_receive(struct vport *vport, struct sk_buff *skb,

const struct ip_tunnel_info *tun_info)

ovs_dp_process_packet(skb, &key);

return 0;

}

在這個函式裡面,首先宣告了變數struct sw_flow_key key;可見這個key裡面是乙個大雜燴,資料報裡面的幾乎任何部分都可以作為key來查詢flow表

tunnel可以作為key

在物理層,in_port即包進入的網口的id

在mac層,源和目的mac位址

在ip層,源和目的ip位址

在傳輸層,源和目的埠號

ipv6

所以,要在核心態匹配流表,首先需要呼叫ovs_flow_key_extract,從包的正文中提取key的值。

接下來就是要呼叫ovs_dp_process_packet了。

void ovs_dp_process_packet(struct sk_buff *skb, struct sw_flow_key *key)

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);

}

這個函式首先在核心裡面的流表中查詢符合key的flow,也即ovs_flow_tbl_lookup_stats,如果找到了,很好說明使用者態的流表已經放入核心,則走fast path就可了。於是直接呼叫ovs_execute_actions,執行這個key對應的action。

如果不能找到,則只好呼叫ovs_dp_upcall,讓使用者態去查詢流表。會呼叫static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb, const struct sw_flow_key *key, const struct dp_upcall_info *upcall_info)

它會呼叫err = genlmsg_unicast(ovs_dp_get_net(dp), user_skb, upcall_info->portid);通過netlink將訊息傳送給使用者態。在使用者態,有執行緒監聽訊息,一旦有訊息,則觸發udpif_upcall_handler。

從device接收packet交給事先註冊的event handler進行處理

接收packet後識別是否是unknown packet,是則交由upcall處理

vswitchd對unknown packet找到flow rule進行處理

將flow rule傳送給datapath

也就是說ovs處理資料報首先會看有沒有事先訂閱的事件,如果有直接轉交給該對應的處理函式,然後匹配流表,最後按照傳統網路協議棧進行處理。

資料預處理過程

概括起來,統計資料預處理的過程包括資料審查 資料清理 資料轉換和資料驗證四大步驟。一 資料審查 該步驟檢查資料的數量 記錄數 是否滿足分析的最低要求,字段值的內容是否與調查要求一致,是否全面 還包括利用描述性統計分析,檢查各個欄位的字段型別 字段值的最大值 最小值 平均數 中位數等,記錄個數 缺失值...

USB host處理過程

在usbh core.c中有乙個函式usbh process 這個函式很重要,main 函式每迴圈一次,它就執行一次,它處理所有usb核心狀態的變化,typedef enum host state 根據這個當前狀態 phost gstate 處於以上哪個狀態的不同,做出不同的處理過程。其中最重要的要...

Hadoop map reduce處理過程

1 在hadoop中,每個mapreduce任務都被初始化為乙個job。每個job又可以分成兩個階段 map階段和reduce階段 map函式接受乙個形式的輸入,然後同樣產生乙個形式的中間輸出,hadoop會負責將所有具有相同結果中間key值的value集合到一起傳給reduce函式,reduce函...