Hi.
在OVS中,user space 與 kernel space都是透過netlink來進行溝通的,kernel中,有定義了幾個netlink message的handler,你可以在datapath/datapath.c(2.3)中找到
2040 static struct genl_family *dp_genl_families[] = {
2041 &dp_datapath_genl_family,
2042 &dp_vport_genl_family,
2043 &dp_flow_genl_family,
2044 &dp_packet_genl_family,
2045 };
這邊可以觀察到至少有四大類型的netlink type,每種內還有再細分。
針對我們想要觀察的flow相關的netlink message,在查詢可以看到下列的程式碼
1231 static struct genl_ops dp_flow_genl_ops[] = {
1232 { .cmd = OVS_FLOW_CMD_NEW,
1233 .flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN privilege. */
1234 .policy = flow_policy,
1235 .doit = ovs_flow_cmd_new
1236 },
這邊可以看到,若netlink的type是OVS_FLOW_CMD_NEW,就會執行對應的event handler ovs_flow_cmd_new來將flow給寫入到kernel space中。
因此若是想要知道userspace是如何將封包寫入kernel space,我建議你可以針對"OVS_FLOW_CMD_NEW" 這個關鍵字去搜尋ž,應該可以找到你想要知道的東西
謝謝