Lines Matching refs:dp

139 static int queue_gso_packets(struct datapath *dp, struct sk_buff *,
142 static int queue_userspace_packet(struct datapath *dp, struct sk_buff *,
154 return vport->dp; in get_dp_rcu()
165 struct datapath *dp; in get_dp() local
169 dp = get_dp_rcu(net, dp_ifindex); in get_dp()
172 return dp; in get_dp()
176 const char *ovs_dp_name(const struct datapath *dp) in ovs_dp_name() argument
178 struct vport *vport = ovs_vport_ovsl_rcu(dp, OVSP_LOCAL); in ovs_dp_name()
182 static int get_dpifindex(const struct datapath *dp) in get_dpifindex() argument
189 local = ovs_vport_rcu(dp, OVSP_LOCAL); in get_dpifindex()
202 struct datapath *dp = container_of(rcu, struct datapath, rcu); in destroy_dp_rcu() local
204 ovs_flow_tbl_destroy(&dp->table); in destroy_dp_rcu()
205 free_percpu(dp->stats_percpu); in destroy_dp_rcu()
206 kfree(dp->ports); in destroy_dp_rcu()
207 kfree(dp); in destroy_dp_rcu()
210 static struct hlist_head *vport_hash_bucket(const struct datapath *dp, in vport_hash_bucket() argument
213 return &dp->ports[port_no & (DP_VPORT_HASH_BUCKETS - 1)]; in vport_hash_bucket()
217 struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no) in ovs_lookup_vport() argument
222 head = vport_hash_bucket(dp, port_no); in ovs_lookup_vport()
237 struct datapath *dp = parms->dp; in new_vport() local
238 struct hlist_head *head = vport_hash_bucket(dp, vport->port_no); in new_vport()
260 struct datapath *dp = p->dp; in ovs_dp_process_packet() local
267 stats = this_cpu_ptr(dp->stats_percpu); in ovs_dp_process_packet()
270 flow = ovs_flow_tbl_lookup_stats(&dp->table, key, &n_mask_hit); in ovs_dp_process_packet()
279 error = ovs_dp_upcall(dp, skb, key, &upcall); in ovs_dp_process_packet()
290 ovs_execute_actions(dp, skb, sf_acts, key); in ovs_dp_process_packet()
302 int ovs_dp_upcall(struct datapath *dp, struct sk_buff *skb, in ovs_dp_upcall() argument
315 err = queue_userspace_packet(dp, skb, key, upcall_info); in ovs_dp_upcall()
317 err = queue_gso_packets(dp, skb, key, upcall_info); in ovs_dp_upcall()
324 stats = this_cpu_ptr(dp->stats_percpu); in ovs_dp_upcall()
333 static int queue_gso_packets(struct datapath *dp, struct sk_buff *skb, in queue_gso_packets() argument
364 err = queue_userspace_packet(dp, skb, key, upcall_info); in queue_gso_packets()
400 static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb, in queue_userspace_packet() argument
409 .dst_sk = ovs_dp_get_net(dp)->genl_sock, in queue_userspace_packet()
416 dp_ifindex = get_dpifindex(dp); in queue_userspace_packet()
446 if (dp->user_features & OVS_DP_F_UNALIGNED) in queue_userspace_packet()
491 if (!(dp->user_features & OVS_DP_F_UNALIGNED)) { in queue_userspace_packet()
500 err = genlmsg_unicast(ovs_dp_get_net(dp), user_skb, upcall_info->portid); in queue_userspace_packet()
518 struct datapath *dp; in ovs_packet_cmd_execute() local
572 dp = get_dp_rcu(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_packet_cmd_execute()
574 if (!dp) in ovs_packet_cmd_execute()
577 input_vport = ovs_vport_rcu(dp, flow->key.phy.in_port); in ovs_packet_cmd_execute()
579 input_vport = ovs_vport_rcu(dp, OVSP_LOCAL); in ovs_packet_cmd_execute()
588 err = ovs_execute_actions(dp, packet, sf_acts, &flow->key); in ovs_packet_cmd_execute()
632 static void get_dp_stats(const struct datapath *dp, struct ovs_dp_stats *stats, in get_dp_stats() argument
639 stats->n_flows = ovs_flow_tbl_count(&dp->table); in get_dp_stats()
640 mega_stats->n_masks = ovs_flow_tbl_num_masks(&dp->table); in get_dp_stats()
649 percpu_stats = per_cpu_ptr(dp->stats_percpu, i); in get_dp_stats()
871 struct datapath *dp; in ovs_flow_cmd_new() local
930 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_flow_cmd_new()
931 if (unlikely(!dp)) { in ovs_flow_cmd_new()
938 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &new_flow->id); in ovs_flow_cmd_new()
940 flow = ovs_flow_tbl_lookup(&dp->table, &key); in ovs_flow_cmd_new()
945 error = ovs_flow_tbl_insert(&dp->table, new_flow, &mask); in ovs_flow_cmd_new()
980 flow = ovs_flow_tbl_lookup_exact(&dp->table, in ovs_flow_cmd_new()
1052 struct datapath *dp; in ovs_flow_cmd_set() local
1094 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_flow_cmd_set()
1095 if (unlikely(!dp)) { in ovs_flow_cmd_set()
1101 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &sfid); in ovs_flow_cmd_set()
1103 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match); in ovs_flow_cmd_set()
1163 struct datapath *dp; in ovs_flow_cmd_get() local
1185 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_flow_cmd_get()
1186 if (!dp) { in ovs_flow_cmd_get()
1192 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &ufid); in ovs_flow_cmd_get()
1194 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match); in ovs_flow_cmd_get()
1221 struct datapath *dp; in ovs_flow_cmd_del() local
1239 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_flow_cmd_del()
1240 if (unlikely(!dp)) { in ovs_flow_cmd_del()
1246 err = ovs_flow_tbl_flush(&dp->table); in ovs_flow_cmd_del()
1251 flow = ovs_flow_tbl_lookup_ufid(&dp->table, &ufid); in ovs_flow_cmd_del()
1253 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match); in ovs_flow_cmd_del()
1259 ovs_flow_tbl_remove(&dp->table, flow); in ovs_flow_cmd_del()
1293 struct datapath *dp; in ovs_flow_cmd_dump() local
1304 dp = get_dp_rcu(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_flow_cmd_dump()
1305 if (!dp) { in ovs_flow_cmd_dump()
1310 ti = rcu_dereference(dp->table.ti); in ovs_flow_cmd_dump()
1395 static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb, in ovs_dp_cmd_fill_info() argument
1408 ovs_header->dp_ifindex = get_dpifindex(dp); in ovs_dp_cmd_fill_info()
1410 err = nla_put_string(skb, OVS_DP_ATTR_NAME, ovs_dp_name(dp)); in ovs_dp_cmd_fill_info()
1414 get_dp_stats(dp, &dp_stats, &dp_megaflow_stats); in ovs_dp_cmd_fill_info()
1424 if (nla_put_u32(skb, OVS_DP_ATTR_USER_FEATURES, dp->user_features)) in ovs_dp_cmd_fill_info()
1446 struct datapath *dp; in lookup_datapath() local
1449 dp = get_dp(net, ovs_header->dp_ifindex); in lookup_datapath()
1454 dp = vport && vport->port_no == OVSP_LOCAL ? vport->dp : NULL; in lookup_datapath()
1456 return dp ? dp : ERR_PTR(-ENODEV); in lookup_datapath()
1461 struct datapath *dp; in ovs_dp_reset_user_features() local
1463 dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); in ovs_dp_reset_user_features()
1464 if (IS_ERR(dp)) in ovs_dp_reset_user_features()
1467 WARN(dp->user_features, "Dropping previously announced user features\n"); in ovs_dp_reset_user_features()
1468 dp->user_features = 0; in ovs_dp_reset_user_features()
1471 static void ovs_dp_change(struct datapath *dp, struct nlattr *a[]) in ovs_dp_change() argument
1474 dp->user_features = nla_get_u32(a[OVS_DP_ATTR_USER_FEATURES]); in ovs_dp_change()
1482 struct datapath *dp; in ovs_dp_cmd_new() local
1496 dp = kzalloc(sizeof(*dp), GFP_KERNEL); in ovs_dp_cmd_new()
1497 if (dp == NULL) in ovs_dp_cmd_new()
1500 ovs_dp_set_net(dp, sock_net(skb->sk)); in ovs_dp_cmd_new()
1503 err = ovs_flow_tbl_init(&dp->table); in ovs_dp_cmd_new()
1507 dp->stats_percpu = netdev_alloc_pcpu_stats(struct dp_stats_percpu); in ovs_dp_cmd_new()
1508 if (!dp->stats_percpu) { in ovs_dp_cmd_new()
1513 dp->ports = kmalloc(DP_VPORT_HASH_BUCKETS * sizeof(struct hlist_head), in ovs_dp_cmd_new()
1515 if (!dp->ports) { in ovs_dp_cmd_new()
1521 INIT_HLIST_HEAD(&dp->ports[i]); in ovs_dp_cmd_new()
1527 parms.dp = dp; in ovs_dp_cmd_new()
1531 ovs_dp_change(dp, a); in ovs_dp_cmd_new()
1554 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, in ovs_dp_cmd_new()
1558 ovs_net = net_generic(ovs_dp_get_net(dp), ovs_net_id); in ovs_dp_cmd_new()
1559 list_add_tail_rcu(&dp->list_node, &ovs_net->dps); in ovs_dp_cmd_new()
1568 kfree(dp->ports); in ovs_dp_cmd_new()
1570 free_percpu(dp->stats_percpu); in ovs_dp_cmd_new()
1572 ovs_flow_tbl_destroy(&dp->table); in ovs_dp_cmd_new()
1574 kfree(dp); in ovs_dp_cmd_new()
1582 static void __dp_destroy(struct datapath *dp) in __dp_destroy() argument
1590 hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node) in __dp_destroy()
1595 list_del_rcu(&dp->list_node); in __dp_destroy()
1600 ovs_dp_detach_port(ovs_vport_ovsl(dp, OVSP_LOCAL)); in __dp_destroy()
1603 call_rcu(&dp->rcu, destroy_dp_rcu); in __dp_destroy()
1609 struct datapath *dp; in ovs_dp_cmd_del() local
1617 dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); in ovs_dp_cmd_del()
1618 err = PTR_ERR(dp); in ovs_dp_cmd_del()
1619 if (IS_ERR(dp)) in ovs_dp_cmd_del()
1622 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, in ovs_dp_cmd_del()
1626 __dp_destroy(dp); in ovs_dp_cmd_del()
1642 struct datapath *dp; in ovs_dp_cmd_set() local
1650 dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); in ovs_dp_cmd_set()
1651 err = PTR_ERR(dp); in ovs_dp_cmd_set()
1652 if (IS_ERR(dp)) in ovs_dp_cmd_set()
1655 ovs_dp_change(dp, info->attrs); in ovs_dp_cmd_set()
1657 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, in ovs_dp_cmd_set()
1675 struct datapath *dp; in ovs_dp_cmd_get() local
1683 dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); in ovs_dp_cmd_get()
1684 if (IS_ERR(dp)) { in ovs_dp_cmd_get()
1685 err = PTR_ERR(dp); in ovs_dp_cmd_get()
1688 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid, in ovs_dp_cmd_get()
1704 struct datapath *dp; in ovs_dp_cmd_dump() local
1709 list_for_each_entry(dp, &ovs_net->dps, list_node) { in ovs_dp_cmd_dump()
1711 ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid, in ovs_dp_cmd_dump()
1781 ovs_header->dp_ifindex = get_dpifindex(vport->dp); in ovs_vport_cmd_fill_info()
1838 struct datapath *dp; in lookup_vport() local
1846 ovs_header->dp_ifindex != get_dpifindex(vport->dp)) in lookup_vport()
1855 dp = get_dp(net, ovs_header->dp_ifindex); in lookup_vport()
1856 if (!dp) in lookup_vport()
1859 vport = ovs_vport_ovsl_rcu(dp, port_no); in lookup_vport()
1874 struct datapath *dp; in ovs_vport_cmd_new() local
1893 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_vport_cmd_new()
1895 if (!dp) in ovs_vport_cmd_new()
1899 vport = ovs_vport_ovsl(dp, port_no); in ovs_vport_cmd_new()
1909 vport = ovs_vport_ovsl(dp, port_no); in ovs_vport_cmd_new()
1918 parms.dp = dp; in ovs_vport_cmd_new()
2066 struct datapath *dp; in ovs_vport_cmd_dump() local
2071 dp = get_dp_rcu(sock_net(skb->sk), ovs_header->dp_ifindex); in ovs_vport_cmd_dump()
2072 if (!dp) { in ovs_vport_cmd_dump()
2080 hlist_for_each_entry_rcu(vport, &dp->ports[i], dp_hash_node) { in ovs_vport_cmd_dump()
2196 struct datapath *dp; in list_vports_from_net() local
2198 list_for_each_entry(dp, &ovs_net->dps, list_node) { in list_vports_from_net()
2204 hlist_for_each_entry(vport, &dp->ports[i], dp_hash_node) { in list_vports_from_net()
2220 struct datapath *dp, *dp_next; in ovs_exit_net() local
2227 list_for_each_entry_safe(dp, dp_next, &ovs_net->dps, list_node) in ovs_exit_net()
2228 __dp_destroy(dp); in ovs_exit_net()