/*
- * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "simap.h"
#include "stream.h"
#include "timeval.h"
-#include "vconn.h"
-#include "vlog.h"
+#include "openvswitch/vconn.h"
+#include "openvswitch/vlog.h"
#include "bundles.h"
struct ofconn {
/* Configuration that persists from one connection to the next. */
- struct list node; /* In struct connmgr's "all_conns" list. */
+ struct ovs_list node; /* In struct connmgr's "all_conns" list. */
struct hmap_node hmap_node; /* In struct connmgr's "controllers" map. */
struct connmgr *connmgr; /* Connection's manager. */
*
* When 'updates' is nonempty, 'sent_abbrev_update' is true if 'updates'
* contains an update event of type NXFME_ABBREV and false otherwise.. */
- struct list updates OVS_GUARDED_BY(ofproto_mutex);
+ struct ovs_list updates OVS_GUARDED_BY(ofproto_mutex);
bool sent_abbrev_update OVS_GUARDED_BY(ofproto_mutex);
/* Active bundles. Contains "struct ofp_bundle"s. */
static void ofconn_send(const struct ofconn *, struct ofpbuf *,
struct rconn_packet_counter *);
-static void do_send_packet_ins(struct ofconn *, struct list *txq);
+static void do_send_packet_ins(struct ofconn *, struct ovs_list *txq);
/* A listener for incoming OpenFlow "service" connections. */
struct ofservice {
char *local_port_name;
/* OpenFlow connections. */
- struct hmap controllers; /* All OFCONN_PRIMARY controllers. */
- struct list all_conns; /* All controllers. */
+ struct hmap controllers; /* All OFCONN_PRIMARY controllers. */
+ struct ovs_list all_conns; /* All controllers. */
uint64_t master_election_id; /* monotonically increasing sequence number
* for master election */
bool master_election_id_defined;
} sa;
if (ofconn->band == OFPROTO_IN_BAND
- && stream_parse_target_with_default_port(target, OFP_OLD_PORT,
- &sa.ss)
+ && stream_parse_target_with_default_port(target, OFP_PORT, &sa.ss)
&& sa.ss.ss_family == AF_INET) {
addrs[n_addrs++] = sa.in;
}
uint32_t *master = ofconn->master_async_config;
uint32_t *slave = ofconn->slave_async_config;
+ /* OFPR_ACTION_SET is not supported before OF1.4 */
+ master[OAM_PACKET_IN] &= ~(1u << OFPR_ACTION_SET);
+ slave [OAM_PACKET_IN] &= ~(1u << OFPR_ACTION_SET);
+
/* OFPR_GROUP is not supported before OF1.4 */
master[OAM_PACKET_IN] &= ~(1u << OFPR_GROUP);
slave [OAM_PACKET_IN] &= ~(1u << OFPR_GROUP);
/* Sends each of the messages in list 'replies' on 'ofconn' in order,
* accounting them as replies. */
void
-ofconn_send_replies(const struct ofconn *ofconn, struct list *replies)
+ofconn_send_replies(const struct ofconn *ofconn, struct ovs_list *replies)
{
struct ofpbuf *reply, *next;
/* Same as pktbuf_retrieve(), using the pktbuf owned by 'ofconn'. */
enum ofperr
ofconn_pktbuf_retrieve(struct ofconn *ofconn, uint32_t id,
- struct ofpbuf **bufferp, ofp_port_t *in_port)
+ struct dp_packet **bufferp, ofp_port_t *in_port)
{
return pktbuf_retrieve(ofconn->pktbuf, id, bufferp, in_port);
}
* reasons itself. */
master[OAM_PACKET_IN] = ((1u << OFPR_NO_MATCH)
| (1u << OFPR_ACTION)
+ | (1u << OFPR_ACTION_SET)
| (1u << OFPR_GROUP));
master[OAM_PORT_STATUS] = ((1u << OFPPR_ADD)
| (1u << OFPPR_DELETE)
}
ofp_bundle_remove_all(ofconn);
+ hmap_destroy(&ofconn->bundles);
hmap_destroy(&ofconn->monitors);
list_remove(&ofconn->node);
size_t i;
for (i = 0; i < N_SCHEDULERS; i++) {
- struct list txq;
+ struct ovs_list txq;
pinsched_run(ofconn->schedulers[i], &txq);
do_send_packet_ins(ofconn, &txq);
}
static void
-do_send_packet_ins(struct ofconn *ofconn, struct list *txq)
+do_send_packet_ins(struct ofconn *ofconn, struct ovs_list *txq)
{
struct ofpbuf *pin, *next_pin;
{
struct connmgr *mgr = ofconn->connmgr;
uint16_t controller_max_len;
- struct list txq;
+ struct ovs_list txq;
pin.up.total_len = pin.up.packet_len;
ofpact_pad(&ofpacts);
match_init_catchall(&match);
- ofproto_add_flow(mgr->ofproto, &match, 0, ofpbuf_data(&ofpacts),
- ofpbuf_size(&ofpacts));
+ ofproto_add_flow(mgr->ofproto, &match, 0, ofpacts.data,
+ ofpacts.size);
ofpbuf_uninit(&ofpacts);
}
}
+
+/* Returns the number of hidden rules created by the in-band and fail-open
+ * implementations in table 0. (Subtracting this count from the number of
+ * rules in the table 0 classifier, as returned by classifier_count(), yields
+ * the number of flows that OVS should report via OpenFlow for table 0.) */
+int
+connmgr_count_hidden_rules(const struct connmgr *mgr)
+{
+ int n_hidden = 0;
+ if (mgr->in_band) {
+ n_hidden += in_band_count_rules(mgr->in_band);
+ }
+ if (mgr->fail_open) {
+ n_hidden += fail_open_count_rules(mgr->fail_open);
+ }
+ return n_hidden;
+}
\f
/* Creates a new ofservice for 'target' in 'mgr'. Returns 0 if successful,
* otherwise a positive errno value.
struct rule_collection rules;
struct ofpbuf *resumed;
struct ofmonitor *m;
- struct list msgs;
+ struct ovs_list msgs;
rule_collection_init(&rules);
HMAP_FOR_EACH (m, ofconn_node, &ofconn->monitors) {