Datapatch 网桥
ovs和内核态如何打交道?
在linux内核代码中net/core.c中有netdev_rx_handler_register,解释如下:
* Register a receive handler for a device. This handler will then be
* called from __netif_receive_skb. A negative errno code is returned
* on a failure.
在netdev_create中调用netdev_rx_handler_register来注册设备收到报文的回调函数
err = netdev_rx_handler_register(netdev_vport->dev, netdev_frame_hook,
vport);
其中 vport是后面查询设备对应的vport保留使用的(ovs_netdev_get_vport)。
在中断收到报文 后内核调用netif_receive_skb,然后__netif_receive_skb,这个函数中调用了注册的 netdev_frame_hook
在处理报文时,如何保证ovs处理的报文不用linux内核再次处理?如果被某个网口接收报文后可能会查询arp表项,或者路由(此部分内容也需要强化)
rx_handler = rcu_dereference(skb->dev->rx_handler);
if (rx_handler) {
if (pt_prev) {
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = NULL;
}
switch (rx_handler(&skb)) {
case RX_HANDLER_CONSUMED:
ret = NET_RX_SUCCESS;
goto out;
case RX_HANDLER_ANOTHER:
goto another_round;
case RX_HANDLER_EXACT:
deliver_exact = true;
case RX_HANDLER_PASS:
break;
default:
BUG();
}
}
netdev_frame_hook-> netdev_port_receive ->ovs_skb_postpush_rcsum(?)-> ovs_vport_receive(数据统计变化) -> ovs_dp_process_received_packet
struct flow_table {
struct table_instance __rcu *ti;
struct mask_cache_entry __percpu *mask_cache;
struct mask_array __rcu *mask_array;
unsigned long last_rehash;
unsigned int count;
};
flow_table只包含 哈希桶和mask_list,这些怎么代码流表的内容?匹配项?actions?
这个flow_table代码了一个表,如table=0?
datapath/vport.c ovs_vport_receive用来接收数据包
一、根据skb数据包信息提取相关信息封闭为key值
通过ovs_flow_extract,将skb中的mac,ip,tcp层的地址信息复制到key
二、根据key值和skb数据包查找对应的流表
流表查询ovs_flow_tbl_lookup_stats
三、根据流表做相应的action操作(若没有匹配则调用函数往用户空间传递数据包??)
(struct ovs_skb_cb *)(skb)->cb
mask有什么用?
用户空间和内核空间通过netlinks来通信,如何通信?