Lines Matching refs:dp
127 static int queue_gso_packets(struct datapath *dp, struct sk_buff *,
131 static int queue_userspace_packet(struct datapath *dp, struct sk_buff *,
141 const char *ovs_dp_name(const struct datapath *dp) in ovs_dp_name() argument
143 struct vport *vport = ovs_vport_ovsl_rcu(dp, OVSP_LOCAL); in ovs_dp_name()
147 static int get_dpifindex(const struct datapath *dp) in get_dpifindex() argument
154 local = ovs_vport_rcu(dp, OVSP_LOCAL); in get_dpifindex()
167 struct datapath *dp = container_of(rcu, struct datapath, rcu); in destroy_dp_rcu() local
169 ovs_flow_tbl_destroy(&dp->table); in destroy_dp_rcu()
170 free_percpu(dp->stats_percpu); in destroy_dp_rcu()
171 kfree(dp->ports); in destroy_dp_rcu()
172 ovs_meters_exit(dp); in destroy_dp_rcu()
173 kfree(rcu_dereference_raw(dp->upcall_portids)); in destroy_dp_rcu()
174 kfree(dp); in destroy_dp_rcu()
177 static struct hlist_head *vport_hash_bucket(const struct datapath *dp, in vport_hash_bucket() argument
180 return &dp->ports[port_no & (DP_VPORT_HASH_BUCKETS - 1)]; in vport_hash_bucket()
184 struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no) in ovs_lookup_vport() argument
189 head = vport_hash_bucket(dp, port_no); in ovs_lookup_vport()
205 struct datapath *dp = parms->dp; in new_vport() local
206 struct hlist_head *head = vport_hash_bucket(dp, vport->port_no); in new_vport()
249 struct datapath *dp = p->dp; in ovs_dp_process_packet() local
259 stats = this_cpu_ptr(dp->stats_percpu); in ovs_dp_process_packet()
262 flow = ovs_flow_tbl_lookup_stats(&dp->table, key, skb_get_hash(skb), in ovs_dp_process_packet()
272 else if (dp->user_features & OVS_DP_F_DISPATCH_UPCALL_PER_CPU) in ovs_dp_process_packet()
274 ovs_dp_get_upcall_portid(dp, smp_processor_id()); in ovs_dp_process_packet()
279 error = ovs_dp_upcall(dp, skb, key, &upcall, 0); in ovs_dp_process_packet()
309 error = ovs_execute_actions(dp, skb, sf_acts, key); in ovs_dp_process_packet()
312 ovs_dp_name(dp), error); in ovs_dp_process_packet()
329 int ovs_dp_upcall(struct datapath *dp, struct sk_buff *skb, in ovs_dp_upcall() argument
338 trace_ovs_dp_upcall(dp, skb, key, upcall_info); in ovs_dp_upcall()
346 err = queue_userspace_packet(dp, skb, key, upcall_info, cutlen); in ovs_dp_upcall()
348 err = queue_gso_packets(dp, skb, key, upcall_info, cutlen); in ovs_dp_upcall()
357 stats = this_cpu_ptr(dp->stats_percpu); in ovs_dp_upcall()
366 static int queue_gso_packets(struct datapath *dp, struct sk_buff *skb, in queue_gso_packets() argument
397 err = queue_userspace_packet(dp, skb, key, upcall_info, cutlen); in queue_gso_packets()
441 static void pad_packet(struct datapath *dp, struct sk_buff *skb) in pad_packet() argument
443 if (!(dp->user_features & OVS_DP_F_UNALIGNED)) { in pad_packet()
451 static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb, in queue_userspace_packet() argument
465 dp_ifindex = get_dpifindex(dp); in queue_userspace_packet()
495 if (dp->user_features & OVS_DP_F_UNALIGNED) in queue_userspace_packet()
595 pad_packet(dp, user_skb); in queue_userspace_packet()
599 err = genlmsg_unicast(ovs_dp_get_net(dp), user_skb, upcall_info->portid); in queue_userspace_packet()
619 struct datapath *dp; in ovs_packet_cmd_execute() local
680 dp = get_dp_rcu(net, ovs_header->dp_ifindex); in ovs_packet_cmd_execute()
682 if (!dp) in ovs_packet_cmd_execute()
685 input_vport = ovs_vport_rcu(dp, flow->key.phy.in_port); in ovs_packet_cmd_execute()
687 input_vport = ovs_vport_rcu(dp, OVSP_LOCAL); in ovs_packet_cmd_execute()
700 err = ovs_execute_actions(dp, packet, sf_acts, &flow->key); in ovs_packet_cmd_execute()
752 static void get_dp_stats(const struct datapath *dp, struct ovs_dp_stats *stats, in get_dp_stats() argument
759 stats->n_flows = ovs_flow_tbl_count(&dp->table); in get_dp_stats()
760 mega_stats->n_masks = ovs_flow_tbl_num_masks(&dp->table); in get_dp_stats()
769 percpu_stats = per_cpu_ptr(dp->stats_percpu, i); in get_dp_stats()
1003 struct datapath *dp; in ovs_flow_cmd_new() local
1068 dp = get_dp(net, ovs_header->dp_ifindex); in ovs_flow_cmd_new()
1069 if (unlikely(!dp)) { in ovs_flow_cmd_new()
1076 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &new_flow->id); in ovs_flow_cmd_new()
1078 flow = ovs_flow_tbl_lookup(&dp->table, key); in ovs_flow_cmd_new()
1083 error = ovs_flow_tbl_insert(&dp->table, new_flow, &mask); in ovs_flow_cmd_new()
1118 flow = ovs_flow_tbl_lookup_exact(&dp->table, in ovs_flow_cmd_new()
1250 struct datapath *dp; in ovs_flow_cmd_set() local
1282 dp = get_dp(net, ovs_header->dp_ifindex); in ovs_flow_cmd_set()
1283 if (unlikely(!dp)) { in ovs_flow_cmd_set()
1289 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &sfid); in ovs_flow_cmd_set()
1291 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match); in ovs_flow_cmd_set()
1352 struct datapath *dp; in ovs_flow_cmd_get() local
1374 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_flow_cmd_get()
1375 if (!dp) { in ovs_flow_cmd_get()
1381 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &ufid); in ovs_flow_cmd_get()
1383 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match); in ovs_flow_cmd_get()
1411 struct datapath *dp; in ovs_flow_cmd_del() local
1429 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_flow_cmd_del()
1430 if (unlikely(!dp)) { in ovs_flow_cmd_del()
1436 err = ovs_flow_tbl_flush(&dp->table); in ovs_flow_cmd_del()
1441 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &ufid); in ovs_flow_cmd_del()
1443 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match); in ovs_flow_cmd_del()
1449 ovs_flow_tbl_remove(&dp->table, flow); in ovs_flow_cmd_del()
1488 struct datapath *dp; in ovs_flow_cmd_dump() local
1499 dp = get_dp_rcu(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_flow_cmd_dump()
1500 if (!dp) { in ovs_flow_cmd_dump()
1505 ti = rcu_dereference(dp->table.ti); in ovs_flow_cmd_dump()
1594 static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb, in ovs_dp_cmd_fill_info() argument
1600 struct dp_nlsk_pids *pids = ovsl_dereference(dp->upcall_portids); in ovs_dp_cmd_fill_info()
1608 ovs_header->dp_ifindex = get_dpifindex(dp); in ovs_dp_cmd_fill_info()
1610 err = nla_put_string(skb, OVS_DP_ATTR_NAME, ovs_dp_name(dp)); in ovs_dp_cmd_fill_info()
1614 get_dp_stats(dp, &dp_stats, &dp_megaflow_stats); in ovs_dp_cmd_fill_info()
1624 if (nla_put_u32(skb, OVS_DP_ATTR_USER_FEATURES, dp->user_features)) in ovs_dp_cmd_fill_info()
1628 ovs_flow_tbl_masks_cache_size(&dp->table))) in ovs_dp_cmd_fill_info()
1631 if (dp->user_features & OVS_DP_F_DISPATCH_UPCALL_PER_CPU && pids) { in ovs_dp_cmd_fill_info()
1656 struct datapath *dp; in lookup_datapath() local
1659 dp = get_dp(net, ovs_header->dp_ifindex); in lookup_datapath()
1664 dp = vport && vport->port_no == OVSP_LOCAL ? vport->dp : NULL; in lookup_datapath()
1666 return dp ? dp : ERR_PTR(-ENODEV); in lookup_datapath()
1672 struct datapath *dp; in ovs_dp_reset_user_features() local
1674 dp = lookup_datapath(sock_net(skb->sk), genl_info_userhdr(info), in ovs_dp_reset_user_features()
1676 if (IS_ERR(dp)) in ovs_dp_reset_user_features()
1680 ovs_dp_name(dp)); in ovs_dp_reset_user_features()
1681 dp->user_features = 0; in ovs_dp_reset_user_features()
1684 static int ovs_dp_set_upcall_portids(struct datapath *dp, in ovs_dp_set_upcall_portids() argument
1692 old = ovsl_dereference(dp->upcall_portids); in ovs_dp_set_upcall_portids()
1702 rcu_assign_pointer(dp->upcall_portids, dp_nlsk_pids); in ovs_dp_set_upcall_portids()
1709 u32 ovs_dp_get_upcall_portid(const struct datapath *dp, uint32_t cpu_id) in ovs_dp_get_upcall_portid() argument
1713 dp_nlsk_pids = rcu_dereference(dp->upcall_portids); in ovs_dp_get_upcall_portid()
1736 static int ovs_dp_change(struct datapath *dp, struct nlattr *a[]) in ovs_dp_change() argument
1738 u32 user_features = 0, old_features = dp->user_features; in ovs_dp_change()
1761 err = ovs_flow_tbl_masks_cache_resize(&dp->table, cache_size); in ovs_dp_change()
1766 dp->user_features = user_features; in ovs_dp_change()
1768 if (dp->user_features & OVS_DP_F_DISPATCH_UPCALL_PER_CPU && in ovs_dp_change()
1771 err = ovs_dp_set_upcall_portids(dp, in ovs_dp_change()
1777 if ((dp->user_features & OVS_DP_F_TC_RECIRC_SHARING) && in ovs_dp_change()
1780 else if (!(dp->user_features & OVS_DP_F_TC_RECIRC_SHARING) && in ovs_dp_change()
1787 static int ovs_dp_stats_init(struct datapath *dp) in ovs_dp_stats_init() argument
1789 dp->stats_percpu = netdev_alloc_pcpu_stats(struct dp_stats_percpu); in ovs_dp_stats_init()
1790 if (!dp->stats_percpu) in ovs_dp_stats_init()
1796 static int ovs_dp_vport_init(struct datapath *dp) in ovs_dp_vport_init() argument
1800 dp->ports = kmalloc_array(DP_VPORT_HASH_BUCKETS, in ovs_dp_vport_init()
1803 if (!dp->ports) in ovs_dp_vport_init()
1807 INIT_HLIST_HEAD(&dp->ports[i]); in ovs_dp_vport_init()
1817 struct datapath *dp; in ovs_dp_cmd_new() local
1831 dp = kzalloc(sizeof(*dp), GFP_KERNEL); in ovs_dp_cmd_new()
1832 if (dp == NULL) in ovs_dp_cmd_new()
1835 ovs_dp_set_net(dp, sock_net(skb->sk)); in ovs_dp_cmd_new()
1838 err = ovs_flow_tbl_init(&dp->table); in ovs_dp_cmd_new()
1842 err = ovs_dp_stats_init(dp); in ovs_dp_cmd_new()
1846 err = ovs_dp_vport_init(dp); in ovs_dp_cmd_new()
1850 err = ovs_meters_init(dp); in ovs_dp_cmd_new()
1858 parms.dp = dp; in ovs_dp_cmd_new()
1866 err = ovs_dp_change(dp, a); in ovs_dp_cmd_new()
1888 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, in ovs_dp_cmd_new()
1892 ovs_net = net_generic(ovs_dp_get_net(dp), ovs_net_id); in ovs_dp_cmd_new()
1893 list_add_tail_rcu(&dp->list_node, &ovs_net->dps); in ovs_dp_cmd_new()
1901 kfree(rcu_dereference_raw(dp->upcall_portids)); in ovs_dp_cmd_new()
1904 ovs_meters_exit(dp); in ovs_dp_cmd_new()
1906 kfree(dp->ports); in ovs_dp_cmd_new()
1908 free_percpu(dp->stats_percpu); in ovs_dp_cmd_new()
1910 ovs_flow_tbl_destroy(&dp->table); in ovs_dp_cmd_new()
1912 kfree(dp); in ovs_dp_cmd_new()
1920 static void __dp_destroy(struct datapath *dp) in __dp_destroy() argument
1922 struct flow_table *table = &dp->table; in __dp_destroy()
1925 if (dp->user_features & OVS_DP_F_TC_RECIRC_SHARING) in __dp_destroy()
1932 hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node) in __dp_destroy()
1937 list_del_rcu(&dp->list_node); in __dp_destroy()
1942 ovs_dp_detach_port(ovs_vport_ovsl(dp, OVSP_LOCAL)); in __dp_destroy()
1952 call_rcu(&dp->rcu, destroy_dp_rcu); in __dp_destroy()
1958 struct datapath *dp; in ovs_dp_cmd_del() local
1966 dp = lookup_datapath(sock_net(skb->sk), genl_info_userhdr(info), in ovs_dp_cmd_del()
1968 err = PTR_ERR(dp); in ovs_dp_cmd_del()
1969 if (IS_ERR(dp)) in ovs_dp_cmd_del()
1972 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, in ovs_dp_cmd_del()
1976 __dp_destroy(dp); in ovs_dp_cmd_del()
1992 struct datapath *dp; in ovs_dp_cmd_set() local
2000 dp = lookup_datapath(sock_net(skb->sk), genl_info_userhdr(info), in ovs_dp_cmd_set()
2002 err = PTR_ERR(dp); in ovs_dp_cmd_set()
2003 if (IS_ERR(dp)) in ovs_dp_cmd_set()
2006 err = ovs_dp_change(dp, info->attrs); in ovs_dp_cmd_set()
2010 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, in ovs_dp_cmd_set()
2028 struct datapath *dp; in ovs_dp_cmd_get() local
2036 dp = lookup_datapath(sock_net(skb->sk), genl_info_userhdr(info), in ovs_dp_cmd_get()
2038 if (IS_ERR(dp)) { in ovs_dp_cmd_get()
2039 err = PTR_ERR(dp); in ovs_dp_cmd_get()
2042 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, in ovs_dp_cmd_get()
2058 struct datapath *dp; in ovs_dp_cmd_dump() local
2063 list_for_each_entry(dp, &ovs_net->dps, list_node) { in ovs_dp_cmd_dump()
2065 ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid, in ovs_dp_cmd_dump()
2142 ovs_header->dp_ifindex = get_dpifindex(vport->dp); in ovs_vport_cmd_fill_info()
2217 struct datapath *dp; in lookup_vport() local
2227 ovs_header->dp_ifindex != get_dpifindex(vport->dp)) in lookup_vport()
2236 dp = get_dp(net, ovs_header->dp_ifindex); in lookup_vport()
2237 if (!dp) in lookup_vport()
2240 vport = ovs_vport_ovsl_rcu(dp, port_no); in lookup_vport()
2249 static unsigned int ovs_get_max_headroom(struct datapath *dp) in ovs_get_max_headroom() argument
2257 hlist_for_each_entry_rcu(vport, &dp->ports[i], dp_hash_node, in ovs_get_max_headroom()
2270 static void ovs_update_headroom(struct datapath *dp, unsigned int new_headroom) in ovs_update_headroom() argument
2275 dp->max_headroom = new_headroom; in ovs_update_headroom()
2277 hlist_for_each_entry_rcu(vport, &dp->ports[i], dp_hash_node, in ovs_update_headroom()
2290 struct datapath *dp; in ovs_vport_cmd_new() local
2314 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_vport_cmd_new()
2316 if (!dp) in ovs_vport_cmd_new()
2320 vport = ovs_vport_ovsl(dp, port_no); in ovs_vport_cmd_new()
2330 vport = ovs_vport_ovsl(dp, port_no); in ovs_vport_cmd_new()
2338 parms.dp = dp; in ovs_vport_cmd_new()
2358 if (new_headroom > dp->max_headroom) in ovs_vport_cmd_new()
2359 ovs_update_headroom(dp, new_headroom); in ovs_vport_cmd_new()
2361 netdev_set_rx_headroom(vport->dev, dp->max_headroom); in ovs_vport_cmd_new()
2433 struct datapath *dp; in ovs_vport_cmd_del() local
2459 dp = vport->dp; in ovs_vport_cmd_del()
2460 if (netdev_get_fwd_headroom(vport->dev) == dp->max_headroom) in ovs_vport_cmd_del()
2467 new_headroom = ovs_get_max_headroom(dp); in ovs_vport_cmd_del()
2469 if (new_headroom < dp->max_headroom) in ovs_vport_cmd_del()
2470 ovs_update_headroom(dp, new_headroom); in ovs_vport_cmd_del()
2517 struct datapath *dp; in ovs_vport_cmd_dump() local
2522 dp = get_dp_rcu(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_vport_cmd_dump()
2523 if (!dp) { in ovs_vport_cmd_dump()
2531 hlist_for_each_entry_rcu(vport, &dp->ports[i], dp_hash_node) { in ovs_vport_cmd_dump()
2559 struct datapath *dp; in ovs_dp_masks_rebalance() local
2563 list_for_each_entry(dp, &ovs_net->dps, list_node) in ovs_dp_masks_rebalance()
2564 ovs_flow_masks_rebalance(&dp->table); in ovs_dp_masks_rebalance()
2684 struct datapath *dp; in list_vports_from_net() local
2686 list_for_each_entry(dp, &ovs_net->dps, list_node) { in list_vports_from_net()
2692 hlist_for_each_entry(vport, &dp->ports[i], dp_hash_node) { in list_vports_from_net()
2705 struct datapath *dp, *dp_next; in ovs_exit_net() local
2715 list_for_each_entry_safe(dp, dp_next, &ovs_net->dps, list_node) in ovs_exit_net()
2716 __dp_destroy(dp); in ovs_exit_net()