static void ofopgroup_destroy(struct ofopgroup *);
-static int add_flow(struct ofproto *, struct ofconn *, struct flow_mod *,
- const struct ofp_header *);
+static int add_flow(struct ofproto *, struct ofconn *,
+ struct ofputil_flow_mod *, const struct ofp_header *);
/* This return value tells handle_openflow() that processing of the current
* OpenFlow message must be postponed until some ongoing operations have
ofproto->datapath_id = 0;
ofproto_set_flow_eviction_threshold(ofproto,
OFPROTO_FLOW_EVICTON_THRESHOLD_DEFAULT);
+ ofproto->forward_bpdu = false;
ofproto->fallback_dpid = pick_fallback_dpid();
ofproto->mfr_desc = xstrdup(DEFAULT_MFR_DESC);
ofproto->hw_desc = xstrdup(DEFAULT_HW_DESC);
}
}
+/* If forward_bpdu is true, the NORMAL action will forward frames with
+ * reserved (e.g. STP) destination Ethernet addresses. if forward_bpdu is false,
+ * the NORMAL action will drop these frames. */
+void
+ofproto_set_forward_bpdu(struct ofproto *ofproto, bool forward_bpdu)
+{
+ bool old_val = ofproto->forward_bpdu;
+ ofproto->forward_bpdu = forward_bpdu;
+ if (old_val != ofproto->forward_bpdu) {
+ if (ofproto->ofproto_class->forward_bpdu_changed) {
+ ofproto->ofproto_class->forward_bpdu_changed(ofproto);
+ }
+ }
+}
+
void
ofproto_set_desc(struct ofproto *p,
const char *mfr_desc, const char *hw_desc,
&ofproto->tables[0], cls_rule));
if (!rule || !ofputil_actions_equal(rule->actions, rule->n_actions,
actions, n_actions)) {
- struct flow_mod fm;
+ struct ofputil_flow_mod fm;
memset(&fm, 0, sizeof fm);
fm.cr = *cls_rule;
const struct ofp_stats_msg *osm)
{
struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
- struct flow_stats_request fsr;
+ struct ofputil_flow_stats_request fsr;
struct list replies;
struct list rules;
struct rule *rule;
const struct ofp_stats_msg *osm)
{
struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
- struct flow_stats_request request;
+ struct ofputil_flow_stats_request request;
struct ofputil_aggregate_stats stats;
bool unknown_packets, unknown_bytes;
struct ofpbuf *reply;
* 'ofconn' is used to retrieve the packet buffer specified in ofm->buffer_id,
* if any. */
static int
-add_flow(struct ofproto *ofproto, struct ofconn *ofconn, struct flow_mod *fm,
- const struct ofp_header *request)
+add_flow(struct ofproto *ofproto, struct ofconn *ofconn,
+ struct ofputil_flow_mod *fm, const struct ofp_header *request)
{
struct classifier *table;
struct ofopgroup *group;
*
* Returns 0 on success, otherwise an OpenFlow error code. */
static int
-modify_flows__(struct ofconn *ofconn, const struct flow_mod *fm,
+modify_flows__(struct ofconn *ofconn, const struct ofputil_flow_mod *fm,
const struct ofp_header *request, struct list *rules)
{
struct ofopgroup *group;
* 'ofconn' is used to retrieve the packet buffer specified in fm->buffer_id,
* if any. */
static int
-modify_flows_loose(struct ofconn *ofconn, struct flow_mod *fm,
+modify_flows_loose(struct ofconn *ofconn, struct ofputil_flow_mod *fm,
const struct ofp_header *request)
{
struct ofproto *p = ofconn_get_ofproto(ofconn);
* 'ofconn' is used to retrieve the packet buffer specified in fm->buffer_id,
* if any. */
static int
-modify_flow_strict(struct ofconn *ofconn, struct flow_mod *fm,
+modify_flow_strict(struct ofconn *ofconn, struct ofputil_flow_mod *fm,
const struct ofp_header *request)
{
struct ofproto *p = ofconn_get_ofproto(ofconn);
/* Implements OFPFC_DELETE. */
static int
-delete_flows_loose(struct ofconn *ofconn, const struct flow_mod *fm,
+delete_flows_loose(struct ofconn *ofconn, const struct ofputil_flow_mod *fm,
const struct ofp_header *request)
{
struct ofproto *p = ofconn_get_ofproto(ofconn);
/* Implements OFPFC_DELETE_STRICT. */
static int
-delete_flow_strict(struct ofconn *ofconn, struct flow_mod *fm,
+delete_flow_strict(struct ofconn *ofconn, struct ofputil_flow_mod *fm,
const struct ofp_header *request)
{
struct ofproto *p = ofconn_get_ofproto(ofconn);
handle_flow_mod(struct ofconn *ofconn, const struct ofp_header *oh)
{
struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
- struct flow_mod fm;
+ struct ofputil_flow_mod fm;
int error;
error = reject_slave_controller(ofconn, "flow_mod");