]> git.proxmox.com Git - ovs.git/blame - lib/dpif.c
tc: Add SCTP support
[ovs.git] / lib / dpif.c
CommitLineData
064af421 1/*
922fed06 2 * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
064af421 3 *
a14bc59f
BP
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
064af421 7 *
a14bc59f
BP
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
064af421
BP
15 */
16
17#include <config.h>
96fba48f 18#include "dpif-provider.h"
064af421 19
064af421
BP
20#include <ctype.h>
21#include <errno.h>
064af421 22#include <inttypes.h>
064af421
BP
23#include <stdlib.h>
24#include <string.h>
064af421
BP
25
26#include "coverage.h"
fceef209 27#include "dpctl.h"
e14deea0 28#include "dp-packet.h"
c4ea7529 29#include "dpif-netdev.h"
3e8a2ad1 30#include "openvswitch/dynamic-string.h"
064af421 31#include "flow.h"
c3827f61 32#include "netdev.h"
064af421 33#include "netlink.h"
7fd91025 34#include "odp-execute.h"
064af421 35#include "odp-util.h"
25d436fb 36#include "openvswitch/ofp-print.h"
f4248336 37#include "openvswitch/ofp-util.h"
64c96779 38#include "openvswitch/ofpbuf.h"
064af421
BP
39#include "packets.h"
40#include "poll-loop.h"
1bc50ef3 41#include "route-table.h"
36f29fb1 42#include "seq.h"
ee89ea7b 43#include "openvswitch/shash.h"
d0c23a1a 44#include "sset.h"
c97fb132 45#include "timeval.h"
53902038 46#include "tnl-neigh-cache.h"
a36de779 47#include "tnl-ports.h"
064af421 48#include "util.h"
78145f6e 49#include "uuid.h"
064af421 50#include "valgrind.h"
e03c096d 51#include "openvswitch/ofp-errors.h"
e6211adc 52#include "openvswitch/vlog.h"
5136ce49 53
d98e6007 54VLOG_DEFINE_THIS_MODULE(dpif);
064af421 55
d76f09ea
BP
56COVERAGE_DEFINE(dpif_destroy);
57COVERAGE_DEFINE(dpif_port_add);
58COVERAGE_DEFINE(dpif_port_del);
59COVERAGE_DEFINE(dpif_flow_flush);
60COVERAGE_DEFINE(dpif_flow_get);
61COVERAGE_DEFINE(dpif_flow_put);
62COVERAGE_DEFINE(dpif_flow_del);
d76f09ea
BP
63COVERAGE_DEFINE(dpif_execute);
64COVERAGE_DEFINE(dpif_purge);
7fd91025 65COVERAGE_DEFINE(dpif_execute_with_help);
5dddf960
JR
66COVERAGE_DEFINE(dpif_meter_set);
67COVERAGE_DEFINE(dpif_meter_get);
68COVERAGE_DEFINE(dpif_meter_del);
d76f09ea 69
999401aa 70static const struct dpif_class *base_dpif_classes[] = {
93451a0a
AS
71#if defined(__linux__) || defined(_WIN32)
72 &dpif_netlink_class,
c83cdd30 73#endif
72865317 74 &dpif_netdev_class,
c228a364 75};
999401aa
JG
76
77struct registered_dpif_class {
d2d8fbeb 78 const struct dpif_class *dpif_class;
999401aa
JG
79 int refcount;
80};
81static struct shash dpif_classes = SHASH_INITIALIZER(&dpif_classes);
579a77e0 82static struct sset dpif_blacklist = SSET_INITIALIZER(&dpif_blacklist);
c228a364 83
5703b15f 84/* Protects 'dpif_classes', including the refcount, and 'dpif_blacklist'. */
97be1538 85static struct ovs_mutex dpif_mutex = OVS_MUTEX_INITIALIZER;
5703b15f 86
064af421
BP
87/* Rate limit for individual messages going to or from the datapath, output at
88 * DBG level. This is very high because, if these are enabled, it is because
89 * we really need to see them. */
90static struct vlog_rate_limit dpmsg_rl = VLOG_RATE_LIMIT_INIT(600, 600);
91
92/* Not really much point in logging many dpif errors. */
e2781405 93static struct vlog_rate_limit error_rl = VLOG_RATE_LIMIT_INIT(60, 5);
064af421 94
96fba48f
BP
95static void log_operation(const struct dpif *, const char *operation,
96 int error);
eff1e5b0
RD
97static bool should_log_flow_message(const struct vlog_module *module,
98 int error);
064af421 99
36f29fb1
PS
100/* Incremented whenever tnl route, arp, etc changes. */
101struct seq *tnl_conf_seq;
102
5119e258
DB
103static bool
104dpif_is_internal_port(const char *type)
105{
106 /* For userspace datapath, tap devices are the equivalent
107 * of internal devices in the kernel datapath, so both
108 * these types are 'internal' devices. */
109 return !strcmp(type, "internal") || !strcmp(type, "tap");
110}
111
999401aa
JG
112static void
113dp_initialize(void)
114{
eb8ed438 115 static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
999401aa 116
eb8ed438 117 if (ovsthread_once_start(&once)) {
999401aa
JG
118 int i;
119
36f29fb1 120 tnl_conf_seq = seq_create();
fceef209 121 dpctl_unixctl_register();
a36de779 122 tnl_port_map_init();
53902038 123 tnl_neigh_cache_init();
b772066f 124 route_table_init();
1bc50ef3 125
36f29fb1
PS
126 for (i = 0; i < ARRAY_SIZE(base_dpif_classes); i++) {
127 dp_register_provider(base_dpif_classes[i]);
128 }
129
1bc50ef3 130 ovsthread_once_done(&once);
999401aa
JG
131 }
132}
133
5703b15f
BP
134static int
135dp_register_provider__(const struct dpif_class *new_class)
999401aa
JG
136{
137 struct registered_dpif_class *registered_class;
c8973eb6 138 int error;
999401aa 139
579a77e0
EJ
140 if (sset_contains(&dpif_blacklist, new_class->type)) {
141 VLOG_DBG("attempted to register blacklisted provider: %s",
142 new_class->type);
143 return EINVAL;
144 }
145
999401aa
JG
146 if (shash_find(&dpif_classes, new_class->type)) {
147 VLOG_WARN("attempted to register duplicate datapath provider: %s",
148 new_class->type);
149 return EEXIST;
150 }
1a6f1e2a 151
c8973eb6
DDP
152 error = new_class->init ? new_class->init() : 0;
153 if (error) {
154 VLOG_WARN("failed to initialize %s datapath class: %s",
155 new_class->type, ovs_strerror(error));
156 return error;
157 }
158
999401aa 159 registered_class = xmalloc(sizeof *registered_class);
d2d8fbeb 160 registered_class->dpif_class = new_class;
999401aa
JG
161 registered_class->refcount = 0;
162
163 shash_add(&dpif_classes, new_class->type, registered_class);
164
165 return 0;
166}
167
5703b15f
BP
168/* Registers a new datapath provider. After successful registration, new
169 * datapaths of that type can be opened using dpif_open(). */
170int
171dp_register_provider(const struct dpif_class *new_class)
172{
173 int error;
174
97be1538 175 ovs_mutex_lock(&dpif_mutex);
5703b15f 176 error = dp_register_provider__(new_class);
97be1538 177 ovs_mutex_unlock(&dpif_mutex);
5703b15f
BP
178
179 return error;
180}
181
999401aa
JG
182/* Unregisters a datapath provider. 'type' must have been previously
183 * registered and not currently be in use by any dpifs. After unregistration
184 * new datapaths of that type cannot be opened using dpif_open(). */
5703b15f
BP
185static int
186dp_unregister_provider__(const char *type)
999401aa
JG
187{
188 struct shash_node *node;
189 struct registered_dpif_class *registered_class;
190
191 node = shash_find(&dpif_classes, type);
192 if (!node) {
999401aa
JG
193 return EAFNOSUPPORT;
194 }
195
196 registered_class = node->data;
197 if (registered_class->refcount) {
198 VLOG_WARN("attempted to unregister in use datapath provider: %s", type);
199 return EBUSY;
200 }
201
202 shash_delete(&dpif_classes, node);
203 free(registered_class);
204
205 return 0;
206}
207
5703b15f
BP
208/* Unregisters a datapath provider. 'type' must have been previously
209 * registered and not currently be in use by any dpifs. After unregistration
210 * new datapaths of that type cannot be opened using dpif_open(). */
211int
212dp_unregister_provider(const char *type)
213{
214 int error;
215
216 dp_initialize();
217
97be1538 218 ovs_mutex_lock(&dpif_mutex);
5703b15f 219 error = dp_unregister_provider__(type);
97be1538 220 ovs_mutex_unlock(&dpif_mutex);
5703b15f
BP
221
222 return error;
223}
224
579a77e0
EJ
225/* Blacklists a provider. Causes future calls of dp_register_provider() with
226 * a dpif_class which implements 'type' to fail. */
227void
228dp_blacklist_provider(const char *type)
229{
97be1538 230 ovs_mutex_lock(&dpif_mutex);
579a77e0 231 sset_add(&dpif_blacklist, type);
97be1538 232 ovs_mutex_unlock(&dpif_mutex);
579a77e0
EJ
233}
234
5b5b11ea
BP
235/* Adds the types of all currently registered datapath providers to 'types'.
236 * The caller must first initialize the sset. */
1a6f1e2a 237void
d0c23a1a 238dp_enumerate_types(struct sset *types)
1a6f1e2a 239{
999401aa 240 struct shash_node *node;
1a6f1e2a 241
999401aa 242 dp_initialize();
1a6f1e2a 243
97be1538 244 ovs_mutex_lock(&dpif_mutex);
999401aa
JG
245 SHASH_FOR_EACH(node, &dpif_classes) {
246 const struct registered_dpif_class *registered_class = node->data;
d0c23a1a 247 sset_add(types, registered_class->dpif_class->type);
1a6f1e2a 248 }
97be1538 249 ovs_mutex_unlock(&dpif_mutex);
5703b15f
BP
250}
251
252static void
253dp_class_unref(struct registered_dpif_class *rc)
254{
97be1538 255 ovs_mutex_lock(&dpif_mutex);
5703b15f
BP
256 ovs_assert(rc->refcount);
257 rc->refcount--;
97be1538 258 ovs_mutex_unlock(&dpif_mutex);
5703b15f
BP
259}
260
261static struct registered_dpif_class *
262dp_class_lookup(const char *type)
263{
264 struct registered_dpif_class *rc;
265
97be1538 266 ovs_mutex_lock(&dpif_mutex);
5703b15f
BP
267 rc = shash_find_data(&dpif_classes, type);
268 if (rc) {
269 rc->refcount++;
270 }
97be1538 271 ovs_mutex_unlock(&dpif_mutex);
5703b15f
BP
272
273 return rc;
1a6f1e2a
JG
274}
275
276/* Clears 'names' and enumerates the names of all known created datapaths with
d0c23a1a 277 * the given 'type'. The caller must first initialize the sset. Returns 0 if
1a6f1e2a 278 * successful, otherwise a positive errno value.
d3d22744
BP
279 *
280 * Some kinds of datapaths might not be practically enumerable. This is not
281 * considered an error. */
282int
d0c23a1a 283dp_enumerate_names(const char *type, struct sset *names)
d3d22744 284{
5703b15f 285 struct registered_dpif_class *registered_class;
999401aa
JG
286 const struct dpif_class *dpif_class;
287 int error;
d3d22744 288
999401aa 289 dp_initialize();
d0c23a1a 290 sset_clear(names);
1a6f1e2a 291
5703b15f 292 registered_class = dp_class_lookup(type);
999401aa
JG
293 if (!registered_class) {
294 VLOG_WARN("could not enumerate unknown type: %s", type);
295 return EAFNOSUPPORT;
296 }
1a6f1e2a 297
d2d8fbeb 298 dpif_class = registered_class->dpif_class;
2240af25
DDP
299 error = (dpif_class->enumerate
300 ? dpif_class->enumerate(names, dpif_class)
301 : 0);
999401aa
JG
302 if (error) {
303 VLOG_WARN("failed to enumerate %s datapaths: %s", dpif_class->type,
10a89ef0 304 ovs_strerror(error));
d3d22744 305 }
5703b15f 306 dp_class_unref(registered_class);
1a6f1e2a 307
999401aa 308 return error;
1a6f1e2a
JG
309}
310
54ed8a5d
BP
311/* Parses 'datapath_name_', which is of the form [type@]name into its
312 * component pieces. 'name' and 'type' must be freed by the caller.
313 *
314 * The returned 'type' is normalized, as if by dpif_normalize_type(). */
1a6f1e2a
JG
315void
316dp_parse_name(const char *datapath_name_, char **name, char **type)
317{
318 char *datapath_name = xstrdup(datapath_name_);
319 char *separator;
320
321 separator = strchr(datapath_name, '@');
322 if (separator) {
323 *separator = '\0';
324 *type = datapath_name;
54ed8a5d 325 *name = xstrdup(dpif_normalize_type(separator + 1));
1a6f1e2a
JG
326 } else {
327 *name = datapath_name;
54ed8a5d 328 *type = xstrdup(dpif_normalize_type(NULL));
1a6f1e2a 329 }
d3d22744
BP
330}
331
96fba48f 332static int
1a6f1e2a 333do_open(const char *name, const char *type, bool create, struct dpif **dpifp)
064af421 334{
96fba48f 335 struct dpif *dpif = NULL;
064af421 336 int error;
999401aa
JG
337 struct registered_dpif_class *registered_class;
338
339 dp_initialize();
064af421 340
3a225db7 341 type = dpif_normalize_type(type);
5703b15f 342 registered_class = dp_class_lookup(type);
999401aa
JG
343 if (!registered_class) {
344 VLOG_WARN("could not create datapath %s of unknown type %s", name,
345 type);
346 error = EAFNOSUPPORT;
347 goto exit;
348 }
349
4a387741
BP
350 error = registered_class->dpif_class->open(registered_class->dpif_class,
351 name, create, &dpif);
999401aa 352 if (!error) {
32b77c31
PB
353 struct dpif_port_dump port_dump;
354 struct dpif_port dpif_port;
355
cb22974d 356 ovs_assert(dpif->dpif_class == registered_class->dpif_class);
32b77c31
PB
357
358 DPIF_PORT_FOR_EACH(&dpif_port, &port_dump, dpif) {
359 struct netdev *netdev;
360 int err;
361
5119e258 362 if (dpif_is_internal_port(dpif_port.type)) {
32b77c31
PB
363 continue;
364 }
365
366 err = netdev_open(dpif_port.name, dpif_port.type, &netdev);
367
368 if (!err) {
369 netdev_ports_insert(netdev, DPIF_HMAP_KEY(dpif), &dpif_port);
370 netdev_close(netdev);
371 } else {
57459d0d
ML
372 VLOG_WARN("could not open netdev %s type %s: %s",
373 dpif_port.name, dpif_port.type, ovs_strerror(err));
32b77c31
PB
374 }
375 }
5703b15f
BP
376 } else {
377 dp_class_unref(registered_class);
064af421 378 }
064af421 379
96fba48f
BP
380exit:
381 *dpifp = error ? NULL : dpif;
382 return error;
064af421
BP
383}
384
1a6f1e2a
JG
385/* Tries to open an existing datapath named 'name' and type 'type'. Will fail
386 * if no datapath with 'name' and 'type' exists. 'type' may be either NULL or
387 * the empty string to specify the default system type. Returns 0 if
388 * successful, otherwise a positive errno value. On success stores a pointer
389 * to the datapath in '*dpifp', otherwise a null pointer. */
96fba48f 390int
1a6f1e2a 391dpif_open(const char *name, const char *type, struct dpif **dpifp)
064af421 392{
1a6f1e2a 393 return do_open(name, type, false, dpifp);
064af421
BP
394}
395
1a6f1e2a
JG
396/* Tries to create and open a new datapath with the given 'name' and 'type'.
397 * 'type' may be either NULL or the empty string to specify the default system
398 * type. Will fail if a datapath with 'name' and 'type' already exists.
399 * Returns 0 if successful, otherwise a positive errno value. On success
400 * stores a pointer to the datapath in '*dpifp', otherwise a null pointer. */
064af421 401int
1a6f1e2a 402dpif_create(const char *name, const char *type, struct dpif **dpifp)
064af421 403{
1a6f1e2a 404 return do_open(name, type, true, dpifp);
96fba48f 405}
064af421 406
1a6f1e2a
JG
407/* Tries to open a datapath with the given 'name' and 'type', creating it if it
408 * does not exist. 'type' may be either NULL or the empty string to specify
409 * the default system type. Returns 0 if successful, otherwise a positive
410 * errno value. On success stores a pointer to the datapath in '*dpifp',
411 * otherwise a null pointer. */
efacbce6 412int
1a6f1e2a 413dpif_create_and_open(const char *name, const char *type, struct dpif **dpifp)
efacbce6
BP
414{
415 int error;
416
1a6f1e2a 417 error = dpif_create(name, type, dpifp);
efacbce6 418 if (error == EEXIST || error == EBUSY) {
1a6f1e2a 419 error = dpif_open(name, type, dpifp);
efacbce6
BP
420 if (error) {
421 VLOG_WARN("datapath %s already exists but cannot be opened: %s",
10a89ef0 422 name, ovs_strerror(error));
efacbce6
BP
423 }
424 } else if (error) {
10a89ef0
BP
425 VLOG_WARN("failed to create datapath %s: %s",
426 name, ovs_strerror(error));
efacbce6
BP
427 }
428 return error;
429}
430
96fba48f
BP
431/* Closes and frees the connection to 'dpif'. Does not destroy the datapath
432 * itself; call dpif_delete() first, instead, if that is desirable. */
433void
434dpif_close(struct dpif *dpif)
435{
436 if (dpif) {
5703b15f 437 struct registered_dpif_class *rc;
999401aa 438
5703b15f 439 rc = shash_find_data(&dpif_classes, dpif->dpif_class->type);
999401aa 440 dpif_uninit(dpif, true);
5703b15f 441 dp_class_unref(rc);
064af421
BP
442 }
443}
444
640e1b20 445/* Performs periodic work needed by 'dpif'. */
a36de779 446bool
640e1b20
BP
447dpif_run(struct dpif *dpif)
448{
449 if (dpif->dpif_class->run) {
a36de779 450 return dpif->dpif_class->run(dpif);
640e1b20 451 }
a36de779 452 return false;
640e1b20
BP
453}
454
455/* Arranges for poll_block() to wake up when dp_run() needs to be called for
456 * 'dpif'. */
457void
458dpif_wait(struct dpif *dpif)
459{
460 if (dpif->dpif_class->wait) {
461 dpif->dpif_class->wait(dpif);
462 }
463}
464
1a6f1e2a
JG
465/* Returns the name of datapath 'dpif' prefixed with the type
466 * (for use in log messages). */
b29ba128
BP
467const char *
468dpif_name(const struct dpif *dpif)
469{
1a6f1e2a
JG
470 return dpif->full_name;
471}
472
473/* Returns the name of datapath 'dpif' without the type
474 * (for use in device names). */
475const char *
476dpif_base_name(const struct dpif *dpif)
477{
478 return dpif->base_name;
b29ba128
BP
479}
480
c7a26215
JP
481/* Returns the type of datapath 'dpif'. */
482const char *
483dpif_type(const struct dpif *dpif)
484{
485 return dpif->dpif_class->type;
486}
487
3a225db7
BP
488/* Returns the fully spelled out name for the given datapath 'type'.
489 *
490 * Normalized type string can be compared with strcmp(). Unnormalized type
491 * string might be the same even if they have different spellings. */
492const char *
493dpif_normalize_type(const char *type)
494{
495 return type && type[0] ? type : "system";
496}
497
96fba48f
BP
498/* Destroys the datapath that 'dpif' is connected to, first removing all of its
499 * ports. After calling this function, it does not make sense to pass 'dpif'
500 * to any functions other than dpif_name() or dpif_close(). */
064af421
BP
501int
502dpif_delete(struct dpif *dpif)
503{
96fba48f
BP
504 int error;
505
064af421 506 COVERAGE_INC(dpif_destroy);
96fba48f 507
1acb6baa 508 error = dpif->dpif_class->destroy(dpif);
96fba48f
BP
509 log_operation(dpif, "delete", error);
510 return error;
064af421
BP
511}
512
96fba48f
BP
513/* Retrieves statistics for 'dpif' into 'stats'. Returns 0 if successful,
514 * otherwise a positive errno value. */
064af421 515int
a8d9304d 516dpif_get_dp_stats(const struct dpif *dpif, struct dpif_dp_stats *stats)
064af421 517{
1acb6baa 518 int error = dpif->dpif_class->get_stats(dpif, stats);
96fba48f
BP
519 if (error) {
520 memset(stats, 0, sizeof *stats);
521 }
522 log_operation(dpif, "get_stats", error);
523 return error;
064af421
BP
524}
525
0aeaabc8
JP
526const char *
527dpif_port_open_type(const char *datapath_type, const char *port_type)
528{
5703b15f 529 struct registered_dpif_class *rc;
0aeaabc8
JP
530
531 datapath_type = dpif_normalize_type(datapath_type);
532
97be1538 533 ovs_mutex_lock(&dpif_mutex);
5703b15f
BP
534 rc = shash_find_data(&dpif_classes, datapath_type);
535 if (rc && rc->dpif_class->port_open_type) {
536 port_type = rc->dpif_class->port_open_type(rc->dpif_class, port_type);
0aeaabc8 537 }
97be1538 538 ovs_mutex_unlock(&dpif_mutex);
0aeaabc8 539
5703b15f 540 return port_type;
0aeaabc8
JP
541}
542
232dfa4a 543/* Attempts to add 'netdev' as a port on 'dpif'. If 'port_nop' is
4e022ec0 544 * non-null and its value is not ODPP_NONE, then attempts to use the
232dfa4a
JP
545 * value as the port number.
546 *
547 * If successful, returns 0 and sets '*port_nop' to the new port's port
548 * number (if 'port_nop' is non-null). On failure, returns a positive
4e022ec0 549 * errno value and sets '*port_nop' to ODPP_NONE (if 'port_nop' is
232dfa4a 550 * non-null). */
064af421 551int
4e022ec0 552dpif_port_add(struct dpif *dpif, struct netdev *netdev, odp_port_t *port_nop)
064af421 553{
c3827f61 554 const char *netdev_name = netdev_get_name(netdev);
4e022ec0 555 odp_port_t port_no = ODPP_NONE;
9ee3ae3e 556 int error;
064af421
BP
557
558 COVERAGE_INC(dpif_port_add);
9ee3ae3e 559
232dfa4a
JP
560 if (port_nop) {
561 port_no = *port_nop;
562 }
563
c3827f61 564 error = dpif->dpif_class->port_add(dpif, netdev, &port_no);
9ee3ae3e 565 if (!error) {
9b56fe13 566 VLOG_DBG_RL(&dpmsg_rl, "%s: added %s as port %"PRIu32,
c3827f61 567 dpif_name(dpif), netdev_name, port_no);
32b77c31 568
5119e258
DB
569 if (!dpif_is_internal_port(netdev_get_type(netdev))) {
570
32b77c31
PB
571 struct dpif_port dpif_port;
572
573 dpif_port.type = CONST_CAST(char *, netdev_get_type(netdev));
574 dpif_port.name = CONST_CAST(char *, netdev_name);
575 dpif_port.port_no = port_no;
576 netdev_ports_insert(netdev, DPIF_HMAP_KEY(dpif), &dpif_port);
577 }
064af421 578 } else {
9ee3ae3e 579 VLOG_WARN_RL(&error_rl, "%s: failed to add %s as port: %s",
10a89ef0 580 dpif_name(dpif), netdev_name, ovs_strerror(error));
4e022ec0 581 port_no = ODPP_NONE;
9ee3ae3e
BP
582 }
583 if (port_nop) {
584 *port_nop = port_no;
064af421 585 }
9ee3ae3e 586 return error;
064af421
BP
587}
588
96fba48f
BP
589/* Attempts to remove 'dpif''s port number 'port_no'. Returns 0 if successful,
590 * otherwise a positive errno value. */
064af421 591int
4e022ec0 592dpif_port_del(struct dpif *dpif, odp_port_t port_no)
064af421 593{
96fba48f
BP
594 int error;
595
064af421 596 COVERAGE_INC(dpif_port_del);
96fba48f 597
1acb6baa 598 error = dpif->dpif_class->port_del(dpif, port_no);
a1811296 599 if (!error) {
9b56fe13 600 VLOG_DBG_RL(&dpmsg_rl, "%s: port_del(%"PRIu32")",
a1811296 601 dpif_name(dpif), port_no);
32b77c31
PB
602
603 netdev_ports_remove(port_no, DPIF_HMAP_KEY(dpif));
a1811296
BP
604 } else {
605 log_operation(dpif, "port_del", error);
606 }
96fba48f 607 return error;
064af421
BP
608}
609
4c738a8d
BP
610/* Makes a deep copy of 'src' into 'dst'. */
611void
612dpif_port_clone(struct dpif_port *dst, const struct dpif_port *src)
613{
614 dst->name = xstrdup(src->name);
615 dst->type = xstrdup(src->type);
616 dst->port_no = src->port_no;
617}
618
619/* Frees memory allocated to members of 'dpif_port'.
620 *
621 * Do not call this function on a dpif_port obtained from
622 * dpif_port_dump_next(): that function retains ownership of the data in the
623 * dpif_port. */
624void
625dpif_port_destroy(struct dpif_port *dpif_port)
626{
627 free(dpif_port->name);
628 free(dpif_port->type);
629}
630
4afba28d
JP
631/* Checks if port named 'devname' exists in 'dpif'. If so, returns
632 * true; otherwise, returns false. */
633bool
634dpif_port_exists(const struct dpif *dpif, const char *devname)
635{
636 int error = dpif->dpif_class->port_query_by_name(dpif, devname, NULL);
0f6a066f 637 if (error != 0 && error != ENODEV) {
4afba28d 638 VLOG_WARN_RL(&error_rl, "%s: failed to query port %s: %s",
10a89ef0 639 dpif_name(dpif), devname, ovs_strerror(error));
4afba28d
JP
640 }
641
642 return !error;
643}
644
91364d18
IM
645/* Refreshes configuration of 'dpif's port. */
646int
647dpif_port_set_config(struct dpif *dpif, odp_port_t port_no,
648 const struct smap *cfg)
649{
650 int error = 0;
651
652 if (dpif->dpif_class->port_set_config) {
653 error = dpif->dpif_class->port_set_config(dpif, port_no, cfg);
654 if (error) {
655 log_operation(dpif, "port_set_config", error);
656 }
657 }
658
659 return error;
660}
661
96fba48f
BP
662/* Looks up port number 'port_no' in 'dpif'. On success, returns 0 and
663 * initializes '*port' appropriately; on failure, returns a positive errno
4c738a8d
BP
664 * value.
665 *
0f6a066f
DDP
666 * Retuns ENODEV if the port doesn't exist.
667 *
4c738a8d
BP
668 * The caller owns the data in 'port' and must free it with
669 * dpif_port_destroy() when it is no longer needed. */
064af421 670int
4e022ec0 671dpif_port_query_by_number(const struct dpif *dpif, odp_port_t port_no,
4c738a8d 672 struct dpif_port *port)
064af421 673{
1acb6baa 674 int error = dpif->dpif_class->port_query_by_number(dpif, port_no, port);
96fba48f 675 if (!error) {
9b56fe13 676 VLOG_DBG_RL(&dpmsg_rl, "%s: port %"PRIu32" is device %s",
4c738a8d 677 dpif_name(dpif), port_no, port->name);
064af421 678 } else {
96fba48f 679 memset(port, 0, sizeof *port);
9b56fe13 680 VLOG_WARN_RL(&error_rl, "%s: failed to query port %"PRIu32": %s",
10a89ef0 681 dpif_name(dpif), port_no, ovs_strerror(error));
064af421 682 }
96fba48f 683 return error;
064af421
BP
684}
685
96fba48f
BP
686/* Looks up port named 'devname' in 'dpif'. On success, returns 0 and
687 * initializes '*port' appropriately; on failure, returns a positive errno
4c738a8d
BP
688 * value.
689 *
0f6a066f
DDP
690 * Retuns ENODEV if the port doesn't exist.
691 *
4c738a8d
BP
692 * The caller owns the data in 'port' and must free it with
693 * dpif_port_destroy() when it is no longer needed. */
064af421
BP
694int
695dpif_port_query_by_name(const struct dpif *dpif, const char *devname,
4c738a8d 696 struct dpif_port *port)
064af421 697{
1acb6baa 698 int error = dpif->dpif_class->port_query_by_name(dpif, devname, port);
96fba48f 699 if (!error) {
9b56fe13 700 VLOG_DBG_RL(&dpmsg_rl, "%s: device %s is on port %"PRIu32,
4c738a8d 701 dpif_name(dpif), devname, port->port_no);
064af421 702 } else {
96fba48f
BP
703 memset(port, 0, sizeof *port);
704
0f6a066f 705 /* For ENODEV we use DBG level because the caller is probably
d647f0a7
BP
706 * interested in whether 'dpif' actually has a port 'devname', so that
707 * it's not an issue worth logging if it doesn't. Other errors are
708 * uncommon and more likely to indicate a real problem. */
0f6a066f 709 VLOG_RL(&error_rl, error == ENODEV ? VLL_DBG : VLL_WARN,
d647f0a7 710 "%s: failed to query port %s: %s",
10a89ef0 711 dpif_name(dpif), devname, ovs_strerror(error));
064af421 712 }
96fba48f 713 return error;
064af421
BP
714}
715
1954e6bb
AW
716/* Returns the Netlink PID value to supply in OVS_ACTION_ATTR_USERSPACE
717 * actions as the OVS_USERSPACE_ATTR_PID attribute's value, for use in
718 * flows whose packets arrived on port 'port_no'. In the case where the
719 * provider allocates multiple Netlink PIDs to a single port, it may use
720 * 'hash' to spread load among them. The caller need not use a particular
721 * hash function; a 5-tuple hash is suitable.
722 *
723 * (The datapath implementation might use some different hash function for
724 * distributing packets received via flow misses among PIDs. This means
725 * that packets received via flow misses might be reordered relative to
726 * packets received via userspace actions. This is not ordinarily a
727 * problem.)
98403001 728 *
4e022ec0 729 * A 'port_no' of ODPP_NONE is a special case: it returns a reserved PID, not
625b0720
BP
730 * allocated to any port, that the client may use for special purposes.
731 *
98403001
BP
732 * The return value is only meaningful when DPIF_UC_ACTION has been enabled in
733 * the 'dpif''s listen mask. It is allowed to change when DPIF_UC_ACTION is
734 * disabled and then re-enabled, so a client that does that must be prepared to
735 * update all of the flows that it installed that contain
736 * OVS_ACTION_ATTR_USERSPACE actions. */
737uint32_t
1954e6bb 738dpif_port_get_pid(const struct dpif *dpif, odp_port_t port_no, uint32_t hash)
98403001
BP
739{
740 return (dpif->dpif_class->port_get_pid
1954e6bb 741 ? (dpif->dpif_class->port_get_pid)(dpif, port_no, hash)
98403001
BP
742 : 0);
743}
744
96fba48f
BP
745/* Looks up port number 'port_no' in 'dpif'. On success, returns 0 and copies
746 * the port's name into the 'name_size' bytes in 'name', ensuring that the
747 * result is null-terminated. On failure, returns a positive errno value and
748 * makes 'name' the empty string. */
335562c0 749int
4e022ec0 750dpif_port_get_name(struct dpif *dpif, odp_port_t port_no,
335562c0
BP
751 char *name, size_t name_size)
752{
4c738a8d 753 struct dpif_port port;
335562c0
BP
754 int error;
755
cb22974d 756 ovs_assert(name_size > 0);
335562c0
BP
757
758 error = dpif_port_query_by_number(dpif, port_no, &port);
759 if (!error) {
4c738a8d
BP
760 ovs_strlcpy(name, port.name, name_size);
761 dpif_port_destroy(&port);
335562c0
BP
762 } else {
763 *name = '\0';
764 }
765 return error;
766}
767
b0ec0f27 768/* Initializes 'dump' to begin dumping the ports in a dpif.
96fba48f 769 *
b0ec0f27
BP
770 * This function provides no status indication. An error status for the entire
771 * dump operation is provided when it is completed by calling
772 * dpif_port_dump_done().
773 */
774void
775dpif_port_dump_start(struct dpif_port_dump *dump, const struct dpif *dpif)
776{
777 dump->dpif = dpif;
778 dump->error = dpif->dpif_class->port_dump_start(dpif, &dump->state);
779 log_operation(dpif, "port_dump_start", dump->error);
780}
781
782/* Attempts to retrieve another port from 'dump', which must have been
4c738a8d 783 * initialized with dpif_port_dump_start(). On success, stores a new dpif_port
b0ec0f27 784 * into 'port' and returns true. On failure, returns false.
96fba48f 785 *
b0ec0f27
BP
786 * Failure might indicate an actual error or merely that the last port has been
787 * dumped. An error status for the entire dump operation is provided when it
4c738a8d
BP
788 * is completed by calling dpif_port_dump_done().
789 *
790 * The dpif owns the data stored in 'port'. It will remain valid until at
791 * least the next time 'dump' is passed to dpif_port_dump_next() or
792 * dpif_port_dump_done(). */
b0ec0f27 793bool
4c738a8d 794dpif_port_dump_next(struct dpif_port_dump *dump, struct dpif_port *port)
064af421 795{
b0ec0f27 796 const struct dpif *dpif = dump->dpif;
064af421 797
b0ec0f27
BP
798 if (dump->error) {
799 return false;
800 }
f4ba4c4f 801
b0ec0f27
BP
802 dump->error = dpif->dpif_class->port_dump_next(dpif, dump->state, port);
803 if (dump->error == EOF) {
804 VLOG_DBG_RL(&dpmsg_rl, "%s: dumped all ports", dpif_name(dpif));
805 } else {
806 log_operation(dpif, "port_dump_next", dump->error);
807 }
064af421 808
b0ec0f27
BP
809 if (dump->error) {
810 dpif->dpif_class->port_dump_done(dpif, dump->state);
811 return false;
f4ba4c4f 812 }
b0ec0f27
BP
813 return true;
814}
064af421 815
b0ec0f27
BP
816/* Completes port table dump operation 'dump', which must have been initialized
817 * with dpif_port_dump_start(). Returns 0 if the dump operation was
818 * error-free, otherwise a positive errno value describing the problem. */
819int
820dpif_port_dump_done(struct dpif_port_dump *dump)
821{
822 const struct dpif *dpif = dump->dpif;
823 if (!dump->error) {
824 dump->error = dpif->dpif_class->port_dump_done(dpif, dump->state);
825 log_operation(dpif, "port_dump_done", dump->error);
f4ba4c4f 826 }
b0ec0f27 827 return dump->error == EOF ? 0 : dump->error;
064af421
BP
828}
829
e9e28be3
BP
830/* Polls for changes in the set of ports in 'dpif'. If the set of ports in
831 * 'dpif' has changed, this function does one of the following:
832 *
833 * - Stores the name of the device that was added to or deleted from 'dpif' in
834 * '*devnamep' and returns 0. The caller is responsible for freeing
835 * '*devnamep' (with free()) when it no longer needs it.
836 *
837 * - Returns ENOBUFS and sets '*devnamep' to NULL.
838 *
839 * This function may also return 'false positives', where it returns 0 and
840 * '*devnamep' names a device that was not actually added or deleted or it
841 * returns ENOBUFS without any change.
842 *
843 * Returns EAGAIN if the set of ports in 'dpif' has not changed. May also
844 * return other positive errno values to indicate that something has gone
845 * wrong. */
846int
847dpif_port_poll(const struct dpif *dpif, char **devnamep)
848{
1acb6baa 849 int error = dpif->dpif_class->port_poll(dpif, devnamep);
e9e28be3
BP
850 if (error) {
851 *devnamep = NULL;
852 }
853 return error;
854}
855
856/* Arranges for the poll loop to wake up when port_poll(dpif) will return a
857 * value other than EAGAIN. */
858void
859dpif_port_poll_wait(const struct dpif *dpif)
860{
1acb6baa 861 dpif->dpif_class->port_poll_wait(dpif);
e9e28be3
BP
862}
863
572b7068 864/* Extracts the flow stats for a packet. The 'flow' and 'packet'
a7752d4a
BP
865 * arguments must have been initialized through a call to flow_extract().
866 * 'used' is stored into stats->used. */
572b7068 867void
cf62fa4c 868dpif_flow_stats_extract(const struct flow *flow, const struct dp_packet *packet,
a7752d4a 869 long long int used, struct dpif_flow_stats *stats)
572b7068 870{
e0eecb1c 871 stats->tcp_flags = ntohs(flow->tcp_flags);
cf62fa4c 872 stats->n_bytes = dp_packet_size(packet);
572b7068 873 stats->n_packets = 1;
a7752d4a 874 stats->used = used;
572b7068
BP
875}
876
c97fb132
BP
877/* Appends a human-readable representation of 'stats' to 's'. */
878void
879dpif_flow_stats_format(const struct dpif_flow_stats *stats, struct ds *s)
880{
881 ds_put_format(s, "packets:%"PRIu64", bytes:%"PRIu64", used:",
882 stats->n_packets, stats->n_bytes);
883 if (stats->used) {
884 ds_put_format(s, "%.3fs", (time_msec() - stats->used) / 1000.0);
885 } else {
886 ds_put_format(s, "never");
887 }
7393104d
BP
888 if (stats->tcp_flags) {
889 ds_put_cstr(s, ", flags:");
890 packet_format_tcp_flags(s, stats->tcp_flags);
891 }
c97fb132
BP
892}
893
7af12bd7
JS
894/* Places the hash of the 'key_len' bytes starting at 'key' into '*hash'. */
895void
896dpif_flow_hash(const struct dpif *dpif OVS_UNUSED,
897 const void *key, size_t key_len, ovs_u128 *hash)
898{
899 static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
900 static uint32_t secret;
901
902 if (ovsthread_once_start(&once)) {
903 secret = random_uint32();
904 ovsthread_once_done(&once);
905 }
906 hash_bytes128(key, key_len, secret, hash);
78145f6e 907 uuid_set_bits_v4((struct uuid *)hash);
7af12bd7
JS
908}
909
96fba48f
BP
910/* Deletes all flows from 'dpif'. Returns 0 if successful, otherwise a
911 * positive errno value. */
912int
913dpif_flow_flush(struct dpif *dpif)
064af421 914{
96fba48f
BP
915 int error;
916
917 COVERAGE_INC(dpif_flow_flush);
918
1acb6baa 919 error = dpif->dpif_class->flow_flush(dpif);
96fba48f
BP
920 log_operation(dpif, "flow_flush", error);
921 return error;
064af421
BP
922}
923
2c85851f
JS
924/* Attempts to install 'key' into the datapath, fetches it, then deletes it.
925 * Returns true if the datapath supported installing 'flow', false otherwise.
926 */
927bool
928dpif_probe_feature(struct dpif *dpif, const char *name,
bb71c96e
AZ
929 const struct ofpbuf *key, const struct ofpbuf *actions,
930 const ovs_u128 *ufid)
2c85851f
JS
931{
932 struct dpif_flow flow;
933 struct ofpbuf reply;
934 uint64_t stub[DPIF_FLOW_BUFSIZE / 8];
935 bool enable_feature = false;
936 int error;
bb71c96e
AZ
937 const struct nlattr *nl_actions = actions ? actions->data : NULL;
938 const size_t nl_actions_size = actions ? actions->size : 0;
2c85851f 939
9ab0fce1
JS
940 /* Use DPIF_FP_MODIFY to cover the case where ovs-vswitchd is killed (and
941 * restarted) at just the right time such that feature probes from the
942 * previous run are still present in the datapath. */
943 error = dpif_flow_put(dpif, DPIF_FP_CREATE | DPIF_FP_MODIFY | DPIF_FP_PROBE,
bb71c96e
AZ
944 key->data, key->size, NULL, 0,
945 nl_actions, nl_actions_size,
f5d317a1 946 ufid, NON_PMD_CORE_ID, NULL);
9ab0fce1 947 if (error) {
b52ac659 948 if (error != EINVAL && error != EOVERFLOW) {
2c85851f
JS
949 VLOG_WARN("%s: %s flow probe failed (%s)",
950 dpif_name(dpif), name, ovs_strerror(error));
951 }
952 return false;
953 }
954
955 ofpbuf_use_stack(&reply, &stub, sizeof stub);
6fd6ed71 956 error = dpif_flow_get(dpif, key->data, key->size, ufid,
f5d317a1 957 NON_PMD_CORE_ID, &reply, &flow);
2c85851f 958 if (!error
bdd7ecf5 959 && (!ufid || (flow.ufid_present
2ff8484b 960 && ovs_u128_equals(*ufid, flow.ufid)))) {
2c85851f
JS
961 enable_feature = true;
962 }
963
6fd6ed71 964 error = dpif_flow_del(dpif, key->data, key->size, ufid,
f5d317a1 965 NON_PMD_CORE_ID, NULL);
2c85851f
JS
966 if (error) {
967 VLOG_WARN("%s: failed to delete %s feature probe flow",
968 dpif_name(dpif), name);
969 }
970
971 return enable_feature;
972}
973
6fe09f8c 974/* A dpif_operate() wrapper for performing a single DPIF_OP_FLOW_GET. */
96fba48f 975int
6fe09f8c 976dpif_flow_get(struct dpif *dpif,
70e5ed6f 977 const struct nlattr *key, size_t key_len, const ovs_u128 *ufid,
bd5131ba 978 const unsigned pmd_id, struct ofpbuf *buf, struct dpif_flow *flow)
064af421 979{
6fe09f8c
JS
980 struct dpif_op *opp;
981 struct dpif_op op;
96fba48f 982
6fe09f8c
JS
983 op.type = DPIF_OP_FLOW_GET;
984 op.u.flow_get.key = key;
985 op.u.flow_get.key_len = key_len;
70e5ed6f 986 op.u.flow_get.ufid = ufid;
1c1e46ed 987 op.u.flow_get.pmd_id = pmd_id;
6fe09f8c 988 op.u.flow_get.buffer = buf;
70e5ed6f
JS
989
990 memset(flow, 0, sizeof *flow);
6fe09f8c
JS
991 op.u.flow_get.flow = flow;
992 op.u.flow_get.flow->key = key;
993 op.u.flow_get.flow->key_len = key_len;
96fba48f 994
6fe09f8c
JS
995 opp = &op;
996 dpif_operate(dpif, &opp, 1);
997
998 return op.error;
064af421
BP
999}
1000
1a0c894a 1001/* A dpif_operate() wrapper for performing a single DPIF_OP_FLOW_PUT. */
064af421 1002int
ba25b8f4 1003dpif_flow_put(struct dpif *dpif, enum dpif_flow_put_flags flags,
feebdea2 1004 const struct nlattr *key, size_t key_len,
e6cc0bab 1005 const struct nlattr *mask, size_t mask_len,
feebdea2 1006 const struct nlattr *actions, size_t actions_len,
bd5131ba 1007 const ovs_u128 *ufid, const unsigned pmd_id,
1c1e46ed 1008 struct dpif_flow_stats *stats)
064af421 1009{
1a0c894a
BP
1010 struct dpif_op *opp;
1011 struct dpif_op op;
1012
1013 op.type = DPIF_OP_FLOW_PUT;
1014 op.u.flow_put.flags = flags;
1015 op.u.flow_put.key = key;
1016 op.u.flow_put.key_len = key_len;
1017 op.u.flow_put.mask = mask;
1018 op.u.flow_put.mask_len = mask_len;
1019 op.u.flow_put.actions = actions;
1020 op.u.flow_put.actions_len = actions_len;
70e5ed6f 1021 op.u.flow_put.ufid = ufid;
1c1e46ed 1022 op.u.flow_put.pmd_id = pmd_id;
1a0c894a
BP
1023 op.u.flow_put.stats = stats;
1024
1025 opp = &op;
1026 dpif_operate(dpif, &opp, 1);
1027
1028 return op.error;
064af421
BP
1029}
1030
1a0c894a 1031/* A dpif_operate() wrapper for performing a single DPIF_OP_FLOW_DEL. */
064af421 1032int
feebdea2 1033dpif_flow_del(struct dpif *dpif,
70e5ed6f 1034 const struct nlattr *key, size_t key_len, const ovs_u128 *ufid,
bd5131ba 1035 const unsigned pmd_id, struct dpif_flow_stats *stats)
064af421 1036{
1a0c894a
BP
1037 struct dpif_op *opp;
1038 struct dpif_op op;
1039
1040 op.type = DPIF_OP_FLOW_DEL;
1041 op.u.flow_del.key = key;
1042 op.u.flow_del.key_len = key_len;
70e5ed6f 1043 op.u.flow_del.ufid = ufid;
1c1e46ed 1044 op.u.flow_del.pmd_id = pmd_id;
1a0c894a 1045 op.u.flow_del.stats = stats;
8e1ffd75 1046 op.u.flow_del.terse = false;
f1aa2072 1047
1a0c894a
BP
1048 opp = &op;
1049 dpif_operate(dpif, &opp, 1);
1050
1051 return op.error;
064af421
BP
1052}
1053
ac64794a 1054/* Creates and returns a new 'struct dpif_flow_dump' for iterating through the
64bb477f
JS
1055 * flows in 'dpif'. If 'terse' is true, then only UFID and statistics will
1056 * be returned in the dump. Otherwise, all fields will be returned.
ac64794a
BP
1057 *
1058 * This function always successfully returns a dpif_flow_dump. Error
1059 * reporting is deferred to dpif_flow_dump_destroy(). */
1060struct dpif_flow_dump *
7e8b7199 1061dpif_flow_dump_create(const struct dpif *dpif, bool terse, char *type)
e723fd32 1062{
7e8b7199 1063 return dpif->dpif_class->flow_dump_create(dpif, terse, type);
e723fd32
JS
1064}
1065
ac64794a
BP
1066/* Destroys 'dump', which must have been created with dpif_flow_dump_create().
1067 * All dpif_flow_dump_thread structures previously created for 'dump' must
1068 * previously have been destroyed.
1069 *
1070 * Returns 0 if the dump operation was error-free, otherwise a positive errno
1071 * value describing the problem. */
1072int
1073dpif_flow_dump_destroy(struct dpif_flow_dump *dump)
e723fd32 1074{
ac64794a
BP
1075 const struct dpif *dpif = dump->dpif;
1076 int error = dpif->dpif_class->flow_dump_destroy(dump);
1077 log_operation(dpif, "flow_dump_destroy", error);
1078 return error == EOF ? 0 : error;
e723fd32
JS
1079}
1080
ac64794a
BP
1081/* Returns new thread-local state for use with dpif_flow_dump_next(). */
1082struct dpif_flow_dump_thread *
1083dpif_flow_dump_thread_create(struct dpif_flow_dump *dump)
064af421 1084{
ac64794a 1085 return dump->dpif->dpif_class->flow_dump_thread_create(dump);
064af421
BP
1086}
1087
ac64794a
BP
1088/* Releases 'thread'. */
1089void
1090dpif_flow_dump_thread_destroy(struct dpif_flow_dump_thread *thread)
704a1e09 1091{
ac64794a 1092 thread->dpif->dpif_class->flow_dump_thread_destroy(thread);
704a1e09
BP
1093}
1094
ac64794a
BP
1095/* Attempts to retrieve up to 'max_flows' more flows from 'thread'. Returns 0
1096 * if and only if no flows remained to be retrieved, otherwise a positive
1097 * number reflecting the number of elements in 'flows[]' that were updated.
1098 * The number of flows returned might be less than 'max_flows' because
1099 * fewer than 'max_flows' remained, because this particular datapath does not
1100 * benefit from batching, or because an error occurred partway through
1101 * retrieval. Thus, the caller should continue calling until a 0 return value,
1102 * even if intermediate return values are less than 'max_flows'.
bdeadfdd 1103 *
ac64794a
BP
1104 * No error status is immediately provided. An error status for the entire
1105 * dump operation is provided when it is completed by calling
1106 * dpif_flow_dump_destroy().
bdeadfdd 1107 *
ac64794a
BP
1108 * All of the data stored into 'flows' is owned by the datapath, not by the
1109 * caller, and the caller must not modify or free it. The datapath guarantees
58df55ce
JS
1110 * that it remains accessible and unchanged until the first of:
1111 * - The next call to dpif_flow_dump_next() for 'thread', or
1112 * - The next rcu quiescent period. */
704a1e09 1113int
ac64794a
BP
1114dpif_flow_dump_next(struct dpif_flow_dump_thread *thread,
1115 struct dpif_flow *flows, int max_flows)
704a1e09 1116{
ac64794a
BP
1117 struct dpif *dpif = thread->dpif;
1118 int n;
1119
1120 ovs_assert(max_flows > 0);
1121 n = dpif->dpif_class->flow_dump_next(thread, flows, max_flows);
1122 if (n > 0) {
1123 struct dpif_flow *f;
1124
eff1e5b0
RD
1125 for (f = flows; f < &flows[n]
1126 && should_log_flow_message(&this_module, 0); f++) {
1127 log_flow_message(dpif, 0, &this_module, "flow_dump",
ac64794a 1128 f->key, f->key_len, f->mask, f->mask_len,
70e5ed6f 1129 &f->ufid, &f->stats, f->actions, f->actions_len);
ac64794a
BP
1130 }
1131 } else {
1132 VLOG_DBG_RL(&dpmsg_rl, "%s: dumped all flows", dpif_name(dpif));
1133 }
1134 return n;
064af421
BP
1135}
1136
7fd91025
BP
1137struct dpif_execute_helper_aux {
1138 struct dpif *dpif;
1cceb31b 1139 const struct flow *flow;
7fd91025 1140 int error;
076caa2f 1141 const struct nlattr *meter_action; /* Non-NULL, if have a meter action. */
7fd91025
BP
1142};
1143
09f9da0b
JR
1144/* This is called for actions that need the context of the datapath to be
1145 * meaningful. */
7fd91025 1146static void
1895cc8d 1147dpif_execute_helper_cb(void *aux_, struct dp_packet_batch *packets_,
18b58592 1148 const struct nlattr *action, bool may_steal)
7fd91025 1149{
758c456d 1150 struct dpif_execute_helper_aux *aux = aux_;
09f9da0b 1151 int type = nl_attr_type(action);
1895cc8d 1152 struct dp_packet *packet = packets_->packets[0];
8cbf4f47 1153
1895cc8d 1154 ovs_assert(packets_->count == 1);
758c456d 1155
09f9da0b 1156 switch ((enum ovs_action_attr)type) {
076caa2f
JR
1157 case OVS_ACTION_ATTR_METER:
1158 /* Maintain a pointer to the first meter action seen. */
1159 if (!aux->meter_action) {
1160 aux->meter_action = action;
1161 }
1162 break;
1163
07659514 1164 case OVS_ACTION_ATTR_CT:
09f9da0b 1165 case OVS_ACTION_ATTR_OUTPUT:
a36de779
PS
1166 case OVS_ACTION_ATTR_TUNNEL_PUSH:
1167 case OVS_ACTION_ATTR_TUNNEL_POP:
09f9da0b 1168 case OVS_ACTION_ATTR_USERSPACE:
2b651e44
BP
1169 case OVS_ACTION_ATTR_RECIRC: {
1170 struct dpif_execute execute;
1171 struct ofpbuf execute_actions;
1172 uint64_t stub[256 / 8];
cf62fa4c 1173 struct pkt_metadata *md = &packet->md;
2b651e44 1174
076caa2f
JR
1175 if (flow_tnl_dst_is_set(&md->tunnel) || aux->meter_action) {
1176 ofpbuf_use_stub(&execute_actions, stub, sizeof stub);
1177
1178 if (aux->meter_action) {
1179 const struct nlattr *a = aux->meter_action;
1180
1181 /* XXX: This code collects meter actions since the last action
1182 * execution via the datapath to be executed right before the
1183 * current action that needs to be executed by the datapath.
1184 * This is only an approximation, but better than nothing.
1185 * Fundamentally, we should have a mechanism by which the
1186 * datapath could return the result of the meter action so that
1187 * we could execute them at the right order. */
1188 do {
1189 ofpbuf_put(&execute_actions, a, NLA_ALIGN(a->nla_len));
1190 /* Find next meter action before 'action', if any. */
1191 do {
1192 a = nl_attr_next(a);
1193 } while (a != action &&
1194 nl_attr_type(a) != OVS_ACTION_ATTR_METER);
1195 } while (a != action);
1196 }
1197
2b651e44
BP
1198 /* The Linux kernel datapath throws away the tunnel information
1199 * that we supply as metadata. We have to use a "set" action to
1200 * supply it. */
076caa2f
JR
1201 if (md->tunnel.ip_dst) {
1202 odp_put_tunnel_action(&md->tunnel, &execute_actions);
1203 }
2b651e44
BP
1204 ofpbuf_put(&execute_actions, action, NLA_ALIGN(action->nla_len));
1205
6fd6ed71
PS
1206 execute.actions = execute_actions.data;
1207 execute.actions_len = execute_actions.size;
2b651e44
BP
1208 } else {
1209 execute.actions = action;
1210 execute.actions_len = NLA_ALIGN(action->nla_len);
1211 }
1212
18b58592
AZ
1213 struct dp_packet *clone = NULL;
1214 uint32_t cutlen = dp_packet_get_cutlen(packet);
1215 if (cutlen && (type == OVS_ACTION_ATTR_OUTPUT
1216 || type == OVS_ACTION_ATTR_TUNNEL_PUSH
1217 || type == OVS_ACTION_ATTR_TUNNEL_POP
1218 || type == OVS_ACTION_ATTR_USERSPACE)) {
1219 dp_packet_reset_cutlen(packet);
aaca4fe0 1220 if (!may_steal) {
18b58592 1221 packet = clone = dp_packet_clone(packet);
aaca4fe0 1222 }
aaca4fe0 1223 dp_packet_set_size(packet, dp_packet_size(packet) - cutlen);
aaca4fe0
WT
1224 }
1225
8cbf4f47 1226 execute.packet = packet;
1cceb31b 1227 execute.flow = aux->flow;
758c456d 1228 execute.needs_help = false;
43f9ac0a 1229 execute.probe = false;
27130224 1230 execute.mtu = 0;
1a0c894a 1231 aux->error = dpif_execute(aux->dpif, &execute);
eff1e5b0
RD
1232 log_execute_message(aux->dpif, &this_module, &execute,
1233 true, aux->error);
fc65bafc 1234
18b58592
AZ
1235 dp_packet_delete(clone);
1236
076caa2f 1237 if (flow_tnl_dst_is_set(&md->tunnel) || aux->meter_action) {
2b651e44 1238 ofpbuf_uninit(&execute_actions);
076caa2f
JR
1239
1240 /* Do not re-use the same meters for later output actions. */
1241 aux->meter_action = NULL;
2b651e44 1242 }
09f9da0b 1243 break;
2b651e44 1244 }
758c456d 1245
c6bf49f3 1246 case OVS_ACTION_ATTR_HASH:
09f9da0b
JR
1247 case OVS_ACTION_ATTR_PUSH_VLAN:
1248 case OVS_ACTION_ATTR_POP_VLAN:
1249 case OVS_ACTION_ATTR_PUSH_MPLS:
1250 case OVS_ACTION_ATTR_POP_MPLS:
1251 case OVS_ACTION_ATTR_SET:
6d670e7f 1252 case OVS_ACTION_ATTR_SET_MASKED:
09f9da0b 1253 case OVS_ACTION_ATTR_SAMPLE:
aaca4fe0 1254 case OVS_ACTION_ATTR_TRUNC:
6fcecb85
YY
1255 case OVS_ACTION_ATTR_PUSH_ETH:
1256 case OVS_ACTION_ATTR_POP_ETH:
535e3acf 1257 case OVS_ACTION_ATTR_CLONE:
09f9da0b
JR
1258 case OVS_ACTION_ATTR_UNSPEC:
1259 case __OVS_ACTION_ATTR_MAX:
1260 OVS_NOT_REACHED();
1261 }
7fd91025
BP
1262}
1263
1264/* Executes 'execute' by performing most of the actions in userspace and
1265 * passing the fully constructed packets to 'dpif' for output and userspace
1266 * actions.
1267 *
1268 * This helps with actions that a given 'dpif' doesn't implement directly. */
1269static int
758c456d 1270dpif_execute_with_help(struct dpif *dpif, struct dpif_execute *execute)
7fd91025 1271{
076caa2f 1272 struct dpif_execute_helper_aux aux = {dpif, execute->flow, 0, NULL};
1895cc8d 1273 struct dp_packet_batch pb;
7fd91025
BP
1274
1275 COVERAGE_INC(dpif_execute_with_help);
1276
72c84bc2 1277 dp_packet_batch_init_packet(&pb, execute->packet);
1895cc8d 1278 odp_execute_actions(&aux, &pb, false, execute->actions,
91088554 1279 execute->actions_len, dpif_execute_helper_cb);
7fd91025
BP
1280 return aux.error;
1281}
1282
87e5119b
BP
1283/* Returns true if the datapath needs help executing 'execute'. */
1284static bool
1285dpif_execute_needs_help(const struct dpif_execute *execute)
1286{
1287 return execute->needs_help || nl_attr_oversized(execute->actions_len);
1288}
1289
1a0c894a 1290/* A dpif_operate() wrapper for performing a single DPIF_OP_EXECUTE. */
758c456d
JR
1291int
1292dpif_execute(struct dpif *dpif, struct dpif_execute *execute)
89625d1e 1293{
1a0c894a
BP
1294 if (execute->actions_len) {
1295 struct dpif_op *opp;
1296 struct dpif_op op;
89625d1e 1297
1a0c894a
BP
1298 op.type = DPIF_OP_EXECUTE;
1299 op.u.execute = *execute;
89625d1e 1300
1a0c894a
BP
1301 opp = &op;
1302 dpif_operate(dpif, &opp, 1);
89625d1e 1303
1a0c894a
BP
1304 return op.error;
1305 } else {
1306 return 0;
1307 }
89625d1e
BP
1308}
1309
6bc60024 1310/* Executes each of the 'n_ops' operations in 'ops' on 'dpif', in the order in
1a0c894a
BP
1311 * which they are specified. Places each operation's results in the "output"
1312 * members documented in comments, and 0 in the 'error' member on success or a
1313 * positive errno on failure. */
6bc60024 1314void
c2b565b5 1315dpif_operate(struct dpif *dpif, struct dpif_op **ops, size_t n_ops)
6bc60024 1316{
1a0c894a
BP
1317 while (n_ops > 0) {
1318 size_t chunk;
7fd91025 1319
1a0c894a
BP
1320 /* Count 'chunk', the number of ops that can be executed without
1321 * needing any help. Ops that need help should be rare, so we
1322 * expect this to ordinarily be 'n_ops', that is, all the ops. */
1323 for (chunk = 0; chunk < n_ops; chunk++) {
1324 struct dpif_op *op = ops[chunk];
1325
1326 if (op->type == DPIF_OP_EXECUTE
1327 && dpif_execute_needs_help(&op->u.execute)) {
1328 break;
1329 }
1330 }
7fd91025 1331
1a0c894a
BP
1332 if (chunk) {
1333 /* Execute a chunk full of ops that the dpif provider can
1334 * handle itself, without help. */
1335 size_t i;
7fd91025 1336
1a0c894a 1337 dpif->dpif_class->operate(dpif, ops, chunk);
7fd91025 1338
1a0c894a
BP
1339 for (i = 0; i < chunk; i++) {
1340 struct dpif_op *op = ops[i];
1341 int error = op->error;
7fd91025 1342
1a0c894a
BP
1343 switch (op->type) {
1344 case DPIF_OP_FLOW_PUT: {
1345 struct dpif_flow_put *put = &op->u.flow_put;
7fd91025 1346
1a0c894a 1347 COVERAGE_INC(dpif_flow_put);
eff1e5b0 1348 log_flow_put_message(dpif, &this_module, put, error);
1a0c894a
BP
1349 if (error && put->stats) {
1350 memset(put->stats, 0, sizeof *put->stats);
7fd91025 1351 }
1a0c894a 1352 break;
7fd91025
BP
1353 }
1354
6fe09f8c
JS
1355 case DPIF_OP_FLOW_GET: {
1356 struct dpif_flow_get *get = &op->u.flow_get;
1357
1358 COVERAGE_INC(dpif_flow_get);
6fe09f8c
JS
1359 if (error) {
1360 memset(get->flow, 0, sizeof *get->flow);
1361 }
eff1e5b0 1362 log_flow_get_message(dpif, &this_module, get, error);
72d52166 1363
6fe09f8c
JS
1364 break;
1365 }
1366
1a0c894a
BP
1367 case DPIF_OP_FLOW_DEL: {
1368 struct dpif_flow_del *del = &op->u.flow_del;
7fd91025 1369
1a0c894a 1370 COVERAGE_INC(dpif_flow_del);
eff1e5b0 1371 log_flow_del_message(dpif, &this_module, del, error);
1a0c894a
BP
1372 if (error && del->stats) {
1373 memset(del->stats, 0, sizeof *del->stats);
1374 }
1375 break;
1376 }
f23d2845 1377
1a0c894a
BP
1378 case DPIF_OP_EXECUTE:
1379 COVERAGE_INC(dpif_execute);
eff1e5b0
RD
1380 log_execute_message(dpif, &this_module, &op->u.execute,
1381 false, error);
1a0c894a
BP
1382 break;
1383 }
1384 }
b99d3cee 1385
1a0c894a
BP
1386 ops += chunk;
1387 n_ops -= chunk;
1388 } else {
1389 /* Help the dpif provider to execute one op. */
1390 struct dpif_op *op = ops[0];
b99d3cee 1391
1a0c894a
BP
1392 COVERAGE_INC(dpif_execute);
1393 op->error = dpif_execute_with_help(dpif, &op->u.execute);
1394 ops++;
1395 n_ops--;
6bc60024
BP
1396 }
1397 }
1398}
1399
01545c1a
BP
1400/* Returns a string that represents 'type', for use in log messages. */
1401const char *
1402dpif_upcall_type_to_string(enum dpif_upcall_type type)
1403{
1404 switch (type) {
1405 case DPIF_UC_MISS: return "miss";
1406 case DPIF_UC_ACTION: return "action";
01545c1a
BP
1407 case DPIF_N_UC_TYPES: default: return "<unknown>";
1408 }
1409}
1410
a12b3ead
BP
1411/* Enables or disables receiving packets with dpif_recv() on 'dpif'. Returns 0
1412 * if successful, otherwise a positive errno value.
98403001 1413 *
a12b3ead 1414 * Turning packet receive off and then back on may change the Netlink PID
98403001
BP
1415 * assignments returned by dpif_port_get_pid(). If the client does this, it
1416 * must update all of the flows that have OVS_ACTION_ATTR_USERSPACE actions
1417 * using the new PID assignment. */
8f24562a 1418int
a12b3ead 1419dpif_recv_set(struct dpif *dpif, bool enable)
8f24562a 1420{
6b31e073
RW
1421 int error = 0;
1422
1423 if (dpif->dpif_class->recv_set) {
1424 error = dpif->dpif_class->recv_set(dpif, enable);
1425 log_operation(dpif, "recv_set", error);
1426 }
96fba48f 1427 return error;
8f24562a
BP
1428}
1429
1954e6bb
AW
1430/* Refreshes the poll loops and Netlink sockets associated to each port,
1431 * when the number of upcall handlers (upcall receiving thread) is changed
1432 * to 'n_handlers' and receiving packets for 'dpif' is enabled by
1433 * recv_set().
1434 *
1435 * Since multiple upcall handlers can read upcalls simultaneously from
1436 * 'dpif', each port can have multiple Netlink sockets, one per upcall
1437 * handler. So, handlers_set() is responsible for the following tasks:
1438 *
1439 * When receiving upcall is enabled, extends or creates the
1440 * configuration to support:
1441 *
1442 * - 'n_handlers' Netlink sockets for each port.
1443 *
1444 * - 'n_handlers' poll loops, one for each upcall handler.
1445 *
1446 * - registering the Netlink sockets for the same upcall handler to
1447 * the corresponding poll loop.
1448 *
1449 * Returns 0 if successful, otherwise a positive errno value. */
1450int
1451dpif_handlers_set(struct dpif *dpif, uint32_t n_handlers)
1452{
6b31e073
RW
1453 int error = 0;
1454
1455 if (dpif->dpif_class->handlers_set) {
1456 error = dpif->dpif_class->handlers_set(dpif, n_handlers);
1457 log_operation(dpif, "handlers_set", error);
1458 }
1954e6bb
AW
1459 return error;
1460}
1461
e4e74c3a
AW
1462void
1463dpif_register_dp_purge_cb(struct dpif *dpif, dp_purge_callback *cb, void *aux)
1464{
1465 if (dpif->dpif_class->register_dp_purge_cb) {
1466 dpif->dpif_class->register_dp_purge_cb(dpif, cb, aux);
1467 }
1468}
1469
6b31e073 1470void
623540e4 1471dpif_register_upcall_cb(struct dpif *dpif, upcall_callback *cb, void *aux)
6b31e073
RW
1472{
1473 if (dpif->dpif_class->register_upcall_cb) {
623540e4 1474 dpif->dpif_class->register_upcall_cb(dpif, cb, aux);
6b31e073
RW
1475 }
1476}
1477
1478void
1479dpif_enable_upcall(struct dpif *dpif)
1480{
1481 if (dpif->dpif_class->enable_upcall) {
1482 dpif->dpif_class->enable_upcall(dpif);
1483 }
1484}
1485
1486void
1487dpif_disable_upcall(struct dpif *dpif)
1488{
1489 if (dpif->dpif_class->disable_upcall) {
1490 dpif->dpif_class->disable_upcall(dpif);
1491 }
1492}
1493
1494void
1495dpif_print_packet(struct dpif *dpif, struct dpif_upcall *upcall)
1496{
1497 if (!VLOG_DROP_DBG(&dpmsg_rl)) {
1498 struct ds flow;
1499 char *packet;
1500
2482b0b0 1501 packet = ofp_dp_packet_to_string(&upcall->packet);
6b31e073
RW
1502
1503 ds_init(&flow);
1504 odp_flow_key_format(upcall->key, upcall->key_len, &flow);
1505
1506 VLOG_DBG("%s: %s upcall:\n%s\n%s",
1507 dpif_name(dpif), dpif_upcall_type_to_string(upcall->type),
1508 ds_cstr(&flow), packet);
1509
1510 ds_destroy(&flow);
1511 free(packet);
1512 }
1513}
1514
d4f6865c
DDP
1515/* Pass custom configuration to the datapath implementation. Some of the
1516 * changes can be postponed until dpif_run() is called. */
f2eee189 1517int
d4f6865c 1518dpif_set_config(struct dpif *dpif, const struct smap *cfg)
f2eee189
AW
1519{
1520 int error = 0;
1521
d4f6865c
DDP
1522 if (dpif->dpif_class->set_config) {
1523 error = dpif->dpif_class->set_config(dpif, cfg);
f2eee189 1524 if (error) {
d4f6865c 1525 log_operation(dpif, "set_config", error);
f2eee189
AW
1526 }
1527 }
1528
1529 return error;
1530}
1531
1954e6bb
AW
1532/* Polls for an upcall from 'dpif' for an upcall handler. Since there
1533 * there can be multiple poll loops, 'handler_id' is needed as index to
1534 * identify the corresponding poll loop. If successful, stores the upcall
1535 * into '*upcall', using 'buf' for storage. Should only be called if
1536 * 'recv_set' has been used to enable receiving packets from 'dpif'.
96fba48f 1537 *
da546e07
JR
1538 * 'upcall->key' and 'upcall->userdata' point into data in the caller-provided
1539 * 'buf', so their memory cannot be freed separately from 'buf'.
856081f6 1540 *
837a88dc
JR
1541 * The caller owns the data of 'upcall->packet' and may modify it. If
1542 * packet's headroom is exhausted as it is manipulated, 'upcall->packet'
1543 * will be reallocated. This requires the data of 'upcall->packet' to be
1544 * released with ofpbuf_uninit() before 'upcall' is destroyed. However,
1545 * when an error is returned, the 'upcall->packet' may be uninitialized
1546 * and should not be released.
1547 *
96fba48f 1548 * Returns 0 if successful, otherwise a positive errno value. Returns EAGAIN
856081f6 1549 * if no upcall is immediately available. */
064af421 1550int
1954e6bb
AW
1551dpif_recv(struct dpif *dpif, uint32_t handler_id, struct dpif_upcall *upcall,
1552 struct ofpbuf *buf)
064af421 1553{
6b31e073 1554 int error = EAGAIN;
01545c1a 1555
6b31e073
RW
1556 if (dpif->dpif_class->recv) {
1557 error = dpif->dpif_class->recv(dpif, handler_id, upcall, buf);
1558 if (!error) {
1559 dpif_print_packet(dpif, upcall);
1560 } else if (error != EAGAIN) {
1561 log_operation(dpif, "recv", error);
1562 }
064af421 1563 }
064af421
BP
1564 return error;
1565}
1566
96fba48f 1567/* Discards all messages that would otherwise be received by dpif_recv() on
1ba530f4
BP
1568 * 'dpif'. */
1569void
96fba48f
BP
1570dpif_recv_purge(struct dpif *dpif)
1571{
96fba48f 1572 COVERAGE_INC(dpif_purge);
1ba530f4
BP
1573 if (dpif->dpif_class->recv_purge) {
1574 dpif->dpif_class->recv_purge(dpif);
96fba48f 1575 }
96fba48f
BP
1576}
1577
1954e6bb
AW
1578/* Arranges for the poll loop for an upcall handler to wake up when 'dpif'
1579 * 'dpif' has a message queued to be received with the recv member
1580 * function. Since there can be multiple poll loops, 'handler_id' is
1581 * needed as index to identify the corresponding poll loop. */
064af421 1582void
1954e6bb 1583dpif_recv_wait(struct dpif *dpif, uint32_t handler_id)
064af421 1584{
6b31e073
RW
1585 if (dpif->dpif_class->recv_wait) {
1586 dpif->dpif_class->recv_wait(dpif, handler_id);
1587 }
064af421 1588}
53a4218d 1589
b5cbbcf6
AZ
1590/*
1591 * Return the datapath version. Caller is responsible for freeing
1592 * the string.
1593 */
1594char *
1595dpif_get_dp_version(const struct dpif *dpif)
1596{
1597 char *version = NULL;
1598
1599 if (dpif->dpif_class->get_datapath_version) {
1600 version = dpif->dpif_class->get_datapath_version();
1601 }
1602
1603 return version;
1604}
1605
96fba48f
BP
1606/* Obtains the NetFlow engine type and engine ID for 'dpif' into '*engine_type'
1607 * and '*engine_id', respectively. */
53a4218d
BP
1608void
1609dpif_get_netflow_ids(const struct dpif *dpif,
1610 uint8_t *engine_type, uint8_t *engine_id)
1611{
96fba48f
BP
1612 *engine_type = dpif->netflow_engine_type;
1613 *engine_id = dpif->netflow_engine_id;
1614}
aae51f53
BP
1615
1616/* Translates OpenFlow queue ID 'queue_id' (in host byte order) into a priority
abff858b
PS
1617 * value used for setting packet priority.
1618 * On success, returns 0 and stores the priority into '*priority'.
1619 * On failure, returns a positive errno value and stores 0 into '*priority'. */
aae51f53
BP
1620int
1621dpif_queue_to_priority(const struct dpif *dpif, uint32_t queue_id,
1622 uint32_t *priority)
1623{
1624 int error = (dpif->dpif_class->queue_to_priority
1625 ? dpif->dpif_class->queue_to_priority(dpif, queue_id,
1626 priority)
1627 : EOPNOTSUPP);
1628 if (error) {
1629 *priority = 0;
1630 }
1631 log_operation(dpif, "queue_to_priority", error);
1632 return error;
1633}
96fba48f
BP
1634\f
1635void
1acb6baa
BP
1636dpif_init(struct dpif *dpif, const struct dpif_class *dpif_class,
1637 const char *name,
96fba48f
BP
1638 uint8_t netflow_engine_type, uint8_t netflow_engine_id)
1639{
1acb6baa 1640 dpif->dpif_class = dpif_class;
1a6f1e2a 1641 dpif->base_name = xstrdup(name);
a4af0040 1642 dpif->full_name = xasprintf("%s@%s", dpif_class->type, name);
96fba48f
BP
1643 dpif->netflow_engine_type = netflow_engine_type;
1644 dpif->netflow_engine_id = netflow_engine_id;
1645}
999401aa
JG
1646
1647/* Undoes the results of initialization.
1648 *
1649 * Normally this function only needs to be called from dpif_close().
1650 * However, it may be called by providers due to an error on opening
1651 * that occurs after initialization. It this case dpif_close() would
1652 * never be called. */
1653void
1654dpif_uninit(struct dpif *dpif, bool close)
1655{
1656 char *base_name = dpif->base_name;
1657 char *full_name = dpif->full_name;
1658
1659 if (close) {
a4af0040 1660 dpif->dpif_class->close(dpif);
999401aa
JG
1661 }
1662
1663 free(base_name);
1664 free(full_name);
1665}
96fba48f
BP
1666\f
1667static void
1668log_operation(const struct dpif *dpif, const char *operation, int error)
1669{
1670 if (!error) {
1671 VLOG_DBG_RL(&dpmsg_rl, "%s: %s success", dpif_name(dpif), operation);
90bf1e07 1672 } else if (ofperr_is_valid(error)) {
96fba48f 1673 VLOG_WARN_RL(&error_rl, "%s: %s failed (%s)",
90bf1e07 1674 dpif_name(dpif), operation, ofperr_get_name(error));
71ce9235 1675 } else {
90bf1e07 1676 VLOG_WARN_RL(&error_rl, "%s: %s failed (%s)",
10a89ef0 1677 dpif_name(dpif), operation, ovs_strerror(error));
96fba48f
BP
1678 }
1679}
1680
1681static enum vlog_level
1682flow_message_log_level(int error)
1683{
9b1a48c2
JP
1684 /* If flows arrive in a batch, userspace may push down multiple
1685 * unique flow definitions that overlap when wildcards are applied.
1686 * Kernels that support flow wildcarding will reject these flows as
1687 * duplicates (EEXIST), so lower the log level to debug for these
1688 * types of messages. */
1689 return (error && error != EEXIST) ? VLL_WARN : VLL_DBG;
96fba48f
BP
1690}
1691
1692static bool
eff1e5b0 1693should_log_flow_message(const struct vlog_module *module, int error)
96fba48f 1694{
eff1e5b0 1695 return !vlog_should_drop(module, flow_message_log_level(error),
96fba48f
BP
1696 error ? &error_rl : &dpmsg_rl);
1697}
1698
eff1e5b0
RD
1699void
1700log_flow_message(const struct dpif *dpif, int error,
1701 const struct vlog_module *module,
1702 const char *operation,
36956a7d 1703 const struct nlattr *key, size_t key_len,
61fb711d 1704 const struct nlattr *mask, size_t mask_len,
70e5ed6f 1705 const ovs_u128 *ufid, const struct dpif_flow_stats *stats,
cf22f8cb 1706 const struct nlattr *actions, size_t actions_len)
96fba48f
BP
1707{
1708 struct ds ds = DS_EMPTY_INITIALIZER;
1709 ds_put_format(&ds, "%s: ", dpif_name(dpif));
1710 if (error) {
1711 ds_put_cstr(&ds, "failed to ");
1712 }
1713 ds_put_format(&ds, "%s ", operation);
1714 if (error) {
10a89ef0 1715 ds_put_format(&ds, "(%s) ", ovs_strerror(error));
96fba48f 1716 }
70e5ed6f
JS
1717 if (ufid) {
1718 odp_format_ufid(ufid, &ds);
1719 ds_put_cstr(&ds, " ");
1720 }
0a37839c 1721 odp_flow_format(key, key_len, mask, mask_len, NULL, &ds, true);
96fba48f
BP
1722 if (stats) {
1723 ds_put_cstr(&ds, ", ");
c97fb132 1724 dpif_flow_stats_format(stats, &ds);
96fba48f 1725 }
cdee00fd 1726 if (actions || actions_len) {
96fba48f 1727 ds_put_cstr(&ds, ", actions:");
0722f341 1728 format_odp_actions(&ds, actions, actions_len, NULL);
96fba48f 1729 }
eff1e5b0 1730 vlog(module, flow_message_log_level(error), "%s", ds_cstr(&ds));
96fba48f
BP
1731 ds_destroy(&ds);
1732}
89625d1e 1733
eff1e5b0
RD
1734void
1735log_flow_put_message(const struct dpif *dpif,
1736 const struct vlog_module *module,
1737 const struct dpif_flow_put *put,
89625d1e
BP
1738 int error)
1739{
eff1e5b0
RD
1740 if (should_log_flow_message(module, error)
1741 && !(put->flags & DPIF_FP_PROBE)) {
89625d1e
BP
1742 struct ds s;
1743
1744 ds_init(&s);
1745 ds_put_cstr(&s, "put");
1746 if (put->flags & DPIF_FP_CREATE) {
1747 ds_put_cstr(&s, "[create]");
1748 }
1749 if (put->flags & DPIF_FP_MODIFY) {
1750 ds_put_cstr(&s, "[modify]");
1751 }
1752 if (put->flags & DPIF_FP_ZERO_STATS) {
1753 ds_put_cstr(&s, "[zero]");
1754 }
eff1e5b0 1755 log_flow_message(dpif, error, module, ds_cstr(&s),
61fb711d 1756 put->key, put->key_len, put->mask, put->mask_len,
70e5ed6f
JS
1757 put->ufid, put->stats, put->actions,
1758 put->actions_len);
89625d1e
BP
1759 ds_destroy(&s);
1760 }
1761}
1762
eff1e5b0
RD
1763void
1764log_flow_del_message(const struct dpif *dpif,
1765 const struct vlog_module *module,
1766 const struct dpif_flow_del *del,
b99d3cee
BP
1767 int error)
1768{
eff1e5b0
RD
1769 if (should_log_flow_message(module, error)) {
1770 log_flow_message(dpif, error, module, "flow_del",
1771 del->key, del->key_len,
70e5ed6f
JS
1772 NULL, 0, del->ufid, !error ? del->stats : NULL,
1773 NULL, 0);
b99d3cee
BP
1774 }
1775}
1776
f0fe12fc
BP
1777/* Logs that 'execute' was executed on 'dpif' and completed with errno 'error'
1778 * (0 for success). 'subexecute' should be true if the execution is a result
1779 * of breaking down a larger execution that needed help, false otherwise.
1780 *
1781 *
1782 * XXX In theory, the log message could be deceptive because this function is
1783 * called after the dpif_provider's '->execute' function, which is allowed to
1784 * modify execute->packet and execute->md. In practice, though:
1785 *
93451a0a 1786 * - dpif-netlink doesn't modify execute->packet or execute->md.
f0fe12fc
BP
1787 *
1788 * - dpif-netdev does modify them but it is less likely to have problems
1789 * because it is built into ovs-vswitchd and cannot have version skew,
1790 * etc.
1791 *
1792 * It would still be better to avoid the potential problem. I don't know of a
1793 * good way to do that, though, that isn't expensive. */
eff1e5b0
RD
1794void
1795log_execute_message(const struct dpif *dpif,
1796 const struct vlog_module *module,
1797 const struct dpif_execute *execute,
fc65bafc 1798 bool subexecute, int error)
89625d1e 1799{
43f9ac0a
JR
1800 if (!(error ? VLOG_DROP_WARN(&error_rl) : VLOG_DROP_DBG(&dpmsg_rl))
1801 && !execute->probe) {
89625d1e
BP
1802 struct ds ds = DS_EMPTY_INITIALIZER;
1803 char *packet;
b701bce9
JR
1804 uint64_t stub[1024 / 8];
1805 struct ofpbuf md = OFPBUF_STUB_INITIALIZER(stub);
89625d1e 1806
cf62fa4c 1807 packet = ofp_packet_to_string(dp_packet_data(execute->packet),
2482b0b0
JS
1808 dp_packet_size(execute->packet),
1809 execute->packet->packet_type);
beb75a40 1810 odp_key_from_dp_packet(&md, execute->packet);
fc65bafc
BP
1811 ds_put_format(&ds, "%s: %sexecute ",
1812 dpif_name(dpif),
1813 (subexecute ? "sub-"
1814 : dpif_execute_needs_help(execute) ? "super-"
1815 : ""));
0722f341 1816 format_odp_actions(&ds, execute->actions, execute->actions_len, NULL);
89625d1e 1817 if (error) {
10a89ef0 1818 ds_put_format(&ds, " failed (%s)", ovs_strerror(error));
89625d1e
BP
1819 }
1820 ds_put_format(&ds, " on packet %s", packet);
b701bce9
JR
1821 ds_put_format(&ds, " with metadata ");
1822 odp_flow_format(md.data, md.size, NULL, 0, NULL, &ds, true);
27130224 1823 ds_put_format(&ds, " mtu %d", execute->mtu);
eff1e5b0 1824 vlog(module, error ? VLL_WARN : VLL_DBG, "%s", ds_cstr(&ds));
89625d1e
BP
1825 ds_destroy(&ds);
1826 free(packet);
b701bce9 1827 ofpbuf_uninit(&md);
89625d1e
BP
1828 }
1829}
6fe09f8c 1830
eff1e5b0
RD
1831void
1832log_flow_get_message(const struct dpif *dpif,
1833 const struct vlog_module *module,
1834 const struct dpif_flow_get *get,
6fe09f8c
JS
1835 int error)
1836{
eff1e5b0
RD
1837 if (should_log_flow_message(module, error)) {
1838 log_flow_message(dpif, error, module, "flow_get",
6fe09f8c
JS
1839 get->key, get->key_len,
1840 get->flow->mask, get->flow->mask_len,
70e5ed6f 1841 get->ufid, &get->flow->stats,
6fe09f8c
JS
1842 get->flow->actions, get->flow->actions_len);
1843 }
1844}
a36de779
PS
1845
1846bool
1847dpif_supports_tnl_push_pop(const struct dpif *dpif)
1848{
c4ea7529 1849 return dpif_is_netdev(dpif);
a36de779 1850}
5dddf960
JR
1851
1852/* Meters */
1853void
1854dpif_meter_get_features(const struct dpif *dpif,
1855 struct ofputil_meter_features *features)
1856{
1857 memset(features, 0, sizeof *features);
1858 if (dpif->dpif_class->meter_get_features) {
1859 dpif->dpif_class->meter_get_features(dpif, features);
1860 }
1861}
1862
1863/* Adds or modifies meter identified by 'meter_id' in 'dpif'. If '*meter_id'
1864 * is UINT32_MAX, adds a new meter, otherwise modifies an existing meter.
1865 *
1866 * If meter is successfully added, sets '*meter_id' to the new meter's
1867 * meter number. */
1868int
1869dpif_meter_set(struct dpif *dpif, ofproto_meter_id *meter_id,
1870 struct ofputil_meter_config *config)
1871{
1872 int error;
1873
1874 COVERAGE_INC(dpif_meter_set);
1875
1876 error = dpif->dpif_class->meter_set(dpif, meter_id, config);
1877 if (!error) {
1878 VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" set",
1879 dpif_name(dpif), meter_id->uint32);
1880 } else {
1881 VLOG_WARN_RL(&error_rl, "%s: failed to set DPIF meter %"PRIu32": %s",
1882 dpif_name(dpif), meter_id->uint32, ovs_strerror(error));
1883 meter_id->uint32 = UINT32_MAX;
1884 }
1885 return error;
1886}
1887
1888int
1889dpif_meter_get(const struct dpif *dpif, ofproto_meter_id meter_id,
1890 struct ofputil_meter_stats *stats, uint16_t n_bands)
1891{
1892 int error;
1893
1894 COVERAGE_INC(dpif_meter_get);
1895
1896 error = dpif->dpif_class->meter_get(dpif, meter_id, stats, n_bands);
1897 if (!error) {
1898 VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" get stats",
1899 dpif_name(dpif), meter_id.uint32);
1900 } else {
1901 VLOG_WARN_RL(&error_rl,
1902 "%s: failed to get DPIF meter %"PRIu32" stats: %s",
1903 dpif_name(dpif), meter_id.uint32, ovs_strerror(error));
1904 stats->packet_in_count = ~0;
1905 stats->byte_in_count = ~0;
1906 stats->n_bands = 0;
1907 }
1908 return error;
1909}
1910
1911int
1912dpif_meter_del(struct dpif *dpif, ofproto_meter_id meter_id,
1913 struct ofputil_meter_stats *stats, uint16_t n_bands)
1914{
1915 int error;
1916
1917 COVERAGE_INC(dpif_meter_del);
1918
1919 error = dpif->dpif_class->meter_del(dpif, meter_id, stats, n_bands);
1920 if (!error) {
1921 VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" deleted",
1922 dpif_name(dpif), meter_id.uint32);
1923 } else {
1924 VLOG_WARN_RL(&error_rl,
1925 "%s: failed to delete DPIF meter %"PRIu32": %s",
1926 dpif_name(dpif), meter_id.uint32, ovs_strerror(error));
1927 if (stats) {
1928 stats->packet_in_count = ~0;
1929 stats->byte_in_count = ~0;
1930 stats->n_bands = 0;
1931 }
1932 }
1933 return error;
1934}