structdp_netdev_rxq的成员变量queue_id表示该队列id。 5) netdev层 5.1 由于struct netdev结构内容是struct netdev_dpdk结构的一个up成员变量。所以通过struct netdev地址可以cast到struct netdev_dpdk结构内容。 5.2 通过struct detdev_dpdk结构内容的成员指针变量netdev_class和dpdk类型网卡交互。 5.3 由于struct ...
2、收包处理 通过vport注册的回调函数netdev_frame_hook()->netdev_frame_hook()-> netdev_port_receive()->ovs_vport_receive()处理接收报文,ovs_flow_key_extract()函数生成flow的key内容用以接下来进行流表匹配,最后调用ovs_dp_process_packet()函数进入真正的ovs数据包处理,代码流程如下: 3、流表哈希桶...
rtnl_link_unregister(&internal_dev_link_ops); return err; }1 2 3 4 5 6 static struct vport_ops ovs_internal_vport_ops = { .type = OVS_VPORT_TYPE_INTERNAL, .create = internal_dev_create, .destroy = internal_dev_destroy, .send = internal_dev_recv, };1...
vport->dev->type != ARPHRD_ETHER || ovs_is_internal_dev(vport->dev)) { err = -EINVAL; goto error_put; } rtnl_lock(); printk("vport-netdev.c:ovs_netdev_link-->create\n"); // ??? err = netdev_master_upper_dev_link(vport->dev, get_dpdev(vport->dp), NULL, NULL);...
net_prio 控制器会直接在 sock 上设置 一些属性,这样后面在tc qdisc 上就能根据这些 tags 过滤socket 和对流量进行分类。 net_prio 控制器也是类似的,它的功能是给包设置优先级(priority),后面也是被 tc 使用。 而在v2 中,每个sock 是关联到创建这个 sock 时所在的 cgroup, 在网络层直接 match cgroup(而不是...
流表由dp_netdev_flow数据结构定义(不要与struct流混淆),并存储到名为flow_table的hash表中。存储在流中的一些信息如下 Rule Actions Statistics Batch (queue for processing the packets that matched this flow) Thread ID (owning this flow) Reference count ...
非VXLAN的收发包调用栈 netdev_frame_hook() netdev_port_receive() ovs_vport_receive() ovs_dp_process_packet() (在查表失败后,对于带gso标记的大包,会分片进行upcall) ovs_dp_upcall() Open vSwitch中的datapath flow匹配过程 看OVS2.7的datapath表项匹配是一件很蛋疼的事情 数据结构看不懂 匹配算法经...
ti.type=UDP_TUNNEL_TYPE_GENEVE; ti.sa_family=sa_family; ti.port=inet_sk(sk)->inet_sport; if(dev->netdev_ops->ndo_udp_tunnel_add) dev->netdev_ops->ndo_udp_tunnel_add(dev,&ti); #endif } rcu_read_unlock(); Expand All@@ -452,6 +460,14 @@ static void geneve_notify_del_rx...