/*
- * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 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 "cfm.h"
#include "classifier.h"
#include "flow.h"
-#include "meta-flow.h"
+#include "openvswitch/meta-flow.h"
#include "netflow.h"
#include "rstp.h"
#include "smap.h"
bool enable_tunnel_sampling;
bool enable_input_sampling;
bool enable_output_sampling;
+ char *virtual_obs_id;
};
struct ofproto_ipfix_flow_exporter_options {
struct sset targets;
uint32_t cache_active_timeout;
uint32_t cache_max_flows;
+ bool enable_tunnel_sampling;
+ char *virtual_obs_id;
};
struct ofproto_rstp_status {
OFPROTO_OUT_OF_BAND /* Out-of-band connection to controller. */
};
+/* ofproto supports two kinds of OpenFlow connections:
+ *
+ * - "Primary" connections to ordinary OpenFlow controllers. ofproto
+ * maintains persistent connections to these controllers and by default
+ * sends them asynchronous messages such as packet-ins.
+ *
+ * - "Service" connections, e.g. from ovs-ofctl. When these connections
+ * drop, it is the other side's responsibility to reconnect them if
+ * necessary. ofproto does not send them asynchronous messages by default.
+ */
+enum ofconn_type {
+ OFCONN_PRIMARY, /* An ordinary OpenFlow controller. */
+ OFCONN_SERVICE /* A service connection, e.g. "ovs-ofctl". */
+};
+const char *ofconn_type_to_string(enum ofconn_type);
+
+/* Configuration for an OpenFlow controller. */
struct ofproto_controller {
- char *target; /* e.g. "tcp:127.0.0.1" */
+ enum ofconn_type type; /* Primary or service controller. */
int max_backoff; /* Maximum reconnection backoff, in seconds. */
int probe_interval; /* Max idle time before probing, in seconds. */
enum ofproto_band band; /* In-band or out-of-band? */
bool enable_async_msgs; /* Initially enable asynchronous messages? */
+ uint32_t allowed_versions; /* OpenFlow protocol versions that may
+ * be negotiated for a session. */
/* OpenFlow packet-in rate-limiting. */
+ int max_pktq_size; /* Maximum number of packet-in to be queued. */
int rate_limit; /* Max packet-in rate in packets per second. */
int burst_limit; /* Limit on accumulating packet credits. */
void ofproto_type_wait(const char *datapath_type);
int ofproto_create(const char *datapath, const char *datapath_type,
- struct ofproto **ofprotop);
-void ofproto_destroy(struct ofproto *);
+ struct ofproto **ofprotop)
+ OVS_EXCLUDED(ofproto_mutex);
+void ofproto_destroy(struct ofproto *, bool del);
int ofproto_delete(const char *name, const char *type);
int ofproto_run(struct ofproto *);
#define OFPROTO_FLOW_LIMIT_DEFAULT 200000
#define OFPROTO_MAX_IDLE_DEFAULT 10000 /* ms */
+#define OFPROTO_MAX_REVALIDATOR_DEFAULT 500 /* ms */
+#define OFPROTO_MIN_REVALIDATE_PPS_DEFAULT 5
-const char *ofproto_port_open_type(const char *datapath_type,
+const char *ofproto_port_open_type(const struct ofproto *,
const char *port_type);
int ofproto_port_add(struct ofproto *, struct netdev *, ofp_port_t *ofp_portp);
int ofproto_port_del(struct ofproto *, ofp_port_t ofp_port);
+void ofproto_port_set_config(struct ofproto *, ofp_port_t ofp_port,
+ const struct smap *cfg);
int ofproto_port_get_stats(const struct ofport *, struct netdev_stats *stats);
+int ofproto_vport_get_status(const struct ofproto *, ofp_port_t ofp_port,
+ char **errp);
+
int ofproto_port_query_by_name(const struct ofproto *, const char *devname,
struct ofproto_port *);
/* Top-level configuration. */
uint64_t ofproto_get_datapath_id(const struct ofproto *);
void ofproto_set_datapath_id(struct ofproto *, uint64_t datapath_id);
-void ofproto_set_controllers(struct ofproto *,
- const struct ofproto_controller *, size_t n,
- uint32_t allowed_versions);
+void ofproto_set_controllers(struct ofproto *, struct shash *controllers);
void ofproto_set_fail_mode(struct ofproto *, enum ofproto_fail_mode fail_mode);
void ofproto_reconnect_controllers(struct ofproto *);
void ofproto_set_extra_in_band_remotes(struct ofproto *,
const struct sockaddr_in *, size_t n);
void ofproto_set_in_band_queue(struct ofproto *, int queue_id);
+void ofproto_set_bundle_idle_timeout(unsigned timeout);
void ofproto_set_flow_limit(unsigned limit);
void ofproto_set_max_idle(unsigned max_idle);
+void ofproto_set_max_revalidator(unsigned max_revalidator);
+void ofproto_set_min_revalidate_pps(unsigned min_revalidate_pps);
void ofproto_set_forward_bpdu(struct ofproto *, bool forward_bpdu);
void ofproto_set_mac_table_config(struct ofproto *, unsigned idle_time,
size_t max_entries);
int ofproto_port_set_mcast_snooping(struct ofproto *ofproto, void *aux,
const struct ofproto_mcast_snooping_port_settings *s);
void ofproto_set_threads(int n_handlers, int n_revalidators);
-void ofproto_set_n_dpdk_rxqs(int n_rxqs);
-void ofproto_set_cpu_mask(const char *cmask);
+void ofproto_type_set_config(const char *type,
+ const struct smap *other_config);
void ofproto_set_dp_desc(struct ofproto *, const char *dp_desc);
+void ofproto_set_serial_desc(struct ofproto *p, const char *serial_desc);
int ofproto_set_snoops(struct ofproto *, const struct sset *snoops);
int ofproto_set_netflow(struct ofproto *,
const struct netflow_options *nf_options);
int ofproto_set_rstp(struct ofproto *, const struct ofproto_rstp_settings *);
int ofproto_get_rstp_status(struct ofproto *, struct ofproto_rstp_status *);
+void ofproto_set_vlan_limit(int vlan_limit);
+void ofproto_ct_set_zone_timeout_policy(const char *datapath_type,
+ uint16_t zone,
+ struct simap *timeout_policy);
+void ofproto_ct_del_zone_timeout_policy(const char *datapath_type,
+ uint16_t zone);
+void ofproto_get_datapath_cap(const char *datapath_type,
+ struct smap *dp_cap);
/* Configuration of ports. */
void ofproto_port_unregister(struct ofproto *, ofp_port_t ofp_port);
/* Untagged incoming packets are part of 'vlan', as are incoming packets
* tagged with 'vlan'. Outgoing packets tagged with 'vlan' are untagged.
* Other VLANs in 'trunks' are trunked. */
- PORT_VLAN_NATIVE_UNTAGGED
+ PORT_VLAN_NATIVE_UNTAGGED,
+
+ /* 802.1q tunnel port. Incoming packets are added an outer vlan tag
+ * 'vlan'. If 'cvlans' is set, only allows VLANs in 'cvlans'. */
+ PORT_VLAN_DOT1Q_TUNNEL
+};
+
+/* The behaviour of the port regarding priority tags */
+enum port_priority_tags_mode {
+ PORT_PRIORITY_TAGS_NEVER = 0,
+ PORT_PRIORITY_TAGS_IF_NONZERO,
+ PORT_PRIORITY_TAGS_ALWAYS,
};
+/* The behaviour of the port regarding priority tags */
/* Configuration of bundles. */
struct ofproto_bundle_settings {
char *name; /* For use in log messages. */
size_t n_slaves;
enum port_vlan_mode vlan_mode; /* Selects mode for vlan and trunks */
+ uint16_t qinq_ethtype;
int vlan; /* VLAN VID, except for PORT_VLAN_TRUNK. */
unsigned long *trunks; /* vlan_bitmap, except for PORT_VLAN_ACCESS. */
- bool use_priority_tags; /* Use 802.1p tag for frames in VLAN 0? */
+ unsigned long *cvlans;
+ enum port_priority_tags_mode use_priority_tags;
+ /* Use 802.1p tag for frames in VLAN 0? */
struct bond_settings *bond; /* Must be nonnull iff if n_slaves > 1. */
struct lacp_settings *lacp; /* Nonnull to enable LACP. */
struct lacp_slave_settings *lacp_slaves; /* Array of n_slaves elements. */
- /* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
- *
- * This is deprecated. It is only for compatibility with broken device
- * drivers in old versions of Linux that do not properly support VLANs when
- * VLAN devices are not used. When broken device drivers are no longer in
- * widespread use, we will delete these interfaces. */
- ofp_port_t realdev_ofp_port;/* OpenFlow port number of real device. */
+ bool protected; /* Protected port mode */
};
int ofproto_bundle_register(struct ofproto *, void *aux,
/* Output (mutually exclusive). */
void *out_bundle; /* A registered ofbundle handle or NULL. */
uint16_t out_vlan; /* Output VLAN, only if out_bundle is NULL. */
+ uint16_t snaplen; /* Max packet size of a mirrored packet
+ in byte, set to 0 equals 65535. */
};
int ofproto_mirror_register(struct ofproto *, void *aux,
char *name; /* Name exported via OpenFlow or NULL. */
unsigned int max_flows; /* Maximum number of flows or UINT_MAX. */
- /* These members determine the handling of an attempt to add a flow that
- * would cause the table to have more than 'max_flows' flows.
+ /* These members, together with OpenFlow OFPT_TABLE_MOD, determine the
+ * handling of an attempt to add a flow that would cause the table to have
+ * more than 'max_flows' flows:
*
- * If 'groups' is NULL, overflows will be rejected with an error.
+ * - If 'enable_eviction' is false and OFPT_TABLE_MOD does not enable
+ * eviction, overflows will be rejected with an error.
*
- * If 'groups' is nonnull, an overflow will cause a flow to be removed.
- * The flow to be removed is chosen to give fairness among groups
- * distinguished by different values for the subfields within 'groups'. */
+ * - If 'enable_eviction' is true or OFPT_TABLE_MOD enables eviction, an
+ * overflow will cause a flow to be removed. The flow to be removed
+ * is chosen to give fairness among groups distinguished by different
+ * values for the 'n_groups' subfields within 'groups'. */
+ bool enable_eviction;
struct mf_subfield *groups;
size_t n_groups;
/* Configuration querying. */
bool ofproto_has_snoops(const struct ofproto *);
void ofproto_get_snoops(const struct ofproto *, struct sset *);
-void ofproto_get_all_flows(struct ofproto *p, struct ds *);
+void ofproto_get_all_flows(struct ofproto *p, struct ds *, bool);
void ofproto_get_netflow_ids(const struct ofproto *,
uint8_t *engine_type, uint8_t *engine_id);
ofp_port_t ofp_port,
struct cfm_status *);
\f
-/* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
- *
- * This is deprecated. It is only for compatibility with broken device drivers
- * in old versions of Linux that do not properly support VLANs when VLAN
- * devices are not used. When broken device drivers are no longer in
- * widespread use, we will delete these interfaces. */
-
-void ofproto_get_vlan_usage(struct ofproto *, unsigned long int *vlan_bitmap);
-bool ofproto_has_vlan_usage_changed(const struct ofproto *);
-int ofproto_port_set_realdev(struct ofproto *, ofp_port_t vlandev_ofp_port,
- ofp_port_t realdev_ofp_port, int vid);
-\f
/* Table configuration */
enum ofputil_table_miss ofproto_table_get_miss_config(const struct ofproto *,