Lines Matching refs:dp

136 static int queue_gso_packets(struct datapath *dp, struct sk_buff *,
138 static int queue_userspace_packet(struct datapath *dp, struct sk_buff *,
144 struct datapath *dp = NULL;
152 dp = vport->dp;
156 return dp;
160 const char *ovs_dp_name(const struct datapath *dp)
162 struct vport *vport = ovs_vport_ovsl_rcu(dp, OVSP_LOCAL);
166 static int get_dpifindex(struct datapath *dp)
173 local = ovs_vport_rcu(dp, OVSP_LOCAL);
186 struct datapath *dp = container_of(rcu, struct datapath, rcu);
188 free_percpu(dp->stats_percpu);
189 release_net(ovs_dp_get_net(dp));
190 kfree(dp->ports);
191 kfree(dp);
194 static struct hlist_head *vport_hash_bucket(const struct datapath *dp,
197 return &dp->ports[port_no & (DP_VPORT_HASH_BUCKETS - 1)];
201 struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no)
206 head = vport_hash_bucket(dp, port_no);
221 struct datapath *dp = parms->dp;
222 struct hlist_head *head = vport_hash_bucket(dp, vport->port_no);
244 struct datapath *dp = p->dp;
250 stats = this_cpu_ptr(dp->stats_percpu);
253 flow = ovs_flow_tbl_lookup_stats(&dp->table, key, &n_mask_hit);
262 error = ovs_dp_upcall(dp, skb, &upcall);
274 ovs_execute_actions(dp, skb, key);
285 int ovs_dp_upcall(struct datapath *dp, struct sk_buff *skb,
297 err = queue_userspace_packet(dp, skb, upcall_info);
299 err = queue_gso_packets(dp, skb, upcall_info);
306 stats = this_cpu_ptr(dp->stats_percpu);
315 static int queue_gso_packets(struct datapath *dp, struct sk_buff *skb,
333 err = queue_userspace_packet(dp, skb, upcall_info);
402 static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
410 .dst_sk = ovs_dp_get_net(dp)->genl_sock,
417 dp_ifindex = get_dpifindex(dp);
448 if (dp->user_features & OVS_DP_F_UNALIGNED)
487 if (!(dp->user_features & OVS_DP_F_UNALIGNED)) {
496 err = genlmsg_unicast(ovs_dp_get_net(dp), user_skb, upcall_info->portid);
513 struct datapath *dp;
573 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
575 if (!dp)
578 input_vport = ovs_vport_rcu(dp, flow->key.phy.in_port);
580 input_vport = ovs_vport_rcu(dp, OVSP_LOCAL);
588 err = ovs_execute_actions(dp, packet, &flow->key);
631 static void get_dp_stats(struct datapath *dp, struct ovs_dp_stats *stats,
638 stats->n_flows = ovs_flow_tbl_count(&dp->table);
639 mega_stats->n_masks = ovs_flow_tbl_num_masks(&dp->table);
648 percpu_stats = per_cpu_ptr(dp->stats_percpu, i);
810 struct datapath *dp;
860 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
861 if (unlikely(!dp)) {
866 flow = ovs_flow_tbl_lookup(&dp->table, &new_flow->unmasked_key);
871 error = ovs_flow_tbl_insert(&dp->table, new_flow, &mask);
902 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match);
972 struct datapath *dp;
1007 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
1008 if (unlikely(!dp)) {
1013 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match);
1070 struct datapath *dp;
1085 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
1086 if (!dp) {
1091 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match);
1118 struct datapath *dp;
1130 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
1131 if (unlikely(!dp)) {
1137 err = ovs_flow_tbl_flush(&dp->table);
1141 flow = ovs_flow_tbl_lookup_exact(&dp->table, &match);
1147 ovs_flow_tbl_remove(&dp->table, flow);
1179 struct datapath *dp;
1182 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
1183 if (!dp) {
1188 ti = rcu_dereference(dp->table.ti);
1269 static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb,
1282 ovs_header->dp_ifindex = get_dpifindex(dp);
1284 err = nla_put_string(skb, OVS_DP_ATTR_NAME, ovs_dp_name(dp));
1288 get_dp_stats(dp, &dp_stats, &dp_megaflow_stats);
1298 if (nla_put_u32(skb, OVS_DP_ATTR_USER_FEATURES, dp->user_features))
1319 struct datapath *dp;
1322 dp = get_dp(net, ovs_header->dp_ifindex);
1327 dp = vport && vport->port_no == OVSP_LOCAL ? vport->dp : NULL;
1329 return dp ? dp : ERR_PTR(-ENODEV);
1334 struct datapath *dp;
1336 dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs);
1337 if (IS_ERR(dp))
1340 WARN(dp->user_features, "Dropping previously announced user features\n");
1341 dp->user_features = 0;
1344 static void ovs_dp_change(struct datapath *dp, struct nlattr **a)
1347 dp->user_features = nla_get_u32(a[OVS_DP_ATTR_USER_FEATURES]);
1355 struct datapath *dp;
1369 dp = kzalloc(sizeof(*dp), GFP_KERNEL);
1370 if (dp == NULL)
1373 ovs_dp_set_net(dp, hold_net(sock_net(skb->sk)));
1376 err = ovs_flow_tbl_init(&dp->table);
1380 dp->stats_percpu = netdev_alloc_pcpu_stats(struct dp_stats_percpu);
1381 if (!dp->stats_percpu) {
1386 dp->ports = kmalloc(DP_VPORT_HASH_BUCKETS * sizeof(struct hlist_head),
1388 if (!dp->ports) {
1394 INIT_HLIST_HEAD(&dp->ports[i]);
1400 parms.dp = dp;
1404 ovs_dp_change(dp, a);
1427 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid,
1431 ovs_net = net_generic(ovs_dp_get_net(dp), ovs_net_id);
1432 list_add_tail_rcu(&dp->list_node, &ovs_net->dps);
1441 kfree(dp->ports);
1443 free_percpu(dp->stats_percpu);
1445 ovs_flow_tbl_destroy(&dp->table, false);
1447 release_net(ovs_dp_get_net(dp));
1448 kfree(dp);
1456 static void __dp_destroy(struct datapath *dp)
1464 hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node)
1469 list_del_rcu(&dp->list_node);
1474 ovs_dp_detach_port(ovs_vport_ovsl(dp, OVSP_LOCAL));
1477 ovs_flow_tbl_destroy(&dp->table, true);
1479 call_rcu(&dp->rcu, destroy_dp_rcu);
1485 struct datapath *dp;
1493 dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs);
1494 err = PTR_ERR(dp);
1495 if (IS_ERR(dp))
1498 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid,
1502 __dp_destroy(dp);
1518 struct datapath *dp;
1526 dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs);
1527 err = PTR_ERR(dp);
1528 if (IS_ERR(dp))
1531 ovs_dp_change(dp, info->attrs);
1533 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid,
1551 struct datapath *dp;
1559 dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs);
1560 if (IS_ERR(dp)) {
1561 err = PTR_ERR(dp);
1564 err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid,
1580 struct datapath *dp;
1585 list_for_each_entry(dp, &ovs_net->dps, list_node) {
1587 ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid,
1657 ovs_header->dp_ifindex = get_dpifindex(vport->dp);
1713 struct datapath *dp;
1721 ovs_header->dp_ifindex != get_dpifindex(vport->dp))
1730 dp = get_dp(net, ovs_header->dp_ifindex);
1731 if (!dp)
1734 vport = ovs_vport_ovsl_rcu(dp, port_no);
1749 struct datapath *dp;
1767 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
1769 if (!dp)
1773 vport = ovs_vport_ovsl(dp, port_no);
1783 vport = ovs_vport_ovsl(dp, port_no);
1792 parms.dp = dp;
1937 struct datapath *dp;
1942 dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
1943 if (!dp) {
1951 hlist_for_each_entry_rcu(vport, &dp->ports[i], dp_hash_node) {
2065 struct datapath *dp, *dp_next;
2069 list_for_each_entry_safe(dp, dp_next, &ovs_net->dps, list_node)
2070 __dp_destroy(dp);