in-band: Support an arbitrary number of controllers.
[sliver-openvswitch.git] / ofproto / ofproto.c
1 /*
2  * Copyright (c) 2009, 2010 Nicira Networks.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <config.h>
18 #include "ofproto.h"
19 #include <errno.h>
20 #include <inttypes.h>
21 #include <net/if.h>
22 #include <netinet/in.h>
23 #include <stdbool.h>
24 #include <stdlib.h>
25 #include "classifier.h"
26 #include "coverage.h"
27 #include "discovery.h"
28 #include "dpif.h"
29 #include "dynamic-string.h"
30 #include "fail-open.h"
31 #include "in-band.h"
32 #include "mac-learning.h"
33 #include "netdev.h"
34 #include "netflow.h"
35 #include "odp-util.h"
36 #include "ofp-print.h"
37 #include "ofproto-sflow.h"
38 #include "ofpbuf.h"
39 #include "openflow/nicira-ext.h"
40 #include "openflow/openflow.h"
41 #include "openvswitch/datapath-protocol.h"
42 #include "packets.h"
43 #include "pinsched.h"
44 #include "pktbuf.h"
45 #include "poll-loop.h"
46 #include "port-array.h"
47 #include "rconn.h"
48 #include "shash.h"
49 #include "status.h"
50 #include "stp.h"
51 #include "stream-ssl.h"
52 #include "svec.h"
53 #include "tag.h"
54 #include "timeval.h"
55 #include "unixctl.h"
56 #include "vconn.h"
57 #include "xtoxll.h"
58
59 #define THIS_MODULE VLM_ofproto
60 #include "vlog.h"
61
62 #include "sflow_api.h"
63
64 enum {
65     TABLEID_HASH = 0,
66     TABLEID_CLASSIFIER = 1
67 };
68
69 struct ofport {
70     struct netdev *netdev;
71     struct ofp_phy_port opp;    /* In host byte order. */
72 };
73
74 static void ofport_free(struct ofport *);
75 static void hton_ofp_phy_port(struct ofp_phy_port *);
76
77 static int xlate_actions(const union ofp_action *in, size_t n_in,
78                          const flow_t *flow, struct ofproto *ofproto,
79                          const struct ofpbuf *packet,
80                          struct odp_actions *out, tag_type *tags,
81                          bool *may_set_up_flow, uint16_t *nf_output_iface);
82
83 struct rule {
84     struct cls_rule cr;
85
86     uint64_t flow_cookie;       /* Controller-issued identifier. 
87                                    (Kept in network-byte order.) */
88     uint16_t idle_timeout;      /* In seconds from time of last use. */
89     uint16_t hard_timeout;      /* In seconds from time of creation. */
90     bool send_flow_removed;     /* Send a flow removed message? */
91     long long int used;         /* Last-used time (0 if never used). */
92     long long int created;      /* Creation time. */
93     uint64_t packet_count;      /* Number of packets received. */
94     uint64_t byte_count;        /* Number of bytes received. */
95     uint64_t accounted_bytes;   /* Number of bytes passed to account_cb. */
96     tag_type tags;              /* Tags (set only by hooks). */
97     struct netflow_flow nf_flow; /* Per-flow NetFlow tracking data. */
98
99     /* If 'super' is non-NULL, this rule is a subrule, that is, it is an
100      * exact-match rule (having cr.wc.wildcards of 0) generated from the
101      * wildcard rule 'super'.  In this case, 'list' is an element of the
102      * super-rule's list.
103      *
104      * If 'super' is NULL, this rule is a super-rule, and 'list' is the head of
105      * a list of subrules.  A super-rule with no wildcards (where
106      * cr.wc.wildcards is 0) will never have any subrules. */
107     struct rule *super;
108     struct list list;
109
110     /* OpenFlow actions.
111      *
112      * 'n_actions' is the number of elements in the 'actions' array.  A single
113      * action may take up more more than one element's worth of space.
114      *
115      * A subrule has no actions (it uses the super-rule's actions). */
116     int n_actions;
117     union ofp_action *actions;
118
119     /* Datapath actions.
120      *
121      * A super-rule with wildcard fields never has ODP actions (since the
122      * datapath only supports exact-match flows). */
123     bool installed;             /* Installed in datapath? */
124     bool may_install;           /* True ordinarily; false if actions must
125                                  * be reassessed for every packet. */
126     int n_odp_actions;
127     union odp_action *odp_actions;
128 };
129
130 static inline bool
131 rule_is_hidden(const struct rule *rule)
132 {
133     /* Subrules are merely an implementation detail, so hide them from the
134      * controller. */
135     if (rule->super != NULL) {
136         return true;
137     }
138
139     /* Rules with priority higher than UINT16_MAX are set up by ofproto itself
140      * (e.g. by in-band control) and are intentionally hidden from the
141      * controller. */
142     if (rule->cr.priority > UINT16_MAX) {
143         return true;
144     }
145
146     return false;
147 }
148
149 static struct rule *rule_create(struct ofproto *, struct rule *super,
150                                 const union ofp_action *, size_t n_actions,
151                                 uint16_t idle_timeout, uint16_t hard_timeout,
152                                 uint64_t flow_cookie, bool send_flow_removed);
153 static void rule_free(struct rule *);
154 static void rule_destroy(struct ofproto *, struct rule *);
155 static struct rule *rule_from_cls_rule(const struct cls_rule *);
156 static void rule_insert(struct ofproto *, struct rule *,
157                         struct ofpbuf *packet, uint16_t in_port);
158 static void rule_remove(struct ofproto *, struct rule *);
159 static bool rule_make_actions(struct ofproto *, struct rule *,
160                               const struct ofpbuf *packet);
161 static void rule_install(struct ofproto *, struct rule *,
162                          struct rule *displaced_rule);
163 static void rule_uninstall(struct ofproto *, struct rule *);
164 static void rule_post_uninstall(struct ofproto *, struct rule *);
165 static void send_flow_removed(struct ofproto *p, struct rule *rule,
166                               long long int now, uint8_t reason);
167
168 struct ofconn {
169     struct list node;
170     struct rconn *rconn;
171     struct pktbuf *pktbuf;
172     int miss_send_len;
173
174     struct rconn_packet_counter *packet_in_counter;
175
176     /* Number of OpenFlow messages queued as replies to OpenFlow requests, and
177      * the maximum number before we stop reading OpenFlow requests.  */
178 #define OFCONN_REPLY_MAX 100
179     struct rconn_packet_counter *reply_counter;
180 };
181
182 static struct ofconn *ofconn_create(struct ofproto *, struct rconn *);
183 static void ofconn_destroy(struct ofconn *);
184 static void ofconn_run(struct ofconn *, struct ofproto *);
185 static void ofconn_wait(struct ofconn *);
186 static void queue_tx(struct ofpbuf *msg, const struct ofconn *ofconn,
187                      struct rconn_packet_counter *counter);
188
189 struct ofproto {
190     /* Settings. */
191     uint64_t datapath_id;       /* Datapath ID. */
192     uint64_t fallback_dpid;     /* Datapath ID if no better choice found. */
193     char *mfr_desc;             /* Manufacturer. */
194     char *hw_desc;              /* Hardware. */
195     char *sw_desc;              /* Software version. */
196     char *serial_desc;          /* Serial number. */
197     char *dp_desc;              /* Datapath description. */
198
199     /* Datapath. */
200     struct dpif *dpif;
201     struct netdev_monitor *netdev_monitor;
202     struct port_array ports;    /* Index is ODP port nr; ofport->opp.port_no is
203                                  * OFP port nr. */
204     struct shash port_by_name;
205     uint32_t max_ports;
206
207     /* Configuration. */
208     struct switch_status *switch_status;
209     struct status_category *ss_cat;
210     struct in_band *in_band;
211     struct discovery *discovery;
212     struct fail_open *fail_open;
213     struct pinsched *miss_sched, *action_sched;
214     struct netflow *netflow;
215     struct ofproto_sflow *sflow;
216
217     /* Flow table. */
218     struct classifier cls;
219     bool need_revalidate;
220     long long int next_expiration;
221     struct tag_set revalidate_set;
222     bool tun_id_from_cookie;
223
224     /* OpenFlow connections. */
225     struct list all_conns;
226     struct ofconn *controller;
227     struct pvconn **listeners;
228     size_t n_listeners;
229     struct pvconn **snoops;
230     size_t n_snoops;
231
232     /* Hooks for ovs-vswitchd. */
233     const struct ofhooks *ofhooks;
234     void *aux;
235
236     /* Used by default ofhooks. */
237     struct mac_learning *ml;
238 };
239
240 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
241
242 static const struct ofhooks default_ofhooks;
243
244 static uint64_t pick_datapath_id(const struct ofproto *);
245 static uint64_t pick_fallback_dpid(void);
246 static void send_packet_in_miss(struct ofpbuf *, void *ofproto);
247 static void send_packet_in_action(struct ofpbuf *, void *ofproto);
248 static void update_used(struct ofproto *);
249 static void update_stats(struct ofproto *, struct rule *,
250                          const struct odp_flow_stats *);
251 static void expire_rule(struct cls_rule *, void *ofproto);
252 static void active_timeout(struct ofproto *ofproto, struct rule *rule);
253 static bool revalidate_rule(struct ofproto *p, struct rule *rule);
254 static void revalidate_cb(struct cls_rule *rule_, void *p_);
255
256 static void handle_odp_msg(struct ofproto *, struct ofpbuf *);
257
258 static void handle_openflow(struct ofconn *, struct ofproto *,
259                             struct ofpbuf *);
260
261 static void refresh_port_groups(struct ofproto *);
262
263 static void update_port(struct ofproto *, const char *devname);
264 static int init_ports(struct ofproto *);
265 static void reinit_ports(struct ofproto *);
266
267 int
268 ofproto_create(const char *datapath, const char *datapath_type,
269                const struct ofhooks *ofhooks, void *aux,
270                struct ofproto **ofprotop)
271 {
272     struct odp_stats stats;
273     struct ofproto *p;
274     struct dpif *dpif;
275     int error;
276
277     *ofprotop = NULL;
278
279     /* Connect to datapath and start listening for messages. */
280     error = dpif_open(datapath, datapath_type, &dpif);
281     if (error) {
282         VLOG_ERR("failed to open datapath %s: %s", datapath, strerror(error));
283         return error;
284     }
285     error = dpif_get_dp_stats(dpif, &stats);
286     if (error) {
287         VLOG_ERR("failed to obtain stats for datapath %s: %s",
288                  datapath, strerror(error));
289         dpif_close(dpif);
290         return error;
291     }
292     error = dpif_recv_set_mask(dpif, ODPL_MISS | ODPL_ACTION | ODPL_SFLOW);
293     if (error) {
294         VLOG_ERR("failed to listen on datapath %s: %s",
295                  datapath, strerror(error));
296         dpif_close(dpif);
297         return error;
298     }
299     dpif_flow_flush(dpif);
300     dpif_recv_purge(dpif);
301
302     /* Initialize settings. */
303     p = xzalloc(sizeof *p);
304     p->fallback_dpid = pick_fallback_dpid();
305     p->datapath_id = p->fallback_dpid;
306     p->mfr_desc = xstrdup(DEFAULT_MFR_DESC);
307     p->hw_desc = xstrdup(DEFAULT_HW_DESC);
308     p->sw_desc = xstrdup(DEFAULT_SW_DESC);
309     p->serial_desc = xstrdup(DEFAULT_SERIAL_DESC);
310     p->dp_desc = xstrdup(DEFAULT_DP_DESC);
311
312     /* Initialize datapath. */
313     p->dpif = dpif;
314     p->netdev_monitor = netdev_monitor_create();
315     port_array_init(&p->ports);
316     shash_init(&p->port_by_name);
317     p->max_ports = stats.max_ports;
318
319     /* Initialize submodules. */
320     p->switch_status = switch_status_create(p);
321     p->in_band = NULL;
322     p->discovery = NULL;
323     p->fail_open = NULL;
324     p->miss_sched = p->action_sched = NULL;
325     p->netflow = NULL;
326     p->sflow = NULL;
327
328     /* Initialize flow table. */
329     classifier_init(&p->cls);
330     p->need_revalidate = false;
331     p->next_expiration = time_msec() + 1000;
332     tag_set_init(&p->revalidate_set);
333
334     /* Initialize OpenFlow connections. */
335     list_init(&p->all_conns);
336     p->controller = ofconn_create(p, rconn_create(5, 8));
337     p->controller->pktbuf = pktbuf_create();
338     p->controller->miss_send_len = OFP_DEFAULT_MISS_SEND_LEN;
339     p->listeners = NULL;
340     p->n_listeners = 0;
341     p->snoops = NULL;
342     p->n_snoops = 0;
343
344     /* Initialize hooks. */
345     if (ofhooks) {
346         p->ofhooks = ofhooks;
347         p->aux = aux;
348         p->ml = NULL;
349     } else {
350         p->ofhooks = &default_ofhooks;
351         p->aux = p;
352         p->ml = mac_learning_create();
353     }
354
355     /* Register switch status category. */
356     p->ss_cat = switch_status_register(p->switch_status, "remote",
357                                        rconn_status_cb, p->controller->rconn);
358
359     /* Pick final datapath ID. */
360     p->datapath_id = pick_datapath_id(p);
361     VLOG_INFO("using datapath ID %016"PRIx64, p->datapath_id);
362
363     *ofprotop = p;
364     return 0;
365 }
366
367 void
368 ofproto_set_datapath_id(struct ofproto *p, uint64_t datapath_id)
369 {
370     uint64_t old_dpid = p->datapath_id;
371     p->datapath_id = datapath_id ? datapath_id : pick_datapath_id(p);
372     if (p->datapath_id != old_dpid) {
373         VLOG_INFO("datapath ID changed to %016"PRIx64, p->datapath_id);
374         rconn_reconnect(p->controller->rconn);
375     }
376 }
377
378 void
379 ofproto_set_probe_interval(struct ofproto *p, int probe_interval)
380 {
381     probe_interval = probe_interval ? MAX(probe_interval, 5) : 0;
382     rconn_set_probe_interval(p->controller->rconn, probe_interval);
383     if (p->fail_open) {
384         int trigger_duration = probe_interval ? probe_interval * 3 : 15;
385         fail_open_set_trigger_duration(p->fail_open, trigger_duration);
386     }
387 }
388
389 void
390 ofproto_set_max_backoff(struct ofproto *p, int max_backoff)
391 {
392     rconn_set_max_backoff(p->controller->rconn, max_backoff);
393 }
394
395 void
396 ofproto_set_desc(struct ofproto *p,
397                  const char *mfr_desc, const char *hw_desc,
398                  const char *sw_desc, const char *serial_desc,
399                  const char *dp_desc)
400 {
401     struct ofp_desc_stats *ods;
402
403     if (mfr_desc) {
404         if (strlen(mfr_desc) >= sizeof ods->mfr_desc) {
405             VLOG_WARN("truncating mfr_desc, must be less than %zu characters",
406                     sizeof ods->mfr_desc);
407         }
408         free(p->mfr_desc);
409         p->mfr_desc = xstrdup(mfr_desc);
410     }
411     if (hw_desc) {
412         if (strlen(hw_desc) >= sizeof ods->hw_desc) {
413             VLOG_WARN("truncating hw_desc, must be less than %zu characters",
414                     sizeof ods->hw_desc);
415         }
416         free(p->hw_desc);
417         p->hw_desc = xstrdup(hw_desc);
418     }
419     if (sw_desc) {
420         if (strlen(sw_desc) >= sizeof ods->sw_desc) {
421             VLOG_WARN("truncating sw_desc, must be less than %zu characters",
422                     sizeof ods->sw_desc);
423         }
424         free(p->sw_desc);
425         p->sw_desc = xstrdup(sw_desc);
426     }
427     if (serial_desc) {
428         if (strlen(serial_desc) >= sizeof ods->serial_num) {
429             VLOG_WARN("truncating serial_desc, must be less than %zu "
430                     "characters",
431                     sizeof ods->serial_num);
432         }
433         free(p->serial_desc);
434         p->serial_desc = xstrdup(serial_desc);
435     }
436     if (dp_desc) {
437         if (strlen(dp_desc) >= sizeof ods->dp_desc) {
438             VLOG_WARN("truncating dp_desc, must be less than %zu characters",
439                     sizeof ods->dp_desc);
440         }
441         free(p->dp_desc);
442         p->dp_desc = xstrdup(dp_desc);
443     }
444 }
445
446 int
447 ofproto_set_in_band(struct ofproto *p, bool in_band)
448 {
449     if (in_band != (p->in_band != NULL)) {
450         if (in_band) {
451             int error;
452
453             error = in_band_create(p, p->dpif, p->switch_status, &p->in_band);
454             if (error) {
455                 return error;
456             }
457             in_band_set_remotes(p->in_band, &p->controller->rconn, 1);
458         } else {
459             ofproto_set_discovery(p, false, NULL, true);
460             in_band_destroy(p->in_band);
461             p->in_band = NULL;
462         }
463         rconn_reconnect(p->controller->rconn);
464     }
465     return 0;
466 }
467
468 int
469 ofproto_set_discovery(struct ofproto *p, bool discovery,
470                       const char *re, bool update_resolv_conf)
471 {
472     if (discovery != (p->discovery != NULL)) {
473         if (discovery) {
474             int error = ofproto_set_in_band(p, true);
475             if (error) {
476                 return error;
477             }
478             error = discovery_create(re, update_resolv_conf,
479                                      p->dpif, p->switch_status,
480                                      &p->discovery);
481             if (error) {
482                 return error;
483             }
484         } else {
485             discovery_destroy(p->discovery);
486             p->discovery = NULL;
487         }
488         rconn_disconnect(p->controller->rconn);
489     } else if (discovery) {
490         discovery_set_update_resolv_conf(p->discovery, update_resolv_conf);
491         return discovery_set_accept_controller_re(p->discovery, re);
492     }
493     return 0;
494 }
495
496 int
497 ofproto_set_controller(struct ofproto *ofproto, const char *controller)
498 {
499     if (ofproto->discovery) {
500         return EINVAL;
501     } else if (controller) {
502         if (strcmp(rconn_get_name(ofproto->controller->rconn), controller)) {
503             return rconn_connect(ofproto->controller->rconn, controller);
504         } else {
505             return 0;
506         }
507     } else {
508         rconn_disconnect(ofproto->controller->rconn);
509         return 0;
510     }
511 }
512
513 static int
514 set_pvconns(struct pvconn ***pvconnsp, size_t *n_pvconnsp,
515             const struct svec *svec)
516 {
517     struct pvconn **pvconns = *pvconnsp;
518     size_t n_pvconns = *n_pvconnsp;
519     int retval = 0;
520     size_t i;
521
522     for (i = 0; i < n_pvconns; i++) {
523         pvconn_close(pvconns[i]);
524     }
525     free(pvconns);
526
527     pvconns = xmalloc(svec->n * sizeof *pvconns);
528     n_pvconns = 0;
529     for (i = 0; i < svec->n; i++) {
530         const char *name = svec->names[i];
531         struct pvconn *pvconn;
532         int error;
533
534         error = pvconn_open(name, &pvconn);
535         if (!error) {
536             pvconns[n_pvconns++] = pvconn;
537         } else {
538             VLOG_ERR("failed to listen on %s: %s", name, strerror(error));
539             if (!retval) {
540                 retval = error;
541             }
542         }
543     }
544
545     *pvconnsp = pvconns;
546     *n_pvconnsp = n_pvconns;
547
548     return retval;
549 }
550
551 int
552 ofproto_set_listeners(struct ofproto *ofproto, const struct svec *listeners)
553 {
554     return set_pvconns(&ofproto->listeners, &ofproto->n_listeners, listeners);
555 }
556
557 int
558 ofproto_set_snoops(struct ofproto *ofproto, const struct svec *snoops)
559 {
560     return set_pvconns(&ofproto->snoops, &ofproto->n_snoops, snoops);
561 }
562
563 int
564 ofproto_set_netflow(struct ofproto *ofproto,
565                     const struct netflow_options *nf_options)
566 {
567     if (nf_options && nf_options->collectors.n) {
568         if (!ofproto->netflow) {
569             ofproto->netflow = netflow_create();
570         }
571         return netflow_set_options(ofproto->netflow, nf_options);
572     } else {
573         netflow_destroy(ofproto->netflow);
574         ofproto->netflow = NULL;
575         return 0;
576     }
577 }
578
579 void
580 ofproto_set_sflow(struct ofproto *ofproto,
581                   const struct ofproto_sflow_options *oso)
582 {
583     struct ofproto_sflow *os = ofproto->sflow;
584     if (oso) {
585         if (!os) {
586             struct ofport *ofport;
587             unsigned int odp_port;
588
589             os = ofproto->sflow = ofproto_sflow_create(ofproto->dpif);
590             refresh_port_groups(ofproto);
591             PORT_ARRAY_FOR_EACH (ofport, &ofproto->ports, odp_port) {
592                 ofproto_sflow_add_port(os, odp_port,
593                                        netdev_get_name(ofport->netdev));
594             }
595         }
596         ofproto_sflow_set_options(os, oso);
597     } else {
598         ofproto_sflow_destroy(os);
599         ofproto->sflow = NULL;
600     }
601 }
602
603 void
604 ofproto_set_failure(struct ofproto *ofproto, bool fail_open)
605 {
606     if (fail_open) {
607         struct rconn *rconn = ofproto->controller->rconn;
608         int trigger_duration = rconn_get_probe_interval(rconn) * 3;
609         if (!ofproto->fail_open) {
610             ofproto->fail_open = fail_open_create(ofproto, trigger_duration,
611                                                   ofproto->switch_status,
612                                                   rconn);
613         } else {
614             fail_open_set_trigger_duration(ofproto->fail_open,
615                                            trigger_duration);
616         }
617     } else {
618         fail_open_destroy(ofproto->fail_open);
619         ofproto->fail_open = NULL;
620     }
621 }
622
623 void
624 ofproto_set_rate_limit(struct ofproto *ofproto,
625                        int rate_limit, int burst_limit)
626 {
627     if (rate_limit > 0) {
628         if (!ofproto->miss_sched) {
629             ofproto->miss_sched = pinsched_create(rate_limit, burst_limit,
630                                                   ofproto->switch_status);
631             ofproto->action_sched = pinsched_create(rate_limit, burst_limit,
632                                                     NULL);
633         } else {
634             pinsched_set_limits(ofproto->miss_sched, rate_limit, burst_limit);
635             pinsched_set_limits(ofproto->action_sched,
636                                 rate_limit, burst_limit);
637         }
638     } else {
639         pinsched_destroy(ofproto->miss_sched);
640         ofproto->miss_sched = NULL;
641         pinsched_destroy(ofproto->action_sched);
642         ofproto->action_sched = NULL;
643     }
644 }
645
646 int
647 ofproto_set_stp(struct ofproto *ofproto OVS_UNUSED, bool enable_stp)
648 {
649     /* XXX */
650     if (enable_stp) {
651         VLOG_WARN("STP is not yet implemented");
652         return EINVAL;
653     } else {
654         return 0;
655     }
656 }
657
658 uint64_t
659 ofproto_get_datapath_id(const struct ofproto *ofproto)
660 {
661     return ofproto->datapath_id;
662 }
663
664 int
665 ofproto_get_probe_interval(const struct ofproto *ofproto)
666 {
667     return rconn_get_probe_interval(ofproto->controller->rconn);
668 }
669
670 int
671 ofproto_get_max_backoff(const struct ofproto *ofproto)
672 {
673     return rconn_get_max_backoff(ofproto->controller->rconn);
674 }
675
676 bool
677 ofproto_get_in_band(const struct ofproto *ofproto)
678 {
679     return ofproto->in_band != NULL;
680 }
681
682 bool
683 ofproto_get_discovery(const struct ofproto *ofproto)
684 {
685     return ofproto->discovery != NULL;
686 }
687
688 const char *
689 ofproto_get_controller(const struct ofproto *ofproto)
690 {
691     return rconn_get_name(ofproto->controller->rconn);
692 }
693
694 void
695 ofproto_get_listeners(const struct ofproto *ofproto, struct svec *listeners)
696 {
697     size_t i;
698
699     for (i = 0; i < ofproto->n_listeners; i++) {
700         svec_add(listeners, pvconn_get_name(ofproto->listeners[i]));
701     }
702 }
703
704 void
705 ofproto_get_snoops(const struct ofproto *ofproto, struct svec *snoops)
706 {
707     size_t i;
708
709     for (i = 0; i < ofproto->n_snoops; i++) {
710         svec_add(snoops, pvconn_get_name(ofproto->snoops[i]));
711     }
712 }
713
714 void
715 ofproto_destroy(struct ofproto *p)
716 {
717     struct ofconn *ofconn, *next_ofconn;
718     struct ofport *ofport;
719     unsigned int port_no;
720     size_t i;
721
722     if (!p) {
723         return;
724     }
725
726     /* Destroy fail-open and in-band early, since they touch the classifier. */
727     ofproto_set_failure(p, false);
728     ofproto_set_in_band(p, false);
729
730     ofproto_flush_flows(p);
731     classifier_destroy(&p->cls);
732
733     LIST_FOR_EACH_SAFE (ofconn, next_ofconn, struct ofconn, node,
734                         &p->all_conns) {
735         ofconn_destroy(ofconn);
736     }
737
738     dpif_close(p->dpif);
739     netdev_monitor_destroy(p->netdev_monitor);
740     PORT_ARRAY_FOR_EACH (ofport, &p->ports, port_no) {
741         ofport_free(ofport);
742     }
743     shash_destroy(&p->port_by_name);
744
745     switch_status_destroy(p->switch_status);
746     discovery_destroy(p->discovery);
747     pinsched_destroy(p->miss_sched);
748     pinsched_destroy(p->action_sched);
749     netflow_destroy(p->netflow);
750     ofproto_sflow_destroy(p->sflow);
751
752     switch_status_unregister(p->ss_cat);
753
754     for (i = 0; i < p->n_listeners; i++) {
755         pvconn_close(p->listeners[i]);
756     }
757     free(p->listeners);
758
759     for (i = 0; i < p->n_snoops; i++) {
760         pvconn_close(p->snoops[i]);
761     }
762     free(p->snoops);
763
764     mac_learning_destroy(p->ml);
765
766     free(p->mfr_desc);
767     free(p->hw_desc);
768     free(p->sw_desc);
769     free(p->serial_desc);
770     free(p->dp_desc);
771
772     port_array_destroy(&p->ports);
773
774     free(p);
775 }
776
777 int
778 ofproto_run(struct ofproto *p)
779 {
780     int error = ofproto_run1(p);
781     if (!error) {
782         error = ofproto_run2(p, false);
783     }
784     return error;
785 }
786
787 static void
788 process_port_change(struct ofproto *ofproto, int error, char *devname)
789 {
790     if (error == ENOBUFS) {
791         reinit_ports(ofproto);
792     } else if (!error) {
793         update_port(ofproto, devname);
794         free(devname);
795     }
796 }
797
798 int
799 ofproto_run1(struct ofproto *p)
800 {
801     struct ofconn *ofconn, *next_ofconn;
802     char *devname;
803     int error;
804     int i;
805
806     if (shash_is_empty(&p->port_by_name)) {
807         init_ports(p);
808     }
809
810     for (i = 0; i < 50; i++) {
811         struct ofpbuf *buf;
812         int error;
813
814         error = dpif_recv(p->dpif, &buf);
815         if (error) {
816             if (error == ENODEV) {
817                 /* Someone destroyed the datapath behind our back.  The caller
818                  * better destroy us and give up, because we're just going to
819                  * spin from here on out. */
820                 static struct vlog_rate_limit rl2 = VLOG_RATE_LIMIT_INIT(1, 5);
821                 VLOG_ERR_RL(&rl2, "%s: datapath was destroyed externally",
822                             dpif_name(p->dpif));
823                 return ENODEV;
824             }
825             break;
826         }
827
828         handle_odp_msg(p, buf);
829     }
830
831     while ((error = dpif_port_poll(p->dpif, &devname)) != EAGAIN) {
832         process_port_change(p, error, devname);
833     }
834     while ((error = netdev_monitor_poll(p->netdev_monitor,
835                                         &devname)) != EAGAIN) {
836         process_port_change(p, error, devname);
837     }
838
839     if (p->in_band) {
840         in_band_run(p->in_band);
841     }
842     if (p->discovery) {
843         char *controller_name;
844         if (rconn_is_connectivity_questionable(p->controller->rconn)) {
845             discovery_question_connectivity(p->discovery);
846         }
847         if (discovery_run(p->discovery, &controller_name)) {
848             if (controller_name) {
849                 rconn_connect(p->controller->rconn, controller_name);
850             } else {
851                 rconn_disconnect(p->controller->rconn);
852             }
853         }
854     }
855     pinsched_run(p->miss_sched, send_packet_in_miss, p);
856     pinsched_run(p->action_sched, send_packet_in_action, p);
857
858     LIST_FOR_EACH_SAFE (ofconn, next_ofconn, struct ofconn, node,
859                         &p->all_conns) {
860         ofconn_run(ofconn, p);
861     }
862
863     /* Fail-open maintenance.  Do this after processing the ofconns since
864      * fail-open checks the status of the controller rconn. */
865     if (p->fail_open) {
866         fail_open_run(p->fail_open);
867     }
868
869     for (i = 0; i < p->n_listeners; i++) {
870         struct vconn *vconn;
871         int retval;
872
873         retval = pvconn_accept(p->listeners[i], OFP_VERSION, &vconn);
874         if (!retval) {
875             ofconn_create(p, rconn_new_from_vconn("passive", vconn));
876         } else if (retval != EAGAIN) {
877             VLOG_WARN_RL(&rl, "accept failed (%s)", strerror(retval));
878         }
879     }
880
881     for (i = 0; i < p->n_snoops; i++) {
882         struct vconn *vconn;
883         int retval;
884
885         retval = pvconn_accept(p->snoops[i], OFP_VERSION, &vconn);
886         if (!retval) {
887             rconn_add_monitor(p->controller->rconn, vconn);
888         } else if (retval != EAGAIN) {
889             VLOG_WARN_RL(&rl, "accept failed (%s)", strerror(retval));
890         }
891     }
892
893     if (time_msec() >= p->next_expiration) {
894         COVERAGE_INC(ofproto_expiration);
895         p->next_expiration = time_msec() + 1000;
896         update_used(p);
897
898         classifier_for_each(&p->cls, CLS_INC_ALL, expire_rule, p);
899
900         /* Let the hook know that we're at a stable point: all outstanding data
901          * in existing flows has been accounted to the account_cb.  Thus, the
902          * hook can now reasonably do operations that depend on having accurate
903          * flow volume accounting (currently, that's just bond rebalancing). */
904         if (p->ofhooks->account_checkpoint_cb) {
905             p->ofhooks->account_checkpoint_cb(p->aux);
906         }
907     }
908
909     if (p->netflow) {
910         netflow_run(p->netflow);
911     }
912     if (p->sflow) {
913         ofproto_sflow_run(p->sflow);
914     }
915
916     return 0;
917 }
918
919 struct revalidate_cbdata {
920     struct ofproto *ofproto;
921     bool revalidate_all;        /* Revalidate all exact-match rules? */
922     bool revalidate_subrules;   /* Revalidate all exact-match subrules? */
923     struct tag_set revalidate_set; /* Set of tags to revalidate. */
924 };
925
926 int
927 ofproto_run2(struct ofproto *p, bool revalidate_all)
928 {
929     if (p->need_revalidate || revalidate_all
930         || !tag_set_is_empty(&p->revalidate_set)) {
931         struct revalidate_cbdata cbdata;
932         cbdata.ofproto = p;
933         cbdata.revalidate_all = revalidate_all;
934         cbdata.revalidate_subrules = p->need_revalidate;
935         cbdata.revalidate_set = p->revalidate_set;
936         tag_set_init(&p->revalidate_set);
937         COVERAGE_INC(ofproto_revalidate);
938         classifier_for_each(&p->cls, CLS_INC_EXACT, revalidate_cb, &cbdata);
939         p->need_revalidate = false;
940     }
941
942     return 0;
943 }
944
945 void
946 ofproto_wait(struct ofproto *p)
947 {
948     struct ofconn *ofconn;
949     size_t i;
950
951     dpif_recv_wait(p->dpif);
952     dpif_port_poll_wait(p->dpif);
953     netdev_monitor_poll_wait(p->netdev_monitor);
954     LIST_FOR_EACH (ofconn, struct ofconn, node, &p->all_conns) {
955         ofconn_wait(ofconn);
956     }
957     if (p->in_band) {
958         in_band_wait(p->in_band);
959     }
960     if (p->discovery) {
961         discovery_wait(p->discovery);
962     }
963     if (p->fail_open) {
964         fail_open_wait(p->fail_open);
965     }
966     pinsched_wait(p->miss_sched);
967     pinsched_wait(p->action_sched);
968     if (p->sflow) {
969         ofproto_sflow_wait(p->sflow);
970     }
971     if (!tag_set_is_empty(&p->revalidate_set)) {
972         poll_immediate_wake();
973     }
974     if (p->need_revalidate) {
975         /* Shouldn't happen, but if it does just go around again. */
976         VLOG_DBG_RL(&rl, "need revalidate in ofproto_wait_cb()");
977         poll_immediate_wake();
978     } else if (p->next_expiration != LLONG_MAX) {
979         poll_timer_wait(p->next_expiration - time_msec());
980     }
981     for (i = 0; i < p->n_listeners; i++) {
982         pvconn_wait(p->listeners[i]);
983     }
984     for (i = 0; i < p->n_snoops; i++) {
985         pvconn_wait(p->snoops[i]);
986     }
987 }
988
989 void
990 ofproto_revalidate(struct ofproto *ofproto, tag_type tag)
991 {
992     tag_set_add(&ofproto->revalidate_set, tag);
993 }
994
995 struct tag_set *
996 ofproto_get_revalidate_set(struct ofproto *ofproto)
997 {
998     return &ofproto->revalidate_set;
999 }
1000
1001 bool
1002 ofproto_is_alive(const struct ofproto *p)
1003 {
1004     return p->discovery || rconn_is_alive(p->controller->rconn);
1005 }
1006
1007 int
1008 ofproto_send_packet(struct ofproto *p, const flow_t *flow,
1009                     const union ofp_action *actions, size_t n_actions,
1010                     const struct ofpbuf *packet)
1011 {
1012     struct odp_actions odp_actions;
1013     int error;
1014
1015     error = xlate_actions(actions, n_actions, flow, p, packet, &odp_actions,
1016                           NULL, NULL, NULL);
1017     if (error) {
1018         return error;
1019     }
1020
1021     /* XXX Should we translate the dpif_execute() errno value into an OpenFlow
1022      * error code? */
1023     dpif_execute(p->dpif, flow->in_port, odp_actions.actions,
1024                  odp_actions.n_actions, packet);
1025     return 0;
1026 }
1027
1028 void
1029 ofproto_add_flow(struct ofproto *p,
1030                  const flow_t *flow, uint32_t wildcards, unsigned int priority,
1031                  const union ofp_action *actions, size_t n_actions,
1032                  int idle_timeout)
1033 {
1034     struct rule *rule;
1035     rule = rule_create(p, NULL, actions, n_actions,
1036                        idle_timeout >= 0 ? idle_timeout : 5 /* XXX */, 
1037                        0, 0, false);
1038     cls_rule_from_flow(flow, wildcards, priority, &rule->cr);
1039     rule_insert(p, rule, NULL, 0);
1040 }
1041
1042 void
1043 ofproto_delete_flow(struct ofproto *ofproto, const flow_t *flow,
1044                     uint32_t wildcards, unsigned int priority)
1045 {
1046     struct rule *rule;
1047
1048     rule = rule_from_cls_rule(classifier_find_rule_exactly(&ofproto->cls,
1049                                                            flow, wildcards,
1050                                                            priority));
1051     if (rule) {
1052         rule_remove(ofproto, rule);
1053     }
1054 }
1055
1056 static void
1057 destroy_rule(struct cls_rule *rule_, void *ofproto_)
1058 {
1059     struct rule *rule = rule_from_cls_rule(rule_);
1060     struct ofproto *ofproto = ofproto_;
1061
1062     /* Mark the flow as not installed, even though it might really be
1063      * installed, so that rule_remove() doesn't bother trying to uninstall it.
1064      * There is no point in uninstalling it individually since we are about to
1065      * blow away all the flows with dpif_flow_flush(). */
1066     rule->installed = false;
1067
1068     rule_remove(ofproto, rule);
1069 }
1070
1071 void
1072 ofproto_flush_flows(struct ofproto *ofproto)
1073 {
1074     COVERAGE_INC(ofproto_flush);
1075     classifier_for_each(&ofproto->cls, CLS_INC_ALL, destroy_rule, ofproto);
1076     dpif_flow_flush(ofproto->dpif);
1077     if (ofproto->in_band) {
1078         in_band_flushed(ofproto->in_band);
1079     }
1080     if (ofproto->fail_open) {
1081         fail_open_flushed(ofproto->fail_open);
1082     }
1083 }
1084 \f
1085 static void
1086 reinit_ports(struct ofproto *p)
1087 {
1088     struct svec devnames;
1089     struct ofport *ofport;
1090     unsigned int port_no;
1091     struct odp_port *odp_ports;
1092     size_t n_odp_ports;
1093     size_t i;
1094
1095     svec_init(&devnames);
1096     PORT_ARRAY_FOR_EACH (ofport, &p->ports, port_no) {
1097         svec_add (&devnames, (char *) ofport->opp.name);
1098     }
1099     dpif_port_list(p->dpif, &odp_ports, &n_odp_ports);
1100     for (i = 0; i < n_odp_ports; i++) {
1101         svec_add (&devnames, odp_ports[i].devname);
1102     }
1103     free(odp_ports);
1104
1105     svec_sort_unique(&devnames);
1106     for (i = 0; i < devnames.n; i++) {
1107         update_port(p, devnames.names[i]);
1108     }
1109     svec_destroy(&devnames);
1110 }
1111
1112 static size_t
1113 refresh_port_group(struct ofproto *p, unsigned int group)
1114 {
1115     uint16_t *ports;
1116     size_t n_ports;
1117     struct ofport *port;
1118     unsigned int port_no;
1119
1120     assert(group == DP_GROUP_ALL || group == DP_GROUP_FLOOD);
1121
1122     ports = xmalloc(port_array_count(&p->ports) * sizeof *ports);
1123     n_ports = 0;
1124     PORT_ARRAY_FOR_EACH (port, &p->ports, port_no) {
1125         if (group == DP_GROUP_ALL || !(port->opp.config & OFPPC_NO_FLOOD)) {
1126             ports[n_ports++] = port_no;
1127         }
1128     }
1129     dpif_port_group_set(p->dpif, group, ports, n_ports);
1130     free(ports);
1131
1132     return n_ports;
1133 }
1134
1135 static void
1136 refresh_port_groups(struct ofproto *p)
1137 {
1138     size_t n_flood = refresh_port_group(p, DP_GROUP_FLOOD);
1139     size_t n_all = refresh_port_group(p, DP_GROUP_ALL);
1140     if (p->sflow) {
1141         ofproto_sflow_set_group_sizes(p->sflow, n_flood, n_all);
1142     }
1143 }
1144
1145 static struct ofport *
1146 make_ofport(const struct odp_port *odp_port)
1147 {
1148     struct netdev_options netdev_options;
1149     enum netdev_flags flags;
1150     struct ofport *ofport;
1151     struct netdev *netdev;
1152     bool carrier;
1153     int error;
1154
1155     memset(&netdev_options, 0, sizeof netdev_options);
1156     netdev_options.name = odp_port->devname;
1157     netdev_options.ethertype = NETDEV_ETH_TYPE_NONE;
1158     netdev_options.may_open = true;
1159
1160     error = netdev_open(&netdev_options, &netdev);
1161     if (error) {
1162         VLOG_WARN_RL(&rl, "ignoring port %s (%"PRIu16") because netdev %s "
1163                      "cannot be opened (%s)",
1164                      odp_port->devname, odp_port->port,
1165                      odp_port->devname, strerror(error));
1166         return NULL;
1167     }
1168
1169     ofport = xmalloc(sizeof *ofport);
1170     ofport->netdev = netdev;
1171     ofport->opp.port_no = odp_port_to_ofp_port(odp_port->port);
1172     netdev_get_etheraddr(netdev, ofport->opp.hw_addr);
1173     memcpy(ofport->opp.name, odp_port->devname,
1174            MIN(sizeof ofport->opp.name, sizeof odp_port->devname));
1175     ofport->opp.name[sizeof ofport->opp.name - 1] = '\0';
1176
1177     netdev_get_flags(netdev, &flags);
1178     ofport->opp.config = flags & NETDEV_UP ? 0 : OFPPC_PORT_DOWN;
1179
1180     netdev_get_carrier(netdev, &carrier);
1181     ofport->opp.state = carrier ? 0 : OFPPS_LINK_DOWN;
1182
1183     netdev_get_features(netdev,
1184                         &ofport->opp.curr, &ofport->opp.advertised,
1185                         &ofport->opp.supported, &ofport->opp.peer);
1186     return ofport;
1187 }
1188
1189 static bool
1190 ofport_conflicts(const struct ofproto *p, const struct odp_port *odp_port)
1191 {
1192     if (port_array_get(&p->ports, odp_port->port)) {
1193         VLOG_WARN_RL(&rl, "ignoring duplicate port %"PRIu16" in datapath",
1194                      odp_port->port);
1195         return true;
1196     } else if (shash_find(&p->port_by_name, odp_port->devname)) {
1197         VLOG_WARN_RL(&rl, "ignoring duplicate device %s in datapath",
1198                      odp_port->devname);
1199         return true;
1200     } else {
1201         return false;
1202     }
1203 }
1204
1205 static int
1206 ofport_equal(const struct ofport *a_, const struct ofport *b_)
1207 {
1208     const struct ofp_phy_port *a = &a_->opp;
1209     const struct ofp_phy_port *b = &b_->opp;
1210
1211     BUILD_ASSERT_DECL(sizeof *a == 48); /* Detect ofp_phy_port changes. */
1212     return (a->port_no == b->port_no
1213             && !memcmp(a->hw_addr, b->hw_addr, sizeof a->hw_addr)
1214             && !strcmp((char *) a->name, (char *) b->name)
1215             && a->state == b->state
1216             && a->config == b->config
1217             && a->curr == b->curr
1218             && a->advertised == b->advertised
1219             && a->supported == b->supported
1220             && a->peer == b->peer);
1221 }
1222
1223 static void
1224 send_port_status(struct ofproto *p, const struct ofport *ofport,
1225                  uint8_t reason)
1226 {
1227     /* XXX Should limit the number of queued port status change messages. */
1228     struct ofconn *ofconn;
1229     LIST_FOR_EACH (ofconn, struct ofconn, node, &p->all_conns) {
1230         struct ofp_port_status *ops;
1231         struct ofpbuf *b;
1232
1233         ops = make_openflow_xid(sizeof *ops, OFPT_PORT_STATUS, 0, &b);
1234         ops->reason = reason;
1235         ops->desc = ofport->opp;
1236         hton_ofp_phy_port(&ops->desc);
1237         queue_tx(b, ofconn, NULL);
1238     }
1239     if (p->ofhooks->port_changed_cb) {
1240         p->ofhooks->port_changed_cb(reason, &ofport->opp, p->aux);
1241     }
1242 }
1243
1244 static void
1245 ofport_install(struct ofproto *p, struct ofport *ofport)
1246 {
1247     uint16_t odp_port = ofp_port_to_odp_port(ofport->opp.port_no);
1248     const char *netdev_name = (const char *) ofport->opp.name;
1249
1250     netdev_monitor_add(p->netdev_monitor, ofport->netdev);
1251     port_array_set(&p->ports, odp_port, ofport);
1252     shash_add(&p->port_by_name, netdev_name, ofport);
1253     if (p->sflow) {
1254         ofproto_sflow_add_port(p->sflow, odp_port, netdev_name);
1255     }
1256 }
1257
1258 static void
1259 ofport_remove(struct ofproto *p, struct ofport *ofport)
1260 {
1261     uint16_t odp_port = ofp_port_to_odp_port(ofport->opp.port_no);
1262
1263     netdev_monitor_remove(p->netdev_monitor, ofport->netdev);
1264     port_array_set(&p->ports, odp_port, NULL);
1265     shash_delete(&p->port_by_name,
1266                  shash_find(&p->port_by_name, (char *) ofport->opp.name));
1267     if (p->sflow) {
1268         ofproto_sflow_del_port(p->sflow, odp_port);
1269     }
1270 }
1271
1272 static void
1273 ofport_free(struct ofport *ofport)
1274 {
1275     if (ofport) {
1276         netdev_close(ofport->netdev);
1277         free(ofport);
1278     }
1279 }
1280
1281 static void
1282 update_port(struct ofproto *p, const char *devname)
1283 {
1284     struct odp_port odp_port;
1285     struct ofport *old_ofport;
1286     struct ofport *new_ofport;
1287     int error;
1288
1289     COVERAGE_INC(ofproto_update_port);
1290
1291     /* Query the datapath for port information. */
1292     error = dpif_port_query_by_name(p->dpif, devname, &odp_port);
1293
1294     /* Find the old ofport. */
1295     old_ofport = shash_find_data(&p->port_by_name, devname);
1296     if (!error) {
1297         if (!old_ofport) {
1298             /* There's no port named 'devname' but there might be a port with
1299              * the same port number.  This could happen if a port is deleted
1300              * and then a new one added in its place very quickly, or if a port
1301              * is renamed.  In the former case we want to send an OFPPR_DELETE
1302              * and an OFPPR_ADD, and in the latter case we want to send a
1303              * single OFPPR_MODIFY.  We can distinguish the cases by comparing
1304              * the old port's ifindex against the new port, or perhaps less
1305              * reliably but more portably by comparing the old port's MAC
1306              * against the new port's MAC.  However, this code isn't that smart
1307              * and always sends an OFPPR_MODIFY (XXX). */
1308             old_ofport = port_array_get(&p->ports, odp_port.port);
1309         }
1310     } else if (error != ENOENT && error != ENODEV) {
1311         VLOG_WARN_RL(&rl, "dpif_port_query_by_name returned unexpected error "
1312                      "%s", strerror(error));
1313         return;
1314     }
1315
1316     /* Create a new ofport. */
1317     new_ofport = !error ? make_ofport(&odp_port) : NULL;
1318
1319     /* Eliminate a few pathological cases. */
1320     if (!old_ofport && !new_ofport) {
1321         return;
1322     } else if (old_ofport && new_ofport) {
1323         /* Most of the 'config' bits are OpenFlow soft state, but
1324          * OFPPC_PORT_DOWN is maintained the kernel.  So transfer the OpenFlow
1325          * bits from old_ofport.  (make_ofport() only sets OFPPC_PORT_DOWN and
1326          * leaves the other bits 0.)  */
1327         new_ofport->opp.config |= old_ofport->opp.config & ~OFPPC_PORT_DOWN;
1328
1329         if (ofport_equal(old_ofport, new_ofport)) {
1330             /* False alarm--no change. */
1331             ofport_free(new_ofport);
1332             return;
1333         }
1334     }
1335
1336     /* Now deal with the normal cases. */
1337     if (old_ofport) {
1338         ofport_remove(p, old_ofport);
1339     }
1340     if (new_ofport) {
1341         ofport_install(p, new_ofport);
1342     }
1343     send_port_status(p, new_ofport ? new_ofport : old_ofport,
1344                      (!old_ofport ? OFPPR_ADD
1345                       : !new_ofport ? OFPPR_DELETE
1346                       : OFPPR_MODIFY));
1347     ofport_free(old_ofport);
1348
1349     /* Update port groups. */
1350     refresh_port_groups(p);
1351 }
1352
1353 static int
1354 init_ports(struct ofproto *p)
1355 {
1356     struct odp_port *ports;
1357     size_t n_ports;
1358     size_t i;
1359     int error;
1360
1361     error = dpif_port_list(p->dpif, &ports, &n_ports);
1362     if (error) {
1363         return error;
1364     }
1365
1366     for (i = 0; i < n_ports; i++) {
1367         const struct odp_port *odp_port = &ports[i];
1368         if (!ofport_conflicts(p, odp_port)) {
1369             struct ofport *ofport = make_ofport(odp_port);
1370             if (ofport) {
1371                 ofport_install(p, ofport);
1372             }
1373         }
1374     }
1375     free(ports);
1376     refresh_port_groups(p);
1377     return 0;
1378 }
1379 \f
1380 static struct ofconn *
1381 ofconn_create(struct ofproto *p, struct rconn *rconn)
1382 {
1383     struct ofconn *ofconn = xmalloc(sizeof *ofconn);
1384     list_push_back(&p->all_conns, &ofconn->node);
1385     ofconn->rconn = rconn;
1386     ofconn->pktbuf = NULL;
1387     ofconn->miss_send_len = 0;
1388     ofconn->packet_in_counter = rconn_packet_counter_create ();
1389     ofconn->reply_counter = rconn_packet_counter_create ();
1390     return ofconn;
1391 }
1392
1393 static void
1394 ofconn_destroy(struct ofconn *ofconn)
1395 {
1396     list_remove(&ofconn->node);
1397     rconn_destroy(ofconn->rconn);
1398     rconn_packet_counter_destroy(ofconn->packet_in_counter);
1399     rconn_packet_counter_destroy(ofconn->reply_counter);
1400     pktbuf_destroy(ofconn->pktbuf);
1401     free(ofconn);
1402 }
1403
1404 static void
1405 ofconn_run(struct ofconn *ofconn, struct ofproto *p)
1406 {
1407     int iteration;
1408
1409     rconn_run(ofconn->rconn);
1410
1411     if (rconn_packet_counter_read (ofconn->reply_counter) < OFCONN_REPLY_MAX) {
1412         /* Limit the number of iterations to prevent other tasks from
1413          * starving. */
1414         for (iteration = 0; iteration < 50; iteration++) {
1415             struct ofpbuf *of_msg = rconn_recv(ofconn->rconn);
1416             if (!of_msg) {
1417                 break;
1418             }
1419             if (p->fail_open) {
1420                 fail_open_maybe_recover(p->fail_open);
1421             }
1422             handle_openflow(ofconn, p, of_msg);
1423             ofpbuf_delete(of_msg);
1424         }
1425     }
1426
1427     if (ofconn != p->controller && !rconn_is_alive(ofconn->rconn)) {
1428         ofconn_destroy(ofconn);
1429     }
1430 }
1431
1432 static void
1433 ofconn_wait(struct ofconn *ofconn)
1434 {
1435     rconn_run_wait(ofconn->rconn);
1436     if (rconn_packet_counter_read (ofconn->reply_counter) < OFCONN_REPLY_MAX) {
1437         rconn_recv_wait(ofconn->rconn);
1438     } else {
1439         COVERAGE_INC(ofproto_ofconn_stuck);
1440     }
1441 }
1442 \f
1443 /* Caller is responsible for initializing the 'cr' member of the returned
1444  * rule. */
1445 static struct rule *
1446 rule_create(struct ofproto *ofproto, struct rule *super,
1447             const union ofp_action *actions, size_t n_actions,
1448             uint16_t idle_timeout, uint16_t hard_timeout,
1449             uint64_t flow_cookie, bool send_flow_removed)
1450 {
1451     struct rule *rule = xzalloc(sizeof *rule);
1452     rule->idle_timeout = idle_timeout;
1453     rule->hard_timeout = hard_timeout;
1454     rule->flow_cookie = flow_cookie;
1455     rule->used = rule->created = time_msec();
1456     rule->send_flow_removed = send_flow_removed;
1457     rule->super = super;
1458     if (super) {
1459         list_push_back(&super->list, &rule->list);
1460     } else {
1461         list_init(&rule->list);
1462     }
1463     rule->n_actions = n_actions;
1464     rule->actions = xmemdup(actions, n_actions * sizeof *actions);
1465     netflow_flow_clear(&rule->nf_flow);
1466     netflow_flow_update_time(ofproto->netflow, &rule->nf_flow, rule->created);
1467
1468     return rule;
1469 }
1470
1471 static struct rule *
1472 rule_from_cls_rule(const struct cls_rule *cls_rule)
1473 {
1474     return cls_rule ? CONTAINER_OF(cls_rule, struct rule, cr) : NULL;
1475 }
1476
1477 static void
1478 rule_free(struct rule *rule)
1479 {
1480     free(rule->actions);
1481     free(rule->odp_actions);
1482     free(rule);
1483 }
1484
1485 /* Destroys 'rule'.  If 'rule' is a subrule, also removes it from its
1486  * super-rule's list of subrules.  If 'rule' is a super-rule, also iterates
1487  * through all of its subrules and revalidates them, destroying any that no
1488  * longer has a super-rule (which is probably all of them).
1489  *
1490  * Before calling this function, the caller must make have removed 'rule' from
1491  * the classifier.  If 'rule' is an exact-match rule, the caller is also
1492  * responsible for ensuring that it has been uninstalled from the datapath. */
1493 static void
1494 rule_destroy(struct ofproto *ofproto, struct rule *rule)
1495 {
1496     if (!rule->super) {
1497         struct rule *subrule, *next;
1498         LIST_FOR_EACH_SAFE (subrule, next, struct rule, list, &rule->list) {
1499             revalidate_rule(ofproto, subrule);
1500         }
1501     } else {
1502         list_remove(&rule->list);
1503     }
1504     rule_free(rule);
1505 }
1506
1507 static bool
1508 rule_has_out_port(const struct rule *rule, uint16_t out_port)
1509 {
1510     const union ofp_action *oa;
1511     struct actions_iterator i;
1512
1513     if (out_port == htons(OFPP_NONE)) {
1514         return true;
1515     }
1516     for (oa = actions_first(&i, rule->actions, rule->n_actions); oa;
1517          oa = actions_next(&i)) {
1518         if (oa->type == htons(OFPAT_OUTPUT) && oa->output.port == out_port) {
1519             return true;
1520         }
1521     }
1522     return false;
1523 }
1524
1525 /* Executes the actions indicated by 'rule' on 'packet', which is in flow
1526  * 'flow' and is considered to have arrived on ODP port 'in_port'.
1527  *
1528  * The flow that 'packet' actually contains does not need to actually match
1529  * 'rule'; the actions in 'rule' will be applied to it either way.  Likewise,
1530  * the packet and byte counters for 'rule' will be credited for the packet sent
1531  * out whether or not the packet actually matches 'rule'.
1532  *
1533  * If 'rule' is an exact-match rule and 'flow' actually equals the rule's flow,
1534  * the caller must already have accurately composed ODP actions for it given
1535  * 'packet' using rule_make_actions().  If 'rule' is a wildcard rule, or if
1536  * 'rule' is an exact-match rule but 'flow' is not the rule's flow, then this
1537  * function will compose a set of ODP actions based on 'rule''s OpenFlow
1538  * actions and apply them to 'packet'. */
1539 static void
1540 rule_execute(struct ofproto *ofproto, struct rule *rule,
1541              struct ofpbuf *packet, const flow_t *flow)
1542 {
1543     const union odp_action *actions;
1544     size_t n_actions;
1545     struct odp_actions a;
1546
1547     /* Grab or compose the ODP actions.
1548      *
1549      * The special case for an exact-match 'rule' where 'flow' is not the
1550      * rule's flow is important to avoid, e.g., sending a packet out its input
1551      * port simply because the ODP actions were composed for the wrong
1552      * scenario. */
1553     if (rule->cr.wc.wildcards || !flow_equal(flow, &rule->cr.flow)) {
1554         struct rule *super = rule->super ? rule->super : rule;
1555         if (xlate_actions(super->actions, super->n_actions, flow, ofproto,
1556                           packet, &a, NULL, 0, NULL)) {
1557             return;
1558         }
1559         actions = a.actions;
1560         n_actions = a.n_actions;
1561     } else {
1562         actions = rule->odp_actions;
1563         n_actions = rule->n_odp_actions;
1564     }
1565
1566     /* Execute the ODP actions. */
1567     if (!dpif_execute(ofproto->dpif, flow->in_port,
1568                       actions, n_actions, packet)) {
1569         struct odp_flow_stats stats;
1570         flow_extract_stats(flow, packet, &stats);
1571         update_stats(ofproto, rule, &stats);
1572         rule->used = time_msec();
1573         netflow_flow_update_time(ofproto->netflow, &rule->nf_flow, rule->used);
1574     }
1575 }
1576
1577 static void
1578 rule_insert(struct ofproto *p, struct rule *rule, struct ofpbuf *packet,
1579             uint16_t in_port)
1580 {
1581     struct rule *displaced_rule;
1582
1583     /* Insert the rule in the classifier. */
1584     displaced_rule = rule_from_cls_rule(classifier_insert(&p->cls, &rule->cr));
1585     if (!rule->cr.wc.wildcards) {
1586         rule_make_actions(p, rule, packet);
1587     }
1588
1589     /* Send the packet and credit it to the rule. */
1590     if (packet) {
1591         flow_t flow;
1592         flow_extract(packet, 0, in_port, &flow);
1593         rule_execute(p, rule, packet, &flow);
1594     }
1595
1596     /* Install the rule in the datapath only after sending the packet, to
1597      * avoid packet reordering.  */
1598     if (rule->cr.wc.wildcards) {
1599         COVERAGE_INC(ofproto_add_wc_flow);
1600         p->need_revalidate = true;
1601     } else {
1602         rule_install(p, rule, displaced_rule);
1603     }
1604
1605     /* Free the rule that was displaced, if any. */
1606     if (displaced_rule) {
1607         rule_destroy(p, displaced_rule);
1608     }
1609 }
1610
1611 static struct rule *
1612 rule_create_subrule(struct ofproto *ofproto, struct rule *rule,
1613                     const flow_t *flow)
1614 {
1615     struct rule *subrule = rule_create(ofproto, rule, NULL, 0,
1616                                        rule->idle_timeout, rule->hard_timeout,
1617                                        0, false);
1618     COVERAGE_INC(ofproto_subrule_create);
1619     cls_rule_from_flow(flow, 0, (rule->cr.priority <= UINT16_MAX ? UINT16_MAX
1620                         : rule->cr.priority), &subrule->cr);
1621     classifier_insert_exact(&ofproto->cls, &subrule->cr);
1622
1623     return subrule;
1624 }
1625
1626 static void
1627 rule_remove(struct ofproto *ofproto, struct rule *rule)
1628 {
1629     if (rule->cr.wc.wildcards) {
1630         COVERAGE_INC(ofproto_del_wc_flow);
1631         ofproto->need_revalidate = true;
1632     } else {
1633         rule_uninstall(ofproto, rule);
1634     }
1635     classifier_remove(&ofproto->cls, &rule->cr);
1636     rule_destroy(ofproto, rule);
1637 }
1638
1639 /* Returns true if the actions changed, false otherwise. */
1640 static bool
1641 rule_make_actions(struct ofproto *p, struct rule *rule,
1642                   const struct ofpbuf *packet)
1643 {
1644     const struct rule *super;
1645     struct odp_actions a;
1646     size_t actions_len;
1647
1648     assert(!rule->cr.wc.wildcards);
1649
1650     super = rule->super ? rule->super : rule;
1651     rule->tags = 0;
1652     xlate_actions(super->actions, super->n_actions, &rule->cr.flow, p,
1653                   packet, &a, &rule->tags, &rule->may_install,
1654                   &rule->nf_flow.output_iface);
1655
1656     actions_len = a.n_actions * sizeof *a.actions;
1657     if (rule->n_odp_actions != a.n_actions
1658         || memcmp(rule->odp_actions, a.actions, actions_len)) {
1659         COVERAGE_INC(ofproto_odp_unchanged);
1660         free(rule->odp_actions);
1661         rule->n_odp_actions = a.n_actions;
1662         rule->odp_actions = xmemdup(a.actions, actions_len);
1663         return true;
1664     } else {
1665         return false;
1666     }
1667 }
1668
1669 static int
1670 do_put_flow(struct ofproto *ofproto, struct rule *rule, int flags,
1671             struct odp_flow_put *put)
1672 {
1673     memset(&put->flow.stats, 0, sizeof put->flow.stats);
1674     put->flow.key = rule->cr.flow;
1675     put->flow.actions = rule->odp_actions;
1676     put->flow.n_actions = rule->n_odp_actions;
1677     put->flow.flags = 0;
1678     put->flags = flags;
1679     return dpif_flow_put(ofproto->dpif, put);
1680 }
1681
1682 static void
1683 rule_install(struct ofproto *p, struct rule *rule, struct rule *displaced_rule)
1684 {
1685     assert(!rule->cr.wc.wildcards);
1686
1687     if (rule->may_install) {
1688         struct odp_flow_put put;
1689         if (!do_put_flow(p, rule,
1690                          ODPPF_CREATE | ODPPF_MODIFY | ODPPF_ZERO_STATS,
1691                          &put)) {
1692             rule->installed = true;
1693             if (displaced_rule) {
1694                 update_stats(p, displaced_rule, &put.flow.stats);
1695                 rule_post_uninstall(p, displaced_rule);
1696             }
1697         }
1698     } else if (displaced_rule) {
1699         rule_uninstall(p, displaced_rule);
1700     }
1701 }
1702
1703 static void
1704 rule_reinstall(struct ofproto *ofproto, struct rule *rule)
1705 {
1706     if (rule->installed) {
1707         struct odp_flow_put put;
1708         COVERAGE_INC(ofproto_dp_missed);
1709         do_put_flow(ofproto, rule, ODPPF_CREATE | ODPPF_MODIFY, &put);
1710     } else {
1711         rule_install(ofproto, rule, NULL);
1712     }
1713 }
1714
1715 static void
1716 rule_update_actions(struct ofproto *ofproto, struct rule *rule)
1717 {
1718     bool actions_changed;
1719     uint16_t new_out_iface, old_out_iface;
1720
1721     old_out_iface = rule->nf_flow.output_iface;
1722     actions_changed = rule_make_actions(ofproto, rule, NULL);
1723
1724     if (rule->may_install) {
1725         if (rule->installed) {
1726             if (actions_changed) {
1727                 struct odp_flow_put put;
1728                 do_put_flow(ofproto, rule, ODPPF_CREATE | ODPPF_MODIFY
1729                                            | ODPPF_ZERO_STATS, &put);
1730                 update_stats(ofproto, rule, &put.flow.stats);
1731
1732                 /* Temporarily set the old output iface so that NetFlow
1733                  * messages have the correct output interface for the old
1734                  * stats. */
1735                 new_out_iface = rule->nf_flow.output_iface;
1736                 rule->nf_flow.output_iface = old_out_iface;
1737                 rule_post_uninstall(ofproto, rule);
1738                 rule->nf_flow.output_iface = new_out_iface;
1739             }
1740         } else {
1741             rule_install(ofproto, rule, NULL);
1742         }
1743     } else {
1744         rule_uninstall(ofproto, rule);
1745     }
1746 }
1747
1748 static void
1749 rule_account(struct ofproto *ofproto, struct rule *rule, uint64_t extra_bytes)
1750 {
1751     uint64_t total_bytes = rule->byte_count + extra_bytes;
1752
1753     if (ofproto->ofhooks->account_flow_cb
1754         && total_bytes > rule->accounted_bytes)
1755     {
1756         ofproto->ofhooks->account_flow_cb(
1757             &rule->cr.flow, rule->odp_actions, rule->n_odp_actions,
1758             total_bytes - rule->accounted_bytes, ofproto->aux);
1759         rule->accounted_bytes = total_bytes;
1760     }
1761 }
1762
1763 static void
1764 rule_uninstall(struct ofproto *p, struct rule *rule)
1765 {
1766     assert(!rule->cr.wc.wildcards);
1767     if (rule->installed) {
1768         struct odp_flow odp_flow;
1769
1770         odp_flow.key = rule->cr.flow;
1771         odp_flow.actions = NULL;
1772         odp_flow.n_actions = 0;
1773         odp_flow.flags = 0;
1774         if (!dpif_flow_del(p->dpif, &odp_flow)) {
1775             update_stats(p, rule, &odp_flow.stats);
1776         }
1777         rule->installed = false;
1778
1779         rule_post_uninstall(p, rule);
1780     }
1781 }
1782
1783 static bool
1784 is_controller_rule(struct rule *rule)
1785 {
1786     /* If the only action is send to the controller then don't report
1787      * NetFlow expiration messages since it is just part of the control
1788      * logic for the network and not real traffic. */
1789
1790     if (rule && rule->super) {
1791         struct rule *super = rule->super;
1792
1793         return super->n_actions == 1 &&
1794                super->actions[0].type == htons(OFPAT_OUTPUT) &&
1795                super->actions[0].output.port == htons(OFPP_CONTROLLER);
1796     }
1797
1798     return false;
1799 }
1800
1801 static void
1802 rule_post_uninstall(struct ofproto *ofproto, struct rule *rule)
1803 {
1804     struct rule *super = rule->super;
1805
1806     rule_account(ofproto, rule, 0);
1807
1808     if (ofproto->netflow && !is_controller_rule(rule)) {
1809         struct ofexpired expired;
1810         expired.flow = rule->cr.flow;
1811         expired.packet_count = rule->packet_count;
1812         expired.byte_count = rule->byte_count;
1813         expired.used = rule->used;
1814         netflow_expire(ofproto->netflow, &rule->nf_flow, &expired);
1815     }
1816     if (super) {
1817         super->packet_count += rule->packet_count;
1818         super->byte_count += rule->byte_count;
1819
1820         /* Reset counters to prevent double counting if the rule ever gets
1821          * reinstalled. */
1822         rule->packet_count = 0;
1823         rule->byte_count = 0;
1824         rule->accounted_bytes = 0;
1825
1826         netflow_flow_clear(&rule->nf_flow);
1827     }
1828 }
1829 \f
1830 static void
1831 queue_tx(struct ofpbuf *msg, const struct ofconn *ofconn,
1832          struct rconn_packet_counter *counter)
1833 {
1834     update_openflow_length(msg);
1835     if (rconn_send(ofconn->rconn, msg, counter)) {
1836         ofpbuf_delete(msg);
1837     }
1838 }
1839
1840 static void
1841 send_error(const struct ofconn *ofconn, const struct ofp_header *oh,
1842            int error, const void *data, size_t len)
1843 {
1844     struct ofpbuf *buf;
1845     struct ofp_error_msg *oem;
1846
1847     if (!(error >> 16)) {
1848         VLOG_WARN_RL(&rl, "not sending bad error code %d to controller",
1849                      error);
1850         return;
1851     }
1852
1853     COVERAGE_INC(ofproto_error);
1854     oem = make_openflow_xid(len + sizeof *oem, OFPT_ERROR,
1855                             oh ? oh->xid : 0, &buf);
1856     oem->type = htons((unsigned int) error >> 16);
1857     oem->code = htons(error & 0xffff);
1858     memcpy(oem->data, data, len);
1859     queue_tx(buf, ofconn, ofconn->reply_counter);
1860 }
1861
1862 static void
1863 send_error_oh(const struct ofconn *ofconn, const struct ofp_header *oh,
1864               int error)
1865 {
1866     size_t oh_length = ntohs(oh->length);
1867     send_error(ofconn, oh, error, oh, MIN(oh_length, 64));
1868 }
1869
1870 static void
1871 hton_ofp_phy_port(struct ofp_phy_port *opp)
1872 {
1873     opp->port_no = htons(opp->port_no);
1874     opp->config = htonl(opp->config);
1875     opp->state = htonl(opp->state);
1876     opp->curr = htonl(opp->curr);
1877     opp->advertised = htonl(opp->advertised);
1878     opp->supported = htonl(opp->supported);
1879     opp->peer = htonl(opp->peer);
1880 }
1881
1882 static int
1883 handle_echo_request(struct ofconn *ofconn, struct ofp_header *oh)
1884 {
1885     struct ofp_header *rq = oh;
1886     queue_tx(make_echo_reply(rq), ofconn, ofconn->reply_counter);
1887     return 0;
1888 }
1889
1890 static int
1891 handle_features_request(struct ofproto *p, struct ofconn *ofconn,
1892                         struct ofp_header *oh)
1893 {
1894     struct ofp_switch_features *osf;
1895     struct ofpbuf *buf;
1896     unsigned int port_no;
1897     struct ofport *port;
1898
1899     osf = make_openflow_xid(sizeof *osf, OFPT_FEATURES_REPLY, oh->xid, &buf);
1900     osf->datapath_id = htonll(p->datapath_id);
1901     osf->n_buffers = htonl(pktbuf_capacity());
1902     osf->n_tables = 2;
1903     osf->capabilities = htonl(OFPC_FLOW_STATS | OFPC_TABLE_STATS |
1904                               OFPC_PORT_STATS | OFPC_ARP_MATCH_IP);
1905     osf->actions = htonl((1u << OFPAT_OUTPUT) |
1906                          (1u << OFPAT_SET_VLAN_VID) |
1907                          (1u << OFPAT_SET_VLAN_PCP) |
1908                          (1u << OFPAT_STRIP_VLAN) |
1909                          (1u << OFPAT_SET_DL_SRC) |
1910                          (1u << OFPAT_SET_DL_DST) |
1911                          (1u << OFPAT_SET_NW_SRC) |
1912                          (1u << OFPAT_SET_NW_DST) |
1913                          (1u << OFPAT_SET_NW_TOS) |
1914                          (1u << OFPAT_SET_TP_SRC) |
1915                          (1u << OFPAT_SET_TP_DST));
1916
1917     PORT_ARRAY_FOR_EACH (port, &p->ports, port_no) {
1918         hton_ofp_phy_port(ofpbuf_put(buf, &port->opp, sizeof port->opp));
1919     }
1920
1921     queue_tx(buf, ofconn, ofconn->reply_counter);
1922     return 0;
1923 }
1924
1925 static int
1926 handle_get_config_request(struct ofproto *p, struct ofconn *ofconn,
1927                           struct ofp_header *oh)
1928 {
1929     struct ofpbuf *buf;
1930     struct ofp_switch_config *osc;
1931     uint16_t flags;
1932     bool drop_frags;
1933
1934     /* Figure out flags. */
1935     dpif_get_drop_frags(p->dpif, &drop_frags);
1936     flags = drop_frags ? OFPC_FRAG_DROP : OFPC_FRAG_NORMAL;
1937
1938     /* Send reply. */
1939     osc = make_openflow_xid(sizeof *osc, OFPT_GET_CONFIG_REPLY, oh->xid, &buf);
1940     osc->flags = htons(flags);
1941     osc->miss_send_len = htons(ofconn->miss_send_len);
1942     queue_tx(buf, ofconn, ofconn->reply_counter);
1943
1944     return 0;
1945 }
1946
1947 static int
1948 handle_set_config(struct ofproto *p, struct ofconn *ofconn,
1949                   struct ofp_switch_config *osc)
1950 {
1951     uint16_t flags;
1952     int error;
1953
1954     error = check_ofp_message(&osc->header, OFPT_SET_CONFIG, sizeof *osc);
1955     if (error) {
1956         return error;
1957     }
1958     flags = ntohs(osc->flags);
1959
1960     if (ofconn == p->controller) {
1961         switch (flags & OFPC_FRAG_MASK) {
1962         case OFPC_FRAG_NORMAL:
1963             dpif_set_drop_frags(p->dpif, false);
1964             break;
1965         case OFPC_FRAG_DROP:
1966             dpif_set_drop_frags(p->dpif, true);
1967             break;
1968         default:
1969             VLOG_WARN_RL(&rl, "requested bad fragment mode (flags=%"PRIx16")",
1970                          osc->flags);
1971             break;
1972         }
1973     }
1974
1975     if ((ntohs(osc->miss_send_len) != 0) != (ofconn->miss_send_len != 0)) {
1976         if (ntohs(osc->miss_send_len) != 0) {
1977             ofconn->pktbuf = pktbuf_create();
1978         } else {
1979             pktbuf_destroy(ofconn->pktbuf);
1980         }
1981     }
1982
1983     ofconn->miss_send_len = ntohs(osc->miss_send_len);
1984
1985     return 0;
1986 }
1987
1988 static void
1989 add_output_group_action(struct odp_actions *actions, uint16_t group,
1990                         uint16_t *nf_output_iface)
1991 {
1992     odp_actions_add(actions, ODPAT_OUTPUT_GROUP)->output_group.group = group;
1993
1994     if (group == DP_GROUP_ALL || group == DP_GROUP_FLOOD) {
1995         *nf_output_iface = NF_OUT_FLOOD;
1996     }
1997 }
1998
1999 static void
2000 add_controller_action(struct odp_actions *actions,
2001                       const struct ofp_action_output *oao)
2002 {
2003     union odp_action *a = odp_actions_add(actions, ODPAT_CONTROLLER);
2004     a->controller.arg = oao->max_len ? ntohs(oao->max_len) : UINT32_MAX;
2005 }
2006
2007 struct action_xlate_ctx {
2008     /* Input. */
2009     flow_t flow;                /* Flow to which these actions correspond. */
2010     int recurse;                /* Recursion level, via xlate_table_action. */
2011     struct ofproto *ofproto;
2012     const struct ofpbuf *packet; /* The packet corresponding to 'flow', or a
2013                                   * null pointer if we are revalidating
2014                                   * without a packet to refer to. */
2015
2016     /* Output. */
2017     struct odp_actions *out;    /* Datapath actions. */
2018     tag_type *tags;             /* Tags associated with OFPP_NORMAL actions. */
2019     bool may_set_up_flow;       /* True ordinarily; false if the actions must
2020                                  * be reassessed for every packet. */
2021     uint16_t nf_output_iface;   /* Output interface index for NetFlow. */
2022 };
2023
2024 static void do_xlate_actions(const union ofp_action *in, size_t n_in,
2025                              struct action_xlate_ctx *ctx);
2026
2027 static void
2028 add_output_action(struct action_xlate_ctx *ctx, uint16_t port)
2029 {
2030     const struct ofport *ofport = port_array_get(&ctx->ofproto->ports, port);
2031
2032     if (ofport) {
2033         if (ofport->opp.config & OFPPC_NO_FWD) {
2034             /* Forwarding disabled on port. */
2035             return;
2036         }
2037     } else {
2038         /*
2039          * We don't have an ofport record for this port, but it doesn't hurt to
2040          * allow forwarding to it anyhow.  Maybe such a port will appear later
2041          * and we're pre-populating the flow table.
2042          */
2043     }
2044
2045     odp_actions_add(ctx->out, ODPAT_OUTPUT)->output.port = port;
2046     ctx->nf_output_iface = port;
2047 }
2048
2049 static struct rule *
2050 lookup_valid_rule(struct ofproto *ofproto, const flow_t *flow)
2051 {
2052     struct rule *rule;
2053     rule = rule_from_cls_rule(classifier_lookup(&ofproto->cls, flow));
2054
2055     /* The rule we found might not be valid, since we could be in need of
2056      * revalidation.  If it is not valid, don't return it. */
2057     if (rule
2058         && rule->super
2059         && ofproto->need_revalidate
2060         && !revalidate_rule(ofproto, rule)) {
2061         COVERAGE_INC(ofproto_invalidated);
2062         return NULL;
2063     }
2064
2065     return rule;
2066 }
2067
2068 static void
2069 xlate_table_action(struct action_xlate_ctx *ctx, uint16_t in_port)
2070 {
2071     if (!ctx->recurse) {
2072         uint16_t old_in_port;
2073         struct rule *rule;
2074
2075         /* Look up a flow with 'in_port' as the input port.  Then restore the
2076          * original input port (otherwise OFPP_NORMAL and OFPP_IN_PORT will
2077          * have surprising behavior). */
2078         old_in_port = ctx->flow.in_port;
2079         ctx->flow.in_port = in_port;
2080         rule = lookup_valid_rule(ctx->ofproto, &ctx->flow);
2081         ctx->flow.in_port = old_in_port;
2082
2083         if (rule) {
2084             if (rule->super) {
2085                 rule = rule->super;
2086             }
2087
2088             ctx->recurse++;
2089             do_xlate_actions(rule->actions, rule->n_actions, ctx);
2090             ctx->recurse--;
2091         }
2092     }
2093 }
2094
2095 static void
2096 xlate_output_action(struct action_xlate_ctx *ctx,
2097                     const struct ofp_action_output *oao)
2098 {
2099     uint16_t odp_port;
2100     uint16_t prev_nf_output_iface = ctx->nf_output_iface;
2101
2102     ctx->nf_output_iface = NF_OUT_DROP;
2103
2104     switch (ntohs(oao->port)) {
2105     case OFPP_IN_PORT:
2106         add_output_action(ctx, ctx->flow.in_port);
2107         break;
2108     case OFPP_TABLE:
2109         xlate_table_action(ctx, ctx->flow.in_port);
2110         break;
2111     case OFPP_NORMAL:
2112         if (!ctx->ofproto->ofhooks->normal_cb(&ctx->flow, ctx->packet,
2113                                               ctx->out, ctx->tags,
2114                                               &ctx->nf_output_iface,
2115                                               ctx->ofproto->aux)) {
2116             COVERAGE_INC(ofproto_uninstallable);
2117             ctx->may_set_up_flow = false;
2118         }
2119         break;
2120     case OFPP_FLOOD:
2121         add_output_group_action(ctx->out, DP_GROUP_FLOOD,
2122                                 &ctx->nf_output_iface);
2123         break;
2124     case OFPP_ALL:
2125         add_output_group_action(ctx->out, DP_GROUP_ALL, &ctx->nf_output_iface);
2126         break;
2127     case OFPP_CONTROLLER:
2128         add_controller_action(ctx->out, oao);
2129         break;
2130     case OFPP_LOCAL:
2131         add_output_action(ctx, ODPP_LOCAL);
2132         break;
2133     default:
2134         odp_port = ofp_port_to_odp_port(ntohs(oao->port));
2135         if (odp_port != ctx->flow.in_port) {
2136             add_output_action(ctx, odp_port);
2137         }
2138         break;
2139     }
2140
2141     if (prev_nf_output_iface == NF_OUT_FLOOD) {
2142         ctx->nf_output_iface = NF_OUT_FLOOD;
2143     } else if (ctx->nf_output_iface == NF_OUT_DROP) {
2144         ctx->nf_output_iface = prev_nf_output_iface;
2145     } else if (prev_nf_output_iface != NF_OUT_DROP &&
2146                ctx->nf_output_iface != NF_OUT_FLOOD) {
2147         ctx->nf_output_iface = NF_OUT_MULTI;
2148     }
2149 }
2150
2151 static void
2152 xlate_nicira_action(struct action_xlate_ctx *ctx,
2153                     const struct nx_action_header *nah)
2154 {
2155     const struct nx_action_resubmit *nar;
2156     const struct nx_action_set_tunnel *nast;
2157     union odp_action *oa;
2158     int subtype = ntohs(nah->subtype);
2159
2160     assert(nah->vendor == htonl(NX_VENDOR_ID));
2161     switch (subtype) {
2162     case NXAST_RESUBMIT:
2163         nar = (const struct nx_action_resubmit *) nah;
2164         xlate_table_action(ctx, ofp_port_to_odp_port(ntohs(nar->in_port)));
2165         break;
2166
2167     case NXAST_SET_TUNNEL:
2168         nast = (const struct nx_action_set_tunnel *) nah;
2169         oa = odp_actions_add(ctx->out, ODPAT_SET_TUNNEL);
2170         ctx->flow.tun_id = oa->tunnel.tun_id = nast->tun_id;
2171         break;
2172
2173     /* If you add a new action here that modifies flow data, don't forget to
2174      * update the flow key in ctx->flow in the same key. */
2175
2176     default:
2177         VLOG_DBG_RL(&rl, "unknown Nicira action type %"PRIu16, subtype);
2178         break;
2179     }
2180 }
2181
2182 static void
2183 do_xlate_actions(const union ofp_action *in, size_t n_in,
2184                  struct action_xlate_ctx *ctx)
2185 {
2186     struct actions_iterator iter;
2187     const union ofp_action *ia;
2188     const struct ofport *port;
2189
2190     port = port_array_get(&ctx->ofproto->ports, ctx->flow.in_port);
2191     if (port && port->opp.config & (OFPPC_NO_RECV | OFPPC_NO_RECV_STP) &&
2192         port->opp.config & (eth_addr_equals(ctx->flow.dl_dst, stp_eth_addr)
2193                             ? OFPPC_NO_RECV_STP : OFPPC_NO_RECV)) {
2194         /* Drop this flow. */
2195         return;
2196     }
2197
2198     for (ia = actions_first(&iter, in, n_in); ia; ia = actions_next(&iter)) {
2199         uint16_t type = ntohs(ia->type);
2200         union odp_action *oa;
2201
2202         switch (type) {
2203         case OFPAT_OUTPUT:
2204             xlate_output_action(ctx, &ia->output);
2205             break;
2206
2207         case OFPAT_SET_VLAN_VID:
2208             oa = odp_actions_add(ctx->out, ODPAT_SET_VLAN_VID);
2209             ctx->flow.dl_vlan = oa->vlan_vid.vlan_vid = ia->vlan_vid.vlan_vid;
2210             break;
2211
2212         case OFPAT_SET_VLAN_PCP:
2213             oa = odp_actions_add(ctx->out, ODPAT_SET_VLAN_PCP);
2214             ctx->flow.dl_vlan_pcp = oa->vlan_pcp.vlan_pcp = ia->vlan_pcp.vlan_pcp;
2215             break;
2216
2217         case OFPAT_STRIP_VLAN:
2218             odp_actions_add(ctx->out, ODPAT_STRIP_VLAN);
2219             ctx->flow.dl_vlan = OFP_VLAN_NONE;
2220             ctx->flow.dl_vlan_pcp = 0;
2221             break;
2222
2223         case OFPAT_SET_DL_SRC:
2224             oa = odp_actions_add(ctx->out, ODPAT_SET_DL_SRC);
2225             memcpy(oa->dl_addr.dl_addr,
2226                    ((struct ofp_action_dl_addr *) ia)->dl_addr, ETH_ADDR_LEN);
2227             memcpy(ctx->flow.dl_src,
2228                    ((struct ofp_action_dl_addr *) ia)->dl_addr, ETH_ADDR_LEN);
2229             break;
2230
2231         case OFPAT_SET_DL_DST:
2232             oa = odp_actions_add(ctx->out, ODPAT_SET_DL_DST);
2233             memcpy(oa->dl_addr.dl_addr,
2234                    ((struct ofp_action_dl_addr *) ia)->dl_addr, ETH_ADDR_LEN);
2235             memcpy(ctx->flow.dl_dst,
2236                    ((struct ofp_action_dl_addr *) ia)->dl_addr, ETH_ADDR_LEN);
2237             break;
2238
2239         case OFPAT_SET_NW_SRC:
2240             oa = odp_actions_add(ctx->out, ODPAT_SET_NW_SRC);
2241             ctx->flow.nw_src = oa->nw_addr.nw_addr = ia->nw_addr.nw_addr;
2242             break;
2243
2244         case OFPAT_SET_NW_DST:
2245             oa = odp_actions_add(ctx->out, ODPAT_SET_NW_DST);
2246             ctx->flow.nw_dst = oa->nw_addr.nw_addr = ia->nw_addr.nw_addr;
2247             break;
2248
2249         case OFPAT_SET_NW_TOS:
2250             oa = odp_actions_add(ctx->out, ODPAT_SET_NW_TOS);
2251             ctx->flow.nw_tos = oa->nw_tos.nw_tos = ia->nw_tos.nw_tos;
2252             break;
2253
2254         case OFPAT_SET_TP_SRC:
2255             oa = odp_actions_add(ctx->out, ODPAT_SET_TP_SRC);
2256             ctx->flow.tp_src = oa->tp_port.tp_port = ia->tp_port.tp_port;
2257             break;
2258
2259         case OFPAT_SET_TP_DST:
2260             oa = odp_actions_add(ctx->out, ODPAT_SET_TP_DST);
2261             ctx->flow.tp_dst = oa->tp_port.tp_port = ia->tp_port.tp_port;
2262             break;
2263
2264         case OFPAT_VENDOR:
2265             xlate_nicira_action(ctx, (const struct nx_action_header *) ia);
2266             break;
2267
2268         default:
2269             VLOG_DBG_RL(&rl, "unknown action type %"PRIu16, type);
2270             break;
2271         }
2272     }
2273 }
2274
2275 static int
2276 xlate_actions(const union ofp_action *in, size_t n_in,
2277               const flow_t *flow, struct ofproto *ofproto,
2278               const struct ofpbuf *packet,
2279               struct odp_actions *out, tag_type *tags, bool *may_set_up_flow,
2280               uint16_t *nf_output_iface)
2281 {
2282     tag_type no_tags = 0;
2283     struct action_xlate_ctx ctx;
2284     COVERAGE_INC(ofproto_ofp2odp);
2285     odp_actions_init(out);
2286     ctx.flow = *flow;
2287     ctx.recurse = 0;
2288     ctx.ofproto = ofproto;
2289     ctx.packet = packet;
2290     ctx.out = out;
2291     ctx.tags = tags ? tags : &no_tags;
2292     ctx.may_set_up_flow = true;
2293     ctx.nf_output_iface = NF_OUT_DROP;
2294     do_xlate_actions(in, n_in, &ctx);
2295
2296     /* Check with in-band control to see if we're allowed to set up this
2297      * flow. */
2298     if (!in_band_rule_check(ofproto->in_band, flow, out)) {
2299         ctx.may_set_up_flow = false;
2300     }
2301
2302     if (may_set_up_flow) {
2303         *may_set_up_flow = ctx.may_set_up_flow;
2304     }
2305     if (nf_output_iface) {
2306         *nf_output_iface = ctx.nf_output_iface;
2307     }
2308     if (odp_actions_overflow(out)) {
2309         odp_actions_init(out);
2310         return ofp_mkerr(OFPET_BAD_ACTION, OFPBAC_TOO_MANY);
2311     }
2312     return 0;
2313 }
2314
2315 static int
2316 handle_packet_out(struct ofproto *p, struct ofconn *ofconn,
2317                   struct ofp_header *oh)
2318 {
2319     struct ofp_packet_out *opo;
2320     struct ofpbuf payload, *buffer;
2321     struct odp_actions actions;
2322     int n_actions;
2323     uint16_t in_port;
2324     flow_t flow;
2325     int error;
2326
2327     error = check_ofp_packet_out(oh, &payload, &n_actions, p->max_ports);
2328     if (error) {
2329         return error;
2330     }
2331     opo = (struct ofp_packet_out *) oh;
2332
2333     COVERAGE_INC(ofproto_packet_out);
2334     if (opo->buffer_id != htonl(UINT32_MAX)) {
2335         error = pktbuf_retrieve(ofconn->pktbuf, ntohl(opo->buffer_id),
2336                                 &buffer, &in_port);
2337         if (error || !buffer) {
2338             return error;
2339         }
2340         payload = *buffer;
2341     } else {
2342         buffer = NULL;
2343     }
2344
2345     flow_extract(&payload, 0, ofp_port_to_odp_port(ntohs(opo->in_port)), &flow);
2346     error = xlate_actions((const union ofp_action *) opo->actions, n_actions,
2347                           &flow, p, &payload, &actions, NULL, NULL, NULL);
2348     if (error) {
2349         return error;
2350     }
2351
2352     dpif_execute(p->dpif, flow.in_port, actions.actions, actions.n_actions,
2353                  &payload);
2354     ofpbuf_delete(buffer);
2355
2356     return 0;
2357 }
2358
2359 static void
2360 update_port_config(struct ofproto *p, struct ofport *port,
2361                    uint32_t config, uint32_t mask)
2362 {
2363     mask &= config ^ port->opp.config;
2364     if (mask & OFPPC_PORT_DOWN) {
2365         if (config & OFPPC_PORT_DOWN) {
2366             netdev_turn_flags_off(port->netdev, NETDEV_UP, true);
2367         } else {
2368             netdev_turn_flags_on(port->netdev, NETDEV_UP, true);
2369         }
2370     }
2371 #define REVALIDATE_BITS (OFPPC_NO_RECV | OFPPC_NO_RECV_STP | OFPPC_NO_FWD)
2372     if (mask & REVALIDATE_BITS) {
2373         COVERAGE_INC(ofproto_costly_flags);
2374         port->opp.config ^= mask & REVALIDATE_BITS;
2375         p->need_revalidate = true;
2376     }
2377 #undef REVALIDATE_BITS
2378     if (mask & OFPPC_NO_FLOOD) {
2379         port->opp.config ^= OFPPC_NO_FLOOD;
2380         refresh_port_groups(p);
2381     }
2382     if (mask & OFPPC_NO_PACKET_IN) {
2383         port->opp.config ^= OFPPC_NO_PACKET_IN;
2384     }
2385 }
2386
2387 static int
2388 handle_port_mod(struct ofproto *p, struct ofp_header *oh)
2389 {
2390     const struct ofp_port_mod *opm;
2391     struct ofport *port;
2392     int error;
2393
2394     error = check_ofp_message(oh, OFPT_PORT_MOD, sizeof *opm);
2395     if (error) {
2396         return error;
2397     }
2398     opm = (struct ofp_port_mod *) oh;
2399
2400     port = port_array_get(&p->ports,
2401                           ofp_port_to_odp_port(ntohs(opm->port_no)));
2402     if (!port) {
2403         return ofp_mkerr(OFPET_PORT_MOD_FAILED, OFPPMFC_BAD_PORT);
2404     } else if (memcmp(port->opp.hw_addr, opm->hw_addr, OFP_ETH_ALEN)) {
2405         return ofp_mkerr(OFPET_PORT_MOD_FAILED, OFPPMFC_BAD_HW_ADDR);
2406     } else {
2407         update_port_config(p, port, ntohl(opm->config), ntohl(opm->mask));
2408         if (opm->advertise) {
2409             netdev_set_advertisements(port->netdev, ntohl(opm->advertise));
2410         }
2411     }
2412     return 0;
2413 }
2414
2415 static struct ofpbuf *
2416 make_stats_reply(uint32_t xid, uint16_t type, size_t body_len)
2417 {
2418     struct ofp_stats_reply *osr;
2419     struct ofpbuf *msg;
2420
2421     msg = ofpbuf_new(MIN(sizeof *osr + body_len, UINT16_MAX));
2422     osr = put_openflow_xid(sizeof *osr, OFPT_STATS_REPLY, xid, msg);
2423     osr->type = type;
2424     osr->flags = htons(0);
2425     return msg;
2426 }
2427
2428 static struct ofpbuf *
2429 start_stats_reply(const struct ofp_stats_request *request, size_t body_len)
2430 {
2431     return make_stats_reply(request->header.xid, request->type, body_len);
2432 }
2433
2434 static void *
2435 append_stats_reply(size_t nbytes, struct ofconn *ofconn, struct ofpbuf **msgp)
2436 {
2437     struct ofpbuf *msg = *msgp;
2438     assert(nbytes <= UINT16_MAX - sizeof(struct ofp_stats_reply));
2439     if (nbytes + msg->size > UINT16_MAX) {
2440         struct ofp_stats_reply *reply = msg->data;
2441         reply->flags = htons(OFPSF_REPLY_MORE);
2442         *msgp = make_stats_reply(reply->header.xid, reply->type, nbytes);
2443         queue_tx(msg, ofconn, ofconn->reply_counter);
2444     }
2445     return ofpbuf_put_uninit(*msgp, nbytes);
2446 }
2447
2448 static int
2449 handle_desc_stats_request(struct ofproto *p, struct ofconn *ofconn,
2450                            struct ofp_stats_request *request)
2451 {
2452     struct ofp_desc_stats *ods;
2453     struct ofpbuf *msg;
2454
2455     msg = start_stats_reply(request, sizeof *ods);
2456     ods = append_stats_reply(sizeof *ods, ofconn, &msg);
2457     memset(ods, 0, sizeof *ods);
2458     ovs_strlcpy(ods->mfr_desc, p->mfr_desc, sizeof ods->mfr_desc);
2459     ovs_strlcpy(ods->hw_desc, p->hw_desc, sizeof ods->hw_desc);
2460     ovs_strlcpy(ods->sw_desc, p->sw_desc, sizeof ods->sw_desc);
2461     ovs_strlcpy(ods->serial_num, p->serial_desc, sizeof ods->serial_num);
2462     ovs_strlcpy(ods->dp_desc, p->dp_desc, sizeof ods->dp_desc);
2463     queue_tx(msg, ofconn, ofconn->reply_counter);
2464
2465     return 0;
2466 }
2467
2468 static void
2469 count_subrules(struct cls_rule *cls_rule, void *n_subrules_)
2470 {
2471     struct rule *rule = rule_from_cls_rule(cls_rule);
2472     int *n_subrules = n_subrules_;
2473
2474     if (rule->super) {
2475         (*n_subrules)++;
2476     }
2477 }
2478
2479 static int
2480 handle_table_stats_request(struct ofproto *p, struct ofconn *ofconn,
2481                            struct ofp_stats_request *request)
2482 {
2483     struct ofp_table_stats *ots;
2484     struct ofpbuf *msg;
2485     struct odp_stats dpstats;
2486     int n_exact, n_subrules, n_wild;
2487
2488     msg = start_stats_reply(request, sizeof *ots * 2);
2489
2490     /* Count rules of various kinds. */
2491     n_subrules = 0;
2492     classifier_for_each(&p->cls, CLS_INC_EXACT, count_subrules, &n_subrules);
2493     n_exact = classifier_count_exact(&p->cls) - n_subrules;
2494     n_wild = classifier_count(&p->cls) - classifier_count_exact(&p->cls);
2495
2496     /* Hash table. */
2497     dpif_get_dp_stats(p->dpif, &dpstats);
2498     ots = append_stats_reply(sizeof *ots, ofconn, &msg);
2499     memset(ots, 0, sizeof *ots);
2500     ots->table_id = TABLEID_HASH;
2501     strcpy(ots->name, "hash");
2502     ots->wildcards = htonl(0);
2503     ots->max_entries = htonl(dpstats.max_capacity);
2504     ots->active_count = htonl(n_exact);
2505     ots->lookup_count = htonll(dpstats.n_frags + dpstats.n_hit +
2506                                dpstats.n_missed);
2507     ots->matched_count = htonll(dpstats.n_hit); /* XXX */
2508
2509     /* Classifier table. */
2510     ots = append_stats_reply(sizeof *ots, ofconn, &msg);
2511     memset(ots, 0, sizeof *ots);
2512     ots->table_id = TABLEID_CLASSIFIER;
2513     strcpy(ots->name, "classifier");
2514     ots->wildcards = p->tun_id_from_cookie ? htonl(OVSFW_ALL)
2515                                            : htonl(OFPFW_ALL);
2516     ots->max_entries = htonl(65536);
2517     ots->active_count = htonl(n_wild);
2518     ots->lookup_count = htonll(0);              /* XXX */
2519     ots->matched_count = htonll(0);             /* XXX */
2520
2521     queue_tx(msg, ofconn, ofconn->reply_counter);
2522     return 0;
2523 }
2524
2525 static void
2526 append_port_stat(struct ofport *port, uint16_t port_no, struct ofconn *ofconn, 
2527                  struct ofpbuf *msg)
2528 {
2529     struct netdev_stats stats;
2530     struct ofp_port_stats *ops;
2531
2532     /* Intentionally ignore return value, since errors will set 
2533      * 'stats' to all-1s, which is correct for OpenFlow, and 
2534      * netdev_get_stats() will log errors. */
2535     netdev_get_stats(port->netdev, &stats);
2536
2537     ops = append_stats_reply(sizeof *ops, ofconn, &msg);
2538     ops->port_no = htons(odp_port_to_ofp_port(port_no));
2539     memset(ops->pad, 0, sizeof ops->pad);
2540     ops->rx_packets = htonll(stats.rx_packets);
2541     ops->tx_packets = htonll(stats.tx_packets);
2542     ops->rx_bytes = htonll(stats.rx_bytes);
2543     ops->tx_bytes = htonll(stats.tx_bytes);
2544     ops->rx_dropped = htonll(stats.rx_dropped);
2545     ops->tx_dropped = htonll(stats.tx_dropped);
2546     ops->rx_errors = htonll(stats.rx_errors);
2547     ops->tx_errors = htonll(stats.tx_errors);
2548     ops->rx_frame_err = htonll(stats.rx_frame_errors);
2549     ops->rx_over_err = htonll(stats.rx_over_errors);
2550     ops->rx_crc_err = htonll(stats.rx_crc_errors);
2551     ops->collisions = htonll(stats.collisions);
2552 }
2553
2554 static int
2555 handle_port_stats_request(struct ofproto *p, struct ofconn *ofconn,
2556                           struct ofp_stats_request *osr,
2557                           size_t arg_size)
2558 {
2559     struct ofp_port_stats_request *psr;
2560     struct ofp_port_stats *ops;
2561     struct ofpbuf *msg;
2562     struct ofport *port;
2563     unsigned int port_no;
2564
2565     if (arg_size != sizeof *psr) {
2566         return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
2567     }
2568     psr = (struct ofp_port_stats_request *) osr->body;
2569
2570     msg = start_stats_reply(osr, sizeof *ops * 16);
2571     if (psr->port_no != htons(OFPP_NONE)) {
2572         port = port_array_get(&p->ports, 
2573                 ofp_port_to_odp_port(ntohs(psr->port_no)));
2574         if (port) {
2575             append_port_stat(port, ntohs(psr->port_no), ofconn, msg);
2576         }
2577     } else {
2578         PORT_ARRAY_FOR_EACH (port, &p->ports, port_no) {
2579             append_port_stat(port, port_no, ofconn, msg);
2580         }
2581     }
2582
2583     queue_tx(msg, ofconn, ofconn->reply_counter);
2584     return 0;
2585 }
2586
2587 struct flow_stats_cbdata {
2588     struct ofproto *ofproto;
2589     struct ofconn *ofconn;
2590     uint16_t out_port;
2591     struct ofpbuf *msg;
2592 };
2593
2594 /* Obtains statistic counters for 'rule' within 'p' and stores them into
2595  * '*packet_countp' and '*byte_countp'.  If 'rule' is a wildcarded rule, the
2596  * returned statistic include statistics for all of 'rule''s subrules. */
2597 static void
2598 query_stats(struct ofproto *p, struct rule *rule,
2599             uint64_t *packet_countp, uint64_t *byte_countp)
2600 {
2601     uint64_t packet_count, byte_count;
2602     struct rule *subrule;
2603     struct odp_flow *odp_flows;
2604     size_t n_odp_flows;
2605
2606     /* Start from historical data for 'rule' itself that are no longer tracked
2607      * by the datapath.  This counts, for example, subrules that have
2608      * expired. */
2609     packet_count = rule->packet_count;
2610     byte_count = rule->byte_count;
2611
2612     /* Prepare to ask the datapath for statistics on 'rule', or if it is
2613      * wildcarded then on all of its subrules.
2614      *
2615      * Also, add any statistics that are not tracked by the datapath for each
2616      * subrule.  This includes, for example, statistics for packets that were
2617      * executed "by hand" by ofproto via dpif_execute() but must be accounted
2618      * to a flow. */
2619     n_odp_flows = rule->cr.wc.wildcards ? list_size(&rule->list) : 1;
2620     odp_flows = xzalloc(n_odp_flows * sizeof *odp_flows);
2621     if (rule->cr.wc.wildcards) {
2622         size_t i = 0;
2623         LIST_FOR_EACH (subrule, struct rule, list, &rule->list) {
2624             odp_flows[i++].key = subrule->cr.flow;
2625             packet_count += subrule->packet_count;
2626             byte_count += subrule->byte_count;
2627         }
2628     } else {
2629         odp_flows[0].key = rule->cr.flow;
2630     }
2631
2632     /* Fetch up-to-date statistics from the datapath and add them in. */
2633     if (!dpif_flow_get_multiple(p->dpif, odp_flows, n_odp_flows)) {
2634         size_t i;
2635         for (i = 0; i < n_odp_flows; i++) {
2636             struct odp_flow *odp_flow = &odp_flows[i];
2637             packet_count += odp_flow->stats.n_packets;
2638             byte_count += odp_flow->stats.n_bytes;
2639         }
2640     }
2641     free(odp_flows);
2642
2643     /* Return the stats to the caller. */
2644     *packet_countp = packet_count;
2645     *byte_countp = byte_count;
2646 }
2647
2648 static void
2649 flow_stats_cb(struct cls_rule *rule_, void *cbdata_)
2650 {
2651     struct rule *rule = rule_from_cls_rule(rule_);
2652     struct flow_stats_cbdata *cbdata = cbdata_;
2653     struct ofp_flow_stats *ofs;
2654     uint64_t packet_count, byte_count;
2655     size_t act_len, len;
2656     long long int tdiff = time_msec() - rule->created;
2657     uint32_t sec = tdiff / 1000;
2658     uint32_t msec = tdiff - (sec * 1000);
2659
2660     if (rule_is_hidden(rule) || !rule_has_out_port(rule, cbdata->out_port)) {
2661         return;
2662     }
2663
2664     act_len = sizeof *rule->actions * rule->n_actions;
2665     len = offsetof(struct ofp_flow_stats, actions) + act_len;
2666
2667     query_stats(cbdata->ofproto, rule, &packet_count, &byte_count);
2668
2669     ofs = append_stats_reply(len, cbdata->ofconn, &cbdata->msg);
2670     ofs->length = htons(len);
2671     ofs->table_id = rule->cr.wc.wildcards ? TABLEID_CLASSIFIER : TABLEID_HASH;
2672     ofs->pad = 0;
2673     flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards,
2674                   cbdata->ofproto->tun_id_from_cookie, &ofs->match);
2675     ofs->duration_sec = htonl(sec);
2676     ofs->duration_nsec = htonl(msec * 1000000);
2677     ofs->cookie = rule->flow_cookie;
2678     ofs->priority = htons(rule->cr.priority);
2679     ofs->idle_timeout = htons(rule->idle_timeout);
2680     ofs->hard_timeout = htons(rule->hard_timeout);
2681     memset(ofs->pad2, 0, sizeof ofs->pad2);
2682     ofs->packet_count = htonll(packet_count);
2683     ofs->byte_count = htonll(byte_count);
2684     memcpy(ofs->actions, rule->actions, act_len);
2685 }
2686
2687 static int
2688 table_id_to_include(uint8_t table_id)
2689 {
2690     return (table_id == TABLEID_HASH ? CLS_INC_EXACT
2691             : table_id == TABLEID_CLASSIFIER ? CLS_INC_WILD
2692             : table_id == 0xff ? CLS_INC_ALL
2693             : 0);
2694 }
2695
2696 static int
2697 handle_flow_stats_request(struct ofproto *p, struct ofconn *ofconn,
2698                           const struct ofp_stats_request *osr,
2699                           size_t arg_size)
2700 {
2701     struct ofp_flow_stats_request *fsr;
2702     struct flow_stats_cbdata cbdata;
2703     struct cls_rule target;
2704
2705     if (arg_size != sizeof *fsr) {
2706         return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
2707     }
2708     fsr = (struct ofp_flow_stats_request *) osr->body;
2709
2710     COVERAGE_INC(ofproto_flows_req);
2711     cbdata.ofproto = p;
2712     cbdata.ofconn = ofconn;
2713     cbdata.out_port = fsr->out_port;
2714     cbdata.msg = start_stats_reply(osr, 1024);
2715     cls_rule_from_match(&fsr->match, 0, false, 0, &target);
2716     classifier_for_each_match(&p->cls, &target,
2717                               table_id_to_include(fsr->table_id),
2718                               flow_stats_cb, &cbdata);
2719     queue_tx(cbdata.msg, ofconn, ofconn->reply_counter);
2720     return 0;
2721 }
2722
2723 struct flow_stats_ds_cbdata {
2724     struct ofproto *ofproto;
2725     struct ds *results;
2726 };
2727
2728 static void
2729 flow_stats_ds_cb(struct cls_rule *rule_, void *cbdata_)
2730 {
2731     struct rule *rule = rule_from_cls_rule(rule_);
2732     struct flow_stats_ds_cbdata *cbdata = cbdata_;
2733     struct ds *results = cbdata->results;
2734     struct ofp_match match;
2735     uint64_t packet_count, byte_count;
2736     size_t act_len = sizeof *rule->actions * rule->n_actions;
2737
2738     /* Don't report on subrules. */
2739     if (rule->super != NULL) {
2740         return;
2741     }
2742
2743     query_stats(cbdata->ofproto, rule, &packet_count, &byte_count);
2744     flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards,
2745                   cbdata->ofproto->tun_id_from_cookie, &match);
2746
2747     ds_put_format(results, "duration=%llds, ",
2748                   (time_msec() - rule->created) / 1000);
2749     ds_put_format(results, "priority=%u, ", rule->cr.priority);
2750     ds_put_format(results, "n_packets=%"PRIu64", ", packet_count);
2751     ds_put_format(results, "n_bytes=%"PRIu64", ", byte_count);
2752     ofp_print_match(results, &match, true);
2753     ofp_print_actions(results, &rule->actions->header, act_len);
2754     ds_put_cstr(results, "\n");
2755 }
2756
2757 /* Adds a pretty-printed description of all flows to 'results', including 
2758  * those marked hidden by secchan (e.g., by in-band control). */
2759 void
2760 ofproto_get_all_flows(struct ofproto *p, struct ds *results)
2761 {
2762     struct ofp_match match;
2763     struct cls_rule target;
2764     struct flow_stats_ds_cbdata cbdata;
2765
2766     memset(&match, 0, sizeof match);
2767     match.wildcards = htonl(OVSFW_ALL);
2768
2769     cbdata.ofproto = p;
2770     cbdata.results = results;
2771
2772     cls_rule_from_match(&match, 0, false, 0, &target);
2773     classifier_for_each_match(&p->cls, &target, CLS_INC_ALL,
2774                               flow_stats_ds_cb, &cbdata);
2775 }
2776
2777 struct aggregate_stats_cbdata {
2778     struct ofproto *ofproto;
2779     uint16_t out_port;
2780     uint64_t packet_count;
2781     uint64_t byte_count;
2782     uint32_t n_flows;
2783 };
2784
2785 static void
2786 aggregate_stats_cb(struct cls_rule *rule_, void *cbdata_)
2787 {
2788     struct rule *rule = rule_from_cls_rule(rule_);
2789     struct aggregate_stats_cbdata *cbdata = cbdata_;
2790     uint64_t packet_count, byte_count;
2791
2792     if (rule_is_hidden(rule) || !rule_has_out_port(rule, cbdata->out_port)) {
2793         return;
2794     }
2795
2796     query_stats(cbdata->ofproto, rule, &packet_count, &byte_count);
2797
2798     cbdata->packet_count += packet_count;
2799     cbdata->byte_count += byte_count;
2800     cbdata->n_flows++;
2801 }
2802
2803 static int
2804 handle_aggregate_stats_request(struct ofproto *p, struct ofconn *ofconn,
2805                                const struct ofp_stats_request *osr,
2806                                size_t arg_size)
2807 {
2808     struct ofp_aggregate_stats_request *asr;
2809     struct ofp_aggregate_stats_reply *reply;
2810     struct aggregate_stats_cbdata cbdata;
2811     struct cls_rule target;
2812     struct ofpbuf *msg;
2813
2814     if (arg_size != sizeof *asr) {
2815         return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
2816     }
2817     asr = (struct ofp_aggregate_stats_request *) osr->body;
2818
2819     COVERAGE_INC(ofproto_agg_request);
2820     cbdata.ofproto = p;
2821     cbdata.out_port = asr->out_port;
2822     cbdata.packet_count = 0;
2823     cbdata.byte_count = 0;
2824     cbdata.n_flows = 0;
2825     cls_rule_from_match(&asr->match, 0, false, 0, &target);
2826     classifier_for_each_match(&p->cls, &target,
2827                               table_id_to_include(asr->table_id),
2828                               aggregate_stats_cb, &cbdata);
2829
2830     msg = start_stats_reply(osr, sizeof *reply);
2831     reply = append_stats_reply(sizeof *reply, ofconn, &msg);
2832     reply->flow_count = htonl(cbdata.n_flows);
2833     reply->packet_count = htonll(cbdata.packet_count);
2834     reply->byte_count = htonll(cbdata.byte_count);
2835     queue_tx(msg, ofconn, ofconn->reply_counter);
2836     return 0;
2837 }
2838
2839 static int
2840 handle_stats_request(struct ofproto *p, struct ofconn *ofconn,
2841                      struct ofp_header *oh)
2842 {
2843     struct ofp_stats_request *osr;
2844     size_t arg_size;
2845     int error;
2846
2847     error = check_ofp_message_array(oh, OFPT_STATS_REQUEST, sizeof *osr,
2848                                     1, &arg_size);
2849     if (error) {
2850         return error;
2851     }
2852     osr = (struct ofp_stats_request *) oh;
2853
2854     switch (ntohs(osr->type)) {
2855     case OFPST_DESC:
2856         return handle_desc_stats_request(p, ofconn, osr);
2857
2858     case OFPST_FLOW:
2859         return handle_flow_stats_request(p, ofconn, osr, arg_size);
2860
2861     case OFPST_AGGREGATE:
2862         return handle_aggregate_stats_request(p, ofconn, osr, arg_size);
2863
2864     case OFPST_TABLE:
2865         return handle_table_stats_request(p, ofconn, osr);
2866
2867     case OFPST_PORT:
2868         return handle_port_stats_request(p, ofconn, osr, arg_size);
2869
2870     case OFPST_VENDOR:
2871         return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_VENDOR);
2872
2873     default:
2874         return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_STAT);
2875     }
2876 }
2877
2878 static long long int
2879 msec_from_nsec(uint64_t sec, uint32_t nsec)
2880 {
2881     return !sec ? 0 : sec * 1000 + nsec / 1000000;
2882 }
2883
2884 static void
2885 update_time(struct ofproto *ofproto, struct rule *rule,
2886             const struct odp_flow_stats *stats)
2887 {
2888     long long int used = msec_from_nsec(stats->used_sec, stats->used_nsec);
2889     if (used > rule->used) {
2890         rule->used = used;
2891         if (rule->super && used > rule->super->used) {
2892             rule->super->used = used;
2893         }
2894         netflow_flow_update_time(ofproto->netflow, &rule->nf_flow, used);
2895     }
2896 }
2897
2898 static void
2899 update_stats(struct ofproto *ofproto, struct rule *rule,
2900              const struct odp_flow_stats *stats)
2901 {
2902     if (stats->n_packets) {
2903         update_time(ofproto, rule, stats);
2904         rule->packet_count += stats->n_packets;
2905         rule->byte_count += stats->n_bytes;
2906         netflow_flow_update_flags(&rule->nf_flow, stats->ip_tos,
2907                                   stats->tcp_flags);
2908     }
2909 }
2910
2911 /* Implements OFPFC_ADD and the cases for OFPFC_MODIFY and OFPFC_MODIFY_STRICT
2912  * in which no matching flow already exists in the flow table.
2913  *
2914  * Adds the flow specified by 'ofm', which is followed by 'n_actions'
2915  * ofp_actions, to 'p''s flow table.  Returns 0 on success or an OpenFlow error
2916  * code as encoded by ofp_mkerr() on failure.
2917  *
2918  * 'ofconn' is used to retrieve the packet buffer specified in ofm->buffer_id,
2919  * if any. */
2920 static int
2921 add_flow(struct ofproto *p, struct ofconn *ofconn,
2922          const struct ofp_flow_mod *ofm, size_t n_actions)
2923 {
2924     struct ofpbuf *packet;
2925     struct rule *rule;
2926     uint16_t in_port;
2927     int error;
2928
2929     if (ofm->flags & htons(OFPFF_CHECK_OVERLAP)) {
2930         flow_t flow;
2931         uint32_t wildcards;
2932
2933         flow_from_match(&ofm->match, p->tun_id_from_cookie, ofm->cookie,
2934                         &flow, &wildcards);
2935         if (classifier_rule_overlaps(&p->cls, &flow, wildcards,
2936                                      ntohs(ofm->priority))) {
2937             return ofp_mkerr(OFPET_FLOW_MOD_FAILED, OFPFMFC_OVERLAP);
2938         }
2939     }
2940
2941     rule = rule_create(p, NULL, (const union ofp_action *) ofm->actions,
2942                        n_actions, ntohs(ofm->idle_timeout),
2943                        ntohs(ofm->hard_timeout),  ofm->cookie,
2944                        ofm->flags & htons(OFPFF_SEND_FLOW_REM));
2945     cls_rule_from_match(&ofm->match, ntohs(ofm->priority),
2946                         p->tun_id_from_cookie, ofm->cookie, &rule->cr);
2947
2948     error = 0;
2949     if (ofm->buffer_id != htonl(UINT32_MAX)) {
2950         error = pktbuf_retrieve(ofconn->pktbuf, ntohl(ofm->buffer_id),
2951                                 &packet, &in_port);
2952     } else {
2953         packet = NULL;
2954         in_port = UINT16_MAX;
2955     }
2956
2957     rule_insert(p, rule, packet, in_port);
2958     ofpbuf_delete(packet);
2959     return error;
2960 }
2961
2962 static struct rule *
2963 find_flow_strict(struct ofproto *p, const struct ofp_flow_mod *ofm)
2964 {
2965     uint32_t wildcards;
2966     flow_t flow;
2967
2968     flow_from_match(&ofm->match, p->tun_id_from_cookie, ofm->cookie,
2969                     &flow, &wildcards);
2970     return rule_from_cls_rule(classifier_find_rule_exactly(
2971                                   &p->cls, &flow, wildcards,
2972                                   ntohs(ofm->priority)));
2973 }
2974
2975 static int
2976 send_buffered_packet(struct ofproto *ofproto, struct ofconn *ofconn,
2977                      struct rule *rule, const struct ofp_flow_mod *ofm)
2978 {
2979     struct ofpbuf *packet;
2980     uint16_t in_port;
2981     flow_t flow;
2982     int error;
2983
2984     if (ofm->buffer_id == htonl(UINT32_MAX)) {
2985         return 0;
2986     }
2987
2988     error = pktbuf_retrieve(ofconn->pktbuf, ntohl(ofm->buffer_id),
2989                             &packet, &in_port);
2990     if (error) {
2991         return error;
2992     }
2993
2994     flow_extract(packet, 0, in_port, &flow);
2995     rule_execute(ofproto, rule, packet, &flow);
2996     ofpbuf_delete(packet);
2997
2998     return 0;
2999 }
3000 \f
3001 /* OFPFC_MODIFY and OFPFC_MODIFY_STRICT. */
3002
3003 struct modify_flows_cbdata {
3004     struct ofproto *ofproto;
3005     const struct ofp_flow_mod *ofm;
3006     size_t n_actions;
3007     struct rule *match;
3008 };
3009
3010 static int modify_flow(struct ofproto *, const struct ofp_flow_mod *,
3011                        size_t n_actions, struct rule *);
3012 static void modify_flows_cb(struct cls_rule *, void *cbdata_);
3013
3014 /* Implements OFPFC_MODIFY.  Returns 0 on success or an OpenFlow error code as
3015  * encoded by ofp_mkerr() on failure.
3016  *
3017  * 'ofconn' is used to retrieve the packet buffer specified in ofm->buffer_id,
3018  * if any. */
3019 static int
3020 modify_flows_loose(struct ofproto *p, struct ofconn *ofconn,
3021                    const struct ofp_flow_mod *ofm, size_t n_actions)
3022 {
3023     struct modify_flows_cbdata cbdata;
3024     struct cls_rule target;
3025
3026     cbdata.ofproto = p;
3027     cbdata.ofm = ofm;
3028     cbdata.n_actions = n_actions;
3029     cbdata.match = NULL;
3030
3031     cls_rule_from_match(&ofm->match, 0, p->tun_id_from_cookie, ofm->cookie,
3032                         &target);
3033
3034     classifier_for_each_match(&p->cls, &target, CLS_INC_ALL,
3035                               modify_flows_cb, &cbdata);
3036     if (cbdata.match) {
3037         /* This credits the packet to whichever flow happened to happened to
3038          * match last.  That's weird.  Maybe we should do a lookup for the
3039          * flow that actually matches the packet?  Who knows. */
3040         send_buffered_packet(p, ofconn, cbdata.match, ofm);
3041         return 0;
3042     } else {
3043         return add_flow(p, ofconn, ofm, n_actions);
3044     }
3045 }
3046
3047 /* Implements OFPFC_MODIFY_STRICT.  Returns 0 on success or an OpenFlow error
3048  * code as encoded by ofp_mkerr() on failure.
3049  *
3050  * 'ofconn' is used to retrieve the packet buffer specified in ofm->buffer_id,
3051  * if any. */
3052 static int
3053 modify_flow_strict(struct ofproto *p, struct ofconn *ofconn,
3054                    struct ofp_flow_mod *ofm, size_t n_actions)
3055 {
3056     struct rule *rule = find_flow_strict(p, ofm);
3057     if (rule && !rule_is_hidden(rule)) {
3058         modify_flow(p, ofm, n_actions, rule);
3059         return send_buffered_packet(p, ofconn, rule, ofm);
3060     } else {
3061         return add_flow(p, ofconn, ofm, n_actions);
3062     }
3063 }
3064
3065 /* Callback for modify_flows_loose(). */
3066 static void
3067 modify_flows_cb(struct cls_rule *rule_, void *cbdata_)
3068 {
3069     struct rule *rule = rule_from_cls_rule(rule_);
3070     struct modify_flows_cbdata *cbdata = cbdata_;
3071
3072     if (!rule_is_hidden(rule)) {
3073         cbdata->match = rule;
3074         modify_flow(cbdata->ofproto, cbdata->ofm, cbdata->n_actions, rule);
3075     }
3076 }
3077
3078 /* Implements core of OFPFC_MODIFY and OFPFC_MODIFY_STRICT where 'rule' has
3079  * been identified as a flow in 'p''s flow table to be modified, by changing
3080  * the rule's actions to match those in 'ofm' (which is followed by 'n_actions'
3081  * ofp_action[] structures). */
3082 static int
3083 modify_flow(struct ofproto *p, const struct ofp_flow_mod *ofm,
3084             size_t n_actions, struct rule *rule)
3085 {
3086     size_t actions_len = n_actions * sizeof *rule->actions;
3087
3088     rule->flow_cookie = ofm->cookie;
3089
3090     /* If the actions are the same, do nothing. */
3091     if (n_actions == rule->n_actions
3092         && !memcmp(ofm->actions, rule->actions, actions_len))
3093     {
3094         return 0;
3095     }
3096
3097     /* Replace actions. */
3098     free(rule->actions);
3099     rule->actions = xmemdup(ofm->actions, actions_len);
3100     rule->n_actions = n_actions;
3101
3102     /* Make sure that the datapath gets updated properly. */
3103     if (rule->cr.wc.wildcards) {
3104         COVERAGE_INC(ofproto_mod_wc_flow);
3105         p->need_revalidate = true;
3106     } else {
3107         rule_update_actions(p, rule);
3108     }
3109
3110     return 0;
3111 }
3112 \f
3113 /* OFPFC_DELETE implementation. */
3114
3115 struct delete_flows_cbdata {
3116     struct ofproto *ofproto;
3117     uint16_t out_port;
3118 };
3119
3120 static void delete_flows_cb(struct cls_rule *, void *cbdata_);
3121 static void delete_flow(struct ofproto *, struct rule *, uint16_t out_port);
3122
3123 /* Implements OFPFC_DELETE. */
3124 static void
3125 delete_flows_loose(struct ofproto *p, const struct ofp_flow_mod *ofm)
3126 {
3127     struct delete_flows_cbdata cbdata;
3128     struct cls_rule target;
3129
3130     cbdata.ofproto = p;
3131     cbdata.out_port = ofm->out_port;
3132
3133     cls_rule_from_match(&ofm->match, 0, p->tun_id_from_cookie, ofm->cookie,
3134                         &target);
3135
3136     classifier_for_each_match(&p->cls, &target, CLS_INC_ALL,
3137                               delete_flows_cb, &cbdata);
3138 }
3139
3140 /* Implements OFPFC_DELETE_STRICT. */
3141 static void
3142 delete_flow_strict(struct ofproto *p, struct ofp_flow_mod *ofm)
3143 {
3144     struct rule *rule = find_flow_strict(p, ofm);
3145     if (rule) {
3146         delete_flow(p, rule, ofm->out_port);
3147     }
3148 }
3149
3150 /* Callback for delete_flows_loose(). */
3151 static void
3152 delete_flows_cb(struct cls_rule *rule_, void *cbdata_)
3153 {
3154     struct rule *rule = rule_from_cls_rule(rule_);
3155     struct delete_flows_cbdata *cbdata = cbdata_;
3156
3157     delete_flow(cbdata->ofproto, rule, cbdata->out_port);
3158 }
3159
3160 /* Implements core of OFPFC_DELETE and OFPFC_DELETE_STRICT where 'rule' has
3161  * been identified as a flow to delete from 'p''s flow table, by deleting the
3162  * flow and sending out a OFPT_FLOW_REMOVED message to any interested
3163  * controller.
3164  *
3165  * Will not delete 'rule' if it is hidden.  Will delete 'rule' only if
3166  * 'out_port' is htons(OFPP_NONE) or if 'rule' actually outputs to the
3167  * specified 'out_port'. */
3168 static void
3169 delete_flow(struct ofproto *p, struct rule *rule, uint16_t out_port)
3170 {
3171     if (rule_is_hidden(rule)) {
3172         return;
3173     }
3174
3175     if (out_port != htons(OFPP_NONE) && !rule_has_out_port(rule, out_port)) {
3176         return;
3177     }
3178
3179     send_flow_removed(p, rule, time_msec(), OFPRR_DELETE);
3180     rule_remove(p, rule);
3181 }
3182 \f
3183 static int
3184 handle_flow_mod(struct ofproto *p, struct ofconn *ofconn,
3185                 struct ofp_flow_mod *ofm)
3186 {
3187     size_t n_actions;
3188     int error;
3189
3190     error = check_ofp_message_array(&ofm->header, OFPT_FLOW_MOD, sizeof *ofm,
3191                                     sizeof *ofm->actions, &n_actions);
3192     if (error) {
3193         return error;
3194     }
3195
3196     /* We do not support the emergency flow cache.  It will hopefully
3197      * get dropped from OpenFlow in the near future. */
3198     if (ofm->flags & htons(OFPFF_EMERG)) {
3199         /* There isn't a good fit for an error code, so just state that the
3200          * flow table is full. */
3201         return ofp_mkerr(OFPET_FLOW_MOD_FAILED, OFPFMFC_ALL_TABLES_FULL);
3202     }
3203
3204     normalize_match(&ofm->match);
3205     if (!ofm->match.wildcards) {
3206         ofm->priority = htons(UINT16_MAX);
3207     }
3208
3209     error = validate_actions((const union ofp_action *) ofm->actions,
3210                              n_actions, p->max_ports);
3211     if (error) {
3212         return error;
3213     }
3214
3215     switch (ntohs(ofm->command)) {
3216     case OFPFC_ADD:
3217         return add_flow(p, ofconn, ofm, n_actions);
3218
3219     case OFPFC_MODIFY:
3220         return modify_flows_loose(p, ofconn, ofm, n_actions);
3221
3222     case OFPFC_MODIFY_STRICT:
3223         return modify_flow_strict(p, ofconn, ofm, n_actions);
3224
3225     case OFPFC_DELETE:
3226         delete_flows_loose(p, ofm);
3227         return 0;
3228
3229     case OFPFC_DELETE_STRICT:
3230         delete_flow_strict(p, ofm);
3231         return 0;
3232
3233     default:
3234         return ofp_mkerr(OFPET_FLOW_MOD_FAILED, OFPFMFC_BAD_COMMAND);
3235     }
3236 }
3237
3238 static int
3239 handle_tun_id_from_cookie(struct ofproto *p, struct nxt_tun_id_cookie *msg)
3240 {
3241     int error;
3242
3243     error = check_ofp_message(&msg->header, OFPT_VENDOR, sizeof *msg);
3244     if (error) {
3245         return error;
3246     }
3247
3248     p->tun_id_from_cookie = !!msg->set;
3249     return 0;
3250 }
3251
3252 static int
3253 handle_vendor(struct ofproto *p, struct ofconn *ofconn, void *msg)
3254 {
3255     struct ofp_vendor_header *ovh = msg;
3256     struct nicira_header *nh;
3257
3258     if (ntohs(ovh->header.length) < sizeof(struct ofp_vendor_header)) {
3259         VLOG_WARN_RL(&rl, "received vendor message of length %zu "
3260                           "(expected at least %zu)",
3261                    ntohs(ovh->header.length), sizeof(struct ofp_vendor_header));
3262         return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
3263     }
3264     if (ovh->vendor != htonl(NX_VENDOR_ID)) {
3265         return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_VENDOR);
3266     }
3267     if (ntohs(ovh->header.length) < sizeof(struct nicira_header)) {
3268         VLOG_WARN_RL(&rl, "received Nicira vendor message of length %zu "
3269                           "(expected at least %zu)",
3270                      ntohs(ovh->header.length), sizeof(struct nicira_header));
3271         return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
3272     }
3273
3274     nh = msg;
3275     switch (ntohl(nh->subtype)) {
3276     case NXT_STATUS_REQUEST:
3277         return switch_status_handle_request(p->switch_status, ofconn->rconn,
3278                                             msg);
3279
3280     case NXT_TUN_ID_FROM_COOKIE:
3281         return handle_tun_id_from_cookie(p, msg);
3282     }
3283
3284     return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_SUBTYPE);
3285 }
3286
3287 static int
3288 handle_barrier_request(struct ofconn *ofconn, struct ofp_header *oh)
3289 {
3290     struct ofp_header *ob;
3291     struct ofpbuf *buf;
3292
3293     /* Currently, everything executes synchronously, so we can just
3294      * immediately send the barrier reply. */
3295     ob = make_openflow_xid(sizeof *ob, OFPT_BARRIER_REPLY, oh->xid, &buf);
3296     queue_tx(buf, ofconn, ofconn->reply_counter);
3297     return 0;
3298 }
3299
3300 static void
3301 handle_openflow(struct ofconn *ofconn, struct ofproto *p,
3302                 struct ofpbuf *ofp_msg)
3303 {
3304     struct ofp_header *oh = ofp_msg->data;
3305     int error;
3306
3307     COVERAGE_INC(ofproto_recv_openflow);
3308     switch (oh->type) {
3309     case OFPT_ECHO_REQUEST:
3310         error = handle_echo_request(ofconn, oh);
3311         break;
3312
3313     case OFPT_ECHO_REPLY:
3314         error = 0;
3315         break;
3316
3317     case OFPT_FEATURES_REQUEST:
3318         error = handle_features_request(p, ofconn, oh);
3319         break;
3320
3321     case OFPT_GET_CONFIG_REQUEST:
3322         error = handle_get_config_request(p, ofconn, oh);
3323         break;
3324
3325     case OFPT_SET_CONFIG:
3326         error = handle_set_config(p, ofconn, ofp_msg->data);
3327         break;
3328
3329     case OFPT_PACKET_OUT:
3330         error = handle_packet_out(p, ofconn, ofp_msg->data);
3331         break;
3332
3333     case OFPT_PORT_MOD:
3334         error = handle_port_mod(p, oh);
3335         break;
3336
3337     case OFPT_FLOW_MOD:
3338         error = handle_flow_mod(p, ofconn, ofp_msg->data);
3339         break;
3340
3341     case OFPT_STATS_REQUEST:
3342         error = handle_stats_request(p, ofconn, oh);
3343         break;
3344
3345     case OFPT_VENDOR:
3346         error = handle_vendor(p, ofconn, ofp_msg->data);
3347         break;
3348
3349     case OFPT_BARRIER_REQUEST:
3350         error = handle_barrier_request(ofconn, oh);
3351         break;
3352
3353     default:
3354         if (VLOG_IS_WARN_ENABLED()) {
3355             char *s = ofp_to_string(oh, ntohs(oh->length), 2);
3356             VLOG_DBG_RL(&rl, "OpenFlow message ignored: %s", s);
3357             free(s);
3358         }
3359         error = ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_TYPE);
3360         break;
3361     }
3362
3363     if (error) {
3364         send_error_oh(ofconn, ofp_msg->data, error);
3365     }
3366 }
3367 \f
3368 static void
3369 handle_odp_miss_msg(struct ofproto *p, struct ofpbuf *packet)
3370 {
3371     struct odp_msg *msg = packet->data;
3372     uint16_t in_port = odp_port_to_ofp_port(msg->port);
3373     struct rule *rule;
3374     struct ofpbuf payload;
3375     flow_t flow;
3376
3377     payload.data = msg + 1;
3378     payload.size = msg->length - sizeof *msg;
3379     flow_extract(&payload, msg->arg, msg->port, &flow);
3380
3381     /* Check with in-band control to see if this packet should be sent
3382      * to the local port regardless of the flow table. */
3383     if (in_band_msg_in_hook(p->in_band, &flow, &payload)) {
3384         union odp_action action;
3385
3386         memset(&action, 0, sizeof(action));
3387         action.output.type = ODPAT_OUTPUT;
3388         action.output.port = ODPP_LOCAL;
3389         dpif_execute(p->dpif, flow.in_port, &action, 1, &payload);
3390     }
3391
3392     rule = lookup_valid_rule(p, &flow);
3393     if (!rule) {
3394         /* Don't send a packet-in if OFPPC_NO_PACKET_IN asserted. */
3395         struct ofport *port = port_array_get(&p->ports, msg->port);
3396         if (port) {
3397             if (port->opp.config & OFPPC_NO_PACKET_IN) {
3398                 COVERAGE_INC(ofproto_no_packet_in);
3399                 /* XXX install 'drop' flow entry */
3400                 ofpbuf_delete(packet);
3401                 return;
3402             }
3403         } else {
3404             VLOG_WARN_RL(&rl, "packet-in on unknown port %"PRIu16, msg->port);
3405         }
3406
3407         COVERAGE_INC(ofproto_packet_in);
3408         pinsched_send(p->miss_sched, in_port, packet, send_packet_in_miss, p);
3409         return;
3410     }
3411
3412     if (rule->cr.wc.wildcards) {
3413         rule = rule_create_subrule(p, rule, &flow);
3414         rule_make_actions(p, rule, packet);
3415     } else {
3416         if (!rule->may_install) {
3417             /* The rule is not installable, that is, we need to process every
3418              * packet, so process the current packet and set its actions into
3419              * 'subrule'. */
3420             rule_make_actions(p, rule, packet);
3421         } else {
3422             /* XXX revalidate rule if it needs it */
3423         }
3424     }
3425
3426     rule_execute(p, rule, &payload, &flow);
3427     rule_reinstall(p, rule);
3428
3429     if (rule->super && rule->super->cr.priority == FAIL_OPEN_PRIORITY
3430         && rconn_is_connected(p->controller->rconn)) {
3431         /*
3432          * Extra-special case for fail-open mode.
3433          *
3434          * We are in fail-open mode and the packet matched the fail-open rule,
3435          * but we are connected to a controller too.  We should send the packet
3436          * up to the controller in the hope that it will try to set up a flow
3437          * and thereby allow us to exit fail-open.
3438          *
3439          * See the top-level comment in fail-open.c for more information.
3440          */
3441         pinsched_send(p->miss_sched, in_port, packet, send_packet_in_miss, p);
3442     } else {
3443         ofpbuf_delete(packet);
3444     }
3445 }
3446
3447 static void
3448 handle_odp_msg(struct ofproto *p, struct ofpbuf *packet)
3449 {
3450     struct odp_msg *msg = packet->data;
3451
3452     switch (msg->type) {
3453     case _ODPL_ACTION_NR:
3454         COVERAGE_INC(ofproto_ctlr_action);
3455         pinsched_send(p->action_sched, odp_port_to_ofp_port(msg->port), packet,
3456                       send_packet_in_action, p);
3457         break;
3458
3459     case _ODPL_SFLOW_NR:
3460         if (p->sflow) {
3461             ofproto_sflow_received(p->sflow, msg);
3462         }
3463         ofpbuf_delete(packet);
3464         break;
3465
3466     case _ODPL_MISS_NR:
3467         handle_odp_miss_msg(p, packet);
3468         break;
3469
3470     default:
3471         VLOG_WARN_RL(&rl, "received ODP message of unexpected type %"PRIu32,
3472                      msg->type);
3473         break;
3474     }
3475 }
3476 \f
3477 static void
3478 revalidate_cb(struct cls_rule *sub_, void *cbdata_)
3479 {
3480     struct rule *sub = rule_from_cls_rule(sub_);
3481     struct revalidate_cbdata *cbdata = cbdata_;
3482
3483     if (cbdata->revalidate_all
3484         || (cbdata->revalidate_subrules && sub->super)
3485         || (tag_set_intersects(&cbdata->revalidate_set, sub->tags))) {
3486         revalidate_rule(cbdata->ofproto, sub);
3487     }
3488 }
3489
3490 static bool
3491 revalidate_rule(struct ofproto *p, struct rule *rule)
3492 {
3493     const flow_t *flow = &rule->cr.flow;
3494
3495     COVERAGE_INC(ofproto_revalidate_rule);
3496     if (rule->super) {
3497         struct rule *super;
3498         super = rule_from_cls_rule(classifier_lookup_wild(&p->cls, flow));
3499         if (!super) {
3500             rule_remove(p, rule);
3501             return false;
3502         } else if (super != rule->super) {
3503             COVERAGE_INC(ofproto_revalidate_moved);
3504             list_remove(&rule->list);
3505             list_push_back(&super->list, &rule->list);
3506             rule->super = super;
3507             rule->hard_timeout = super->hard_timeout;
3508             rule->idle_timeout = super->idle_timeout;
3509             rule->created = super->created;
3510             rule->used = 0;
3511         }
3512     }
3513
3514     rule_update_actions(p, rule);
3515     return true;
3516 }
3517
3518 static struct ofpbuf *
3519 compose_flow_removed(struct ofproto *p, const struct rule *rule,
3520                      long long int now, uint8_t reason)
3521 {
3522     struct ofp_flow_removed *ofr;
3523     struct ofpbuf *buf;
3524     long long int tdiff = now - rule->created;
3525     uint32_t sec = tdiff / 1000;
3526     uint32_t msec = tdiff - (sec * 1000);
3527
3528     ofr = make_openflow(sizeof *ofr, OFPT_FLOW_REMOVED, &buf);
3529     flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, p->tun_id_from_cookie,
3530                   &ofr->match);
3531     ofr->cookie = rule->flow_cookie;
3532     ofr->priority = htons(rule->cr.priority);
3533     ofr->reason = reason;
3534     ofr->duration_sec = htonl(sec);
3535     ofr->duration_nsec = htonl(msec * 1000000);
3536     ofr->idle_timeout = htons(rule->idle_timeout);
3537     ofr->packet_count = htonll(rule->packet_count);
3538     ofr->byte_count = htonll(rule->byte_count);
3539
3540     return buf;
3541 }
3542
3543 static void
3544 uninstall_idle_flow(struct ofproto *ofproto, struct rule *rule)
3545 {
3546     assert(rule->installed);
3547     assert(!rule->cr.wc.wildcards);
3548
3549     if (rule->super) {
3550         rule_remove(ofproto, rule);
3551     } else {
3552         rule_uninstall(ofproto, rule);
3553     }
3554 }
3555 static void
3556 send_flow_removed(struct ofproto *p, struct rule *rule,
3557                   long long int now, uint8_t reason)
3558 {
3559     struct ofconn *ofconn;
3560     struct ofconn *prev;
3561     struct ofpbuf *buf = NULL;
3562
3563     /* We limit the maximum number of queued flow expirations it by accounting
3564      * them under the counter for replies.  That works because preventing
3565      * OpenFlow requests from being processed also prevents new flows from
3566      * being added (and expiring).  (It also prevents processing OpenFlow
3567      * requests that would not add new flows, so it is imperfect.) */
3568
3569     prev = NULL;
3570     LIST_FOR_EACH (ofconn, struct ofconn, node, &p->all_conns) {
3571         if (rule->send_flow_removed && rconn_is_connected(ofconn->rconn)) {
3572             if (prev) {
3573                 queue_tx(ofpbuf_clone(buf), prev, prev->reply_counter);
3574             } else {
3575                 buf = compose_flow_removed(p, rule, now, reason);
3576             }
3577             prev = ofconn;
3578         }
3579     }
3580     if (prev) {
3581         queue_tx(buf, prev, prev->reply_counter);
3582     }
3583 }
3584
3585
3586 static void
3587 expire_rule(struct cls_rule *cls_rule, void *p_)
3588 {
3589     struct ofproto *p = p_;
3590     struct rule *rule = rule_from_cls_rule(cls_rule);
3591     long long int hard_expire, idle_expire, expire, now;
3592
3593     hard_expire = (rule->hard_timeout
3594                    ? rule->created + rule->hard_timeout * 1000
3595                    : LLONG_MAX);
3596     idle_expire = (rule->idle_timeout
3597                    && (rule->super || list_is_empty(&rule->list))
3598                    ? rule->used + rule->idle_timeout * 1000
3599                    : LLONG_MAX);
3600     expire = MIN(hard_expire, idle_expire);
3601
3602     now = time_msec();
3603     if (now < expire) {
3604         if (rule->installed && now >= rule->used + 5000) {
3605             uninstall_idle_flow(p, rule);
3606         } else if (!rule->cr.wc.wildcards) {
3607             active_timeout(p, rule);
3608         }
3609
3610         return;
3611     }
3612
3613     COVERAGE_INC(ofproto_expired);
3614
3615     /* Update stats.  This code will be a no-op if the rule expired
3616      * due to an idle timeout. */
3617     if (rule->cr.wc.wildcards) {
3618         struct rule *subrule, *next;
3619         LIST_FOR_EACH_SAFE (subrule, next, struct rule, list, &rule->list) {
3620             rule_remove(p, subrule);
3621         }
3622     } else {
3623         rule_uninstall(p, rule);
3624     }
3625
3626     if (!rule_is_hidden(rule)) {
3627         send_flow_removed(p, rule, now,
3628                           (now >= hard_expire
3629                            ? OFPRR_HARD_TIMEOUT : OFPRR_IDLE_TIMEOUT));
3630     }
3631     rule_remove(p, rule);
3632 }
3633
3634 static void
3635 active_timeout(struct ofproto *ofproto, struct rule *rule)
3636 {
3637     if (ofproto->netflow && !is_controller_rule(rule) &&
3638         netflow_active_timeout_expired(ofproto->netflow, &rule->nf_flow)) {
3639         struct ofexpired expired;
3640         struct odp_flow odp_flow;
3641
3642         /* Get updated flow stats. */
3643         memset(&odp_flow, 0, sizeof odp_flow);
3644         if (rule->installed) {
3645             odp_flow.key = rule->cr.flow;
3646             odp_flow.flags = ODPFF_ZERO_TCP_FLAGS;
3647             dpif_flow_get(ofproto->dpif, &odp_flow);
3648
3649             if (odp_flow.stats.n_packets) {
3650                 update_time(ofproto, rule, &odp_flow.stats);
3651                 netflow_flow_update_flags(&rule->nf_flow, odp_flow.stats.ip_tos,
3652                                           odp_flow.stats.tcp_flags);
3653             }
3654         }
3655
3656         expired.flow = rule->cr.flow;
3657         expired.packet_count = rule->packet_count +
3658                                odp_flow.stats.n_packets;
3659         expired.byte_count = rule->byte_count + odp_flow.stats.n_bytes;
3660         expired.used = rule->used;
3661
3662         netflow_expire(ofproto->netflow, &rule->nf_flow, &expired);
3663
3664         /* Schedule us to send the accumulated records once we have
3665          * collected all of them. */
3666         poll_immediate_wake();
3667     }
3668 }
3669
3670 static void
3671 update_used(struct ofproto *p)
3672 {
3673     struct odp_flow *flows;
3674     size_t n_flows;
3675     size_t i;
3676     int error;
3677
3678     error = dpif_flow_list_all(p->dpif, &flows, &n_flows);
3679     if (error) {
3680         return;
3681     }
3682
3683     for (i = 0; i < n_flows; i++) {
3684         struct odp_flow *f = &flows[i];
3685         struct rule *rule;
3686
3687         rule = rule_from_cls_rule(
3688             classifier_find_rule_exactly(&p->cls, &f->key, 0, UINT16_MAX));
3689         if (!rule || !rule->installed) {
3690             COVERAGE_INC(ofproto_unexpected_rule);
3691             dpif_flow_del(p->dpif, f);
3692             continue;
3693         }
3694
3695         update_time(p, rule, &f->stats);
3696         rule_account(p, rule, f->stats.n_bytes);
3697     }
3698     free(flows);
3699 }
3700
3701 static void
3702 do_send_packet_in(struct ofconn *ofconn, uint32_t buffer_id,
3703                   const struct ofpbuf *packet, int send_len)
3704 {
3705     struct odp_msg *msg = packet->data;
3706     struct ofpbuf payload;
3707     struct ofpbuf *opi;
3708     uint8_t reason;
3709
3710     /* Extract packet payload from 'msg'. */
3711     payload.data = msg + 1;
3712     payload.size = msg->length - sizeof *msg;
3713
3714     /* Construct ofp_packet_in message. */
3715     reason = msg->type == _ODPL_ACTION_NR ? OFPR_ACTION : OFPR_NO_MATCH;
3716     opi = make_packet_in(buffer_id, odp_port_to_ofp_port(msg->port), reason,
3717                          &payload, send_len);
3718
3719     /* Send. */
3720     rconn_send_with_limit(ofconn->rconn, opi, ofconn->packet_in_counter, 100);
3721 }
3722
3723 static void
3724 send_packet_in_action(struct ofpbuf *packet, void *p_)
3725 {
3726     struct ofproto *p = p_;
3727     struct ofconn *ofconn;
3728     struct odp_msg *msg;
3729
3730     msg = packet->data;
3731     LIST_FOR_EACH (ofconn, struct ofconn, node, &p->all_conns) {
3732         if (ofconn == p->controller || ofconn->miss_send_len) {
3733             do_send_packet_in(ofconn, UINT32_MAX, packet, msg->arg);
3734         }
3735     }
3736     ofpbuf_delete(packet);
3737 }
3738
3739 static void
3740 send_packet_in_miss(struct ofpbuf *packet, void *p_)
3741 {
3742     struct ofproto *p = p_;
3743     bool in_fail_open = p->fail_open && fail_open_is_active(p->fail_open);
3744     struct ofconn *ofconn;
3745     struct ofpbuf payload;
3746     struct odp_msg *msg;
3747
3748     msg = packet->data;
3749     payload.data = msg + 1;
3750     payload.size = msg->length - sizeof *msg;
3751     LIST_FOR_EACH (ofconn, struct ofconn, node, &p->all_conns) {
3752         if (ofconn->miss_send_len) {
3753             struct pktbuf *pb = ofconn->pktbuf;
3754             uint32_t buffer_id = (in_fail_open
3755                                   ? pktbuf_get_null()
3756                                   : pktbuf_save(pb, &payload, msg->port));
3757             int send_len = (buffer_id != UINT32_MAX ? ofconn->miss_send_len
3758                             : INT_MAX);
3759             do_send_packet_in(ofconn, buffer_id, packet, send_len);
3760         }
3761     }
3762     ofpbuf_delete(packet);
3763 }
3764
3765 static uint64_t
3766 pick_datapath_id(const struct ofproto *ofproto)
3767 {
3768     const struct ofport *port;
3769
3770     port = port_array_get(&ofproto->ports, ODPP_LOCAL);
3771     if (port) {
3772         uint8_t ea[ETH_ADDR_LEN];
3773         int error;
3774
3775         error = netdev_get_etheraddr(port->netdev, ea);
3776         if (!error) {
3777             return eth_addr_to_uint64(ea);
3778         }
3779         VLOG_WARN("could not get MAC address for %s (%s)",
3780                   netdev_get_name(port->netdev), strerror(error));
3781     }
3782     return ofproto->fallback_dpid;
3783 }
3784
3785 static uint64_t
3786 pick_fallback_dpid(void)
3787 {
3788     uint8_t ea[ETH_ADDR_LEN];
3789     eth_addr_nicira_random(ea);
3790     return eth_addr_to_uint64(ea);
3791 }
3792 \f
3793 static bool
3794 default_normal_ofhook_cb(const flow_t *flow, const struct ofpbuf *packet,
3795                          struct odp_actions *actions, tag_type *tags,
3796                          uint16_t *nf_output_iface, void *ofproto_)
3797 {
3798     struct ofproto *ofproto = ofproto_;
3799     int out_port;
3800
3801     /* Drop frames for reserved multicast addresses. */
3802     if (eth_addr_is_reserved(flow->dl_dst)) {
3803         return true;
3804     }
3805
3806     /* Learn source MAC (but don't try to learn from revalidation). */
3807     if (packet != NULL) {
3808         tag_type rev_tag = mac_learning_learn(ofproto->ml, flow->dl_src,
3809                                               0, flow->in_port);
3810         if (rev_tag) {
3811             /* The log messages here could actually be useful in debugging,
3812              * so keep the rate limit relatively high. */
3813             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(30, 300);
3814             VLOG_DBG_RL(&rl, "learned that "ETH_ADDR_FMT" is on port %"PRIu16,
3815                         ETH_ADDR_ARGS(flow->dl_src), flow->in_port);
3816             ofproto_revalidate(ofproto, rev_tag);
3817         }
3818     }
3819
3820     /* Determine output port. */
3821     out_port = mac_learning_lookup_tag(ofproto->ml, flow->dl_dst, 0, tags);
3822     if (out_port < 0) {
3823         add_output_group_action(actions, DP_GROUP_FLOOD, nf_output_iface);
3824     } else if (out_port != flow->in_port) {
3825         odp_actions_add(actions, ODPAT_OUTPUT)->output.port = out_port;
3826         *nf_output_iface = out_port;
3827     } else {
3828         /* Drop. */
3829     }
3830
3831     return true;
3832 }
3833
3834 static const struct ofhooks default_ofhooks = {
3835     NULL,
3836     default_normal_ofhook_cb,
3837     NULL,
3838     NULL
3839 };