From f9bfea1402fb4776e505eba7bb712c8355e01e70 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 5 Nov 2010 11:10:35 -0700 Subject: [PATCH] ofproto: Generalize tun_id_from_cookie into flow_format. Upcoming commits will add more flow formats, so this needs to be an enumerated type instead of a bool. --- include/openflow/nicira-ext.h | 5 +++++ lib/classifier.c | 10 +++++----- lib/classifier.h | 3 +-- lib/flow.c | 10 +++++----- lib/flow.h | 4 ++-- ofproto/ofproto.c | 33 ++++++++++++++++----------------- 6 files changed, 34 insertions(+), 31 deletions(-) diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h index 70b45027..cd5026ee 100644 --- a/include/openflow/nicira-ext.h +++ b/include/openflow/nicira-ext.h @@ -125,6 +125,11 @@ struct nicira_header { }; OFP_ASSERT(sizeof(struct nicira_header) == 16); +enum { + NXFF_OPENFLOW10 = 0, /* Standard OpenFlow 1.0 compatible. */ + NXFF_TUN_ID_FROM_COOKIE = 1 /* Obtain tunnel ID from cookie. */ +}; + struct nxt_tun_id_cookie { struct ofp_header header; uint32_t vendor; /* NX_VENDOR_ID. */ diff --git a/lib/classifier.c b/lib/classifier.c index 8da2d795..42f026ff 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -118,18 +118,18 @@ cls_rule_from_flow(const struct flow *flow, uint32_t wildcards, rule->priority = priority; } -/* Converts the ofp_match in 'match' into a cls_rule in 'rule', with the given - * 'priority'. If 'tun_id_from_cookie' is set then the upper 32 bits of - * 'cookie' are stored in the rule as the tunnel ID. */ +/* Converts the ofp_match in 'match' (with format 'flow_format', one of NXFF_*) + * into a cls_rule in 'rule', with the given 'priority'. 'cookie' is used + * when 'flow_format' is NXFF_TUN_ID_FROM_COOKIE. */ void cls_rule_from_match(const struct ofp_match *match, unsigned int priority, - bool tun_id_from_cookie, uint64_t cookie, + int flow_format, uint64_t cookie, struct cls_rule *rule) { uint32_t wildcards; struct flow flow; - flow_from_match(match, tun_id_from_cookie, cookie, &flow, &wildcards); + flow_from_match(match, flow_format, cookie, &flow, &wildcards); cls_rule_init__(rule, &flow, wildcards); rule->priority = rule->wc.wildcards ? priority : UINT16_MAX; } diff --git a/lib/classifier.h b/lib/classifier.h index 7ed3cf74..e178703c 100644 --- a/lib/classifier.h +++ b/lib/classifier.h @@ -75,8 +75,7 @@ enum { void cls_rule_from_flow(const struct flow *, uint32_t wildcards, unsigned int priority, struct cls_rule *); void cls_rule_from_match(const struct ofp_match *, unsigned int priority, - bool tun_id_from_cookie, uint64_t cookie, - struct cls_rule *); + int flow_format, uint64_t cookie, struct cls_rule *); void cls_rule_zero_wildcards(struct cls_rule *); diff --git a/lib/flow.c b/lib/flow.c index aba77cca..678ae430 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -250,12 +250,12 @@ flow_extract_stats(const struct flow *flow, struct ofpbuf *packet, } /* Extract 'flow' with 'wildcards' into the OpenFlow match structure - * 'match'. */ + * 'match'. 'flow_format' should be one of NXFF_*. */ void flow_to_match(const struct flow *flow, uint32_t wildcards, - bool tun_id_from_cookie, struct ofp_match *match) + int flow_format, struct ofp_match *match) { - if (!tun_id_from_cookie) { + if (flow_format != NXFF_TUN_ID_FROM_COOKIE) { wildcards &= OFPFW_ALL; } match->wildcards = htonl(wildcards); @@ -278,14 +278,14 @@ flow_to_match(const struct flow *flow, uint32_t wildcards, } void -flow_from_match(const struct ofp_match *match, bool tun_id_from_cookie, +flow_from_match(const struct ofp_match *match, int flow_format, ovs_be64 cookie, struct flow *flow, uint32_t *flow_wildcards) { uint32_t wildcards = ntohl(match->wildcards); flow->nw_src = match->nw_src; flow->nw_dst = match->nw_dst; - if (tun_id_from_cookie && !(wildcards & NXFW_TUN_ID)) { + if (flow_format == NXFF_TUN_ID_FROM_COOKIE && !(wildcards & NXFW_TUN_ID)) { flow->tun_id = htonl(ntohll(cookie) >> 32); } else { wildcards |= NXFW_TUN_ID; diff --git a/lib/flow.h b/lib/flow.h index f1a32d55..a154df2b 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -59,9 +59,9 @@ int flow_extract(struct ofpbuf *, ovs_be32 tun_id, uint16_t in_port, struct flow *); void flow_extract_stats(const struct flow *flow, struct ofpbuf *packet, struct odp_flow_stats *stats); -void flow_to_match(const struct flow *, uint32_t wildcards, bool tun_id_cookie, +void flow_to_match(const struct flow *, uint32_t wildcards, int flow_format, struct ofp_match *); -void flow_from_match(const struct ofp_match *, bool tun_id_from_cookie, +void flow_from_match(const struct ofp_match *, int flow_format, ovs_be64 cookie, struct flow *, uint32_t *wildcards); char *flow_to_string(const struct flow *); void flow_format(struct ds *, const struct flow *); diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 42260443..bd31b760 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -290,7 +290,7 @@ struct ofproto { bool need_revalidate; long long int next_expiration; struct tag_set revalidate_set; - bool tun_id_from_cookie; + int flow_format; /* One of NXFF_*. */ /* OpenFlow connections. */ struct hmap controllers; /* Controller "struct ofconn"s. */ @@ -398,6 +398,7 @@ ofproto_create(const char *datapath, const char *datapath_type, p->need_revalidate = false; p->next_expiration = time_msec() + 1000; tag_set_init(&p->revalidate_set); + p->flow_format = NXFF_OPENFLOW10; /* Initialize OpenFlow connections. */ list_init(&p->all_conns); @@ -3066,8 +3067,8 @@ handle_table_stats_request(struct ofproto *p, struct ofconn *ofconn, ots = append_stats_reply(sizeof *ots, ofconn, &msg); memset(ots, 0, sizeof *ots); strcpy(ots->name, "classifier"); - ots->wildcards = p->tun_id_from_cookie ? htonl(OVSFW_ALL) - : htonl(OFPFW_ALL); + ots->wildcards = (p->flow_format == NXFF_OPENFLOW10 + ? htonl(OFPFW_ALL) : htonl(OVSFW_ALL)); ots->max_entries = htonl(1024 * 1024); /* An arbitrary big number. */ ots->active_count = htonl(n_rules); ots->lookup_count = htonll(0); /* XXX */ @@ -3224,7 +3225,7 @@ flow_stats_cb(struct cls_rule *rule_, void *cbdata_) ofs->table_id = 0; ofs->pad = 0; flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, - cbdata->ofproto->tun_id_from_cookie, &ofs->match); + cbdata->ofproto->flow_format, &ofs->match); ofs->duration_sec = htonl(sec); ofs->duration_nsec = htonl(msec * 1000000); ofs->cookie = rule->flow_cookie; @@ -3264,7 +3265,7 @@ handle_flow_stats_request(struct ofproto *p, struct ofconn *ofconn, cbdata.ofconn = ofconn; cbdata.out_port = fsr->out_port; cbdata.msg = start_stats_reply(osr, 1024); - cls_rule_from_match(&fsr->match, 0, false, 0, &target); + cls_rule_from_match(&fsr->match, 0, NXFF_OPENFLOW10, 0, &target); classifier_for_each_match(&p->cls, &target, table_id_to_include(fsr->table_id), flow_stats_cb, &cbdata); @@ -3294,7 +3295,7 @@ flow_stats_ds_cb(struct cls_rule *rule_, void *cbdata_) query_stats(cbdata->ofproto, rule, &packet_count, &byte_count); flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, - cbdata->ofproto->tun_id_from_cookie, &match); + cbdata->ofproto->flow_format, &match); ds_put_format(results, "duration=%llds, ", (time_msec() - rule->created) / 1000); @@ -3325,7 +3326,7 @@ ofproto_get_all_flows(struct ofproto *p, struct ds *results) cbdata.ofproto = p; cbdata.results = results; - cls_rule_from_match(&match, 0, false, 0, &target); + cls_rule_from_match(&match, 0, NXFF_OPENFLOW10, 0, &target); classifier_for_each_match(&p->cls, &target, CLS_INC_ALL, flow_stats_ds_cb, &cbdata); } @@ -3378,7 +3379,7 @@ handle_aggregate_stats_request(struct ofproto *p, struct ofconn *ofconn, cbdata.packet_count = 0; cbdata.byte_count = 0; cbdata.n_flows = 0; - cls_rule_from_match(&asr->match, 0, false, 0, &target); + cls_rule_from_match(&asr->match, 0, NXFF_OPENFLOW10, 0, &target); classifier_for_each_match(&p->cls, &target, table_id_to_include(asr->table_id), aggregate_stats_cb, &cbdata); @@ -3577,7 +3578,7 @@ add_flow(struct ofproto *p, struct ofconn *ofconn, struct cls_rule cr; cls_rule_from_match(&ofm->match, ntohs(ofm->priority), - p->tun_id_from_cookie, ofm->cookie, &cr); + p->flow_format, ofm->cookie, &cr); if (classifier_rule_overlaps(&p->cls, &cr)) { return ofp_mkerr(OFPET_FLOW_MOD_FAILED, OFPFMFC_OVERLAP); } @@ -3588,7 +3589,7 @@ add_flow(struct ofproto *p, struct ofconn *ofconn, ntohs(ofm->hard_timeout), ofm->cookie, ofm->flags & htons(OFPFF_SEND_FLOW_REM)); cls_rule_from_match(&ofm->match, ntohs(ofm->priority), - p->tun_id_from_cookie, ofm->cookie, &rule->cr); + p->flow_format, ofm->cookie, &rule->cr); error = 0; if (ofm->buffer_id != htonl(UINT32_MAX)) { @@ -3609,7 +3610,7 @@ find_flow_strict(struct ofproto *p, const struct ofp_flow_mod *ofm) struct cls_rule target; cls_rule_from_match(&ofm->match, ntohs(ofm->priority), - p->tun_id_from_cookie, ofm->cookie, &target); + p->flow_format, ofm->cookie, &target); return rule_from_cls_rule(classifier_find_rule_exactly(&p->cls, &target)); } @@ -3668,8 +3669,7 @@ modify_flows_loose(struct ofproto *p, struct ofconn *ofconn, cbdata.n_actions = n_actions; cbdata.match = NULL; - cls_rule_from_match(&ofm->match, 0, p->tun_id_from_cookie, ofm->cookie, - &target); + cls_rule_from_match(&ofm->match, 0, p->flow_format, ofm->cookie, &target); classifier_for_each_match(&p->cls, &target, CLS_INC_ALL, modify_flows_cb, &cbdata); @@ -3770,8 +3770,7 @@ delete_flows_loose(struct ofproto *p, const struct ofp_flow_mod *ofm) cbdata.ofproto = p; cbdata.out_port = ofm->out_port; - cls_rule_from_match(&ofm->match, 0, p->tun_id_from_cookie, ofm->cookie, - &target); + cls_rule_from_match(&ofm->match, 0, p->flow_format, ofm->cookie, &target); classifier_for_each_match(&p->cls, &target, CLS_INC_ALL, delete_flows_cb, &cbdata); @@ -3908,7 +3907,7 @@ handle_tun_id_from_cookie(struct ofproto *p, struct nxt_tun_id_cookie *msg) return error; } - p->tun_id_from_cookie = !!msg->set; + p->flow_format = msg->set ? NXFF_TUN_ID_FROM_COOKIE : NXFF_OPENFLOW10; return 0; } @@ -4524,7 +4523,7 @@ compose_flow_removed(struct ofproto *p, const struct rule *rule, uint32_t msec = tdiff - (sec * 1000); ofr = make_openflow(sizeof *ofr, OFPT_FLOW_REMOVED, &buf); - flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, p->tun_id_from_cookie, + flow_to_match(&rule->cr.flow, rule->cr.wc.wildcards, p->flow_format, &ofr->match); ofr->cookie = rule->flow_cookie; ofr->priority = htons(rule->cr.priority); -- 2.30.2