]> git.proxmox.com Git - mirror_ovs.git/blame - ofproto/ofproto.c
DESIGN: Document uses for flow cookies.
[mirror_ovs.git] / ofproto / ofproto.c
CommitLineData
064af421 1/*
9075907c 2 * Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks.
43253595 3 * Copyright (c) 2010 Jean Tourrilhes - HP-Labs.
064af421 4 *
a14bc59f
BP
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
064af421 8 *
a14bc59f
BP
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
064af421
BP
16 */
17
18#include <config.h>
19#include "ofproto.h"
20#include <errno.h>
21#include <inttypes.h>
064af421
BP
22#include <stdbool.h>
23#include <stdlib.h>
52a90c29 24#include "bitmap.h"
10a24935 25#include "byte-order.h"
064af421 26#include "classifier.h"
19a87e36 27#include "connmgr.h"
064af421 28#include "coverage.h"
4f2cad2c 29#include "dynamic-string.h"
ca0f572c
BP
30#include "hash.h"
31#include "hmap.h"
254750ce 32#include "meta-flow.h"
064af421 33#include "netdev.h"
09246b99 34#include "nx-match.h"
90bf1e07 35#include "ofp-errors.h"
064af421 36#include "ofp-print.h"
fa37b408 37#include "ofp-util.h"
064af421 38#include "ofpbuf.h"
5bee6e26 39#include "ofproto-provider.h"
064af421
BP
40#include "openflow/nicira-ext.h"
41#include "openflow/openflow.h"
064af421
BP
42#include "packets.h"
43#include "pinsched.h"
44#include "pktbuf.h"
45#include "poll-loop.h"
254750ce 46#include "random.h"
064af421 47#include "shash.h"
b3c01ed3 48#include "sset.h"
064af421 49#include "timeval.h"
c4617b3c 50#include "unaligned.h"
4f2cad2c 51#include "unixctl.h"
5136ce49 52#include "vlog.h"
064af421 53
d98e6007 54VLOG_DEFINE_THIS_MODULE(ofproto);
064af421 55
d76f09ea 56COVERAGE_DEFINE(ofproto_error);
d76f09ea 57COVERAGE_DEFINE(ofproto_flush);
d76f09ea 58COVERAGE_DEFINE(ofproto_no_packet_in);
d76f09ea
BP
59COVERAGE_DEFINE(ofproto_packet_out);
60COVERAGE_DEFINE(ofproto_queue_req);
61COVERAGE_DEFINE(ofproto_recv_openflow);
62COVERAGE_DEFINE(ofproto_reinit_ports);
d76f09ea
BP
63COVERAGE_DEFINE(ofproto_uninstallable);
64COVERAGE_DEFINE(ofproto_update_port);
65
7ee20df1
BP
66enum ofproto_state {
67 S_OPENFLOW, /* Processing OpenFlow commands. */
254750ce 68 S_EVICT, /* Evicting flows from over-limit tables. */
7ee20df1
BP
69 S_FLUSH, /* Deleting all flow table rules. */
70};
71
72enum ofoperation_type {
73 OFOPERATION_ADD,
74 OFOPERATION_DELETE,
75 OFOPERATION_MODIFY
76};
77
78/* A single OpenFlow request can execute any number of operations. The
79 * ofopgroup maintain OpenFlow state common to all of the operations, e.g. the
80 * ofconn to which an error reply should be sent if necessary.
81 *
82 * ofproto initiates some operations internally. These operations are still
83 * assigned to groups but will not have an associated ofconn. */
84struct ofopgroup {
85 struct ofproto *ofproto; /* Owning ofproto. */
86 struct list ofproto_node; /* In ofproto's "pending" list. */
87 struct list ops; /* List of "struct ofoperation"s. */
88
89 /* Data needed to send OpenFlow reply on failure or to send a buffered
90 * packet on success.
91 *
92 * If list_is_empty(ofconn_node) then this ofopgroup never had an
93 * associated ofconn or its ofconn's connection dropped after it initiated
94 * the operation. In the latter case 'ofconn' is a wild pointer that
95 * refers to freed memory, so the 'ofconn' member must be used only if
96 * !list_is_empty(ofconn_node).
97 */
98 struct list ofconn_node; /* In ofconn's list of pending opgroups. */
99 struct ofconn *ofconn; /* ofconn for reply (but see note above). */
100 struct ofp_header *request; /* Original request (truncated at 64 bytes). */
101 uint32_t buffer_id; /* Buffer id from original request. */
102 int error; /* 0 if no error yet, otherwise error code. */
103};
104
7024dffe
BP
105static struct ofopgroup *ofopgroup_create_unattached(struct ofproto *);
106static struct ofopgroup *ofopgroup_create(struct ofproto *, struct ofconn *,
107 const struct ofp_header *,
108 uint32_t buffer_id);
7ee20df1
BP
109static void ofopgroup_submit(struct ofopgroup *);
110static void ofopgroup_destroy(struct ofopgroup *);
111
112/* A single flow table operation. */
113struct ofoperation {
114 struct ofopgroup *group; /* Owning group. */
115 struct list group_node; /* In ofopgroup's "ops" list. */
116 struct hmap_node hmap_node; /* In ofproto's "deletions" hmap. */
117 struct rule *rule; /* Rule being operated upon. */
118 enum ofoperation_type type; /* Type of operation. */
119 int status; /* -1 if pending, otherwise 0 or error code. */
120 struct rule *victim; /* OFOPERATION_ADDING: Replaced rule. */
121 union ofp_action *actions; /* OFOPERATION_MODIFYING: Replaced actions. */
122 int n_actions; /* OFOPERATION_MODIFYING: # of old actions. */
123 ovs_be64 flow_cookie; /* Rule's old flow cookie. */
124};
125
126static void ofoperation_create(struct ofopgroup *, struct rule *,
127 enum ofoperation_type);
128static void ofoperation_destroy(struct ofoperation *);
129
d0918789
BP
130/* oftable. */
131static void oftable_init(struct oftable *);
132static void oftable_destroy(struct oftable *);
878ae780 133
254750ce
BP
134static void oftable_set_name(struct oftable *, const char *name);
135
136static void oftable_disable_eviction(struct oftable *);
137static void oftable_enable_eviction(struct oftable *,
138 const struct mf_subfield *fields,
139 size_t n_fields);
140
d0918789
BP
141static void oftable_remove_rule(struct rule *);
142static struct rule *oftable_replace_rule(struct rule *);
143static void oftable_substitute_rule(struct rule *old, struct rule *new);
064af421 144
254750ce
BP
145/* A set of rules within a single OpenFlow table (oftable) that have the same
146 * values for the oftable's eviction_fields. A rule to be evicted, when one is
147 * needed, is taken from the eviction group that contains the greatest number
148 * of rules.
149 *
150 * An oftable owns any number of eviction groups, each of which contains any
151 * number of rules.
152 *
153 * Membership in an eviction group is imprecise, based on the hash of the
154 * oftable's eviction_fields (in the eviction_group's id_node.hash member).
155 * That is, if two rules have different eviction_fields, but those
156 * eviction_fields hash to the same value, then they will belong to the same
157 * eviction_group anyway.
158 *
159 * (When eviction is not enabled on an oftable, we don't track any eviction
160 * groups, to save time and space.) */
161struct eviction_group {
162 struct hmap_node id_node; /* In oftable's "eviction_groups_by_id". */
163 struct heap_node size_node; /* In oftable's "eviction_groups_by_size". */
164 struct heap rules; /* Contains "struct rule"s. */
165};
166
167static struct rule *choose_rule_to_evict(struct oftable *);
168static void ofproto_evict(struct ofproto *);
169static uint32_t rule_eviction_priority(struct rule *);
f29152ca 170
d0918789
BP
171/* ofport. */
172static void ofport_destroy__(struct ofport *);
173static void ofport_destroy(struct ofport *);
174
175static void update_port(struct ofproto *, const char *devname);
176static int init_ports(struct ofproto *);
177static void reinit_ports(struct ofproto *);
7ee20df1 178
254750ce
BP
179/* rule. */
180static void ofproto_rule_destroy__(struct rule *);
181static void ofproto_rule_send_removed(struct rule *, uint8_t reason);
182static bool rule_is_modifiable(const struct rule *);
183static bool rule_is_hidden(const struct rule *);
184
d0918789 185/* OpenFlow. */
90bf1e07
BP
186static enum ofperr add_flow(struct ofproto *, struct ofconn *,
187 const struct ofputil_flow_mod *,
188 const struct ofp_header *);
254750ce 189static void delete_flow__(struct rule *, struct ofopgroup *);
7ee20df1 190static bool handle_openflow(struct ofconn *, struct ofpbuf *);
90bf1e07
BP
191static enum ofperr handle_flow_mod__(struct ofproto *, struct ofconn *,
192 const struct ofputil_flow_mod *,
d0918789 193 const struct ofp_header *);
f29152ca 194
d0918789
BP
195/* ofproto. */
196static uint64_t pick_datapath_id(const struct ofproto *);
197static uint64_t pick_fallback_dpid(void);
198static void ofproto_destroy__(struct ofproto *);
ada3428f 199static void update_mtu(struct ofproto *, struct ofport *);
f29152ca 200
d0918789 201/* unixctl. */
abe529af 202static void ofproto_unixctl_init(void);
f29152ca 203
abe529af
BP
204/* All registered ofproto classes, in probe order. */
205static const struct ofproto_class **ofproto_classes;
206static size_t n_ofproto_classes;
207static size_t allocated_ofproto_classes;
7aa697dd 208
f797957a 209/* Map from datapath name to struct ofproto, for use by unixctl commands. */
abe529af 210static struct hmap all_ofprotos = HMAP_INITIALIZER(&all_ofprotos);
ebe482fd 211
abe529af 212static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
f29152ca 213
abe529af
BP
214static void
215ofproto_initialize(void)
216{
217 static bool inited;
f29152ca 218
abe529af
BP
219 if (!inited) {
220 inited = true;
221 ofproto_class_register(&ofproto_dpif_class);
222 }
223}
f29152ca 224
abe529af
BP
225/* 'type' should be a normalized datapath type, as returned by
226 * ofproto_normalize_type(). Returns the corresponding ofproto_class
227 * structure, or a null pointer if there is none registered for 'type'. */
228static const struct ofproto_class *
229ofproto_class_find__(const char *type)
230{
231 size_t i;
f29152ca 232
abe529af
BP
233 ofproto_initialize();
234 for (i = 0; i < n_ofproto_classes; i++) {
235 const struct ofproto_class *class = ofproto_classes[i];
236 struct sset types;
237 bool found;
064af421 238
abe529af
BP
239 sset_init(&types);
240 class->enumerate_types(&types);
241 found = sset_contains(&types, type);
242 sset_destroy(&types);
bcf84111 243
abe529af
BP
244 if (found) {
245 return class;
246 }
247 }
248 VLOG_WARN("unknown datapath type %s", type);
249 return NULL;
250}
064af421 251
abe529af
BP
252/* Registers a new ofproto class. After successful registration, new ofprotos
253 * of that type can be created using ofproto_create(). */
254int
255ofproto_class_register(const struct ofproto_class *new_class)
256{
257 size_t i;
7aa697dd 258
abe529af
BP
259 for (i = 0; i < n_ofproto_classes; i++) {
260 if (ofproto_classes[i] == new_class) {
261 return EEXIST;
262 }
263 }
064af421 264
abe529af
BP
265 if (n_ofproto_classes >= allocated_ofproto_classes) {
266 ofproto_classes = x2nrealloc(ofproto_classes,
267 &allocated_ofproto_classes,
268 sizeof *ofproto_classes);
269 }
270 ofproto_classes[n_ofproto_classes++] = new_class;
271 return 0;
272}
064af421 273
abe529af
BP
274/* Unregisters a datapath provider. 'type' must have been previously
275 * registered and not currently be in use by any ofprotos. After
276 * unregistration new datapaths of that type cannot be opened using
277 * ofproto_create(). */
278int
279ofproto_class_unregister(const struct ofproto_class *class)
280{
281 size_t i;
76ce9432 282
abe529af
BP
283 for (i = 0; i < n_ofproto_classes; i++) {
284 if (ofproto_classes[i] == class) {
285 for (i++; i < n_ofproto_classes; i++) {
286 ofproto_classes[i - 1] = ofproto_classes[i];
287 }
288 n_ofproto_classes--;
289 return 0;
290 }
291 }
292 VLOG_WARN("attempted to unregister an ofproto class that is not "
293 "registered");
294 return EAFNOSUPPORT;
295}
4a4cdb3b 296
f79e673f
BP
297/* Clears 'types' and enumerates all registered ofproto types into it. The
298 * caller must first initialize the sset. */
299void
300ofproto_enumerate_types(struct sset *types)
301{
abe529af 302 size_t i;
064af421 303
abe529af
BP
304 ofproto_initialize();
305 for (i = 0; i < n_ofproto_classes; i++) {
306 ofproto_classes[i]->enumerate_types(types);
307 }
f79e673f 308}
064af421 309
f79e673f
BP
310/* Returns the fully spelled out name for the given ofproto 'type'.
311 *
312 * Normalized type string can be compared with strcmp(). Unnormalized type
313 * string might be the same even if they have different spellings. */
314const char *
315ofproto_normalize_type(const char *type)
316{
abe529af 317 return type && type[0] ? type : "system";
f79e673f 318}
064af421 319
f79e673f
BP
320/* Clears 'names' and enumerates the names of all known created ofprotos with
321 * the given 'type'. The caller must first initialize the sset. Returns 0 if
322 * successful, otherwise a positive errno value.
323 *
324 * Some kinds of datapaths might not be practically enumerable. This is not
325 * considered an error. */
326int
327ofproto_enumerate_names(const char *type, struct sset *names)
328{
abe529af
BP
329 const struct ofproto_class *class = ofproto_class_find__(type);
330 return class ? class->enumerate_names(type, names) : EAFNOSUPPORT;
331 }
7aa697dd 332
064af421 333int
abe529af 334ofproto_create(const char *datapath_name, const char *datapath_type,
064af421
BP
335 struct ofproto **ofprotop)
336{
abe529af
BP
337 const struct ofproto_class *class;
338 struct ofproto *ofproto;
064af421
BP
339 int error;
340
341 *ofprotop = NULL;
342
abe529af 343 ofproto_initialize();
7aa697dd
BP
344 ofproto_unixctl_init();
345
abe529af
BP
346 datapath_type = ofproto_normalize_type(datapath_type);
347 class = ofproto_class_find__(datapath_type);
348 if (!class) {
349 VLOG_WARN("could not create datapath %s of unknown type %s",
350 datapath_name, datapath_type);
351 return EAFNOSUPPORT;
064af421
BP
352 }
353
abe529af
BP
354 ofproto = class->alloc();
355 if (!ofproto) {
356 VLOG_ERR("failed to allocate datapath %s of type %s",
357 datapath_name, datapath_type);
358 return ENOMEM;
359 }
360
361 /* Initialize. */
362 memset(ofproto, 0, sizeof *ofproto);
363 ofproto->ofproto_class = class;
364 ofproto->name = xstrdup(datapath_name);
365 ofproto->type = xstrdup(datapath_type);
366 hmap_insert(&all_ofprotos, &ofproto->hmap_node,
367 hash_string(ofproto->name, 0));
368 ofproto->datapath_id = 0;
084f5290
SH
369 ofproto_set_flow_eviction_threshold(ofproto,
370 OFPROTO_FLOW_EVICTON_THRESHOLD_DEFAULT);
8402c74b 371 ofproto->forward_bpdu = false;
abe529af
BP
372 ofproto->fallback_dpid = pick_fallback_dpid();
373 ofproto->mfr_desc = xstrdup(DEFAULT_MFR_DESC);
374 ofproto->hw_desc = xstrdup(DEFAULT_HW_DESC);
375 ofproto->sw_desc = xstrdup(DEFAULT_SW_DESC);
376 ofproto->serial_desc = xstrdup(DEFAULT_SERIAL_DESC);
377 ofproto->dp_desc = xstrdup(DEFAULT_DP_DESC);
7257b535 378 ofproto->frag_handling = OFPC_FRAG_NORMAL;
abe529af
BP
379 hmap_init(&ofproto->ports);
380 shash_init(&ofproto->port_by_name);
6c1491fb
BP
381 ofproto->tables = NULL;
382 ofproto->n_tables = 0;
abe529af 383 ofproto->connmgr = connmgr_create(ofproto, datapath_name, datapath_name);
7ee20df1
BP
384 ofproto->state = S_OPENFLOW;
385 list_init(&ofproto->pending);
dd5616b3 386 ofproto->n_pending = 0;
7ee20df1 387 hmap_init(&ofproto->deletions);
52a90c29
BP
388 ofproto->vlan_bitmap = NULL;
389 ofproto->vlans_changed = false;
ada3428f 390 ofproto->min_mtu = INT_MAX;
abe529af 391
0f5f95a9 392 error = ofproto->ofproto_class->construct(ofproto);
19a87e36 393 if (error) {
abe529af
BP
394 VLOG_ERR("failed to open datapath %s: %s",
395 datapath_name, strerror(error));
396 ofproto_destroy__(ofproto);
19a87e36
BP
397 return error;
398 }
073e2a6f 399
0f5f95a9 400 assert(ofproto->n_tables);
19a87e36 401
abe529af
BP
402 ofproto->datapath_id = pick_datapath_id(ofproto);
403 VLOG_INFO("using datapath ID %016"PRIx64, ofproto->datapath_id);
404 init_ports(ofproto);
7aa697dd 405
abe529af 406 *ofprotop = ofproto;
064af421
BP
407 return 0;
408}
409
0f5f95a9
BP
410void
411ofproto_init_tables(struct ofproto *ofproto, int n_tables)
412{
413 struct oftable *table;
414
415 assert(!ofproto->n_tables);
416 assert(n_tables >= 1 && n_tables <= 255);
417
418 ofproto->n_tables = n_tables;
419 ofproto->tables = xmalloc(n_tables * sizeof *ofproto->tables);
420 OFPROTO_FOR_EACH_TABLE (table, ofproto) {
421 oftable_init(table);
422 }
423}
424
064af421
BP
425void
426ofproto_set_datapath_id(struct ofproto *p, uint64_t datapath_id)
427{
428 uint64_t old_dpid = p->datapath_id;
fa60c019 429 p->datapath_id = datapath_id ? datapath_id : pick_datapath_id(p);
064af421 430 if (p->datapath_id != old_dpid) {
b123cc3c 431 VLOG_INFO("datapath ID changed to %016"PRIx64, p->datapath_id);
76ce9432
BP
432
433 /* Force all active connections to reconnect, since there is no way to
434 * notify a controller that the datapath ID has changed. */
fa05809b 435 ofproto_reconnect_controllers(p);
064af421
BP
436 }
437}
438
76ce9432
BP
439void
440ofproto_set_controllers(struct ofproto *p,
441 const struct ofproto_controller *controllers,
442 size_t n_controllers)
443{
19a87e36 444 connmgr_set_controllers(p->connmgr, controllers, n_controllers);
064af421
BP
445}
446
31681a5d
JP
447void
448ofproto_set_fail_mode(struct ofproto *p, enum ofproto_fail_mode fail_mode)
449{
19a87e36 450 connmgr_set_fail_mode(p->connmgr, fail_mode);
31681a5d
JP
451}
452
fa05809b
BP
453/* Drops the connections between 'ofproto' and all of its controllers, forcing
454 * them to reconnect. */
455void
456ofproto_reconnect_controllers(struct ofproto *ofproto)
457{
19a87e36 458 connmgr_reconnect(ofproto->connmgr);
917e50e1
BP
459}
460
461/* Sets the 'n' TCP port addresses in 'extras' as ones to which 'ofproto''s
462 * in-band control should guarantee access, in the same way that in-band
463 * control guarantees access to OpenFlow controllers. */
464void
465ofproto_set_extra_in_band_remotes(struct ofproto *ofproto,
466 const struct sockaddr_in *extras, size_t n)
467{
19a87e36 468 connmgr_set_extra_in_band_remotes(ofproto->connmgr, extras, n);
917e50e1
BP
469}
470
b1da6250
BP
471/* Sets the OpenFlow queue used by flows set up by in-band control on
472 * 'ofproto' to 'queue_id'. If 'queue_id' is negative, then in-band control
473 * flows will use the default queue. */
474void
475ofproto_set_in_band_queue(struct ofproto *ofproto, int queue_id)
476{
19a87e36 477 connmgr_set_in_band_queue(ofproto->connmgr, queue_id);
b1da6250
BP
478}
479
084f5290
SH
480/* Sets the number of flows at which eviction from the kernel flow table
481 * will occur. */
482void
483ofproto_set_flow_eviction_threshold(struct ofproto *ofproto, unsigned threshold)
484{
485 if (threshold < OFPROTO_FLOW_EVICTION_THRESHOLD_MIN) {
486 ofproto->flow_eviction_threshold = OFPROTO_FLOW_EVICTION_THRESHOLD_MIN;
487 } else {
488 ofproto->flow_eviction_threshold = threshold;
489 }
490}
491
b53055f4 492/* If forward_bpdu is true, the NORMAL action will forward frames with
8402c74b
SS
493 * reserved (e.g. STP) destination Ethernet addresses. if forward_bpdu is false,
494 * the NORMAL action will drop these frames. */
495void
496ofproto_set_forward_bpdu(struct ofproto *ofproto, bool forward_bpdu)
497{
498 bool old_val = ofproto->forward_bpdu;
499 ofproto->forward_bpdu = forward_bpdu;
500 if (old_val != ofproto->forward_bpdu) {
501 if (ofproto->ofproto_class->forward_bpdu_changed) {
502 ofproto->ofproto_class->forward_bpdu_changed(ofproto);
503 }
b53055f4 504 }
8402c74b
SS
505}
506
e764773c
BP
507/* Sets the MAC aging timeout for the OFPP_NORMAL action on 'ofproto' to
508 * 'idle_time', in seconds. */
509void
510ofproto_set_mac_idle_time(struct ofproto *ofproto, unsigned idle_time)
511{
512 if (ofproto->ofproto_class->set_mac_idle_time) {
513 ofproto->ofproto_class->set_mac_idle_time(ofproto, idle_time);
514 }
515}
516
064af421
BP
517void
518ofproto_set_desc(struct ofproto *p,
5a719c38
JP
519 const char *mfr_desc, const char *hw_desc,
520 const char *sw_desc, const char *serial_desc,
8abc4ed7 521 const char *dp_desc)
064af421 522{
5a719c38
JP
523 struct ofp_desc_stats *ods;
524
525 if (mfr_desc) {
526 if (strlen(mfr_desc) >= sizeof ods->mfr_desc) {
527 VLOG_WARN("truncating mfr_desc, must be less than %zu characters",
528 sizeof ods->mfr_desc);
529 }
530 free(p->mfr_desc);
531 p->mfr_desc = xstrdup(mfr_desc);
064af421 532 }
5a719c38
JP
533 if (hw_desc) {
534 if (strlen(hw_desc) >= sizeof ods->hw_desc) {
535 VLOG_WARN("truncating hw_desc, must be less than %zu characters",
536 sizeof ods->hw_desc);
537 }
538 free(p->hw_desc);
539 p->hw_desc = xstrdup(hw_desc);
064af421 540 }
5a719c38
JP
541 if (sw_desc) {
542 if (strlen(sw_desc) >= sizeof ods->sw_desc) {
543 VLOG_WARN("truncating sw_desc, must be less than %zu characters",
544 sizeof ods->sw_desc);
545 }
546 free(p->sw_desc);
547 p->sw_desc = xstrdup(sw_desc);
548 }
549 if (serial_desc) {
550 if (strlen(serial_desc) >= sizeof ods->serial_num) {
551 VLOG_WARN("truncating serial_desc, must be less than %zu "
552 "characters",
553 sizeof ods->serial_num);
554 }
555 free(p->serial_desc);
556 p->serial_desc = xstrdup(serial_desc);
064af421 557 }
8abc4ed7 558 if (dp_desc) {
5a719c38
JP
559 if (strlen(dp_desc) >= sizeof ods->dp_desc) {
560 VLOG_WARN("truncating dp_desc, must be less than %zu characters",
561 sizeof ods->dp_desc);
562 }
8abc4ed7
JP
563 free(p->dp_desc);
564 p->dp_desc = xstrdup(dp_desc);
565 }
064af421
BP
566}
567
064af421 568int
81e2083f 569ofproto_set_snoops(struct ofproto *ofproto, const struct sset *snoops)
064af421 570{
19a87e36 571 return connmgr_set_snoops(ofproto->connmgr, snoops);
064af421
BP
572}
573
574int
0193b2af
JG
575ofproto_set_netflow(struct ofproto *ofproto,
576 const struct netflow_options *nf_options)
064af421 577{
abe529af
BP
578 if (nf_options && sset_is_empty(&nf_options->collectors)) {
579 nf_options = NULL;
580 }
581
582 if (ofproto->ofproto_class->set_netflow) {
583 return ofproto->ofproto_class->set_netflow(ofproto, nf_options);
064af421 584 } else {
abe529af 585 return nf_options ? EOPNOTSUPP : 0;
064af421
BP
586 }
587}
588
abe529af 589int
72b06300
BP
590ofproto_set_sflow(struct ofproto *ofproto,
591 const struct ofproto_sflow_options *oso)
592{
abe529af
BP
593 if (oso && sset_is_empty(&oso->targets)) {
594 oso = NULL;
595 }
72b06300 596
abe529af
BP
597 if (ofproto->ofproto_class->set_sflow) {
598 return ofproto->ofproto_class->set_sflow(ofproto, oso);
72b06300 599 } else {
abe529af 600 return oso ? EOPNOTSUPP : 0;
72b06300
BP
601 }
602}
e7934396 603\f
21f7563c
JP
604/* Spanning Tree Protocol (STP) configuration. */
605
606/* Configures STP on 'ofproto' using the settings defined in 's'. If
607 * 's' is NULL, disables STP.
608 *
609 * Returns 0 if successful, otherwise a positive errno value. */
610int
611ofproto_set_stp(struct ofproto *ofproto,
612 const struct ofproto_stp_settings *s)
613{
614 return (ofproto->ofproto_class->set_stp
615 ? ofproto->ofproto_class->set_stp(ofproto, s)
616 : EOPNOTSUPP);
617}
618
619/* Retrieves STP status of 'ofproto' and stores it in 's'. If the
620 * 'enabled' member of 's' is false, then the other members are not
621 * meaningful.
622 *
623 * Returns 0 if successful, otherwise a positive errno value. */
624int
625ofproto_get_stp_status(struct ofproto *ofproto,
626 struct ofproto_stp_status *s)
627{
628 return (ofproto->ofproto_class->get_stp_status
629 ? ofproto->ofproto_class->get_stp_status(ofproto, s)
630 : EOPNOTSUPP);
631}
632
633/* Configures STP on 'ofp_port' of 'ofproto' using the settings defined
634 * in 's'. The caller is responsible for assigning STP port numbers
635 * (using the 'port_num' member in the range of 1 through 255, inclusive)
636 * and ensuring there are no duplicates. If the 's' is NULL, then STP
637 * is disabled on the port.
638 *
639 * Returns 0 if successful, otherwise a positive errno value.*/
640int
641ofproto_port_set_stp(struct ofproto *ofproto, uint16_t ofp_port,
642 const struct ofproto_port_stp_settings *s)
643{
644 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
645 if (!ofport) {
646 VLOG_WARN("%s: cannot configure STP on nonexistent port %"PRIu16,
647 ofproto->name, ofp_port);
648 return ENODEV;
649 }
650
651 return (ofproto->ofproto_class->set_stp_port
652 ? ofproto->ofproto_class->set_stp_port(ofport, s)
653 : EOPNOTSUPP);
654}
655
656/* Retrieves STP port status of 'ofp_port' on 'ofproto' and stores it in
657 * 's'. If the 'enabled' member in 's' is false, then the other members
658 * are not meaningful.
659 *
660 * Returns 0 if successful, otherwise a positive errno value.*/
661int
662ofproto_port_get_stp_status(struct ofproto *ofproto, uint16_t ofp_port,
663 struct ofproto_port_stp_status *s)
664{
665 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
666 if (!ofport) {
667 VLOG_WARN("%s: cannot get STP status on nonexistent port %"PRIu16,
668 ofproto->name, ofp_port);
669 return ENODEV;
670 }
671
672 return (ofproto->ofproto_class->get_stp_port_status
673 ? ofproto->ofproto_class->get_stp_port_status(ofport, s)
674 : EOPNOTSUPP);
675}
676\f
8b36f51e
EJ
677/* Queue DSCP configuration. */
678
679/* Registers meta-data associated with the 'n_qdscp' Qualities of Service
680 * 'queues' attached to 'ofport'. This data is not intended to be sufficient
681 * to implement QoS. Instead, it is used to implement features which require
682 * knowledge of what queues exist on a port, and some basic information about
683 * them.
684 *
685 * Returns 0 if successful, otherwise a positive errno value. */
686int
687ofproto_port_set_queues(struct ofproto *ofproto, uint16_t ofp_port,
688 const struct ofproto_port_queue *queues,
689 size_t n_queues)
690{
691 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
692
693 if (!ofport) {
694 VLOG_WARN("%s: cannot set queues on nonexistent port %"PRIu16,
695 ofproto->name, ofp_port);
696 return ENODEV;
697 }
698
699 return (ofproto->ofproto_class->set_queues
700 ? ofproto->ofproto_class->set_queues(ofport, queues, n_queues)
701 : EOPNOTSUPP);
702}
703\f
e7934396
BP
704/* Connectivity Fault Management configuration. */
705
892815f5 706/* Clears the CFM configuration from 'ofp_port' on 'ofproto'. */
e7934396 707void
892815f5 708ofproto_port_clear_cfm(struct ofproto *ofproto, uint16_t ofp_port)
e7934396 709{
abe529af
BP
710 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
711 if (ofport && ofproto->ofproto_class->set_cfm) {
a5610457 712 ofproto->ofproto_class->set_cfm(ofport, NULL);
e7934396
BP
713 }
714}
72b06300 715
892815f5 716/* Configures connectivity fault management on 'ofp_port' in 'ofproto'. Takes
93b8df38
EJ
717 * basic configuration from the configuration members in 'cfm', and the remote
718 * maintenance point ID from remote_mpid. Ignores the statistics members of
719 * 'cfm'.
e7934396 720 *
892815f5 721 * This function has no effect if 'ofproto' does not have a port 'ofp_port'. */
e7934396 722void
892815f5 723ofproto_port_set_cfm(struct ofproto *ofproto, uint16_t ofp_port,
a5610457 724 const struct cfm_settings *s)
e7934396
BP
725{
726 struct ofport *ofport;
abe529af 727 int error;
e7934396 728
abe529af 729 ofport = ofproto_get_port(ofproto, ofp_port);
e7934396 730 if (!ofport) {
892815f5
BP
731 VLOG_WARN("%s: cannot configure CFM on nonexistent port %"PRIu16,
732 ofproto->name, ofp_port);
e7934396
BP
733 return;
734 }
735
93b8df38
EJ
736 /* XXX: For configuration simplicity, we only support one remote_mpid
737 * outside of the CFM module. It's not clear if this is the correct long
738 * term solution or not. */
abe529af 739 error = (ofproto->ofproto_class->set_cfm
a5610457 740 ? ofproto->ofproto_class->set_cfm(ofport, s)
abe529af
BP
741 : EOPNOTSUPP);
742 if (error) {
743 VLOG_WARN("%s: CFM configuration on port %"PRIu16" (%s) failed (%s)",
744 ofproto->name, ofp_port, netdev_get_name(ofport->netdev),
745 strerror(error));
e7934396 746 }
e7934396 747}
e7934396 748
fa066f01
BP
749/* Checks the status of LACP negotiation for 'ofp_port' within ofproto.
750 * Returns 1 if LACP partner information for 'ofp_port' is up-to-date,
751 * 0 if LACP partner information is not current (generally indicating a
752 * connectivity problem), or -1 if LACP is not enabled on 'ofp_port'. */
753int
754ofproto_port_is_lacp_current(struct ofproto *ofproto, uint16_t ofp_port)
755{
abe529af
BP
756 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
757 return (ofport && ofproto->ofproto_class->port_is_lacp_current
758 ? ofproto->ofproto_class->port_is_lacp_current(ofport)
fa066f01 759 : -1);
e7934396 760}
e7934396 761\f
fa066f01 762/* Bundles. */
e7934396 763
abe529af
BP
764/* Registers a "bundle" associated with client data pointer 'aux' in 'ofproto'.
765 * A bundle is the same concept as a Port in OVSDB, that is, it consists of one
766 * or more "slave" devices (Interfaces, in OVSDB) along with a VLAN
767 * configuration plus, if there is more than one slave, a bonding
768 * configuration.
769 *
770 * If 'aux' is already registered then this function updates its configuration
771 * to 's'. Otherwise, this function registers a new bundle.
772 *
773 * Bundles only affect the NXAST_AUTOPATH action and output to the OFPP_NORMAL
774 * port. */
775int
776ofproto_bundle_register(struct ofproto *ofproto, void *aux,
777 const struct ofproto_bundle_settings *s)
fa066f01 778{
abe529af
BP
779 return (ofproto->ofproto_class->bundle_set
780 ? ofproto->ofproto_class->bundle_set(ofproto, aux, s)
781 : EOPNOTSUPP);
fa066f01
BP
782}
783
abe529af
BP
784/* Unregisters the bundle registered on 'ofproto' with auxiliary data 'aux'.
785 * If no such bundle has been registered, this has no effect. */
786int
787ofproto_bundle_unregister(struct ofproto *ofproto, void *aux)
e7934396 788{
abe529af 789 return ofproto_bundle_register(ofproto, aux, NULL);
e7934396 790}
fa066f01 791
e7934396 792\f
abe529af
BP
793/* Registers a mirror associated with client data pointer 'aux' in 'ofproto'.
794 * If 'aux' is already registered then this function updates its configuration
c06bba01 795 * to 's'. Otherwise, this function registers a new mirror. */
abe529af
BP
796int
797ofproto_mirror_register(struct ofproto *ofproto, void *aux,
798 const struct ofproto_mirror_settings *s)
064af421 799{
abe529af
BP
800 return (ofproto->ofproto_class->mirror_set
801 ? ofproto->ofproto_class->mirror_set(ofproto, aux, s)
802 : EOPNOTSUPP);
064af421
BP
803}
804
abe529af
BP
805/* Unregisters the mirror registered on 'ofproto' with auxiliary data 'aux'.
806 * If no mirror has been registered, this has no effect. */
807int
808ofproto_mirror_unregister(struct ofproto *ofproto, void *aux)
064af421 809{
abe529af 810 return ofproto_mirror_register(ofproto, aux, NULL);
064af421
BP
811}
812
9d24de3b
JP
813/* Retrieves statistics from mirror associated with client data pointer
814 * 'aux' in 'ofproto'. Stores packet and byte counts in 'packets' and
815 * 'bytes', respectively. If a particular counters is not supported,
816 * the appropriate argument is set to UINT64_MAX. */
817int
818ofproto_mirror_get_stats(struct ofproto *ofproto, void *aux,
819 uint64_t *packets, uint64_t *bytes)
820{
821 if (!ofproto->ofproto_class->mirror_get_stats) {
822 *packets = *bytes = UINT64_MAX;
823 return EOPNOTSUPP;
824 }
825
826 return ofproto->ofproto_class->mirror_get_stats(ofproto, aux,
827 packets, bytes);
828}
829
abe529af
BP
830/* Configures the VLANs whose bits are set to 1 in 'flood_vlans' as VLANs on
831 * which all packets are flooded, instead of using MAC learning. If
832 * 'flood_vlans' is NULL, then MAC learning applies to all VLANs.
833 *
834 * Flood VLANs affect only the treatment of packets output to the OFPP_NORMAL
835 * port. */
836int
837ofproto_set_flood_vlans(struct ofproto *ofproto, unsigned long *flood_vlans)
abdfe474 838{
abe529af
BP
839 return (ofproto->ofproto_class->set_flood_vlans
840 ? ofproto->ofproto_class->set_flood_vlans(ofproto, flood_vlans)
841 : EOPNOTSUPP);
abdfe474
JP
842}
843
abe529af
BP
844/* Returns true if 'aux' is a registered bundle that is currently in use as the
845 * output for a mirror. */
846bool
b4affc74 847ofproto_is_mirror_output_bundle(const struct ofproto *ofproto, void *aux)
abe529af
BP
848{
849 return (ofproto->ofproto_class->is_mirror_output_bundle
850 ? ofproto->ofproto_class->is_mirror_output_bundle(ofproto, aux)
851 : false);
852}
853\f
254750ce
BP
854/* Configuration of OpenFlow tables. */
855
856/* Returns the number of OpenFlow tables in 'ofproto'. */
857int
858ofproto_get_n_tables(const struct ofproto *ofproto)
859{
860 return ofproto->n_tables;
861}
862
863/* Configures the OpenFlow table in 'ofproto' with id 'table_id' with the
864 * settings from 's'. 'table_id' must be in the range 0 through the number of
865 * OpenFlow tables in 'ofproto' minus 1, inclusive.
866 *
867 * For read-only tables, only the name may be configured. */
868void
869ofproto_configure_table(struct ofproto *ofproto, int table_id,
870 const struct ofproto_table_settings *s)
871{
872 struct oftable *table;
873
874 assert(table_id >= 0 && table_id < ofproto->n_tables);
875 table = &ofproto->tables[table_id];
876
877 oftable_set_name(table, s->name);
878
879 if (table->flags & OFTABLE_READONLY) {
880 return;
881 }
882
883 if (s->groups) {
884 oftable_enable_eviction(table, s->groups, s->n_groups);
885 } else {
886 oftable_disable_eviction(table);
887 }
888
889 table->max_flows = s->max_flows;
890 if (classifier_count(&table->cls) > table->max_flows
891 && table->eviction_fields) {
892 /* 'table' contains more flows than allowed. We might not be able to
893 * evict them right away because of the asynchronous nature of flow
894 * table changes. Schedule eviction for later. */
895 switch (ofproto->state) {
896 case S_OPENFLOW:
897 ofproto->state = S_EVICT;
898 break;
899 case S_EVICT:
900 case S_FLUSH:
901 /* We're already deleting flows, nothing more to do. */
902 break;
903 }
904 }
905}
906\f
81e2083f
BP
907bool
908ofproto_has_snoops(const struct ofproto *ofproto)
909{
910 return connmgr_has_snoops(ofproto->connmgr);
911}
912
064af421 913void
81e2083f 914ofproto_get_snoops(const struct ofproto *ofproto, struct sset *snoops)
064af421 915{
19a87e36 916 connmgr_get_snoops(ofproto->connmgr, snoops);
064af421
BP
917}
918
7ee20df1
BP
919static void
920ofproto_flush__(struct ofproto *ofproto)
921{
7ee20df1 922 struct ofopgroup *group;
d0918789 923 struct oftable *table;
7ee20df1
BP
924
925 if (ofproto->ofproto_class->flush) {
926 ofproto->ofproto_class->flush(ofproto);
927 }
928
7024dffe 929 group = ofopgroup_create_unattached(ofproto);
b772ded8 930 OFPROTO_FOR_EACH_TABLE (table, ofproto) {
7ee20df1
BP
931 struct rule *rule, *next_rule;
932 struct cls_cursor cursor;
933
5c67e4af
BP
934 if (table->flags & OFTABLE_HIDDEN) {
935 continue;
936 }
937
d0918789 938 cls_cursor_init(&cursor, &table->cls, NULL);
7ee20df1
BP
939 CLS_CURSOR_FOR_EACH_SAFE (rule, next_rule, cr, &cursor) {
940 if (!rule->pending) {
941 ofoperation_create(group, rule, OFOPERATION_DELETE);
d0918789 942 oftable_remove_rule(rule);
7ee20df1
BP
943 ofproto->ofproto_class->rule_destruct(rule);
944 }
945 }
946 }
947 ofopgroup_submit(group);
948}
949
abe529af
BP
950static void
951ofproto_destroy__(struct ofproto *ofproto)
952{
d0918789 953 struct oftable *table;
6c1491fb 954
7ee20df1 955 assert(list_is_empty(&ofproto->pending));
dd5616b3 956 assert(!ofproto->n_pending);
7ee20df1 957
abe529af 958 connmgr_destroy(ofproto->connmgr);
fa066f01 959
abe529af
BP
960 hmap_remove(&all_ofprotos, &ofproto->hmap_node);
961 free(ofproto->name);
955a7127 962 free(ofproto->type);
abe529af
BP
963 free(ofproto->mfr_desc);
964 free(ofproto->hw_desc);
965 free(ofproto->sw_desc);
966 free(ofproto->serial_desc);
967 free(ofproto->dp_desc);
abe529af
BP
968 hmap_destroy(&ofproto->ports);
969 shash_destroy(&ofproto->port_by_name);
6c1491fb 970
b772ded8 971 OFPROTO_FOR_EACH_TABLE (table, ofproto) {
d0918789 972 oftable_destroy(table);
6c1491fb
BP
973 }
974 free(ofproto->tables);
fa066f01 975
7ee20df1
BP
976 hmap_destroy(&ofproto->deletions);
977
52a90c29
BP
978 free(ofproto->vlan_bitmap);
979
abe529af
BP
980 ofproto->ofproto_class->dealloc(ofproto);
981}
fa066f01 982
064af421
BP
983void
984ofproto_destroy(struct ofproto *p)
985{
ca0f572c 986 struct ofport *ofport, *next_ofport;
064af421
BP
987
988 if (!p) {
989 return;
990 }
991
7ee20df1 992 ofproto_flush__(p);
4e8e4213 993 HMAP_FOR_EACH_SAFE (ofport, next_ofport, hmap_node, &p->ports) {
abe529af 994 ofport_destroy(ofport);
064af421 995 }
064af421 996
abe529af
BP
997 p->ofproto_class->destruct(p);
998 ofproto_destroy__(p);
064af421
BP
999}
1000
abe529af
BP
1001/* Destroys the datapath with the respective 'name' and 'type'. With the Linux
1002 * kernel datapath, for example, this destroys the datapath in the kernel, and
1003 * with the netdev-based datapath, it tears down the data structures that
1004 * represent the datapath.
1005 *
1006 * The datapath should not be currently open as an ofproto. */
064af421 1007int
abe529af 1008ofproto_delete(const char *name, const char *type)
064af421 1009{
abe529af
BP
1010 const struct ofproto_class *class = ofproto_class_find__(type);
1011 return (!class ? EAFNOSUPPORT
1012 : !class->del ? EACCES
1013 : class->del(type, name));
064af421
BP
1014}
1015
e9e28be3
BP
1016static void
1017process_port_change(struct ofproto *ofproto, int error, char *devname)
1018{
1019 if (error == ENOBUFS) {
1020 reinit_ports(ofproto);
1021 } else if (!error) {
1022 update_port(ofproto, devname);
1023 free(devname);
1024 }
1025}
1026
064af421 1027int
abe529af 1028ofproto_run(struct ofproto *p)
064af421 1029{
7436ed80
BP
1030 struct sset changed_netdevs;
1031 const char *changed_netdev;
031d8bff 1032 struct ofport *ofport;
064af421 1033 int error;
064af421 1034
abe529af 1035 error = p->ofproto_class->run(p);
5fcc0d00
BP
1036 if (error && error != EAGAIN) {
1037 VLOG_ERR_RL(&rl, "%s: run failed (%s)", p->name, strerror(error));
149f577a
JG
1038 }
1039
5bf0e941 1040 if (p->ofproto_class->port_poll) {
7436ed80
BP
1041 char *devname;
1042
5bf0e941
BP
1043 while ((error = p->ofproto_class->port_poll(p, &devname)) != EAGAIN) {
1044 process_port_change(p, error, devname);
064af421 1045 }
e9e28be3 1046 }
031d8bff 1047
7436ed80
BP
1048 /* Update OpenFlow port status for any port whose netdev has changed.
1049 *
1050 * Refreshing a given 'ofport' can cause an arbitrary ofport to be
1051 * destroyed, so it's not safe to update ports directly from the
1052 * HMAP_FOR_EACH loop, or even to use HMAP_FOR_EACH_SAFE. Instead, we
1053 * need this two-phase approach. */
1054 sset_init(&changed_netdevs);
031d8bff
EJ
1055 HMAP_FOR_EACH (ofport, hmap_node, &p->ports) {
1056 unsigned int change_seq = netdev_change_seq(ofport->netdev);
1057 if (ofport->change_seq != change_seq) {
1058 ofport->change_seq = change_seq;
7436ed80 1059 sset_add(&changed_netdevs, netdev_get_name(ofport->netdev));
031d8bff 1060 }
064af421 1061 }
7436ed80
BP
1062 SSET_FOR_EACH (changed_netdev, &changed_netdevs) {
1063 update_port(p, changed_netdev);
1064 }
1065 sset_destroy(&changed_netdevs);
064af421 1066
7ee20df1
BP
1067 switch (p->state) {
1068 case S_OPENFLOW:
1069 connmgr_run(p->connmgr, handle_openflow);
1070 break;
1071
254750ce
BP
1072 case S_EVICT:
1073 connmgr_run(p->connmgr, NULL);
1074 ofproto_evict(p);
1075 if (list_is_empty(&p->pending) && hmap_is_empty(&p->deletions)) {
1076 p->state = S_OPENFLOW;
1077 }
1078 break;
1079
7ee20df1
BP
1080 case S_FLUSH:
1081 connmgr_run(p->connmgr, NULL);
1082 ofproto_flush__(p);
1083 if (list_is_empty(&p->pending) && hmap_is_empty(&p->deletions)) {
1084 connmgr_flushed(p->connmgr);
1085 p->state = S_OPENFLOW;
1086 }
1087 break;
1088
1089 default:
1090 NOT_REACHED();
1091 }
064af421 1092
5fcc0d00
BP
1093 return error;
1094}
1095
1096/* Performs periodic activity required by 'ofproto' that needs to be done
1097 * with the least possible latency.
1098 *
1099 * It makes sense to call this function a couple of times per poll loop, to
1100 * provide a significant performance boost on some benchmarks with the
1101 * ofproto-dpif implementation. */
1102int
1103ofproto_run_fast(struct ofproto *p)
1104{
1105 int error;
1106
1107 error = p->ofproto_class->run_fast ? p->ofproto_class->run_fast(p) : 0;
1108 if (error && error != EAGAIN) {
1109 VLOG_ERR_RL(&rl, "%s: fastpath run failed (%s)",
1110 p->name, strerror(error));
1111 }
1112 return error;
064af421
BP
1113}
1114
1115void
1116ofproto_wait(struct ofproto *p)
1117{
031d8bff
EJ
1118 struct ofport *ofport;
1119
abe529af 1120 p->ofproto_class->wait(p);
5bf0e941
BP
1121 if (p->ofproto_class->port_poll_wait) {
1122 p->ofproto_class->port_poll_wait(p);
e7934396 1123 }
031d8bff
EJ
1124
1125 HMAP_FOR_EACH (ofport, hmap_node, &p->ports) {
1126 if (ofport->change_seq != netdev_change_seq(ofport->netdev)) {
1127 poll_immediate_wake();
1128 }
1129 }
7ee20df1
BP
1130
1131 switch (p->state) {
1132 case S_OPENFLOW:
1133 connmgr_wait(p->connmgr, true);
1134 break;
1135
254750ce 1136 case S_EVICT:
7ee20df1
BP
1137 case S_FLUSH:
1138 connmgr_wait(p->connmgr, false);
1139 if (list_is_empty(&p->pending) && hmap_is_empty(&p->deletions)) {
1140 poll_immediate_wake();
1141 }
1142 break;
1143 }
064af421
BP
1144}
1145
064af421
BP
1146bool
1147ofproto_is_alive(const struct ofproto *p)
1148{
19a87e36 1149 return connmgr_has_controllers(p->connmgr);
064af421
BP
1150}
1151
bffc0589 1152void
2cdcb898 1153ofproto_get_ofproto_controller_info(const struct ofproto *ofproto,
bffc0589
AE
1154 struct shash *info)
1155{
19a87e36 1156 connmgr_get_controller_info(ofproto->connmgr, info);
bffc0589
AE
1157}
1158
1159void
1160ofproto_free_ofproto_controller_info(struct shash *info)
1161{
72ba2ed3 1162 connmgr_free_controller_info(info);
bffc0589
AE
1163}
1164
b5827b24
BP
1165/* Makes a deep copy of 'old' into 'port'. */
1166void
1167ofproto_port_clone(struct ofproto_port *port, const struct ofproto_port *old)
1168{
1169 port->name = xstrdup(old->name);
1170 port->type = xstrdup(old->type);
1171 port->ofp_port = old->ofp_port;
1172}
1173
1174/* Frees memory allocated to members of 'ofproto_port'.
3a6ccc8c 1175 *
b5827b24
BP
1176 * Do not call this function on an ofproto_port obtained from
1177 * ofproto_port_dump_next(): that function retains ownership of the data in the
1178 * ofproto_port. */
1179void
1180ofproto_port_destroy(struct ofproto_port *ofproto_port)
1181{
1182 free(ofproto_port->name);
1183 free(ofproto_port->type);
1184}
1185
b5827b24 1186/* Initializes 'dump' to begin dumping the ports in an ofproto.
3a6ccc8c 1187 *
b5827b24
BP
1188 * This function provides no status indication. An error status for the entire
1189 * dump operation is provided when it is completed by calling
1190 * ofproto_port_dump_done().
1191 */
1192void
1193ofproto_port_dump_start(struct ofproto_port_dump *dump,
1194 const struct ofproto *ofproto)
1195{
abe529af
BP
1196 dump->ofproto = ofproto;
1197 dump->error = ofproto->ofproto_class->port_dump_start(ofproto,
1198 &dump->state);
b5827b24
BP
1199}
1200
1201/* Attempts to retrieve another port from 'dump', which must have been created
1202 * with ofproto_port_dump_start(). On success, stores a new ofproto_port into
1203 * 'port' and returns true. On failure, returns false.
1204 *
1205 * Failure might indicate an actual error or merely that the last port has been
1206 * dumped. An error status for the entire dump operation is provided when it
1207 * is completed by calling ofproto_port_dump_done().
1208 *
1209 * The ofproto owns the data stored in 'port'. It will remain valid until at
1210 * least the next time 'dump' is passed to ofproto_port_dump_next() or
1211 * ofproto_port_dump_done(). */
1212bool
1213ofproto_port_dump_next(struct ofproto_port_dump *dump,
1214 struct ofproto_port *port)
1215{
abe529af
BP
1216 const struct ofproto *ofproto = dump->ofproto;
1217
1218 if (dump->error) {
1219 return false;
1220 }
b5827b24 1221
abe529af
BP
1222 dump->error = ofproto->ofproto_class->port_dump_next(ofproto, dump->state,
1223 port);
1224 if (dump->error) {
1225 ofproto->ofproto_class->port_dump_done(ofproto, dump->state);
1226 return false;
b5827b24 1227 }
abe529af 1228 return true;
b5827b24
BP
1229}
1230
1231/* Completes port table dump operation 'dump', which must have been created
1232 * with ofproto_port_dump_start(). Returns 0 if the dump operation was
1233 * error-free, otherwise a positive errno value describing the problem. */
3a6ccc8c 1234int
b5827b24 1235ofproto_port_dump_done(struct ofproto_port_dump *dump)
3a6ccc8c 1236{
abe529af
BP
1237 const struct ofproto *ofproto = dump->ofproto;
1238 if (!dump->error) {
1239 dump->error = ofproto->ofproto_class->port_dump_done(ofproto,
1240 dump->state);
1241 }
1242 return dump->error == EOF ? 0 : dump->error;
b5827b24
BP
1243}
1244
1245/* Attempts to add 'netdev' as a port on 'ofproto'. If successful, returns 0
892815f5 1246 * and sets '*ofp_portp' to the new port's OpenFlow port number (if 'ofp_portp'
b5827b24
BP
1247 * is non-null). On failure, returns a positive errno value and sets
1248 * '*ofp_portp' to OFPP_NONE (if 'ofp_portp' is non-null). */
1249int
1250ofproto_port_add(struct ofproto *ofproto, struct netdev *netdev,
1251 uint16_t *ofp_portp)
1252{
abe529af 1253 uint16_t ofp_port;
3a6ccc8c
BP
1254 int error;
1255
abe529af 1256 error = ofproto->ofproto_class->port_add(ofproto, netdev, &ofp_port);
1fa24dea
BP
1257 if (!error) {
1258 update_port(ofproto, netdev_get_name(netdev));
1259 }
b5827b24 1260 if (ofp_portp) {
abe529af 1261 *ofp_portp = error ? OFPP_NONE : ofp_port;
3a6ccc8c
BP
1262 }
1263 return error;
1264}
1265
b5827b24
BP
1266/* Looks up a port named 'devname' in 'ofproto'. On success, returns 0 and
1267 * initializes '*port' appropriately; on failure, returns a positive errno
1268 * value.
1269 *
abe529af 1270 * The caller owns the data in 'ofproto_port' and must free it with
b5827b24
BP
1271 * ofproto_port_destroy() when it is no longer needed. */
1272int
1273ofproto_port_query_by_name(const struct ofproto *ofproto, const char *devname,
1274 struct ofproto_port *port)
a4e2e1f2 1275{
b5827b24
BP
1276 int error;
1277
abe529af
BP
1278 error = ofproto->ofproto_class->port_query_by_name(ofproto, devname, port);
1279 if (error) {
1280 memset(port, 0, sizeof *port);
b5827b24
BP
1281 }
1282 return error;
a4e2e1f2
EJ
1283}
1284
b5827b24 1285/* Deletes port number 'ofp_port' from the datapath for 'ofproto'.
3a6ccc8c 1286 * Returns 0 if successful, otherwise a positive errno. */
064af421 1287int
b5827b24 1288ofproto_port_del(struct ofproto *ofproto, uint16_t ofp_port)
064af421 1289{
abe529af 1290 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
1264ec95 1291 const char *name = ofport ? netdev_get_name(ofport->netdev) : "<unknown>";
3cf10406 1292 int error;
cdee00fd 1293
abe529af 1294 error = ofproto->ofproto_class->port_del(ofproto, ofp_port);
892815f5 1295 if (!error && ofport) {
1264ec95
BP
1296 /* 'name' is the netdev's name and update_port() is going to close the
1297 * netdev. Just in case update_port() refers to 'name' after it
3a6ccc8c
BP
1298 * destroys 'ofport', make a copy of it around the update_port()
1299 * call. */
1300 char *devname = xstrdup(name);
1301 update_port(ofproto, devname);
1302 free(devname);
3cf10406
BP
1303 }
1304 return error;
064af421
BP
1305}
1306
6c1491fb 1307/* Adds a flow to OpenFlow flow table 0 in 'p' that matches 'cls_rule' and
fa8b054f
BP
1308 * performs the 'n_actions' actions in 'actions'. The new flow will not
1309 * timeout.
1310 *
1311 * If cls_rule->priority is in the range of priorities supported by OpenFlow
1312 * (0...65535, inclusive) then the flow will be visible to OpenFlow
1313 * controllers; otherwise, it will be hidden.
1314 *
6c1491fb
BP
1315 * The caller retains ownership of 'cls_rule' and 'actions'.
1316 *
1317 * This is a helper function for in-band control and fail-open. */
064af421 1318void
7ee20df1 1319ofproto_add_flow(struct ofproto *ofproto, const struct cls_rule *cls_rule,
fa8b054f 1320 const union ofp_action *actions, size_t n_actions)
064af421 1321{
7ee20df1
BP
1322 const struct rule *rule;
1323
1324 rule = rule_from_cls_rule(classifier_find_rule_exactly(
d0918789 1325 &ofproto->tables[0].cls, cls_rule));
7ee20df1
BP
1326 if (!rule || !ofputil_actions_equal(rule->actions, rule->n_actions,
1327 actions, n_actions)) {
a9a2da38 1328 struct ofputil_flow_mod fm;
7ee20df1
BP
1329
1330 memset(&fm, 0, sizeof fm);
1331 fm.cr = *cls_rule;
1332 fm.buffer_id = UINT32_MAX;
1333 fm.actions = (union ofp_action *) actions;
1334 fm.n_actions = n_actions;
1335 add_flow(ofproto, NULL, &fm, NULL);
1336 }
064af421
BP
1337}
1338
75a75043 1339/* Executes the flow modification specified in 'fm'. Returns 0 on success, an
90bf1e07
BP
1340 * OFPERR_* OpenFlow error code on failure, or OFPROTO_POSTPONE if the
1341 * operation cannot be initiated now but may be retried later.
75a75043
BP
1342 *
1343 * This is a helper function for in-band control and fail-open. */
1344int
1345ofproto_flow_mod(struct ofproto *ofproto, const struct ofputil_flow_mod *fm)
1346{
1347 return handle_flow_mod__(ofproto, NULL, fm, NULL);
1348}
1349
6c1491fb
BP
1350/* Searches for a rule with matching criteria exactly equal to 'target' in
1351 * ofproto's table 0 and, if it finds one, deletes it.
1352 *
1353 * This is a helper function for in-band control and fail-open. */
7ee20df1 1354bool
cf3fad8a 1355ofproto_delete_flow(struct ofproto *ofproto, const struct cls_rule *target)
064af421
BP
1356{
1357 struct rule *rule;
1358
6c1491fb 1359 rule = rule_from_cls_rule(classifier_find_rule_exactly(
d0918789 1360 &ofproto->tables[0].cls, target));
7ee20df1
BP
1361 if (!rule) {
1362 /* No such rule -> success. */
1363 return true;
1364 } else if (rule->pending) {
1365 /* An operation on the rule is already pending -> failure.
1366 * Caller must retry later if it's important. */
1367 return false;
1368 } else {
1369 /* Initiate deletion -> success. */
7024dffe 1370 struct ofopgroup *group = ofopgroup_create_unattached(ofproto);
7ee20df1 1371 ofoperation_create(group, rule, OFOPERATION_DELETE);
d0918789 1372 oftable_remove_rule(rule);
254750ce 1373 ofproto->ofproto_class->rule_destruct(rule);
7ee20df1
BP
1374 ofopgroup_submit(group);
1375 return true;
bcf84111 1376 }
5ecc9d81 1377
142e1f5c
BP
1378}
1379
7ee20df1
BP
1380/* Starts the process of deleting all of the flows from all of ofproto's flow
1381 * tables and then reintroducing the flows required by in-band control and
1382 * fail-open. The process will complete in a later call to ofproto_run(). */
142e1f5c
BP
1383void
1384ofproto_flush_flows(struct ofproto *ofproto)
1385{
7ee20df1
BP
1386 COVERAGE_INC(ofproto_flush);
1387 ofproto->state = S_FLUSH;
064af421
BP
1388}
1389\f
1390static void
1391reinit_ports(struct ofproto *p)
1392{
abe529af 1393 struct ofproto_port_dump dump;
b3c01ed3 1394 struct sset devnames;
064af421 1395 struct ofport *ofport;
abe529af 1396 struct ofproto_port ofproto_port;
b3c01ed3 1397 const char *devname;
064af421 1398
898bf89d
JP
1399 COVERAGE_INC(ofproto_reinit_ports);
1400
b3c01ed3 1401 sset_init(&devnames);
4e8e4213 1402 HMAP_FOR_EACH (ofport, hmap_node, &p->ports) {
1264ec95 1403 sset_add(&devnames, netdev_get_name(ofport->netdev));
064af421 1404 }
abe529af
BP
1405 OFPROTO_PORT_FOR_EACH (&ofproto_port, &dump, p) {
1406 sset_add(&devnames, ofproto_port.name);
064af421 1407 }
064af421 1408
b3c01ed3
BP
1409 SSET_FOR_EACH (devname, &devnames) {
1410 update_port(p, devname);
064af421 1411 }
b3c01ed3 1412 sset_destroy(&devnames);
064af421
BP
1413}
1414
abe529af
BP
1415/* Opens and returns a netdev for 'ofproto_port', or a null pointer if the
1416 * netdev cannot be opened. On success, also fills in 'opp'. */
b33951b8 1417static struct netdev *
9e1fd49b
BP
1418ofport_open(const struct ofproto_port *ofproto_port,
1419 struct ofputil_phy_port *pp)
064af421
BP
1420{
1421 enum netdev_flags flags;
064af421 1422 struct netdev *netdev;
064af421
BP
1423 int error;
1424
18812dff 1425 error = netdev_open(ofproto_port->name, ofproto_port->type, &netdev);
064af421
BP
1426 if (error) {
1427 VLOG_WARN_RL(&rl, "ignoring port %s (%"PRIu16") because netdev %s "
1428 "cannot be opened (%s)",
abe529af
BP
1429 ofproto_port->name, ofproto_port->ofp_port,
1430 ofproto_port->name, strerror(error));
064af421
BP
1431 return NULL;
1432 }
1433
9e1fd49b
BP
1434 pp->port_no = ofproto_port->ofp_port;
1435 netdev_get_etheraddr(netdev, pp->hw_addr);
1436 ovs_strlcpy(pp->name, ofproto_port->name, sizeof pp->name);
064af421 1437 netdev_get_flags(netdev, &flags);
9e1fd49b
BP
1438 pp->config = flags & NETDEV_UP ? 0 : OFPUTIL_PC_PORT_DOWN;
1439 pp->state = netdev_get_carrier(netdev) ? 0 : OFPUTIL_PS_LINK_DOWN;
1440 netdev_get_features(netdev, &pp->curr, &pp->advertised,
1441 &pp->supported, &pp->peer);
1442 pp->curr_speed = netdev_features_to_bps(pp->curr);
1443 pp->max_speed = netdev_features_to_bps(pp->supported);
118c4676 1444
b33951b8 1445 return netdev;
064af421
BP
1446}
1447
b33951b8 1448/* Returns true if most fields of 'a' and 'b' are equal. Differences in name,
9e1fd49b 1449 * port number, and 'config' bits other than OFPUTIL_PS_LINK_DOWN are
b33951b8
BP
1450 * disregarded. */
1451static bool
9e1fd49b
BP
1452ofport_equal(const struct ofputil_phy_port *a,
1453 const struct ofputil_phy_port *b)
064af421 1454{
9e1fd49b 1455 return (eth_addr_equals(a->hw_addr, b->hw_addr)
064af421 1456 && a->state == b->state
9e1fd49b 1457 && !((a->config ^ b->config) & OFPUTIL_PC_PORT_DOWN)
064af421
BP
1458 && a->curr == b->curr
1459 && a->advertised == b->advertised
1460 && a->supported == b->supported
9e1fd49b
BP
1461 && a->peer == b->peer
1462 && a->curr_speed == b->curr_speed
1463 && a->max_speed == b->max_speed);
064af421
BP
1464}
1465
b33951b8
BP
1466/* Adds an ofport to 'p' initialized based on the given 'netdev' and 'opp'.
1467 * The caller must ensure that 'p' does not have a conflicting ofport (that is,
1468 * one with the same name or port number). */
064af421 1469static void
b33951b8 1470ofport_install(struct ofproto *p,
9e1fd49b 1471 struct netdev *netdev, const struct ofputil_phy_port *pp)
064af421 1472{
b33951b8
BP
1473 const char *netdev_name = netdev_get_name(netdev);
1474 struct ofport *ofport;
abe529af 1475 int error;
72b06300 1476
b33951b8 1477 /* Create ofport. */
abe529af
BP
1478 ofport = p->ofproto_class->port_alloc();
1479 if (!ofport) {
1480 error = ENOMEM;
1481 goto error;
1482 }
0f7d71a5 1483 ofport->ofproto = p;
b33951b8 1484 ofport->netdev = netdev;
031d8bff 1485 ofport->change_seq = netdev_change_seq(netdev);
9e1fd49b
BP
1486 ofport->pp = *pp;
1487 ofport->ofp_port = pp->port_no;
b33951b8
BP
1488
1489 /* Add port to 'p'. */
abe529af 1490 hmap_insert(&p->ports, &ofport->hmap_node, hash_int(ofport->ofp_port, 0));
72b06300 1491 shash_add(&p->port_by_name, netdev_name, ofport);
abe529af 1492
ada3428f 1493 update_mtu(p, ofport);
9197df76 1494
abe529af
BP
1495 /* Let the ofproto_class initialize its private data. */
1496 error = p->ofproto_class->port_construct(ofport);
1497 if (error) {
1498 goto error;
1499 }
9e1fd49b 1500 connmgr_send_port_status(p->connmgr, pp, OFPPR_ADD);
abe529af
BP
1501 return;
1502
1503error:
1504 VLOG_WARN_RL(&rl, "%s: could not add port %s (%s)",
1505 p->name, netdev_name, strerror(error));
1506 if (ofport) {
1507 ofport_destroy__(ofport);
1508 } else {
1509 netdev_close(netdev);
72b06300 1510 }
064af421
BP
1511}
1512
b33951b8 1513/* Removes 'ofport' from 'p' and destroys it. */
064af421 1514static void
0f7d71a5 1515ofport_remove(struct ofport *ofport)
064af421 1516{
9e1fd49b 1517 connmgr_send_port_status(ofport->ofproto->connmgr, &ofport->pp,
fa066f01 1518 OFPPR_DELETE);
abe529af 1519 ofport_destroy(ofport);
b33951b8
BP
1520}
1521
1522/* If 'ofproto' contains an ofport named 'name', removes it from 'ofproto' and
1523 * destroys it. */
1524static void
1525ofport_remove_with_name(struct ofproto *ofproto, const char *name)
1526{
1527 struct ofport *port = shash_find_data(&ofproto->port_by_name, name);
1528 if (port) {
0f7d71a5 1529 ofport_remove(port);
b33951b8
BP
1530 }
1531}
1532
9e1fd49b 1533/* Updates 'port' with new 'pp' description.
b33951b8
BP
1534 *
1535 * Does not handle a name or port number change. The caller must implement
1536 * such a change as a delete followed by an add. */
1537static void
9e1fd49b 1538ofport_modified(struct ofport *port, struct ofputil_phy_port *pp)
b33951b8 1539{
9e1fd49b
BP
1540 memcpy(port->pp.hw_addr, pp->hw_addr, ETH_ADDR_LEN);
1541 port->pp.config = ((port->pp.config & ~OFPUTIL_PC_PORT_DOWN)
1542 | (pp->config & OFPUTIL_PC_PORT_DOWN));
1543 port->pp.state = pp->state;
1544 port->pp.curr = pp->curr;
1545 port->pp.advertised = pp->advertised;
1546 port->pp.supported = pp->supported;
1547 port->pp.peer = pp->peer;
1548 port->pp.curr_speed = pp->curr_speed;
1549 port->pp.max_speed = pp->max_speed;
b33951b8 1550
9e1fd49b 1551 connmgr_send_port_status(port->ofproto->connmgr, &port->pp, OFPPR_MODIFY);
064af421
BP
1552}
1553
5a2dfd47
JP
1554/* Update OpenFlow 'state' in 'port' and notify controller. */
1555void
9e1fd49b 1556ofproto_port_set_state(struct ofport *port, enum ofputil_port_state state)
5a2dfd47 1557{
9e1fd49b
BP
1558 if (port->pp.state != state) {
1559 port->pp.state = state;
1560 connmgr_send_port_status(port->ofproto->connmgr, &port->pp,
5a2dfd47
JP
1561 OFPPR_MODIFY);
1562 }
1563}
1564
abe529af
BP
1565void
1566ofproto_port_unregister(struct ofproto *ofproto, uint16_t ofp_port)
e7934396 1567{
abe529af
BP
1568 struct ofport *port = ofproto_get_port(ofproto, ofp_port);
1569 if (port) {
52a90c29
BP
1570 if (port->ofproto->ofproto_class->set_realdev) {
1571 port->ofproto->ofproto_class->set_realdev(port, 0, 0);
1572 }
b308140a
JP
1573 if (port->ofproto->ofproto_class->set_stp_port) {
1574 port->ofproto->ofproto_class->set_stp_port(port, NULL);
1575 }
abe529af 1576 if (port->ofproto->ofproto_class->set_cfm) {
a5610457 1577 port->ofproto->ofproto_class->set_cfm(port, NULL);
abe529af
BP
1578 }
1579 if (port->ofproto->ofproto_class->bundle_remove) {
1580 port->ofproto->ofproto_class->bundle_remove(port);
e7934396
BP
1581 }
1582 }
1583}
1584
1585static void
abe529af 1586ofport_destroy__(struct ofport *port)
e7934396 1587{
abe529af
BP
1588 struct ofproto *ofproto = port->ofproto;
1589 const char *name = netdev_get_name(port->netdev);
fa066f01 1590
abe529af
BP
1591 hmap_remove(&ofproto->ports, &port->hmap_node);
1592 shash_delete(&ofproto->port_by_name,
1593 shash_find(&ofproto->port_by_name, name));
fa066f01 1594
abe529af
BP
1595 netdev_close(port->netdev);
1596 ofproto->ofproto_class->port_dealloc(port);
e7934396
BP
1597}
1598
064af421 1599static void
abe529af 1600ofport_destroy(struct ofport *port)
064af421 1601{
fa066f01 1602 if (port) {
abe529af
BP
1603 port->ofproto->ofproto_class->port_destruct(port);
1604 ofport_destroy__(port);
1605 }
064af421
BP
1606}
1607
abe529af
BP
1608struct ofport *
1609ofproto_get_port(const struct ofproto *ofproto, uint16_t ofp_port)
ca0f572c
BP
1610{
1611 struct ofport *port;
1612
4e8e4213 1613 HMAP_FOR_EACH_IN_BUCKET (port, hmap_node,
abe529af
BP
1614 hash_int(ofp_port, 0), &ofproto->ports) {
1615 if (port->ofp_port == ofp_port) {
ca0f572c
BP
1616 return port;
1617 }
1618 }
1619 return NULL;
1620}
1621
6527c598
PS
1622int
1623ofproto_port_get_stats(const struct ofport *port, struct netdev_stats *stats)
1624{
1625 struct ofproto *ofproto = port->ofproto;
1626 int error;
1627
1628 if (ofproto->ofproto_class->port_get_stats) {
1629 error = ofproto->ofproto_class->port_get_stats(port, stats);
1630 } else {
1631 error = EOPNOTSUPP;
1632 }
1633
1634 return error;
1635}
1636
064af421 1637static void
b33951b8 1638update_port(struct ofproto *ofproto, const char *name)
064af421 1639{
abe529af 1640 struct ofproto_port ofproto_port;
9e1fd49b 1641 struct ofputil_phy_port pp;
b33951b8
BP
1642 struct netdev *netdev;
1643 struct ofport *port;
064af421
BP
1644
1645 COVERAGE_INC(ofproto_update_port);
c874dc6d 1646
b33951b8 1647 /* Fetch 'name''s location and properties from the datapath. */
abe529af 1648 netdev = (!ofproto_port_query_by_name(ofproto, name, &ofproto_port)
9e1fd49b 1649 ? ofport_open(&ofproto_port, &pp)
b33951b8
BP
1650 : NULL);
1651 if (netdev) {
abe529af 1652 port = ofproto_get_port(ofproto, ofproto_port.ofp_port);
b33951b8 1653 if (port && !strcmp(netdev_get_name(port->netdev), name)) {
e65942a0
BP
1654 struct netdev *old_netdev = port->netdev;
1655
b33951b8 1656 /* 'name' hasn't changed location. Any properties changed? */
9e1fd49b
BP
1657 if (!ofport_equal(&port->pp, &pp)) {
1658 ofport_modified(port, &pp);
abe529af
BP
1659 }
1660
ada3428f 1661 update_mtu(ofproto, port);
9197df76 1662
e65942a0
BP
1663 /* Install the newly opened netdev in case it has changed.
1664 * Don't close the old netdev yet in case port_modified has to
1665 * remove a retained reference to it.*/
abe529af 1666 port->netdev = netdev;
031d8bff 1667 port->change_seq = netdev_change_seq(netdev);
abe529af
BP
1668
1669 if (port->ofproto->ofproto_class->port_modified) {
1670 port->ofproto->ofproto_class->port_modified(port);
b33951b8 1671 }
e65942a0
BP
1672
1673 netdev_close(old_netdev);
b33951b8
BP
1674 } else {
1675 /* If 'port' is nonnull then its name differs from 'name' and thus
1676 * we should delete it. If we think there's a port named 'name'
1677 * then its port number must be wrong now so delete it too. */
1678 if (port) {
0f7d71a5 1679 ofport_remove(port);
b33951b8
BP
1680 }
1681 ofport_remove_with_name(ofproto, name);
9e1fd49b 1682 ofport_install(ofproto, netdev, &pp);
c874dc6d 1683 }
b33951b8
BP
1684 } else {
1685 /* Any port named 'name' is gone now. */
1686 ofport_remove_with_name(ofproto, name);
c874dc6d 1687 }
abe529af 1688 ofproto_port_destroy(&ofproto_port);
064af421
BP
1689}
1690
1691static int
1692init_ports(struct ofproto *p)
1693{
abe529af
BP
1694 struct ofproto_port_dump dump;
1695 struct ofproto_port ofproto_port;
1696
1697 OFPROTO_PORT_FOR_EACH (&ofproto_port, &dump, p) {
1698 uint16_t ofp_port = ofproto_port.ofp_port;
1699 if (ofproto_get_port(p, ofp_port)) {
1700 VLOG_WARN_RL(&rl, "ignoring duplicate port %"PRIu16" in datapath",
1701 ofp_port);
1702 } else if (shash_find(&p->port_by_name, ofproto_port.name)) {
1703 VLOG_WARN_RL(&rl, "ignoring duplicate device %s in datapath",
1704 ofproto_port.name);
1705 } else {
9e1fd49b 1706 struct ofputil_phy_port pp;
b33951b8
BP
1707 struct netdev *netdev;
1708
9e1fd49b 1709 netdev = ofport_open(&ofproto_port, &pp);
b33951b8 1710 if (netdev) {
9e1fd49b 1711 ofport_install(p, netdev, &pp);
064af421
BP
1712 }
1713 }
1714 }
b0ec0f27 1715
064af421
BP
1716 return 0;
1717}
9197df76
JP
1718
1719/* Find the minimum MTU of all non-datapath devices attached to 'p'.
1720 * Returns ETH_PAYLOAD_MAX or the minimum of the ports. */
1721static int
1722find_min_mtu(struct ofproto *p)
1723{
1724 struct ofport *ofport;
1725 int mtu = 0;
1726
1727 HMAP_FOR_EACH (ofport, hmap_node, &p->ports) {
1728 struct netdev *netdev = ofport->netdev;
1729 int dev_mtu;
1730
1731 /* Skip any internal ports, since that's what we're trying to
1732 * set. */
1733 if (!strcmp(netdev_get_type(netdev), "internal")) {
1734 continue;
1735 }
1736
1737 if (netdev_get_mtu(netdev, &dev_mtu)) {
1738 continue;
1739 }
1740 if (!mtu || dev_mtu < mtu) {
1741 mtu = dev_mtu;
1742 }
1743 }
1744
1745 return mtu ? mtu: ETH_PAYLOAD_MAX;
1746}
1747
ada3428f
PS
1748/* Update MTU of all datapath devices on 'p' to the minimum of the
1749 * non-datapath ports in event of 'port' added or changed. */
9197df76 1750static void
ada3428f 1751update_mtu(struct ofproto *p, struct ofport *port)
9197df76
JP
1752{
1753 struct ofport *ofport;
ada3428f
PS
1754 struct netdev *netdev = port->netdev;
1755 int dev_mtu, old_min;
1756
1757 if (netdev_get_mtu(netdev, &dev_mtu)) {
1758 port->mtu = 0;
1759 return;
1760 }
1761 if (!strcmp(netdev_get_type(port->netdev), "internal")) {
1762 if (dev_mtu > p->min_mtu) {
1763 if (!netdev_set_mtu(port->netdev, p->min_mtu)) {
1764 dev_mtu = p->min_mtu;
1765 }
1766 }
1767 port->mtu = dev_mtu;
1768 return;
1769 }
1770
1771 /* For non-internal port find new min mtu. */
1772 old_min = p->min_mtu;
1773 port->mtu = dev_mtu;
1774 p->min_mtu = find_min_mtu(p);
1775 if (p->min_mtu == old_min) {
1776 return;
1777 }
9197df76
JP
1778
1779 HMAP_FOR_EACH (ofport, hmap_node, &p->ports) {
1780 struct netdev *netdev = ofport->netdev;
1781
1782 if (!strcmp(netdev_get_type(netdev), "internal")) {
ada3428f
PS
1783 if (!netdev_set_mtu(netdev, p->min_mtu)) {
1784 ofport->mtu = p->min_mtu;
1785 }
9197df76
JP
1786 }
1787 }
1788}
064af421 1789\f
064af421 1790static void
abe529af 1791ofproto_rule_destroy__(struct rule *rule)
064af421 1792{
1eae3d33
BP
1793 if (rule) {
1794 free(rule->actions);
1795 rule->ofproto->ofproto_class->rule_dealloc(rule);
1796 }
064af421
BP
1797}
1798
7ee20df1
BP
1799/* This function allows an ofproto implementation to destroy any rules that
1800 * remain when its ->destruct() function is called. The caller must have
1801 * already uninitialized any derived members of 'rule' (step 5 described in the
5bee6e26
JP
1802 * large comment in ofproto/ofproto-provider.h titled "Life Cycle").
1803 * This function implements steps 6 and 7.
7ee20df1
BP
1804 *
1805 * This function should only be called from an ofproto implementation's
1806 * ->destruct() function. It is not suitable elsewhere. */
abe529af
BP
1807void
1808ofproto_rule_destroy(struct rule *rule)
064af421 1809{
7ee20df1 1810 assert(!rule->pending);
d0918789 1811 oftable_remove_rule(rule);
7ee20df1 1812 ofproto_rule_destroy__(rule);
064af421
BP
1813}
1814
bcf84111
BP
1815/* Returns true if 'rule' has an OpenFlow OFPAT_OUTPUT or OFPAT_ENQUEUE action
1816 * that outputs to 'out_port' (output to OFPP_FLOOD and OFPP_ALL doesn't
1817 * count). */
064af421 1818static bool
9ed18e46 1819rule_has_out_port(const struct rule *rule, uint16_t out_port)
064af421
BP
1820{
1821 const union ofp_action *oa;
b4b8c781 1822 size_t left;
064af421 1823
9ed18e46 1824 if (out_port == OFPP_NONE) {
064af421
BP
1825 return true;
1826 }
b4b8c781 1827 OFPUTIL_ACTION_FOR_EACH_UNSAFE (oa, left, rule->actions, rule->n_actions) {
9ed18e46 1828 if (action_outputs_to_port(oa, htons(out_port))) {
064af421
BP
1829 return true;
1830 }
1831 }
1832 return false;
1833}
1834
bcf84111 1835/* Executes the actions indicated by 'rule' on 'packet' and credits 'rule''s
bcf84111
BP
1836 * statistics appropriately. 'packet' must have at least sizeof(struct
1837 * ofp_packet_in) bytes of headroom.
064af421 1838 *
bcf84111
BP
1839 * 'packet' doesn't necessarily have to match 'rule'. 'rule' will be credited
1840 * with statistics for 'packet' either way.
1841 *
1842 * Takes ownership of 'packet'. */
5bf0e941 1843static int
abe529af 1844rule_execute(struct rule *rule, uint16_t in_port, struct ofpbuf *packet)
eedc0097 1845{
bcf84111 1846 struct flow flow;
eedc0097 1847
abe529af 1848 assert(ofpbuf_headroom(packet) >= sizeof(struct ofp_packet_in));
eedc0097 1849
abff858b 1850 flow_extract(packet, 0, 0, in_port, &flow);
5bf0e941 1851 return rule->ofproto->ofproto_class->rule_execute(rule, &flow, packet);
350a665f
BP
1852}
1853
abe529af
BP
1854/* Returns true if 'rule' should be hidden from the controller.
1855 *
1856 * Rules with priority higher than UINT16_MAX are set up by ofproto itself
1857 * (e.g. by in-band control) and are intentionally hidden from the
1858 * controller. */
1859static bool
1860rule_is_hidden(const struct rule *rule)
b6c9e612 1861{
abe529af 1862 return rule->cr.priority > UINT16_MAX;
7b064a79 1863}
5c67e4af
BP
1864
1865static enum oftable_flags
1866rule_get_flags(const struct rule *rule)
1867{
1868 return rule->ofproto->tables[rule->table_id].flags;
1869}
1870
1871static bool
1872rule_is_modifiable(const struct rule *rule)
1873{
1874 return !(rule_get_flags(rule) & OFTABLE_READONLY);
1875}
fa066f01 1876\f
90bf1e07 1877static enum ofperr
d1e2cf21 1878handle_echo_request(struct ofconn *ofconn, const struct ofp_header *oh)
064af421 1879{
b0421aa2 1880 ofconn_send_reply(ofconn, make_echo_reply(oh));
064af421 1881 return 0;
064af421
BP
1882}
1883
90bf1e07 1884static enum ofperr
d1e2cf21 1885handle_features_request(struct ofconn *ofconn, const struct ofp_header *oh)
064af421 1886{
64ff1d96 1887 struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
9e1fd49b 1888 struct ofputil_switch_features features;
064af421 1889 struct ofport *port;
6c1491fb 1890 bool arp_match_ip;
9e1fd49b 1891 struct ofpbuf *b;
064af421 1892
9e1fd49b
BP
1893 ofproto->ofproto_class->get_features(ofproto, &arp_match_ip,
1894 &features.actions);
1895 assert(features.actions & OFPUTIL_A_OUTPUT); /* sanity check */
064af421 1896
9e1fd49b
BP
1897 features.datapath_id = ofproto->datapath_id;
1898 features.n_buffers = pktbuf_capacity();
1899 features.n_tables = ofproto->n_tables;
1900 features.capabilities = (OFPUTIL_C_FLOW_STATS | OFPUTIL_C_TABLE_STATS |
1901 OFPUTIL_C_PORT_STATS | OFPUTIL_C_QUEUE_STATS);
6c1491fb 1902 if (arp_match_ip) {
9e1fd49b 1903 features.capabilities |= OFPUTIL_C_ARP_MATCH_IP;
6c1491fb 1904 }
064af421 1905
9e1fd49b
BP
1906 b = ofputil_encode_switch_features(&features, ofconn_get_protocol(ofconn),
1907 oh->xid);
64ff1d96 1908 HMAP_FOR_EACH (port, hmap_node, &ofproto->ports) {
9e1fd49b 1909 ofputil_put_switch_features_port(&port->pp, b);
064af421 1910 }
064af421 1911
9e1fd49b 1912 ofconn_send_reply(ofconn, b);
064af421
BP
1913 return 0;
1914}
064af421 1915
90bf1e07 1916static enum ofperr
d1e2cf21 1917handle_get_config_request(struct ofconn *ofconn, const struct ofp_header *oh)
064af421 1918{
64ff1d96 1919 struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
064af421 1920 struct ofp_switch_config *osc;
f0fd1a17 1921 enum ofp_config_flags flags;
7257b535 1922 struct ofpbuf *buf;
959a2ecd 1923
064af421
BP
1924 /* Send reply. */
1925 osc = make_openflow_xid(sizeof *osc, OFPT_GET_CONFIG_REPLY, oh->xid, &buf);
f0fd1a17
PS
1926 flags = ofproto->frag_handling;
1927 if (ofconn_get_invalid_ttl_to_controller(ofconn)) {
1928 flags |= OFPC_INVALID_TTL_TO_CONTROLLER;
1929 }
1930 osc->flags = htons(flags);
810605a2 1931 osc->miss_send_len = htons(ofconn_get_miss_send_len(ofconn));
b0421aa2 1932 ofconn_send_reply(ofconn, buf);
2d70a31a 1933
064af421
BP
1934 return 0;
1935}
064af421 1936
90bf1e07 1937static enum ofperr
d1e2cf21 1938handle_set_config(struct ofconn *ofconn, const struct ofp_switch_config *osc)
064af421 1939{
64ff1d96 1940 struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
d1e2cf21 1941 uint16_t flags = ntohs(osc->flags);
2d70a31a 1942
7257b535
BP
1943 if (ofconn_get_type(ofconn) != OFCONN_PRIMARY
1944 || ofconn_get_role(ofconn) != NX_ROLE_SLAVE) {
1945 enum ofp_config_flags cur = ofproto->frag_handling;
1946 enum ofp_config_flags next = flags & OFPC_FRAG_MASK;
1947
1948 assert((cur & OFPC_FRAG_MASK) == cur);
1949 if (cur != next) {
1950 if (ofproto->ofproto_class->set_frag_handling(ofproto, next)) {
1951 ofproto->frag_handling = next;
1952 } else {
1953 VLOG_WARN_RL(&rl, "%s: unsupported fragment handling mode %s",
1954 ofproto->name,
1955 ofputil_frag_handling_to_string(next));
1956 }
064af421
BP
1957 }
1958 }
f0fd1a17 1959 ofconn_set_invalid_ttl_to_controller(ofconn,
05fe1764 1960 (flags & OFPC_INVALID_TTL_TO_CONTROLLER));
ebe482fd 1961
810605a2 1962 ofconn_set_miss_send_len(ofconn, ntohs(osc->miss_send_len));
0ad9b732 1963
064af421 1964 return 0;
064af421
BP
1965}
1966
9deba63b 1967/* Checks whether 'ofconn' is a slave controller. If so, returns an OpenFlow
90bf1e07
BP
1968 * error message code for the caller to propagate upward. Otherwise, returns
1969 * 0.
1970 *
1971 * The log message mentions 'msg_type'. */
1972static enum ofperr
1973reject_slave_controller(struct ofconn *ofconn)
9deba63b 1974{
1ce0a5fa
BP
1975 if (ofconn_get_type(ofconn) == OFCONN_PRIMARY
1976 && ofconn_get_role(ofconn) == NX_ROLE_SLAVE) {
90bf1e07 1977 return OFPERR_OFPBRC_EPERM;
9deba63b
BP
1978 } else {
1979 return 0;
1980 }
1981}
1982
90bf1e07 1983static enum ofperr
c6a93eb7 1984handle_packet_out(struct ofconn *ofconn, const struct ofp_packet_out *opo)
064af421 1985{
64ff1d96 1986 struct ofproto *p = ofconn_get_ofproto(ofconn);
c6a93eb7
BP
1987 struct ofputil_packet_out po;
1988 struct ofpbuf *payload;
ae412e7d 1989 struct flow flow;
90bf1e07 1990 enum ofperr error;
064af421 1991
ac51afaf
BP
1992 COVERAGE_INC(ofproto_packet_out);
1993
76589937 1994 error = reject_slave_controller(ofconn);
9deba63b
BP
1995 if (error) {
1996 return error;
1997 }
1998
c6a93eb7
BP
1999 /* Decode message. */
2000 error = ofputil_decode_packet_out(&po, opo);
064af421
BP
2001 if (error) {
2002 return error;
2003 }
064af421 2004
ac51afaf 2005 /* Get payload. */
c6a93eb7
BP
2006 if (po.buffer_id != UINT32_MAX) {
2007 error = ofconn_pktbuf_retrieve(ofconn, po.buffer_id, &payload, NULL);
2008 if (error || !payload) {
064af421
BP
2009 return error;
2010 }
064af421 2011 } else {
c6a93eb7
BP
2012 payload = xmalloc(sizeof *payload);
2013 ofpbuf_use_const(payload, po.packet, po.packet_len);
e1154f71
BP
2014 }
2015
abe529af 2016 /* Send out packet. */
c6a93eb7
BP
2017 flow_extract(payload, 0, 0, po.in_port, &flow);
2018 error = p->ofproto_class->packet_out(p, payload, &flow,
2019 po.actions, po.n_actions);
2020 ofpbuf_delete(payload);
abe529af
BP
2021
2022 return error;
064af421
BP
2023}
2024
2025static void
9e1fd49b
BP
2026update_port_config(struct ofport *port,
2027 enum ofputil_port_config config,
2028 enum ofputil_port_config mask)
064af421 2029{
9e1fd49b
BP
2030 enum ofputil_port_config old_config = port->pp.config;
2031 enum ofputil_port_config toggle;
abe529af 2032
9e1fd49b
BP
2033 toggle = (config ^ port->pp.config) & mask;
2034 if (toggle & OFPUTIL_PC_PORT_DOWN) {
2035 if (config & OFPUTIL_PC_PORT_DOWN) {
064af421
BP
2036 netdev_turn_flags_off(port->netdev, NETDEV_UP, true);
2037 } else {
2038 netdev_turn_flags_on(port->netdev, NETDEV_UP, true);
2039 }
9e1fd49b 2040 toggle &= ~OFPUTIL_PC_PORT_DOWN;
064af421 2041 }
abe529af 2042
9e1fd49b
BP
2043 port->pp.config ^= toggle;
2044 if (port->pp.config != old_config) {
abe529af 2045 port->ofproto->ofproto_class->port_reconfigured(port, old_config);
064af421
BP
2046 }
2047}
2048
90bf1e07 2049static enum ofperr
d1e2cf21 2050handle_port_mod(struct ofconn *ofconn, const struct ofp_header *oh)
064af421 2051{
64ff1d96 2052 struct ofproto *p = ofconn_get_ofproto(ofconn);
9e1fd49b 2053 struct ofputil_port_mod pm;
064af421 2054 struct ofport *port;
9e1fd49b 2055 enum ofperr error;
064af421 2056
76589937 2057 error = reject_slave_controller(ofconn);
9deba63b
BP
2058 if (error) {
2059 return error;
2060 }
064af421 2061
9e1fd49b
BP
2062 error = ofputil_decode_port_mod(oh, &pm);
2063 if (error) {
2064 return error;
2065 }
2066
2067 port = ofproto_get_port(p, pm.port_no);
064af421 2068 if (!port) {
90bf1e07 2069 return OFPERR_OFPPMFC_BAD_PORT;
9e1fd49b 2070 } else if (!eth_addr_equals(port->pp.hw_addr, pm.hw_addr)) {
90bf1e07 2071 return OFPERR_OFPPMFC_BAD_HW_ADDR;
064af421 2072 } else {
9e1fd49b
BP
2073 update_port_config(port, pm.config, pm.mask);
2074 if (pm.advertise) {
2075 netdev_set_advertisements(port->netdev, pm.advertise);
064af421
BP
2076 }
2077 }
2078 return 0;
2079}
2080
90bf1e07 2081static enum ofperr
3269c562 2082handle_desc_stats_request(struct ofconn *ofconn,
63f2140a 2083 const struct ofp_stats_msg *request)
064af421 2084{
64ff1d96 2085 struct ofproto *p = ofconn_get_ofproto(ofconn);
064af421
BP
2086 struct ofp_desc_stats *ods;
2087 struct ofpbuf *msg;
2088
63f2140a 2089 ods = ofputil_make_stats_reply(sizeof *ods, request, &msg);
5a719c38
JP
2090 ovs_strlcpy(ods->mfr_desc, p->mfr_desc, sizeof ods->mfr_desc);
2091 ovs_strlcpy(ods->hw_desc, p->hw_desc, sizeof ods->hw_desc);
2092 ovs_strlcpy(ods->sw_desc, p->sw_desc, sizeof ods->sw_desc);
2093 ovs_strlcpy(ods->serial_num, p->serial_desc, sizeof ods->serial_num);
2094 ovs_strlcpy(ods->dp_desc, p->dp_desc, sizeof ods->dp_desc);
b0421aa2 2095 ofconn_send_reply(ofconn, msg);
064af421
BP
2096
2097 return 0;
2098}
2099
90bf1e07 2100static enum ofperr
3269c562 2101handle_table_stats_request(struct ofconn *ofconn,
63f2140a 2102 const struct ofp_stats_msg *request)
064af421 2103{
64ff1d96 2104 struct ofproto *p = ofconn_get_ofproto(ofconn);
064af421
BP
2105 struct ofp_table_stats *ots;
2106 struct ofpbuf *msg;
6c1491fb 2107 size_t i;
064af421 2108
63f2140a 2109 ofputil_make_stats_reply(sizeof(struct ofp_stats_msg), request, &msg);
064af421 2110
6c1491fb
BP
2111 ots = ofpbuf_put_zeros(msg, sizeof *ots * p->n_tables);
2112 for (i = 0; i < p->n_tables; i++) {
2113 ots[i].table_id = i;
35aa7a21 2114 sprintf(ots[i].name, "table%zu", i);
00794817 2115 ots[i].wildcards = htonl(OFPFW_ALL);
6c1491fb 2116 ots[i].max_entries = htonl(1000000); /* An arbitrary big number. */
d0918789 2117 ots[i].active_count = htonl(classifier_count(&p->tables[i].cls));
6c1491fb 2118 }
064af421 2119
6c1491fb 2120 p->ofproto_class->get_tables(p, ots);
064af421 2121
254750ce
BP
2122 for (i = 0; i < p->n_tables; i++) {
2123 const struct oftable *table = &p->tables[i];
2124
2125 if (table->name) {
2126 ovs_strzcpy(ots[i].name, table->name, sizeof ots[i].name);
2127 }
2128
2129 if (table->max_flows < ntohl(ots[i].max_entries)) {
2130 ots[i].max_entries = htonl(table->max_flows);
2131 }
2132 }
2133
b0421aa2 2134 ofconn_send_reply(ofconn, msg);
064af421
BP
2135 return 0;
2136}
2137
abaad8cf 2138static void
63f2140a 2139append_port_stat(struct ofport *port, struct list *replies)
abaad8cf
JP
2140{
2141 struct netdev_stats stats;
2142 struct ofp_port_stats *ops;
2143
d295e8e9
JP
2144 /* Intentionally ignore return value, since errors will set
2145 * 'stats' to all-1s, which is correct for OpenFlow, and
abaad8cf 2146 * netdev_get_stats() will log errors. */
6527c598 2147 ofproto_port_get_stats(port, &stats);
abaad8cf 2148
63f2140a 2149 ops = ofputil_append_stats_reply(sizeof *ops, replies);
9e1fd49b 2150 ops->port_no = htons(port->pp.port_no);
abaad8cf 2151 memset(ops->pad, 0, sizeof ops->pad);
c4617b3c
BP
2152 put_32aligned_be64(&ops->rx_packets, htonll(stats.rx_packets));
2153 put_32aligned_be64(&ops->tx_packets, htonll(stats.tx_packets));
2154 put_32aligned_be64(&ops->rx_bytes, htonll(stats.rx_bytes));
2155 put_32aligned_be64(&ops->tx_bytes, htonll(stats.tx_bytes));
2156 put_32aligned_be64(&ops->rx_dropped, htonll(stats.rx_dropped));
2157 put_32aligned_be64(&ops->tx_dropped, htonll(stats.tx_dropped));
2158 put_32aligned_be64(&ops->rx_errors, htonll(stats.rx_errors));
2159 put_32aligned_be64(&ops->tx_errors, htonll(stats.tx_errors));
2160 put_32aligned_be64(&ops->rx_frame_err, htonll(stats.rx_frame_errors));
2161 put_32aligned_be64(&ops->rx_over_err, htonll(stats.rx_over_errors));
2162 put_32aligned_be64(&ops->rx_crc_err, htonll(stats.rx_crc_errors));
2163 put_32aligned_be64(&ops->collisions, htonll(stats.collisions));
abaad8cf
JP
2164}
2165
90bf1e07 2166static enum ofperr
63f2140a
BP
2167handle_port_stats_request(struct ofconn *ofconn,
2168 const struct ofp_port_stats_request *psr)
064af421 2169{
64ff1d96 2170 struct ofproto *p = ofconn_get_ofproto(ofconn);
064af421 2171 struct ofport *port;
63f2140a 2172 struct list replies;
064af421 2173
63f2140a 2174 ofputil_start_stats_reply(&psr->osm, &replies);
abaad8cf 2175 if (psr->port_no != htons(OFPP_NONE)) {
abe529af 2176 port = ofproto_get_port(p, ntohs(psr->port_no));
abaad8cf 2177 if (port) {
63f2140a 2178 append_port_stat(port, &replies);
abaad8cf
JP
2179 }
2180 } else {
4e8e4213 2181 HMAP_FOR_EACH (port, hmap_node, &p->ports) {
63f2140a 2182 append_port_stat(port, &replies);
abaad8cf 2183 }
064af421
BP
2184 }
2185
63f2140a 2186 ofconn_send_replies(ofconn, &replies);
064af421
BP
2187 return 0;
2188}
2189
c6ebb8fb 2190static void
f27f2134
BP
2191calc_flow_duration__(long long int start, long long int now,
2192 uint32_t *sec, uint32_t *nsec)
c6ebb8fb 2193{
f27f2134 2194 long long int msecs = now - start;
588cd7b5
BP
2195 *sec = msecs / 1000;
2196 *nsec = (msecs % 1000) * (1000 * 1000);
2197}
2198
48266274
BP
2199/* Checks whether 'table_id' is 0xff or a valid table ID in 'ofproto'. Returns
2200 * 0 if 'table_id' is OK, otherwise an OpenFlow error code. */
90bf1e07 2201static enum ofperr
48266274
BP
2202check_table_id(const struct ofproto *ofproto, uint8_t table_id)
2203{
2204 return (table_id == 0xff || table_id < ofproto->n_tables
2205 ? 0
90bf1e07 2206 : OFPERR_NXBRC_BAD_TABLE_ID);
48266274
BP
2207
2208}
2209
5c67e4af
BP
2210static struct oftable *
2211next_visible_table(struct ofproto *ofproto, uint8_t table_id)
2212{
2213 struct oftable *table;
2214
2215 for (table = &ofproto->tables[table_id];
2216 table < &ofproto->tables[ofproto->n_tables];
2217 table++) {
2218 if (!(table->flags & OFTABLE_HIDDEN)) {
2219 return table;
2220 }
2221 }
2222
2223 return NULL;
2224}
2225
d0918789 2226static struct oftable *
6c1491fb 2227first_matching_table(struct ofproto *ofproto, uint8_t table_id)
064af421 2228{
6c1491fb 2229 if (table_id == 0xff) {
5c67e4af 2230 return next_visible_table(ofproto, 0);
6c1491fb
BP
2231 } else if (table_id < ofproto->n_tables) {
2232 return &ofproto->tables[table_id];
a02e5331 2233 } else {
6c1491fb 2234 return NULL;
a02e5331 2235 }
064af421
BP
2236}
2237
d0918789 2238static struct oftable *
6c1491fb 2239next_matching_table(struct ofproto *ofproto,
d0918789 2240 struct oftable *table, uint8_t table_id)
6c1491fb 2241{
5c67e4af
BP
2242 return (table_id == 0xff
2243 ? next_visible_table(ofproto, (table - ofproto->tables) + 1)
6c1491fb
BP
2244 : NULL);
2245}
2246
d0918789 2247/* Assigns TABLE to each oftable, in turn, that matches TABLE_ID in OFPROTO:
6c1491fb
BP
2248 *
2249 * - If TABLE_ID is 0xff, this iterates over every classifier table in
5c67e4af 2250 * OFPROTO, skipping tables marked OFTABLE_HIDDEN.
6c1491fb
BP
2251 *
2252 * - If TABLE_ID is the number of a table in OFPROTO, then the loop iterates
5c67e4af
BP
2253 * only once, for that table. (This can be used to access tables marked
2254 * OFTABLE_HIDDEN.)
6c1491fb 2255 *
48266274
BP
2256 * - Otherwise, TABLE_ID isn't valid for OFPROTO, so the loop won't be
2257 * entered at all. (Perhaps you should have validated TABLE_ID with
2258 * check_table_id().)
6c1491fb
BP
2259 *
2260 * All parameters are evaluated multiple times.
2261 */
d0918789
BP
2262#define FOR_EACH_MATCHING_TABLE(TABLE, TABLE_ID, OFPROTO) \
2263 for ((TABLE) = first_matching_table(OFPROTO, TABLE_ID); \
2264 (TABLE) != NULL; \
2265 (TABLE) = next_matching_table(OFPROTO, TABLE, TABLE_ID))
6c1491fb 2266
9ed18e46
BP
2267/* Searches 'ofproto' for rules in table 'table_id' (or in all tables, if
2268 * 'table_id' is 0xff) that match 'match' in the "loose" way required for
2269 * OpenFlow OFPFC_MODIFY and OFPFC_DELETE requests and puts them on list
2270 * 'rules'.
2271 *
2272 * If 'out_port' is anything other than OFPP_NONE, then only rules that output
2273 * to 'out_port' are included.
2274 *
2275 * Hidden rules are always omitted.
2276 *
2277 * Returns 0 on success, otherwise an OpenFlow error code. */
90bf1e07 2278static enum ofperr
9ed18e46 2279collect_rules_loose(struct ofproto *ofproto, uint8_t table_id,
e729e793
JP
2280 const struct cls_rule *match,
2281 ovs_be64 cookie, ovs_be64 cookie_mask,
2282 uint16_t out_port, struct list *rules)
9ed18e46 2283{
d0918789 2284 struct oftable *table;
90bf1e07 2285 enum ofperr error;
48266274
BP
2286
2287 error = check_table_id(ofproto, table_id);
2288 if (error) {
2289 return error;
2290 }
9ed18e46
BP
2291
2292 list_init(rules);
d0918789 2293 FOR_EACH_MATCHING_TABLE (table, table_id, ofproto) {
9ed18e46
BP
2294 struct cls_cursor cursor;
2295 struct rule *rule;
2296
d0918789 2297 cls_cursor_init(&cursor, &table->cls, match);
9ed18e46 2298 CLS_CURSOR_FOR_EACH (rule, cr, &cursor) {
7ee20df1
BP
2299 if (rule->pending) {
2300 return OFPROTO_POSTPONE;
2301 }
e729e793
JP
2302 if (!rule_is_hidden(rule) && rule_has_out_port(rule, out_port)
2303 && !((rule->flow_cookie ^ cookie) & cookie_mask)) {
9ed18e46
BP
2304 list_push_back(rules, &rule->ofproto_node);
2305 }
2306 }
2307 }
2308 return 0;
2309}
2310
2311/* Searches 'ofproto' for rules in table 'table_id' (or in all tables, if
2312 * 'table_id' is 0xff) that match 'match' in the "strict" way required for
2313 * OpenFlow OFPFC_MODIFY_STRICT and OFPFC_DELETE_STRICT requests and puts them
2314 * on list 'rules'.
2315 *
2316 * If 'out_port' is anything other than OFPP_NONE, then only rules that output
2317 * to 'out_port' are included.
2318 *
2319 * Hidden rules are always omitted.
2320 *
2321 * Returns 0 on success, otherwise an OpenFlow error code. */
90bf1e07 2322static enum ofperr
9ed18e46 2323collect_rules_strict(struct ofproto *ofproto, uint8_t table_id,
e729e793
JP
2324 const struct cls_rule *match,
2325 ovs_be64 cookie, ovs_be64 cookie_mask,
2326 uint16_t out_port, struct list *rules)
9ed18e46 2327{
d0918789 2328 struct oftable *table;
48266274
BP
2329 int error;
2330
2331 error = check_table_id(ofproto, table_id);
2332 if (error) {
2333 return error;
2334 }
9ed18e46
BP
2335
2336 list_init(rules);
d0918789 2337 FOR_EACH_MATCHING_TABLE (table, table_id, ofproto) {
9ed18e46
BP
2338 struct rule *rule;
2339
d0918789
BP
2340 rule = rule_from_cls_rule(classifier_find_rule_exactly(&table->cls,
2341 match));
9ed18e46 2342 if (rule) {
7ee20df1
BP
2343 if (rule->pending) {
2344 return OFPROTO_POSTPONE;
2345 }
e729e793
JP
2346 if (!rule_is_hidden(rule) && rule_has_out_port(rule, out_port)
2347 && !((rule->flow_cookie ^ cookie) & cookie_mask)) {
9ed18e46
BP
2348 list_push_back(rules, &rule->ofproto_node);
2349 }
2350 }
2351 }
2352 return 0;
2353}
2354
f27f2134
BP
2355/* Returns 'age_ms' (a duration in milliseconds), converted to seconds and
2356 * forced into the range of a uint16_t. */
2357static int
2358age_secs(long long int age_ms)
2359{
2360 return (age_ms < 0 ? 0
2361 : age_ms >= UINT16_MAX * 1000 ? UINT16_MAX
2362 : (unsigned int) age_ms / 1000);
2363}
2364
90bf1e07 2365static enum ofperr
63f2140a 2366handle_flow_stats_request(struct ofconn *ofconn,
349adfb2 2367 const struct ofp_stats_msg *osm)
064af421 2368{
64ff1d96 2369 struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
81d1ea94 2370 struct ofputil_flow_stats_request fsr;
63f2140a 2371 struct list replies;
9ed18e46
BP
2372 struct list rules;
2373 struct rule *rule;
90bf1e07 2374 enum ofperr error;
09246b99 2375
349adfb2 2376 error = ofputil_decode_flow_stats_request(&fsr, &osm->header);
09246b99
BP
2377 if (error) {
2378 return error;
2379 }
2380
9ed18e46 2381 error = collect_rules_loose(ofproto, fsr.table_id, &fsr.match,
e729e793 2382 fsr.cookie, fsr.cookie_mask,
9ed18e46
BP
2383 fsr.out_port, &rules);
2384 if (error) {
2385 return error;
2386 }
5ecc9d81 2387
9ed18e46
BP
2388 ofputil_start_stats_reply(osm, &replies);
2389 LIST_FOR_EACH (rule, ofproto_node, &rules) {
f27f2134 2390 long long int now = time_msec();
9ed18e46
BP
2391 struct ofputil_flow_stats fs;
2392
2393 fs.rule = rule->cr;
2394 fs.cookie = rule->flow_cookie;
2395 fs.table_id = rule->table_id;
f27f2134 2396 calc_flow_duration__(rule->created, now, &fs.duration_sec,
9ed18e46
BP
2397 &fs.duration_nsec);
2398 fs.idle_timeout = rule->idle_timeout;
2399 fs.hard_timeout = rule->hard_timeout;
f27f2134
BP
2400 fs.idle_age = age_secs(now - rule->used);
2401 fs.hard_age = age_secs(now - rule->modified);
9ed18e46
BP
2402 ofproto->ofproto_class->rule_get_stats(rule, &fs.packet_count,
2403 &fs.byte_count);
2404 fs.actions = rule->actions;
2405 fs.n_actions = rule->n_actions;
2406 ofputil_append_flow_stats_reply(&fs, &replies);
3c4486a5 2407 }
63f2140a 2408 ofconn_send_replies(ofconn, &replies);
5ecc9d81 2409
09246b99
BP
2410 return 0;
2411}
2412
4f2cad2c 2413static void
3394b5b6 2414flow_stats_ds(struct rule *rule, struct ds *results)
4f2cad2c 2415{
4f2cad2c 2416 uint64_t packet_count, byte_count;
4f2cad2c 2417
abe529af
BP
2418 rule->ofproto->ofproto_class->rule_get_stats(rule,
2419 &packet_count, &byte_count);
4f2cad2c 2420
6c1491fb
BP
2421 if (rule->table_id != 0) {
2422 ds_put_format(results, "table_id=%"PRIu8", ", rule->table_id);
2423 }
4f2cad2c
JP
2424 ds_put_format(results, "duration=%llds, ",
2425 (time_msec() - rule->created) / 1000);
52ae00b3 2426 ds_put_format(results, "priority=%u, ", rule->cr.priority);
4f2cad2c
JP
2427 ds_put_format(results, "n_packets=%"PRIu64", ", packet_count);
2428 ds_put_format(results, "n_bytes=%"PRIu64", ", byte_count);
cb833cf6 2429 cls_rule_format(&rule->cr, results);
a5df0e72 2430 ds_put_char(results, ',');
b4b8c781
BP
2431 if (rule->n_actions > 0) {
2432 ofp_print_actions(results, rule->actions, rule->n_actions);
3c8552c1
JP
2433 } else {
2434 ds_put_cstr(results, "drop");
3dffcf07 2435 }
4f2cad2c
JP
2436 ds_put_cstr(results, "\n");
2437}
2438
d295e8e9 2439/* Adds a pretty-printed description of all flows to 'results', including
ee8b231c 2440 * hidden flows (e.g., set up by in-band control). */
4f2cad2c
JP
2441void
2442ofproto_get_all_flows(struct ofproto *p, struct ds *results)
2443{
d0918789 2444 struct oftable *table;
6c1491fb 2445
d0918789 2446 OFPROTO_FOR_EACH_TABLE (table, p) {
6c1491fb
BP
2447 struct cls_cursor cursor;
2448 struct rule *rule;
064af421 2449
d0918789 2450 cls_cursor_init(&cursor, &table->cls, NULL);
6c1491fb
BP
2451 CLS_CURSOR_FOR_EACH (rule, cr, &cursor) {
2452 flow_stats_ds(rule, results);
2453 }
064af421 2454 }
064af421
BP
2455}
2456
b5827b24
BP
2457/* Obtains the NetFlow engine type and engine ID for 'ofproto' into
2458 * '*engine_type' and '*engine_id', respectively. */
2459void
2460ofproto_get_netflow_ids(const struct ofproto *ofproto,
2461 uint8_t *engine_type, uint8_t *engine_id)
2462{
abe529af 2463 ofproto->ofproto_class->get_netflow_ids(ofproto, engine_type, engine_id);
b5827b24
BP
2464}
2465
b9380396
EJ
2466/* Checks the fault status of CFM for 'ofp_port' within 'ofproto'. Returns a
2467 * bitmask of 'cfm_fault_reason's to indicate a CFM fault (generally
2468 * indicating a connectivity problem). Returns zero if CFM is not faulted,
2469 * and -1 if CFM is not enabled on 'port'. */
a5610457
EJ
2470int
2471ofproto_port_get_cfm_fault(const struct ofproto *ofproto, uint16_t ofp_port)
2472{
2473 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
2474 return (ofport && ofproto->ofproto_class->get_cfm_fault
2475 ? ofproto->ofproto_class->get_cfm_fault(ofport)
2476 : -1);
2477}
2478
1de11730
EJ
2479/* Gets the MPIDs of the remote maintenance points broadcasting to 'ofp_port'
2480 * within 'ofproto'. Populates 'rmps' with an array of MPIDs owned by
2481 * 'ofproto', and 'n_rmps' with the number of MPIDs in 'rmps'. Returns a
2482 * number less than 0 if CFM is not enabled on 'ofp_port'. */
2483int
2484ofproto_port_get_cfm_remote_mpids(const struct ofproto *ofproto,
2485 uint16_t ofp_port, const uint64_t **rmps,
2486 size_t *n_rmps)
2487{
2488 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
2489
2490 *rmps = NULL;
2491 *n_rmps = 0;
2492 return (ofport && ofproto->ofproto_class->get_cfm_remote_mpids
2493 ? ofproto->ofproto_class->get_cfm_remote_mpids(ofport, rmps,
2494 n_rmps)
2495 : -1);
2496}
2497
3967a833
MM
2498/* Checks the health of the CFM for 'ofp_port' within 'ofproto'. Returns an
2499 * integer value between 0 and 100 to indicate the health of the port as a
2500 * percentage which is the average of cfm health of all the remote_mpids or
2501 * returns -1 if CFM is not enabled on 'ofport'. */
2502int
2503ofproto_port_get_cfm_health(const struct ofproto *ofproto, uint16_t ofp_port)
2504{
2505 struct ofport *ofport = ofproto_get_port(ofproto, ofp_port);
2506 return (ofport && ofproto->ofproto_class->get_cfm_health
2507 ? ofproto->ofproto_class->get_cfm_health(ofport)
2508 : -1);
2509}
2510
90bf1e07 2511static enum ofperr
76c93b22
BP
2512handle_aggregate_stats_request(struct ofconn *ofconn,
2513 const struct ofp_stats_msg *osm)
27d34fce 2514{
76c93b22 2515 struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
81d1ea94 2516 struct ofputil_flow_stats_request request;
76c93b22 2517 struct ofputil_aggregate_stats stats;
5e9d0469 2518 bool unknown_packets, unknown_bytes;
76c93b22 2519 struct ofpbuf *reply;
9ed18e46
BP
2520 struct list rules;
2521 struct rule *rule;
90bf1e07 2522 enum ofperr error;
27d34fce 2523
76c93b22
BP
2524 error = ofputil_decode_flow_stats_request(&request, &osm->header);
2525 if (error) {
2526 return error;
2527 }
5ecc9d81 2528
9ed18e46 2529 error = collect_rules_loose(ofproto, request.table_id, &request.match,
e729e793 2530 request.cookie, request.cookie_mask,
9ed18e46
BP
2531 request.out_port, &rules);
2532 if (error) {
2533 return error;
2534 }
3c4486a5 2535
9ed18e46 2536 memset(&stats, 0, sizeof stats);
5e9d0469 2537 unknown_packets = unknown_bytes = false;
9ed18e46
BP
2538 LIST_FOR_EACH (rule, ofproto_node, &rules) {
2539 uint64_t packet_count;
2540 uint64_t byte_count;
5ecc9d81 2541
9ed18e46
BP
2542 ofproto->ofproto_class->rule_get_stats(rule, &packet_count,
2543 &byte_count);
5ecc9d81 2544
5e9d0469
BP
2545 if (packet_count == UINT64_MAX) {
2546 unknown_packets = true;
2547 } else {
2548 stats.packet_count += packet_count;
2549 }
2550
2551 if (byte_count == UINT64_MAX) {
2552 unknown_bytes = true;
2553 } else {
2554 stats.byte_count += byte_count;
2555 }
2556
9ed18e46 2557 stats.flow_count++;
3c4486a5 2558 }
5e9d0469
BP
2559 if (unknown_packets) {
2560 stats.packet_count = UINT64_MAX;
2561 }
2562 if (unknown_bytes) {
2563 stats.byte_count = UINT64_MAX;
2564 }
27d34fce 2565
76c93b22
BP
2566 reply = ofputil_encode_aggregate_stats_reply(&stats, osm);
2567 ofconn_send_reply(ofconn, reply);
09246b99
BP
2568
2569 return 0;
2570}
2571
c1c9c9c4 2572struct queue_stats_cbdata {
ca0f572c 2573 struct ofport *ofport;
63f2140a 2574 struct list replies;
c1c9c9c4
BP
2575};
2576
2577static void
db9220c3 2578put_queue_stats(struct queue_stats_cbdata *cbdata, uint32_t queue_id,
c1c9c9c4
BP
2579 const struct netdev_queue_stats *stats)
2580{
2581 struct ofp_queue_stats *reply;
2582
63f2140a 2583 reply = ofputil_append_stats_reply(sizeof *reply, &cbdata->replies);
9e1fd49b 2584 reply->port_no = htons(cbdata->ofport->pp.port_no);
c1c9c9c4
BP
2585 memset(reply->pad, 0, sizeof reply->pad);
2586 reply->queue_id = htonl(queue_id);
c4617b3c
BP
2587 put_32aligned_be64(&reply->tx_bytes, htonll(stats->tx_bytes));
2588 put_32aligned_be64(&reply->tx_packets, htonll(stats->tx_packets));
2589 put_32aligned_be64(&reply->tx_errors, htonll(stats->tx_errors));
c1c9c9c4
BP
2590}
2591
2592static void
db9220c3 2593handle_queue_stats_dump_cb(uint32_t queue_id,
c1c9c9c4
BP
2594 struct netdev_queue_stats *stats,
2595 void *cbdata_)
2596{
2597 struct queue_stats_cbdata *cbdata = cbdata_;
2598
2599 put_queue_stats(cbdata, queue_id, stats);
2600}
2601
2602static void
ca0f572c 2603handle_queue_stats_for_port(struct ofport *port, uint32_t queue_id,
c1c9c9c4
BP
2604 struct queue_stats_cbdata *cbdata)
2605{
ca0f572c 2606 cbdata->ofport = port;
c1c9c9c4
BP
2607 if (queue_id == OFPQ_ALL) {
2608 netdev_dump_queue_stats(port->netdev,
2609 handle_queue_stats_dump_cb, cbdata);
2610 } else {
2611 struct netdev_queue_stats stats;
2612
1ac788f6
BP
2613 if (!netdev_get_queue_stats(port->netdev, queue_id, &stats)) {
2614 put_queue_stats(cbdata, queue_id, &stats);
2615 }
c1c9c9c4
BP
2616 }
2617}
2618
90bf1e07 2619static enum ofperr
63f2140a
BP
2620handle_queue_stats_request(struct ofconn *ofconn,
2621 const struct ofp_queue_stats_request *qsr)
c1c9c9c4 2622{
64ff1d96 2623 struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
c1c9c9c4
BP
2624 struct queue_stats_cbdata cbdata;
2625 struct ofport *port;
2626 unsigned int port_no;
2627 uint32_t queue_id;
2628
c1c9c9c4
BP
2629 COVERAGE_INC(ofproto_queue_req);
2630
63f2140a 2631 ofputil_start_stats_reply(&qsr->osm, &cbdata.replies);
c1c9c9c4
BP
2632
2633 port_no = ntohs(qsr->port_no);
2634 queue_id = ntohl(qsr->queue_id);
2635 if (port_no == OFPP_ALL) {
4e8e4213 2636 HMAP_FOR_EACH (port, hmap_node, &ofproto->ports) {
ca0f572c 2637 handle_queue_stats_for_port(port, queue_id, &cbdata);
c1c9c9c4 2638 }
abe529af
BP
2639 } else if (port_no < OFPP_MAX) {
2640 port = ofproto_get_port(ofproto, port_no);
c1c9c9c4 2641 if (port) {
ca0f572c 2642 handle_queue_stats_for_port(port, queue_id, &cbdata);
c1c9c9c4
BP
2643 }
2644 } else {
63f2140a 2645 ofpbuf_list_delete(&cbdata.replies);
90bf1e07 2646 return OFPERR_OFPQOFC_BAD_PORT;
c1c9c9c4 2647 }
63f2140a 2648 ofconn_send_replies(ofconn, &cbdata.replies);
c1c9c9c4
BP
2649
2650 return 0;
2651}
7ee20df1
BP
2652
2653static bool
2654is_flow_deletion_pending(const struct ofproto *ofproto,
2655 const struct cls_rule *cls_rule,
2656 uint8_t table_id)
2657{
2658 if (!hmap_is_empty(&ofproto->deletions)) {
2659 struct ofoperation *op;
2660
2661 HMAP_FOR_EACH_WITH_HASH (op, hmap_node,
2662 cls_rule_hash(cls_rule, table_id),
2663 &ofproto->deletions) {
2664 if (cls_rule_equal(cls_rule, &op->rule->cr)) {
2665 return true;
2666 }
2667 }
2668 }
2669
2670 return false;
2671}
2672
79eee1eb
BP
2673/* Implements OFPFC_ADD and the cases for OFPFC_MODIFY and OFPFC_MODIFY_STRICT
2674 * in which no matching flow already exists in the flow table.
2675 *
2676 * Adds the flow specified by 'ofm', which is followed by 'n_actions'
75a75043 2677 * ofp_actions, to the ofproto's flow table. Returns 0 on success, an OpenFlow
90bf1e07
BP
2678 * error code on failure, or OFPROTO_POSTPONE if the operation cannot be
2679 * initiated now but may be retried later.
79eee1eb
BP
2680 *
2681 * 'ofconn' is used to retrieve the packet buffer specified in ofm->buffer_id,
2682 * if any. */
90bf1e07 2683static enum ofperr
a9a2da38 2684add_flow(struct ofproto *ofproto, struct ofconn *ofconn,
1b9d6420 2685 const struct ofputil_flow_mod *fm, const struct ofp_header *request)
064af421 2686{
d0918789 2687 struct oftable *table;
7ee20df1
BP
2688 struct ofopgroup *group;
2689 struct rule *victim;
064af421 2690 struct rule *rule;
064af421
BP
2691 int error;
2692
48266274
BP
2693 error = check_table_id(ofproto, fm->table_id);
2694 if (error) {
2695 return error;
2696 }
2697
7ee20df1
BP
2698 /* Pick table. */
2699 if (fm->table_id == 0xff) {
2700 uint8_t table_id;
13521ff5 2701 if (ofproto->ofproto_class->rule_choose_table) {
7ee20df1
BP
2702 error = ofproto->ofproto_class->rule_choose_table(ofproto, &fm->cr,
2703 &table_id);
2704 if (error) {
2705 return error;
2706 }
2707 assert(table_id < ofproto->n_tables);
2708 table = &ofproto->tables[table_id];
2709 } else {
2710 table = &ofproto->tables[0];
2711 }
2712 } else if (fm->table_id < ofproto->n_tables) {
2713 table = &ofproto->tables[fm->table_id];
2714 } else {
90bf1e07 2715 return OFPERR_NXFMFC_BAD_TABLE_ID;
064af421
BP
2716 }
2717
5c67e4af
BP
2718 if (table->flags & OFTABLE_READONLY) {
2719 return OFPERR_OFPBRC_EPERM;
2720 }
2721
63adcc7d
BP
2722 /* Check for overlap, if requested. */
2723 if (fm->flags & OFPFF_CHECK_OVERLAP
d0918789 2724 && classifier_rule_overlaps(&table->cls, &fm->cr)) {
90bf1e07 2725 return OFPERR_OFPFMFC_OVERLAP;
63adcc7d
BP
2726 }
2727
7ee20df1
BP
2728 /* Serialize against pending deletion. */
2729 if (is_flow_deletion_pending(ofproto, &fm->cr, table - ofproto->tables)) {
2730 return OFPROTO_POSTPONE;
afe75089 2731 }
064af421 2732
7ee20df1
BP
2733 /* Allocate new rule. */
2734 rule = ofproto->ofproto_class->rule_alloc();
2735 if (!rule) {
2736 VLOG_WARN_RL(&rl, "%s: failed to create rule (%s)",
2737 ofproto->name, strerror(error));
2738 return ENOMEM;
2739 }
2740 rule->ofproto = ofproto;
2741 rule->cr = fm->cr;
2742 rule->pending = NULL;
2743 rule->flow_cookie = fm->cookie;
1745cd08 2744 rule->created = rule->modified = rule->used = time_msec();
7ee20df1
BP
2745 rule->idle_timeout = fm->idle_timeout;
2746 rule->hard_timeout = fm->hard_timeout;
2747 rule->table_id = table - ofproto->tables;
2748 rule->send_flow_removed = (fm->flags & OFPFF_SEND_FLOW_REM) != 0;
2749 rule->actions = ofputil_actions_clone(fm->actions, fm->n_actions);
2750 rule->n_actions = fm->n_actions;
254750ce
BP
2751 rule->evictable = true;
2752 rule->eviction_group = NULL;
7ee20df1
BP
2753
2754 /* Insert new rule. */
d0918789 2755 victim = oftable_replace_rule(rule);
5c67e4af
BP
2756 if (victim && !rule_is_modifiable(victim)) {
2757 error = OFPERR_OFPBRC_EPERM;
2758 } else if (victim && victim->pending) {
7ee20df1
BP
2759 error = OFPROTO_POSTPONE;
2760 } else {
254750ce
BP
2761 struct rule *evict;
2762
2763 if (classifier_count(&table->cls) > table->max_flows) {
2764 bool was_evictable;
2765
2766 was_evictable = rule->evictable;
2767 rule->evictable = false;
2768 evict = choose_rule_to_evict(table);
2769 rule->evictable = was_evictable;
2770
2771 if (!evict) {
2772 error = OFPERR_OFPFMFC_ALL_TABLES_FULL;
2773 goto exit;
2774 } else if (evict->pending) {
2775 error = OFPROTO_POSTPONE;
2776 goto exit;
2777 }
2778 } else {
2779 evict = NULL;
2780 }
2781
7024dffe 2782 group = ofopgroup_create(ofproto, ofconn, request, fm->buffer_id);
7ee20df1
BP
2783 ofoperation_create(group, rule, OFOPERATION_ADD);
2784 rule->pending->victim = victim;
2785
2786 error = ofproto->ofproto_class->rule_construct(rule);
2787 if (error) {
2788 ofoperation_destroy(rule->pending);
254750ce
BP
2789 } else if (evict) {
2790 delete_flow__(evict, group);
7ee20df1
BP
2791 }
2792 ofopgroup_submit(group);
064af421 2793 }
79eee1eb 2794
254750ce 2795exit:
7ee20df1 2796 /* Back out if an error occurred. */
79eee1eb 2797 if (error) {
d0918789 2798 oftable_substitute_rule(rule, victim);
7ee20df1 2799 ofproto_rule_destroy__(rule);
79eee1eb 2800 }
7ee20df1 2801 return error;
064af421 2802}
79eee1eb
BP
2803\f
2804/* OFPFC_MODIFY and OFPFC_MODIFY_STRICT. */
064af421 2805
9ed18e46
BP
2806/* Modifies the rules listed in 'rules', changing their actions to match those
2807 * in 'fm'.
79eee1eb 2808 *
9ed18e46
BP
2809 * 'ofconn' is used to retrieve the packet buffer specified in fm->buffer_id,
2810 * if any.
2811 *
2812 * Returns 0 on success, otherwise an OpenFlow error code. */
90bf1e07 2813static enum ofperr
7024dffe
BP
2814modify_flows__(struct ofproto *ofproto, struct ofconn *ofconn,
2815 const struct ofputil_flow_mod *fm,
7ee20df1 2816 const struct ofp_header *request, struct list *rules)
79eee1eb 2817{
7ee20df1 2818 struct ofopgroup *group;
9ed18e46 2819 struct rule *rule;
5c67e4af 2820 enum ofperr error;
79eee1eb 2821
7024dffe 2822 group = ofopgroup_create(ofproto, ofconn, request, fm->buffer_id);
5c67e4af 2823 error = OFPERR_OFPBRC_EPERM;
9ed18e46 2824 LIST_FOR_EACH (rule, ofproto_node, rules) {
5c67e4af
BP
2825 if (rule_is_modifiable(rule)) {
2826 /* At least one rule is modifiable, don't report EPERM error. */
2827 error = 0;
2828 } else {
2829 continue;
2830 }
2831
9ed18e46
BP
2832 if (!ofputil_actions_equal(fm->actions, fm->n_actions,
2833 rule->actions, rule->n_actions)) {
7ee20df1
BP
2834 ofoperation_create(group, rule, OFOPERATION_MODIFY);
2835 rule->pending->actions = rule->actions;
2836 rule->pending->n_actions = rule->n_actions;
2837 rule->actions = ofputil_actions_clone(fm->actions, fm->n_actions);
2838 rule->n_actions = fm->n_actions;
254750ce 2839 ofproto->ofproto_class->rule_modify_actions(rule);
308881af
BP
2840 } else {
2841 rule->modified = time_msec();
5ecc9d81 2842 }
9ed18e46 2843 rule->flow_cookie = fm->cookie;
5ecc9d81 2844 }
7ee20df1 2845 ofopgroup_submit(group);
79eee1eb 2846
5c67e4af 2847 return error;
9ed18e46
BP
2848}
2849
90bf1e07
BP
2850/* Implements OFPFC_MODIFY. Returns 0 on success or an OpenFlow error code on
2851 * failure.
9ed18e46
BP
2852 *
2853 * 'ofconn' is used to retrieve the packet buffer specified in fm->buffer_id,
2854 * if any. */
90bf1e07 2855static enum ofperr
7024dffe 2856modify_flows_loose(struct ofproto *ofproto, struct ofconn *ofconn,
1b9d6420 2857 const struct ofputil_flow_mod *fm,
7ee20df1 2858 const struct ofp_header *request)
9ed18e46 2859{
9ed18e46
BP
2860 struct list rules;
2861 int error;
2862
e729e793
JP
2863 error = collect_rules_loose(ofproto, fm->table_id, &fm->cr,
2864 fm->cookie, fm->cookie_mask,
2865 OFPP_NONE, &rules);
9ed18e46 2866 return (error ? error
7024dffe
BP
2867 : list_is_empty(&rules) ? add_flow(ofproto, ofconn, fm, request)
2868 : modify_flows__(ofproto, ofconn, fm, request, &rules));
79eee1eb
BP
2869}
2870
2871/* Implements OFPFC_MODIFY_STRICT. Returns 0 on success or an OpenFlow error
90bf1e07 2872 * code on failure.
79eee1eb 2873 *
9ed18e46 2874 * 'ofconn' is used to retrieve the packet buffer specified in fm->buffer_id,
79eee1eb 2875 * if any. */
90bf1e07 2876static enum ofperr
7024dffe 2877modify_flow_strict(struct ofproto *ofproto, struct ofconn *ofconn,
1b9d6420 2878 const struct ofputil_flow_mod *fm,
7ee20df1 2879 const struct ofp_header *request)
79eee1eb 2880{
9ed18e46 2881 struct list rules;
6c1491fb
BP
2882 int error;
2883
e729e793
JP
2884 error = collect_rules_strict(ofproto, fm->table_id, &fm->cr,
2885 fm->cookie, fm->cookie_mask,
2886 OFPP_NONE, &rules);
9ed18e46 2887 return (error ? error
7024dffe
BP
2888 : list_is_empty(&rules) ? add_flow(ofproto, ofconn, fm, request)
2889 : list_is_singleton(&rules) ? modify_flows__(ofproto, ofconn,
2890 fm, request, &rules)
9ed18e46 2891 : 0);
79eee1eb 2892}
9ed18e46
BP
2893\f
2894/* OFPFC_DELETE implementation. */
79eee1eb 2895
254750ce
BP
2896static void
2897delete_flow__(struct rule *rule, struct ofopgroup *group)
2898{
2899 struct ofproto *ofproto = rule->ofproto;
2900
2901 ofproto_rule_send_removed(rule, OFPRR_DELETE);
2902
2903 ofoperation_create(group, rule, OFOPERATION_DELETE);
2904 oftable_remove_rule(rule);
2905 ofproto->ofproto_class->rule_destruct(rule);
2906}
2907
9ed18e46
BP
2908/* Deletes the rules listed in 'rules'.
2909 *
2910 * Returns 0 on success, otherwise an OpenFlow error code. */
90bf1e07 2911static enum ofperr
7024dffe
BP
2912delete_flows__(struct ofproto *ofproto, struct ofconn *ofconn,
2913 const struct ofp_header *request, struct list *rules)
064af421 2914{
9ed18e46 2915 struct rule *rule, *next;
7ee20df1 2916 struct ofopgroup *group;
79eee1eb 2917
7024dffe 2918 group = ofopgroup_create(ofproto, ofconn, request, UINT32_MAX);
9ed18e46 2919 LIST_FOR_EACH_SAFE (rule, next, ofproto_node, rules) {
254750ce 2920 delete_flow__(rule, group);
79eee1eb 2921 }
7ee20df1 2922 ofopgroup_submit(group);
79eee1eb 2923
9ed18e46 2924 return 0;
79eee1eb 2925}
79eee1eb
BP
2926
2927/* Implements OFPFC_DELETE. */
90bf1e07 2928static enum ofperr
7024dffe
BP
2929delete_flows_loose(struct ofproto *ofproto, struct ofconn *ofconn,
2930 const struct ofputil_flow_mod *fm,
7ee20df1 2931 const struct ofp_header *request)
79eee1eb 2932{
9ed18e46 2933 struct list rules;
90bf1e07 2934 enum ofperr error;
064af421 2935
e729e793
JP
2936 error = collect_rules_loose(ofproto, fm->table_id, &fm->cr,
2937 fm->cookie, fm->cookie_mask,
2938 fm->out_port, &rules);
9ed18e46 2939 return (error ? error
7024dffe
BP
2940 : !list_is_empty(&rules) ? delete_flows__(ofproto, ofconn, request,
2941 &rules)
9ed18e46 2942 : 0);
064af421
BP
2943}
2944
79eee1eb 2945/* Implements OFPFC_DELETE_STRICT. */
90bf1e07 2946static enum ofperr
7024dffe 2947delete_flow_strict(struct ofproto *ofproto, struct ofconn *ofconn,
1b9d6420 2948 const struct ofputil_flow_mod *fm,
7ee20df1 2949 const struct ofp_header *request)
79eee1eb 2950{
9ed18e46 2951 struct list rules;
90bf1e07 2952 enum ofperr error;
79eee1eb 2953
e729e793
JP
2954 error = collect_rules_strict(ofproto, fm->table_id, &fm->cr,
2955 fm->cookie, fm->cookie_mask,
2956 fm->out_port, &rules);
9ed18e46 2957 return (error ? error
7024dffe
BP
2958 : list_is_singleton(&rules) ? delete_flows__(ofproto, ofconn,
2959 request, &rules)
9ed18e46 2960 : 0);
abe529af
BP
2961}
2962
2963static void
2964ofproto_rule_send_removed(struct rule *rule, uint8_t reason)
2965{
2966 struct ofputil_flow_removed fr;
2967
2968 if (rule_is_hidden(rule) || !rule->send_flow_removed) {
2969 return;
2970 }
2971
2972 fr.rule = rule->cr;
2973 fr.cookie = rule->flow_cookie;
2974 fr.reason = reason;
f27f2134
BP
2975 calc_flow_duration__(rule->created, time_msec(),
2976 &fr.duration_sec, &fr.duration_nsec);
abe529af
BP
2977 fr.idle_timeout = rule->idle_timeout;
2978 rule->ofproto->ofproto_class->rule_get_stats(rule, &fr.packet_count,
2979 &fr.byte_count);
2980
2981 connmgr_send_flow_removed(rule->ofproto->connmgr, &fr);
2982}
2983
1745cd08
BP
2984void
2985ofproto_rule_update_used(struct rule *rule, long long int used)
2986{
2987 if (used > rule->used) {
254750ce
BP
2988 struct eviction_group *evg = rule->eviction_group;
2989
1745cd08 2990 rule->used = used;
254750ce
BP
2991 if (evg) {
2992 heap_change(&evg->rules, &rule->evg_node,
2993 rule_eviction_priority(rule));
2994 }
1745cd08
BP
2995 }
2996}
2997
abe529af
BP
2998/* Sends an OpenFlow "flow removed" message with the given 'reason' (either
2999 * OFPRR_HARD_TIMEOUT or OFPRR_IDLE_TIMEOUT), and then removes 'rule' from its
3000 * ofproto.
3001 *
3002 * ofproto implementation ->run() functions should use this function to expire
3003 * OpenFlow flows. */
3004void
3005ofproto_rule_expire(struct rule *rule, uint8_t reason)
3006{
7ee20df1
BP
3007 struct ofproto *ofproto = rule->ofproto;
3008 struct ofopgroup *group;
3009
abe529af 3010 assert(reason == OFPRR_HARD_TIMEOUT || reason == OFPRR_IDLE_TIMEOUT);
7ee20df1 3011
abe529af 3012 ofproto_rule_send_removed(rule, reason);
7ee20df1 3013
7024dffe 3014 group = ofopgroup_create_unattached(ofproto);
7ee20df1 3015 ofoperation_create(group, rule, OFOPERATION_DELETE);
d0918789 3016 oftable_remove_rule(rule);
254750ce 3017 ofproto->ofproto_class->rule_destruct(rule);
7ee20df1 3018 ofopgroup_submit(group);
79eee1eb
BP
3019}
3020\f
90bf1e07 3021static enum ofperr
2e4f5fcf 3022handle_flow_mod(struct ofconn *ofconn, const struct ofp_header *oh)
064af421 3023{
a9a2da38 3024 struct ofputil_flow_mod fm;
90bf1e07 3025 enum ofperr error;
064af421 3026
76589937 3027 error = reject_slave_controller(ofconn);
9deba63b
BP
3028 if (error) {
3029 return error;
3030 }
3052b0c5 3031
27527aa0 3032 error = ofputil_decode_flow_mod(&fm, oh, ofconn_get_protocol(ofconn));
064af421
BP
3033 if (error) {
3034 return error;
3035 }
3036
2e4f5fcf
BP
3037 /* We do not support the emergency flow cache. It will hopefully get
3038 * dropped from OpenFlow in the near future. */
3039 if (fm.flags & OFPFF_EMERG) {
49bdc010
JP
3040 /* There isn't a good fit for an error code, so just state that the
3041 * flow table is full. */
90bf1e07 3042 return OFPERR_OFPFMFC_ALL_TABLES_FULL;
49bdc010
JP
3043 }
3044
75a75043
BP
3045 return handle_flow_mod__(ofconn_get_ofproto(ofconn), ofconn, &fm, oh);
3046}
3047
90bf1e07 3048static enum ofperr
75a75043
BP
3049handle_flow_mod__(struct ofproto *ofproto, struct ofconn *ofconn,
3050 const struct ofputil_flow_mod *fm,
3051 const struct ofp_header *oh)
3052{
3053 if (ofproto->n_pending >= 50) {
3054 assert(!list_is_empty(&ofproto->pending));
3055 return OFPROTO_POSTPONE;
3056 }
3057
3058 switch (fm->command) {
3052b0c5 3059 case OFPFC_ADD:
75a75043 3060 return add_flow(ofproto, ofconn, fm, oh);
3052b0c5
BP
3061
3062 case OFPFC_MODIFY:
75a75043 3063 return modify_flows_loose(ofproto, ofconn, fm, oh);
3052b0c5
BP
3064
3065 case OFPFC_MODIFY_STRICT:
75a75043 3066 return modify_flow_strict(ofproto, ofconn, fm, oh);
3052b0c5
BP
3067
3068 case OFPFC_DELETE:
75a75043 3069 return delete_flows_loose(ofproto, ofconn, fm, oh);
3052b0c5
BP
3070
3071 case OFPFC_DELETE_STRICT:
75a75043 3072 return delete_flow_strict(ofproto, ofconn, fm, oh);
3052b0c5
BP
3073
3074 default:
75a75043 3075 if (fm->command > 0xff) {
6c1491fb
BP
3076 VLOG_WARN_RL(&rl, "flow_mod has explicit table_id but "
3077 "flow_mod_table_id extension is not enabled");
3078 }
90bf1e07 3079 return OFPERR_OFPFMFC_BAD_COMMAND;
3052b0c5
BP
3080 }
3081}
3082
90bf1e07 3083static enum ofperr
d1e2cf21 3084handle_role_request(struct ofconn *ofconn, const struct ofp_header *oh)
9deba63b 3085{
d1e2cf21 3086 struct nx_role_request *nrr = (struct nx_role_request *) oh;
9deba63b
BP
3087 struct nx_role_request *reply;
3088 struct ofpbuf *buf;
3089 uint32_t role;
3090
9deba63b
BP
3091 role = ntohl(nrr->role);
3092 if (role != NX_ROLE_OTHER && role != NX_ROLE_MASTER
3093 && role != NX_ROLE_SLAVE) {
2e0525bc 3094 return OFPERR_OFPRRFC_BAD_ROLE;
9deba63b
BP
3095 }
3096
7ee20df1
BP
3097 if (ofconn_get_role(ofconn) != role
3098 && ofconn_has_pending_opgroups(ofconn)) {
3099 return OFPROTO_POSTPONE;
3100 }
3101
1ce0a5fa 3102 ofconn_set_role(ofconn, role);
9deba63b 3103
d1e2cf21 3104 reply = make_nxmsg_xid(sizeof *reply, NXT_ROLE_REPLY, oh->xid, &buf);
9deba63b 3105 reply->role = htonl(role);
b0421aa2 3106 ofconn_send_reply(ofconn, buf);
9deba63b
BP
3107
3108 return 0;
3109}
3110
90bf1e07 3111static enum ofperr
6c1491fb
BP
3112handle_nxt_flow_mod_table_id(struct ofconn *ofconn,
3113 const struct ofp_header *oh)
3114{
73dbf4ab
BP
3115 const struct nx_flow_mod_table_id *msg
3116 = (const struct nx_flow_mod_table_id *) oh;
27527aa0
BP
3117 enum ofputil_protocol cur, next;
3118
3119 cur = ofconn_get_protocol(ofconn);
3120 next = ofputil_protocol_set_tid(cur, msg->set != 0);
3121 ofconn_set_protocol(ofconn, next);
6c1491fb 3122
6c1491fb
BP
3123 return 0;
3124}
3125
90bf1e07 3126static enum ofperr
d1e2cf21 3127handle_nxt_set_flow_format(struct ofconn *ofconn, const struct ofp_header *oh)
09246b99 3128{
73dbf4ab
BP
3129 const struct nx_set_flow_format *msg
3130 = (const struct nx_set_flow_format *) oh;
27527aa0
BP
3131 enum ofputil_protocol cur, next;
3132 enum ofputil_protocol next_base;
09246b99 3133
27527aa0
BP
3134 next_base = ofputil_nx_flow_format_to_protocol(ntohl(msg->format));
3135 if (!next_base) {
90bf1e07 3136 return OFPERR_OFPBRC_EPERM;
09246b99 3137 }
7ee20df1 3138
27527aa0
BP
3139 cur = ofconn_get_protocol(ofconn);
3140 next = ofputil_protocol_set_base(cur, next_base);
3141 if (cur != next && ofconn_has_pending_opgroups(ofconn)) {
3142 /* Avoid sending async messages in surprising protocol. */
7ee20df1
BP
3143 return OFPROTO_POSTPONE;
3144 }
3145
27527aa0 3146 ofconn_set_protocol(ofconn, next);
7ee20df1 3147 return 0;
09246b99
BP
3148}
3149
90bf1e07 3150static enum ofperr
54834960
EJ
3151handle_nxt_set_packet_in_format(struct ofconn *ofconn,
3152 const struct ofp_header *oh)
3153{
73dbf4ab 3154 const struct nx_set_packet_in_format *msg;
54834960
EJ
3155 uint32_t format;
3156
73dbf4ab 3157 msg = (const struct nx_set_packet_in_format *) oh;
54834960 3158 format = ntohl(msg->format);
a15f0eeb 3159 if (format != NXPIF_OPENFLOW10 && format != NXPIF_NXM) {
90bf1e07 3160 return OFPERR_OFPBRC_EPERM;
54834960
EJ
3161 }
3162
3163 if (format != ofconn_get_packet_in_format(ofconn)
3164 && ofconn_has_pending_opgroups(ofconn)) {
3165 /* Avoid sending async message in surprsing packet in format. */
3166 return OFPROTO_POSTPONE;
3167 }
3168
3169 ofconn_set_packet_in_format(ofconn, format);
3170 return 0;
3171}
3172
80d5aefd
BP
3173static enum ofperr
3174handle_nxt_set_async_config(struct ofconn *ofconn, const struct ofp_header *oh)
3175{
3176 const struct nx_async_config *msg = (const struct nx_async_config *) oh;
3177 uint32_t master[OAM_N_TYPES];
3178 uint32_t slave[OAM_N_TYPES];
3179
3180 master[OAM_PACKET_IN] = ntohl(msg->packet_in_mask[0]);
3181 master[OAM_PORT_STATUS] = ntohl(msg->port_status_mask[0]);
3182 master[OAM_FLOW_REMOVED] = ntohl(msg->flow_removed_mask[0]);
3183
3184 slave[OAM_PACKET_IN] = ntohl(msg->packet_in_mask[1]);
3185 slave[OAM_PORT_STATUS] = ntohl(msg->port_status_mask[1]);
3186 slave[OAM_FLOW_REMOVED] = ntohl(msg->flow_removed_mask[1]);
3187
3188 ofconn_set_async_config(ofconn, master, slave);
3189
3190 return 0;
3191}
3192
a7349929
BP
3193static enum ofperr
3194handle_nxt_set_controller_id(struct ofconn *ofconn,
3195 const struct ofp_header *oh)
3196{
3197 const struct nx_controller_id *nci;
3198
3199 nci = (const struct nx_controller_id *) oh;
3200 if (!is_all_zeros(nci->zero, sizeof nci->zero)) {
3201 return OFPERR_NXBRC_MUST_BE_ZERO;
3202 }
3203
3204 ofconn_set_controller_id(ofconn, ntohs(nci->controller_id));
3205 return 0;
3206}
3207
90bf1e07 3208static enum ofperr
d1e2cf21 3209handle_barrier_request(struct ofconn *ofconn, const struct ofp_header *oh)
246e61ea
JP
3210{
3211 struct ofp_header *ob;
3212 struct ofpbuf *buf;
3213
7ee20df1
BP
3214 if (ofconn_has_pending_opgroups(ofconn)) {
3215 return OFPROTO_POSTPONE;
3216 }
3217
5293a2e1 3218 ob = make_openflow_xid(sizeof *ob, OFPT10_BARRIER_REPLY, oh->xid, &buf);
b0421aa2 3219 ofconn_send_reply(ofconn, buf);
246e61ea
JP
3220 return 0;
3221}
3222
90bf1e07 3223static enum ofperr
d1e2cf21 3224handle_openflow__(struct ofconn *ofconn, const struct ofpbuf *msg)
064af421 3225{
d1e2cf21
BP
3226 const struct ofp_header *oh = msg->data;
3227 const struct ofputil_msg_type *type;
90bf1e07 3228 enum ofperr error;
064af421 3229
d1e2cf21
BP
3230 error = ofputil_decode_msg_type(oh, &type);
3231 if (error) {
3232 return error;
3233 }
064af421 3234
d1e2cf21
BP
3235 switch (ofputil_msg_type_code(type)) {
3236 /* OpenFlow requests. */
3237 case OFPUTIL_OFPT_ECHO_REQUEST:
3238 return handle_echo_request(ofconn, oh);
064af421 3239
d1e2cf21
BP
3240 case OFPUTIL_OFPT_FEATURES_REQUEST:
3241 return handle_features_request(ofconn, oh);
064af421 3242
d1e2cf21
BP
3243 case OFPUTIL_OFPT_GET_CONFIG_REQUEST:
3244 return handle_get_config_request(ofconn, oh);
064af421 3245
d1e2cf21
BP
3246 case OFPUTIL_OFPT_SET_CONFIG:
3247 return handle_set_config(ofconn, msg->data);
064af421 3248
d1e2cf21 3249 case OFPUTIL_OFPT_PACKET_OUT:
c6a93eb7 3250 return handle_packet_out(ofconn, msg->data);
064af421 3251
d1e2cf21
BP
3252 case OFPUTIL_OFPT_PORT_MOD:
3253 return handle_port_mod(ofconn, oh);
064af421 3254
d1e2cf21 3255 case OFPUTIL_OFPT_FLOW_MOD:
2e4f5fcf 3256 return handle_flow_mod(ofconn, oh);
064af421 3257
d1e2cf21
BP
3258 case OFPUTIL_OFPT_BARRIER_REQUEST:
3259 return handle_barrier_request(ofconn, oh);
064af421 3260
d1e2cf21
BP
3261 /* OpenFlow replies. */
3262 case OFPUTIL_OFPT_ECHO_REPLY:
3263 return 0;
246e61ea 3264
d1e2cf21 3265 /* Nicira extension requests. */
d1e2cf21
BP
3266 case OFPUTIL_NXT_ROLE_REQUEST:
3267 return handle_role_request(ofconn, oh);
3268
6c1491fb
BP
3269 case OFPUTIL_NXT_FLOW_MOD_TABLE_ID:
3270 return handle_nxt_flow_mod_table_id(ofconn, oh);
d1e2cf21
BP
3271
3272 case OFPUTIL_NXT_SET_FLOW_FORMAT:
3273 return handle_nxt_set_flow_format(ofconn, oh);
3274
54834960
EJ
3275 case OFPUTIL_NXT_SET_PACKET_IN_FORMAT:
3276 return handle_nxt_set_packet_in_format(ofconn, oh);
3277
a7349929
BP
3278 case OFPUTIL_NXT_SET_CONTROLLER_ID:
3279 return handle_nxt_set_controller_id(ofconn, oh);
3280
d1e2cf21 3281 case OFPUTIL_NXT_FLOW_MOD:
2e4f5fcf 3282 return handle_flow_mod(ofconn, oh);
d1e2cf21 3283
f27f2134
BP
3284 case OFPUTIL_NXT_FLOW_AGE:
3285 /* Nothing to do. */
3286 return 0;
3287
80d5aefd
BP
3288 case OFPUTIL_NXT_SET_ASYNC_CONFIG:
3289 return handle_nxt_set_async_config(ofconn, oh);
3290
349adfb2 3291 /* Statistics requests. */
d1e2cf21 3292 case OFPUTIL_OFPST_DESC_REQUEST:
63f2140a 3293 return handle_desc_stats_request(ofconn, msg->data);
d1e2cf21
BP
3294
3295 case OFPUTIL_OFPST_FLOW_REQUEST:
349adfb2 3296 case OFPUTIL_NXST_FLOW_REQUEST:
63f2140a 3297 return handle_flow_stats_request(ofconn, msg->data);
d1e2cf21
BP
3298
3299 case OFPUTIL_OFPST_AGGREGATE_REQUEST:
76c93b22 3300 case OFPUTIL_NXST_AGGREGATE_REQUEST:
63f2140a 3301 return handle_aggregate_stats_request(ofconn, msg->data);
d1e2cf21
BP
3302
3303 case OFPUTIL_OFPST_TABLE_REQUEST:
63f2140a 3304 return handle_table_stats_request(ofconn, msg->data);
d1e2cf21
BP
3305
3306 case OFPUTIL_OFPST_PORT_REQUEST:
63f2140a 3307 return handle_port_stats_request(ofconn, msg->data);
d1e2cf21
BP
3308
3309 case OFPUTIL_OFPST_QUEUE_REQUEST:
63f2140a 3310 return handle_queue_stats_request(ofconn, msg->data);
d1e2cf21 3311
8f93e93c 3312 case OFPUTIL_MSG_INVALID:
d1e2cf21
BP
3313 case OFPUTIL_OFPT_HELLO:
3314 case OFPUTIL_OFPT_ERROR:
3315 case OFPUTIL_OFPT_FEATURES_REPLY:
3316 case OFPUTIL_OFPT_GET_CONFIG_REPLY:
3317 case OFPUTIL_OFPT_PACKET_IN:
3318 case OFPUTIL_OFPT_FLOW_REMOVED:
3319 case OFPUTIL_OFPT_PORT_STATUS:
3320 case OFPUTIL_OFPT_BARRIER_REPLY:
3321 case OFPUTIL_OFPT_QUEUE_GET_CONFIG_REQUEST:
3322 case OFPUTIL_OFPT_QUEUE_GET_CONFIG_REPLY:
3323 case OFPUTIL_OFPST_DESC_REPLY:
3324 case OFPUTIL_OFPST_FLOW_REPLY:
3325 case OFPUTIL_OFPST_QUEUE_REPLY:
3326 case OFPUTIL_OFPST_PORT_REPLY:
3327 case OFPUTIL_OFPST_TABLE_REPLY:
3328 case OFPUTIL_OFPST_AGGREGATE_REPLY:
d1e2cf21
BP
3329 case OFPUTIL_NXT_ROLE_REPLY:
3330 case OFPUTIL_NXT_FLOW_REMOVED:
54834960 3331 case OFPUTIL_NXT_PACKET_IN:
d1e2cf21
BP
3332 case OFPUTIL_NXST_FLOW_REPLY:
3333 case OFPUTIL_NXST_AGGREGATE_REPLY:
064af421 3334 default:
5293a2e1
BP
3335 return (oh->type == OFPT10_STATS_REQUEST ||
3336 oh->type == OFPT10_STATS_REPLY
3337 ? OFPERR_OFPBRC_BAD_STAT
3338 : OFPERR_OFPBRC_BAD_TYPE);
064af421 3339 }
d1e2cf21 3340}
064af421 3341
7ee20df1 3342static bool
d1e2cf21
BP
3343handle_openflow(struct ofconn *ofconn, struct ofpbuf *ofp_msg)
3344{
3345 int error = handle_openflow__(ofconn, ofp_msg);
7ee20df1 3346 if (error && error != OFPROTO_POSTPONE) {
1be5ff75 3347 ofconn_send_error(ofconn, ofp_msg->data, error);
064af421 3348 }
d1e2cf21 3349 COVERAGE_INC(ofproto_recv_openflow);
7ee20df1
BP
3350 return error != OFPROTO_POSTPONE;
3351}
3352\f
3353/* Asynchronous operations. */
3354
3355/* Creates and returns a new ofopgroup that is not associated with any
3356 * OpenFlow connection.
3357 *
3358 * The caller should add operations to the returned group with
3359 * ofoperation_create() and then submit it with ofopgroup_submit(). */
3360static struct ofopgroup *
7024dffe 3361ofopgroup_create_unattached(struct ofproto *ofproto)
7ee20df1
BP
3362{
3363 struct ofopgroup *group = xzalloc(sizeof *group);
3364 group->ofproto = ofproto;
3365 list_init(&group->ofproto_node);
3366 list_init(&group->ops);
3367 list_init(&group->ofconn_node);
3368 return group;
3369}
3370
7024dffe
BP
3371/* Creates and returns a new ofopgroup for 'ofproto'.
3372 *
3373 * If 'ofconn' is NULL, the new ofopgroup is not associated with any OpenFlow
3374 * connection. The 'request' and 'buffer_id' arguments are ignored.
3375 *
3376 * If 'ofconn' is nonnull, then the new ofopgroup is associated with 'ofconn'.
3377 * If the ofopgroup eventually fails, then the error reply will include
3378 * 'request'. If the ofopgroup eventually succeeds, then the packet with
3379 * buffer id 'buffer_id' on 'ofconn' will be sent by 'ofconn''s ofproto.
7ee20df1
BP
3380 *
3381 * The caller should add operations to the returned group with
3382 * ofoperation_create() and then submit it with ofopgroup_submit(). */
3383static struct ofopgroup *
7024dffe
BP
3384ofopgroup_create(struct ofproto *ofproto, struct ofconn *ofconn,
3385 const struct ofp_header *request, uint32_t buffer_id)
7ee20df1 3386{
7024dffe
BP
3387 struct ofopgroup *group = ofopgroup_create_unattached(ofproto);
3388 if (ofconn) {
3389 size_t request_len = ntohs(request->length);
7ee20df1 3390
7024dffe 3391 assert(ofconn_get_ofproto(ofconn) == ofproto);
7ee20df1 3392
7024dffe
BP
3393 ofconn_add_opgroup(ofconn, &group->ofconn_node);
3394 group->ofconn = ofconn;
3395 group->request = xmemdup(request, MIN(request_len, 64));
3396 group->buffer_id = buffer_id;
3397 }
7ee20df1
BP
3398 return group;
3399}
3400
3401/* Submits 'group' for processing.
3402 *
3403 * If 'group' contains no operations (e.g. none were ever added, or all of the
3404 * ones that were added completed synchronously), then it is destroyed
3405 * immediately. Otherwise it is added to the ofproto's list of pending
3406 * groups. */
3407static void
3408ofopgroup_submit(struct ofopgroup *group)
3409{
3410 if (list_is_empty(&group->ops)) {
3411 ofopgroup_destroy(group);
3412 } else {
3413 list_push_back(&group->ofproto->pending, &group->ofproto_node);
dd5616b3 3414 group->ofproto->n_pending++;
7ee20df1
BP
3415 }
3416}
3417
3418static void
3419ofopgroup_destroy(struct ofopgroup *group)
3420{
3421 assert(list_is_empty(&group->ops));
3422 if (!list_is_empty(&group->ofproto_node)) {
dd5616b3
BP
3423 assert(group->ofproto->n_pending > 0);
3424 group->ofproto->n_pending--;
7ee20df1
BP
3425 list_remove(&group->ofproto_node);
3426 }
3427 if (!list_is_empty(&group->ofconn_node)) {
3428 list_remove(&group->ofconn_node);
3429 if (group->error) {
3430 ofconn_send_error(group->ofconn, group->request, group->error);
3431 }
3432 connmgr_retry(group->ofproto->connmgr);
3433 }
3434 free(group->request);
3435 free(group);
3436}
3437
3438/* Initiates a new operation on 'rule', of the specified 'type', within
3439 * 'group'. Prior to calling, 'rule' must not have any pending operation. */
3440static void
3441ofoperation_create(struct ofopgroup *group, struct rule *rule,
3442 enum ofoperation_type type)
3443{
3444 struct ofoperation *op;
3445
3446 assert(!rule->pending);
3447
3448 op = rule->pending = xzalloc(sizeof *op);
3449 op->group = group;
3450 list_push_back(&group->ops, &op->group_node);
3451 op->rule = rule;
3452 op->type = type;
3453 op->status = -1;
3454 op->flow_cookie = rule->flow_cookie;
3455
3456 if (type == OFOPERATION_DELETE) {
3457 hmap_insert(&op->group->ofproto->deletions, &op->hmap_node,
3458 cls_rule_hash(&rule->cr, rule->table_id));
3459 }
3460}
3461
3462static void
3463ofoperation_destroy(struct ofoperation *op)
3464{
3465 struct ofopgroup *group = op->group;
3466
3467 if (op->rule) {
3468 op->rule->pending = NULL;
3469 }
3470 if (op->type == OFOPERATION_DELETE) {
3471 hmap_remove(&group->ofproto->deletions, &op->hmap_node);
3472 }
3473 list_remove(&op->group_node);
3474 free(op->actions);
3475 free(op);
3476
3477 if (list_is_empty(&group->ops) && !list_is_empty(&group->ofproto_node)) {
3478 ofopgroup_destroy(group);
3479 }
3480}
3481
3482/* Indicates that 'op' completed with status 'error', which is either 0 to
90bf1e07 3483 * indicate success or an OpenFlow error code on failure.
7ee20df1 3484 *
a6a62132
BP
3485 * If 'error' is 0, indicating success, the operation will be committed
3486 * permanently to the flow table. There is one interesting subcase:
3487 *
3488 * - If 'op' is an "add flow" operation that is replacing an existing rule in
3489 * the flow table (the "victim" rule) by a new one, then the caller must
3490 * have uninitialized any derived state in the victim rule, as in step 5 in
3491 * the "Life Cycle" in ofproto/ofproto-provider.h. ofoperation_complete()
3492 * performs steps 6 and 7 for the victim rule, most notably by calling its
3493 * ->rule_dealloc() function.
3494 *
3495 * If 'error' is nonzero, then generally the operation will be rolled back:
3496 *
3497 * - If 'op' is an "add flow" operation, ofproto removes the new rule or
3498 * restores the original rule. The caller must have uninitialized any
3499 * derived state in the new rule, as in step 5 of in the "Life Cycle" in
3500 * ofproto/ofproto-provider.h. ofoperation_complete() performs steps 6 and
3501 * and 7 for the new rule, calling its ->rule_dealloc() function.
3502 *
3503 * - If 'op' is a "modify flow" operation, ofproto restores the original
3504 * actions.
3505 *
3506 * - 'op' must not be a "delete flow" operation. Removing a rule is not
3507 * allowed to fail. It must always succeed.
7ee20df1 3508 *
5bee6e26
JP
3509 * Please see the large comment in ofproto/ofproto-provider.h titled
3510 * "Asynchronous Operation Support" for more information. */
7ee20df1 3511void
90bf1e07 3512ofoperation_complete(struct ofoperation *op, enum ofperr error)
7ee20df1
BP
3513{
3514 struct ofopgroup *group = op->group;
3515 struct rule *rule = op->rule;
52a90c29 3516 struct ofproto *ofproto = rule->ofproto;
7ee20df1
BP
3517
3518 assert(rule->pending == op);
3519 assert(op->status < 0);
7ee20df1
BP
3520
3521 if (!error
3522 && !group->error
3523 && op->type != OFOPERATION_DELETE
3524 && group->ofconn
3525 && group->buffer_id != UINT32_MAX
3526 && list_is_singleton(&op->group_node)) {
3527 struct ofpbuf *packet;
3528 uint16_t in_port;
3529
3530 error = ofconn_pktbuf_retrieve(group->ofconn, group->buffer_id,
3531 &packet, &in_port);
3532 if (packet) {
3533 assert(!error);
3534 error = rule_execute(rule, in_port, packet);
3535 }
3536 }
3537 if (!group->error) {
3538 group->error = error;
3539 }
3540
3541 switch (op->type) {
3542 case OFOPERATION_ADD:
3543 if (!error) {
1eae3d33 3544 ofproto_rule_destroy__(op->victim);
9075907c
BP
3545 if ((rule->cr.wc.vlan_tci_mask & htons(VLAN_VID_MASK))
3546 == htons(VLAN_VID_MASK)) {
3547 if (ofproto->vlan_bitmap) {
3548 uint16_t vid = vlan_tci_to_vid(rule->cr.flow.vlan_tci);
3549
3550 if (!bitmap_is_set(ofproto->vlan_bitmap, vid)) {
3551 bitmap_set1(ofproto->vlan_bitmap, vid);
3552 ofproto->vlans_changed = true;
3553 }
3554 } else {
52a90c29
BP
3555 ofproto->vlans_changed = true;
3556 }
3557 }
7ee20df1 3558 } else {
d0918789 3559 oftable_substitute_rule(rule, op->victim);
7ee20df1
BP
3560 ofproto_rule_destroy__(rule);
3561 }
7ee20df1
BP
3562 break;
3563
3564 case OFOPERATION_DELETE:
3565 assert(!error);
3566 ofproto_rule_destroy__(rule);
3567 op->rule = NULL;
3568 break;
3569
3570 case OFOPERATION_MODIFY:
308881af
BP
3571 if (!error) {
3572 rule->modified = time_msec();
3573 } else {
7ee20df1
BP
3574 free(rule->actions);
3575 rule->actions = op->actions;
3576 rule->n_actions = op->n_actions;
3577 op->actions = NULL;
3578 }
3579 break;
3580
3581 default:
3582 NOT_REACHED();
3583 }
3584 ofoperation_destroy(op);
3585}
3586
3587struct rule *
3588ofoperation_get_victim(struct ofoperation *op)
3589{
3590 assert(op->type == OFOPERATION_ADD);
3591 return op->victim;
064af421
BP
3592}
3593\f
064af421 3594static uint64_t
fa60c019 3595pick_datapath_id(const struct ofproto *ofproto)
064af421 3596{
fa60c019 3597 const struct ofport *port;
064af421 3598
abe529af 3599 port = ofproto_get_port(ofproto, OFPP_LOCAL);
fa60c019
BP
3600 if (port) {
3601 uint8_t ea[ETH_ADDR_LEN];
3602 int error;
3603
3604 error = netdev_get_etheraddr(port->netdev, ea);
064af421
BP
3605 if (!error) {
3606 return eth_addr_to_uint64(ea);
3607 }
3608 VLOG_WARN("could not get MAC address for %s (%s)",
fa60c019 3609 netdev_get_name(port->netdev), strerror(error));
064af421 3610 }
fa60c019 3611 return ofproto->fallback_dpid;
064af421
BP
3612}
3613
3614static uint64_t
3615pick_fallback_dpid(void)
3616{
3617 uint8_t ea[ETH_ADDR_LEN];
70150daf 3618 eth_addr_nicira_random(ea);
064af421
BP
3619 return eth_addr_to_uint64(ea);
3620}
3621\f
254750ce
BP
3622/* Table overflow policy. */
3623
3624/* Chooses and returns a rule to evict from 'table'. Returns NULL if the table
3625 * is not configured to evict rules or if the table contains no evictable
3626 * rules. (Rules with 'evictable' set to false or with no timeouts are not
3627 * evictable.) */
3628static struct rule *
3629choose_rule_to_evict(struct oftable *table)
3630{
3631 struct eviction_group *evg;
3632
3633 if (!table->eviction_fields) {
3634 return NULL;
3635 }
3636
3637 /* In the common case, the outer and inner loops here will each be entered
3638 * exactly once:
3639 *
3640 * - The inner loop normally "return"s in its first iteration. If the
3641 * eviction group has any evictable rules, then it always returns in
3642 * some iteration.
3643 *
3644 * - The outer loop only iterates more than once if the largest eviction
3645 * group has no evictable rules.
3646 *
3647 * - The outer loop can exit only if table's 'max_flows' is all filled up
3648 * by unevictable rules'. */
3649 HEAP_FOR_EACH (evg, size_node, &table->eviction_groups_by_size) {
3650 struct rule *rule;
3651
3652 HEAP_FOR_EACH (rule, evg_node, &evg->rules) {
3653 if (rule->evictable) {
3654 return rule;
3655 }
3656 }
3657 }
3658
3659 return NULL;
3660}
3661
3662/* Searches 'ofproto' for tables that have more flows than their configured
3663 * maximum and that have flow eviction enabled, and evicts as many flows as
3664 * necessary and currently feasible from them.
3665 *
3666 * This triggers only when an OpenFlow table has N flows in it and then the
3667 * client configures a maximum number of flows less than N. */
3668static void
3669ofproto_evict(struct ofproto *ofproto)
3670{
3671 struct ofopgroup *group;
3672 struct oftable *table;
3673
3674 group = ofopgroup_create_unattached(ofproto);
3675 OFPROTO_FOR_EACH_TABLE (table, ofproto) {
3676 while (classifier_count(&table->cls) > table->max_flows
3677 && table->eviction_fields) {
3678 struct rule *rule;
3679
3680 rule = choose_rule_to_evict(table);
3681 if (!rule || rule->pending) {
3682 break;
3683 }
3684
3685 ofoperation_create(group, rule, OFOPERATION_DELETE);
3686 oftable_remove_rule(rule);
3687 ofproto->ofproto_class->rule_destruct(rule);
3688 }
3689 }
3690 ofopgroup_submit(group);
3691}
3692\f
3693/* Eviction groups. */
3694
3695/* Returns the priority to use for an eviction_group that contains 'n_rules'
3696 * rules. The priority contains low-order random bits to ensure that eviction
3697 * groups with the same number of rules are prioritized randomly. */
3698static uint32_t
3699eviction_group_priority(size_t n_rules)
3700{
3701 uint16_t size = MIN(UINT16_MAX, n_rules);
3702 return (size << 16) | random_uint16();
3703}
3704
3705/* Updates 'evg', an eviction_group within 'table', following a change that
3706 * adds or removes rules in 'evg'. */
3707static void
3708eviction_group_resized(struct oftable *table, struct eviction_group *evg)
3709{
3710 heap_change(&table->eviction_groups_by_size, &evg->size_node,
3711 eviction_group_priority(heap_count(&evg->rules)));
3712}
3713
3714/* Destroys 'evg', an eviction_group within 'table':
3715 *
3716 * - Removes all the rules, if any, from 'evg'. (It doesn't destroy the
3717 * rules themselves, just removes them from the eviction group.)
3718 *
3719 * - Removes 'evg' from 'table'.
3720 *
3721 * - Frees 'evg'. */
3722static void
3723eviction_group_destroy(struct oftable *table, struct eviction_group *evg)
3724{
3725 while (!heap_is_empty(&evg->rules)) {
3726 struct rule *rule;
3727
3728 rule = CONTAINER_OF(heap_pop(&evg->rules), struct rule, evg_node);
3729 rule->eviction_group = NULL;
3730 }
3731 hmap_remove(&table->eviction_groups_by_id, &evg->id_node);
3732 heap_remove(&table->eviction_groups_by_size, &evg->size_node);
3733 heap_destroy(&evg->rules);
3734 free(evg);
3735}
3736
3737/* Removes 'rule' from its eviction group, if any. */
3738static void
3739eviction_group_remove_rule(struct rule *rule)
3740{
3741 if (rule->eviction_group) {
3742 struct oftable *table = &rule->ofproto->tables[rule->table_id];
3743 struct eviction_group *evg = rule->eviction_group;
3744
3745 rule->eviction_group = NULL;
3746 heap_remove(&evg->rules, &rule->evg_node);
3747 if (heap_is_empty(&evg->rules)) {
3748 eviction_group_destroy(table, evg);
3749 } else {
3750 eviction_group_resized(table, evg);
3751 }
3752 }
3753}
3754
3755/* Hashes the 'rule''s values for the eviction_fields of 'rule''s table, and
3756 * returns the hash value. */
3757static uint32_t
3758eviction_group_hash_rule(struct rule *rule)
3759{
3760 struct oftable *table = &rule->ofproto->tables[rule->table_id];
3761 const struct mf_subfield *sf;
3762 uint32_t hash;
3763
3764 hash = table->eviction_group_id_basis;
3765 for (sf = table->eviction_fields;
3766 sf < &table->eviction_fields[table->n_eviction_fields];
3767 sf++)
3768 {
3769 if (mf_are_prereqs_ok(sf->field, &rule->cr.flow)) {
3770 union mf_value value;
3771
3772 mf_get_value(sf->field, &rule->cr.flow, &value);
3773 if (sf->ofs) {
3774 bitwise_zero(&value, sf->field->n_bytes, 0, sf->ofs);
3775 }
3776 if (sf->ofs + sf->n_bits < sf->field->n_bytes * 8) {
3777 unsigned int start = sf->ofs + sf->n_bits;
3778 bitwise_zero(&value, sf->field->n_bytes, start,
3779 sf->field->n_bytes * 8 - start);
3780 }
3781 hash = hash_bytes(&value, sf->field->n_bytes, hash);
3782 } else {
3783 hash = hash_int(hash, 0);
3784 }
3785 }
3786
3787 return hash;
3788}
3789
3790/* Returns an eviction group within 'table' with the given 'id', creating one
3791 * if necessary. */
3792static struct eviction_group *
3793eviction_group_find(struct oftable *table, uint32_t id)
3794{
3795 struct eviction_group *evg;
3796
3797 HMAP_FOR_EACH_WITH_HASH (evg, id_node, id, &table->eviction_groups_by_id) {
3798 return evg;
3799 }
3800
3801 evg = xmalloc(sizeof *evg);
3802 hmap_insert(&table->eviction_groups_by_id, &evg->id_node, id);
3803 heap_insert(&table->eviction_groups_by_size, &evg->size_node,
3804 eviction_group_priority(0));
3805 heap_init(&evg->rules);
3806
3807 return evg;
3808}
3809
3810/* Returns an eviction priority for 'rule'. The return value should be
3811 * interpreted so that higher priorities make a rule more attractive candidates
3812 * for eviction. */
3813static uint32_t
3814rule_eviction_priority(struct rule *rule)
3815{
3816 long long int hard_expiration;
3817 long long int idle_expiration;
3818 long long int expiration;
3819 uint32_t expiration_offset;
3820
3821 /* Calculate time of expiration. */
3822 hard_expiration = (rule->hard_timeout
3823 ? rule->modified + rule->hard_timeout * 1000
3824 : LLONG_MAX);
3825 idle_expiration = (rule->idle_timeout
3826 ? rule->used + rule->idle_timeout * 1000
3827 : LLONG_MAX);
3828 expiration = MIN(hard_expiration, idle_expiration);
3829 if (expiration == LLONG_MAX) {
3830 return 0;
3831 }
3832
3833 /* Calculate the time of expiration as a number of (approximate) seconds
3834 * after program startup.
3835 *
3836 * This should work OK for program runs that last UINT32_MAX seconds or
3837 * less. Therefore, please restart OVS at least once every 136 years. */
3838 expiration_offset = (expiration >> 10) - (time_boot_msec() >> 10);
3839
3840 /* Invert the expiration offset because we're using a max-heap. */
3841 return UINT32_MAX - expiration_offset;
3842}
3843
3844/* Adds 'rule' to an appropriate eviction group for its oftable's
3845 * configuration. Does nothing if 'rule''s oftable doesn't have eviction
3846 * enabled, or if 'rule' is a permanent rule (one that will never expire on its
3847 * own).
3848 *
3849 * The caller must ensure that 'rule' is not already in an eviction group. */
3850static void
3851eviction_group_add_rule(struct rule *rule)
3852{
3853 struct ofproto *ofproto = rule->ofproto;
3854 struct oftable *table = &ofproto->tables[rule->table_id];
3855
3856 if (table->eviction_fields
3857 && (rule->hard_timeout || rule->idle_timeout)) {
3858 struct eviction_group *evg;
3859
3860 evg = eviction_group_find(table, eviction_group_hash_rule(rule));
3861
3862 rule->eviction_group = evg;
3863 heap_insert(&evg->rules, &rule->evg_node,
3864 rule_eviction_priority(rule));
3865 eviction_group_resized(table, evg);
3866 }
3867}
3868\f
d0918789
BP
3869/* oftables. */
3870
3871/* Initializes 'table'. */
3872static void
3873oftable_init(struct oftable *table)
3874{
5c67e4af 3875 memset(table, 0, sizeof *table);
d0918789
BP
3876 classifier_init(&table->cls);
3877}
3878
254750ce 3879/* Destroys 'table', including its classifier and eviction groups.
d0918789
BP
3880 *
3881 * The caller is responsible for freeing 'table' itself. */
3882static void
3883oftable_destroy(struct oftable *table)
3884{
3885 assert(classifier_is_empty(&table->cls));
254750ce 3886 oftable_disable_eviction(table);
d0918789 3887 classifier_destroy(&table->cls);
254750ce
BP
3888 free(table->name);
3889}
3890
3891/* Changes the name of 'table' to 'name'. If 'name' is NULL or the empty
3892 * string, then 'table' will use its default name.
3893 *
3894 * This only affects the name exposed for a table exposed through the OpenFlow
3895 * OFPST_TABLE (as printed by "ovs-ofctl dump-tables"). */
3896static void
3897oftable_set_name(struct oftable *table, const char *name)
3898{
3899 if (name && name[0]) {
3900 int len = strnlen(name, OFP_MAX_TABLE_NAME_LEN);
3901 if (!table->name || strncmp(name, table->name, len)) {
3902 free(table->name);
3903 table->name = xmemdup0(name, len);
3904 }
3905 } else {
3906 free(table->name);
3907 table->name = NULL;
3908 }
3909}
3910
3911/* oftables support a choice of two policies when adding a rule would cause the
3912 * number of flows in the table to exceed the configured maximum number: either
3913 * they can refuse to add the new flow or they can evict some existing flow.
3914 * This function configures the former policy on 'table'. */
3915static void
3916oftable_disable_eviction(struct oftable *table)
3917{
3918 if (table->eviction_fields) {
3919 struct eviction_group *evg, *next;
3920
3921 HMAP_FOR_EACH_SAFE (evg, next, id_node,
3922 &table->eviction_groups_by_id) {
3923 eviction_group_destroy(table, evg);
3924 }
3925 hmap_destroy(&table->eviction_groups_by_id);
3926 heap_destroy(&table->eviction_groups_by_size);
3927
3928 free(table->eviction_fields);
3929 table->eviction_fields = NULL;
3930 table->n_eviction_fields = 0;
3931 }
3932}
3933
3934/* oftables support a choice of two policies when adding a rule would cause the
3935 * number of flows in the table to exceed the configured maximum number: either
3936 * they can refuse to add the new flow or they can evict some existing flow.
3937 * This function configures the latter policy on 'table', with fairness based
3938 * on the values of the 'n_fields' fields specified in 'fields'. (Specifying
3939 * 'n_fields' as 0 disables fairness.) */
3940static void
3941oftable_enable_eviction(struct oftable *table,
3942 const struct mf_subfield *fields, size_t n_fields)
3943{
3944 struct cls_cursor cursor;
3945 struct rule *rule;
3946
3947 if (table->eviction_fields
3948 && n_fields == table->n_eviction_fields
3949 && (!n_fields
3950 || !memcmp(fields, table->eviction_fields,
3951 n_fields * sizeof *fields))) {
3952 /* No change. */
3953 return;
3954 }
3955
3956 oftable_disable_eviction(table);
3957
3958 table->n_eviction_fields = n_fields;
3959 table->eviction_fields = xmemdup(fields, n_fields * sizeof *fields);
3960
3961 table->eviction_group_id_basis = random_uint32();
3962 hmap_init(&table->eviction_groups_by_id);
3963 heap_init(&table->eviction_groups_by_size);
3964
3965 cls_cursor_init(&cursor, &table->cls, NULL);
3966 CLS_CURSOR_FOR_EACH (rule, cr, &cursor) {
3967 eviction_group_add_rule(rule);
3968 }
d0918789
BP
3969}
3970
3971/* Removes 'rule' from the oftable that contains it. */
3972static void
3973oftable_remove_rule(struct rule *rule)
3974{
3975 struct ofproto *ofproto = rule->ofproto;
3976 struct oftable *table = &ofproto->tables[rule->table_id];
3977
3978 classifier_remove(&table->cls, &rule->cr);
254750ce 3979 eviction_group_remove_rule(rule);
d0918789
BP
3980}
3981
3982/* Inserts 'rule' into its oftable. Removes any existing rule from 'rule''s
3983 * oftable that has an identical cls_rule. Returns the rule that was removed,
3984 * if any, and otherwise NULL. */
3985static struct rule *
3986oftable_replace_rule(struct rule *rule)
3987{
3988 struct ofproto *ofproto = rule->ofproto;
3989 struct oftable *table = &ofproto->tables[rule->table_id];
254750ce 3990 struct rule *victim;
d0918789 3991
254750ce
BP
3992 victim = rule_from_cls_rule(classifier_replace(&table->cls, &rule->cr));
3993 if (victim) {
3994 eviction_group_remove_rule(victim);
3995 }
3996 eviction_group_add_rule(rule);
3997 return victim;
d0918789
BP
3998}
3999
4000/* Removes 'old' from its oftable then, if 'new' is nonnull, inserts 'new'. */
4001static void
4002oftable_substitute_rule(struct rule *old, struct rule *new)
4003{
4004 if (new) {
4005 oftable_replace_rule(new);
4006 } else {
4007 oftable_remove_rule(old);
4008 }
4009}
4010\f
abe529af 4011/* unixctl commands. */
7aa697dd 4012
abe529af 4013struct ofproto *
2ac6bedd 4014ofproto_lookup(const char *name)
7aa697dd 4015{
2ac6bedd 4016 struct ofproto *ofproto;
7aa697dd 4017
2ac6bedd
BP
4018 HMAP_FOR_EACH_WITH_HASH (ofproto, hmap_node, hash_string(name, 0),
4019 &all_ofprotos) {
4020 if (!strcmp(ofproto->name, name)) {
4021 return ofproto;
4022 }
7aa697dd 4023 }
2ac6bedd 4024 return NULL;
7aa697dd
BP
4025}
4026
4027static void
0e15264f
BP
4028ofproto_unixctl_list(struct unixctl_conn *conn, int argc OVS_UNUSED,
4029 const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
7aa697dd 4030{
7aa697dd 4031 struct ofproto *ofproto;
7aa697dd 4032 struct ds results;
7aa697dd 4033
7aa697dd 4034 ds_init(&results);
2ac6bedd
BP
4035 HMAP_FOR_EACH (ofproto, hmap_node, &all_ofprotos) {
4036 ds_put_format(&results, "%s\n", ofproto->name);
7aa697dd 4037 }
bde9f75d 4038 unixctl_command_reply(conn, ds_cstr(&results));
7aa697dd 4039 ds_destroy(&results);
7aa697dd
BP
4040}
4041
4042static void
4043ofproto_unixctl_init(void)
4044{
4045 static bool registered;
4046 if (registered) {
4047 return;
4048 }
4049 registered = true;
4050
0e15264f
BP
4051 unixctl_command_register("ofproto/list", "", 0, 0,
4052 ofproto_unixctl_list, NULL);
064af421 4053}
52a90c29
BP
4054\f
4055/* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
4056 *
4057 * This is deprecated. It is only for compatibility with broken device drivers
4058 * in old versions of Linux that do not properly support VLANs when VLAN
4059 * devices are not used. When broken device drivers are no longer in
4060 * widespread use, we will delete these interfaces. */
4061
4062/* Sets a 1-bit in the 4096-bit 'vlan_bitmap' for each VLAN ID that is matched
4063 * (exactly) by an OpenFlow rule in 'ofproto'. */
4064void
4065ofproto_get_vlan_usage(struct ofproto *ofproto, unsigned long int *vlan_bitmap)
4066{
d0918789 4067 const struct oftable *oftable;
52a90c29
BP
4068
4069 free(ofproto->vlan_bitmap);
4070 ofproto->vlan_bitmap = bitmap_allocate(4096);
4071 ofproto->vlans_changed = false;
4072
d0918789 4073 OFPROTO_FOR_EACH_TABLE (oftable, ofproto) {
52a90c29
BP
4074 const struct cls_table *table;
4075
d0918789 4076 HMAP_FOR_EACH (table, hmap_node, &oftable->cls.tables) {
9075907c
BP
4077 if ((table->wc.vlan_tci_mask & htons(VLAN_VID_MASK))
4078 == htons(VLAN_VID_MASK)) {
52a90c29
BP
4079 const struct cls_rule *rule;
4080
4081 HMAP_FOR_EACH (rule, hmap_node, &table->rules) {
4082 uint16_t vid = vlan_tci_to_vid(rule->flow.vlan_tci);
4083 bitmap_set1(vlan_bitmap, vid);
4084 bitmap_set1(ofproto->vlan_bitmap, vid);
4085 }
4086 }
4087 }
4088 }
4089}
4090
4091/* Returns true if new VLANs have come into use by the flow table since the
4092 * last call to ofproto_get_vlan_usage().
4093 *
4094 * We don't track when old VLANs stop being used. */
4095bool
4096ofproto_has_vlan_usage_changed(const struct ofproto *ofproto)
4097{
4098 return ofproto->vlans_changed;
4099}
4100
4101/* Configures a VLAN splinter binding between the ports identified by OpenFlow
4102 * port numbers 'vlandev_ofp_port' and 'realdev_ofp_port'. If
4103 * 'realdev_ofp_port' is nonzero, then the VLAN device is enslaved to the real
4104 * device as a VLAN splinter for VLAN ID 'vid'. If 'realdev_ofp_port' is zero,
4105 * then the VLAN device is un-enslaved. */
4106int
4107ofproto_port_set_realdev(struct ofproto *ofproto, uint16_t vlandev_ofp_port,
4108 uint16_t realdev_ofp_port, int vid)
4109{
4110 struct ofport *ofport;
4111 int error;
4112
4113 assert(vlandev_ofp_port != realdev_ofp_port);
4114
4115 ofport = ofproto_get_port(ofproto, vlandev_ofp_port);
4116 if (!ofport) {
4117 VLOG_WARN("%s: cannot set realdev on nonexistent port %"PRIu16,
4118 ofproto->name, vlandev_ofp_port);
4119 return EINVAL;
4120 }
4121
4122 if (!ofproto->ofproto_class->set_realdev) {
4123 if (!vlandev_ofp_port) {
4124 return 0;
4125 }
4126 VLOG_WARN("%s: vlan splinters not supported", ofproto->name);
4127 return EOPNOTSUPP;
4128 }
4129
4130 error = ofproto->ofproto_class->set_realdev(ofport, realdev_ofp_port, vid);
4131 if (error) {
4132 VLOG_WARN("%s: setting realdev on port %"PRIu16" (%s) failed (%s)",
4133 ofproto->name, vlandev_ofp_port,
4134 netdev_get_name(ofport->netdev), strerror(error));
4135 }
4136 return error;
4137}