X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fconnmgr.c;h=7897bb7fea6843b24fd14b1a0a8784440ad19aa3;hb=1007d8acad106fb508ccfdb84ca5bbdc491efc6c;hp=5ce77c04c579e97e129c77f4ce3a368cce513f9d;hpb=982697a4d24caa0a3bdaf85db67619338b382e50;p=openvswitch diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c index 5ce77c04..7897bb7f 100644 --- a/ofproto/connmgr.c +++ b/ofproto/connmgr.c @@ -137,7 +137,8 @@ struct ofservice { static void ofservice_reconfigure(struct ofservice *, const struct ofproto_controller *); -static int ofservice_create(struct connmgr *, const char *target, uint8_t dscp); +static int ofservice_create(struct connmgr *mgr, const char *target, + uint32_t allowed_versions, uint8_t dscp); static void ofservice_destroy(struct connmgr *, struct ofservice *); static struct ofservice *ofservice_lookup(struct connmgr *, const char *target); @@ -289,7 +290,7 @@ connmgr_run(struct connmgr *mgr, struct vconn *vconn; int retval; - retval = pvconn_accept(ofservice->pvconn, OFP10_VERSION, &vconn); + retval = pvconn_accept(ofservice->pvconn, &vconn); if (!retval) { struct rconn *rconn; char *name; @@ -313,7 +314,7 @@ connmgr_run(struct connmgr *mgr, struct vconn *vconn; int retval; - retval = pvconn_accept(mgr->snoops[i], OFP10_VERSION, &vconn); + retval = pvconn_accept(mgr->snoops[i], &vconn); if (!retval) { add_snooper(mgr, vconn); } else if (retval != EAGAIN) { @@ -477,7 +478,7 @@ connmgr_free_controller_info(struct shash *info) SHASH_FOR_EACH (node, info) { struct ofproto_controller_info *cinfo = node->data; while (cinfo->pairs.n) { - free((char *) cinfo->pairs.values[--cinfo->pairs.n]); + free(CONST_CAST(char *, cinfo->pairs.values[--cinfo->pairs.n])); } free(cinfo); } @@ -513,7 +514,7 @@ connmgr_set_controllers(struct connmgr *mgr, if (!ofservice_lookup(mgr, c->target)) { VLOG_INFO("%s: added service controller \"%s\"", mgr->name, c->target); - ofservice_create(mgr, c->target, c->dscp); + ofservice_create(mgr, c->target, 0, c->dscp); } } else { VLOG_WARN_RL(&rl, "%s: unsupported controller \"%s\"", @@ -720,8 +721,7 @@ set_pvconns(struct pvconn ***pvconnsp, size_t *n_pvconnsp, SSET_FOR_EACH (name, sset) { struct pvconn *pvconn; int error; - - error = pvconn_open(name, &pvconn, 0); + error = pvconn_open(name, 0, &pvconn, 0); if (!error) { pvconns[n_pvconns++] = pvconn; } else { @@ -1407,7 +1407,8 @@ schedule_packet_in(struct ofconn *ofconn, struct ofputil_packet_in pin) * while (until a later call to pinsched_run()). */ pinsched_send(ofconn->schedulers[pin.reason == OFPR_NO_MATCH ? 0 : 1], pin.fmd.in_port, - ofputil_encode_packet_in(&pin, ofconn->packet_in_format), + ofputil_encode_packet_in(&pin, ofconn->protocol, + ofconn->packet_in_format), do_send_packet_in, ofconn); } @@ -1599,14 +1600,14 @@ connmgr_flushed(struct connmgr *mgr) if (!connmgr_has_controllers(mgr) && mgr->fail_mode == OFPROTO_FAIL_STANDALONE) { struct ofpbuf ofpacts; - struct cls_rule rule; + struct match match; ofpbuf_init(&ofpacts, OFPACT_OUTPUT_SIZE); ofpact_put_OUTPUT(&ofpacts)->port = OFPP_NORMAL; ofpact_pad(&ofpacts); - cls_rule_init_catchall(&rule, 0); - ofproto_add_flow(mgr->ofproto, &rule, ofpacts.data, ofpacts.size); + match_init_catchall(&match); + ofproto_add_flow(mgr->ofproto, &match, 0, ofpacts.data, ofpacts.size); ofpbuf_uninit(&ofpacts); } @@ -1618,13 +1619,14 @@ connmgr_flushed(struct connmgr *mgr) * ofservice_reconfigure() must be called to fully configure the new * ofservice. */ static int -ofservice_create(struct connmgr *mgr, const char *target, uint8_t dscp) +ofservice_create(struct connmgr *mgr, const char *target, + uint32_t allowed_versions, uint8_t dscp) { struct ofservice *ofservice; struct pvconn *pvconn; int error; - error = pvconn_open(target, &pvconn, dscp); + error = pvconn_open(target, allowed_versions, &pvconn, dscp); if (error) { return error; } @@ -1716,7 +1718,7 @@ ofmonitor_create(const struct ofputil_flow_monitor_request *request, m->flags = request->flags; m->out_port = request->out_port; m->table_id = request->table_id; - m->match = request->match; + minimatch_init(&m->match, &request->match); *monitorp = m; return 0; @@ -1804,6 +1806,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule, if (ofconn != abbrev_ofconn || ofconn->monitor_paused) { struct ofputil_flow_update fu; + struct match match; fu.event = event; fu.reason = event == NXFME_DELETED ? reason : 0; @@ -1811,7 +1814,9 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule, fu.hard_timeout = rule->hard_timeout; fu.table_id = rule->table_id; fu.cookie = rule->flow_cookie; - fu.match = &rule->cr; + minimatch_expand(&rule->cr.match, &match); + fu.match = &match; + fu.priority = rule->cr.priority; if (flags & NXFMF_ACTIONS) { fu.ofpacts = rule->ofpacts; fu.ofpacts_len = rule->ofpacts_len;