[ovs-dev] [learning 3/6] ofproto: Add 'ofproto' parameter to most flow_mod functions.
Ethan Jackson
ethan at nicira.com
Thu Aug 18 17:46:58 PDT 2011
Looks good,
Ethan
On Wed, Aug 17, 2011 at 16:00, Ben Pfaff <blp at nicira.com> wrote:
> ---
> ofproto/ofproto.c | 116 ++++++++++++++++++++++++++++------------------------
> 1 files changed, 62 insertions(+), 54 deletions(-)
>
> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> index a34db45..45dec07 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -97,10 +97,10 @@ struct ofopgroup {
> int error; /* 0 if no error yet, otherwise error code. */
> };
>
> -static struct ofopgroup *ofopgroup_create(struct ofproto *);
> -static struct ofopgroup *ofopgroup_create_for_ofconn(struct ofconn *,
> - const struct ofp_header *,
> - uint32_t buffer_id);
> +static struct ofopgroup *ofopgroup_create_unattached(struct ofproto *);
> +static struct ofopgroup *ofopgroup_create(struct ofproto *, struct ofconn *,
> + const struct ofp_header *,
> + uint32_t buffer_id);
> static void ofopgroup_submit(struct ofopgroup *);
> static void ofopgroup_destroy(struct ofopgroup *);
>
> @@ -691,7 +691,7 @@ ofproto_flush__(struct ofproto *ofproto)
> ofproto->ofproto_class->flush(ofproto);
> }
>
> - group = ofopgroup_create(ofproto);
> + group = ofopgroup_create_unattached(ofproto);
> OFPROTO_FOR_EACH_TABLE (table, ofproto) {
> struct rule *rule, *next_rule;
> struct cls_cursor cursor;
> @@ -1081,7 +1081,7 @@ ofproto_delete_flow(struct ofproto *ofproto, const struct cls_rule *target)
> return false;
> } else {
> /* Initiate deletion -> success. */
> - struct ofopgroup *group = ofopgroup_create(ofproto);
> + struct ofopgroup *group = ofopgroup_create_unattached(ofproto);
> ofoperation_create(group, rule, OFOPERATION_DELETE);
> classifier_remove(&ofproto->tables[rule->table_id], &rule->cr);
> rule->ofproto->ofproto_class->rule_destruct(rule);
> @@ -2245,9 +2245,7 @@ add_flow(struct ofproto *ofproto, struct ofconn *ofconn,
> if (victim && victim->pending) {
> error = OFPROTO_POSTPONE;
> } else {
> - group = (ofconn
> - ? ofopgroup_create_for_ofconn(ofconn, request, fm->buffer_id)
> - : ofopgroup_create(ofproto));
> + group = ofopgroup_create(ofproto, ofconn, request, fm->buffer_id);
> ofoperation_create(group, rule, OFOPERATION_ADD);
> rule->pending->victim = victim;
>
> @@ -2280,13 +2278,14 @@ add_flow(struct ofproto *ofproto, struct ofconn *ofconn,
> *
> * Returns 0 on success, otherwise an OpenFlow error code. */
> static int
> -modify_flows__(struct ofconn *ofconn, const struct ofputil_flow_mod *fm,
> +modify_flows__(struct ofproto *ofproto, struct ofconn *ofconn,
> + const struct ofputil_flow_mod *fm,
> const struct ofp_header *request, struct list *rules)
> {
> struct ofopgroup *group;
> struct rule *rule;
>
> - group = ofopgroup_create_for_ofconn(ofconn, request, fm->buffer_id);
> + group = ofopgroup_create(ofproto, ofconn, request, fm->buffer_id);
> LIST_FOR_EACH (rule, ofproto_node, rules) {
> if (!ofputil_actions_equal(fm->actions, fm->n_actions,
> rule->actions, rule->n_actions)) {
> @@ -2310,17 +2309,18 @@ modify_flows__(struct ofconn *ofconn, const struct ofputil_flow_mod *fm,
> * 'ofconn' is used to retrieve the packet buffer specified in fm->buffer_id,
> * if any. */
> static int
> -modify_flows_loose(struct ofconn *ofconn, struct ofputil_flow_mod *fm,
> +modify_flows_loose(struct ofproto *ofproto, struct ofconn *ofconn,
> + struct ofputil_flow_mod *fm,
> const struct ofp_header *request)
> {
> - struct ofproto *p = ofconn_get_ofproto(ofconn);
> struct list rules;
> int error;
>
> - error = collect_rules_loose(p, fm->table_id, &fm->cr, OFPP_NONE, &rules);
> + error = collect_rules_loose(ofproto, fm->table_id, &fm->cr, OFPP_NONE,
> + &rules);
> return (error ? error
> - : list_is_empty(&rules) ? add_flow(p, ofconn, fm, request)
> - : modify_flows__(ofconn, fm, request, &rules));
> + : list_is_empty(&rules) ? add_flow(ofproto, ofconn, fm, request)
> + : modify_flows__(ofproto, ofconn, fm, request, &rules));
> }
>
> /* Implements OFPFC_MODIFY_STRICT. Returns 0 on success or an OpenFlow error
> @@ -2329,18 +2329,19 @@ modify_flows_loose(struct ofconn *ofconn, struct ofputil_flow_mod *fm,
> * 'ofconn' is used to retrieve the packet buffer specified in fm->buffer_id,
> * if any. */
> static int
> -modify_flow_strict(struct ofconn *ofconn, struct ofputil_flow_mod *fm,
> +modify_flow_strict(struct ofproto *ofproto, struct ofconn *ofconn,
> + struct ofputil_flow_mod *fm,
> const struct ofp_header *request)
> {
> - struct ofproto *p = ofconn_get_ofproto(ofconn);
> struct list rules;
> int error;
>
> - error = collect_rules_strict(p, fm->table_id, &fm->cr, OFPP_NONE, &rules);
> + error = collect_rules_strict(ofproto, fm->table_id, &fm->cr, OFPP_NONE,
> + &rules);
> return (error ? error
> - : list_is_empty(&rules) ? add_flow(p, ofconn, fm, request)
> - : list_is_singleton(&rules) ? modify_flows__(ofconn, fm, request,
> - &rules)
> + : list_is_empty(&rules) ? add_flow(ofproto, ofconn, fm, request)
> + : list_is_singleton(&rules) ? modify_flows__(ofproto, ofconn,
> + fm, request, &rules)
> : 0);
> }
>
> @@ -2350,14 +2351,13 @@ modify_flow_strict(struct ofconn *ofconn, struct ofputil_flow_mod *fm,
> *
> * Returns 0 on success, otherwise an OpenFlow error code. */
> static int
> -delete_flows__(struct ofconn *ofconn, const struct ofp_header *request,
> - struct list *rules)
> +delete_flows__(struct ofproto *ofproto, struct ofconn *ofconn,
> + const struct ofp_header *request, struct list *rules)
> {
> - struct ofproto *ofproto = ofconn_get_ofproto(ofconn);
> struct rule *rule, *next;
> struct ofopgroup *group;
>
> - group = ofopgroup_create_for_ofconn(ofconn, request, UINT32_MAX);
> + group = ofopgroup_create(ofproto, ofconn, request, UINT32_MAX);
> LIST_FOR_EACH_SAFE (rule, next, ofproto_node, rules) {
> ofproto_rule_send_removed(rule, OFPRR_DELETE);
>
> @@ -2372,34 +2372,35 @@ delete_flows__(struct ofconn *ofconn, const struct ofp_header *request,
>
> /* Implements OFPFC_DELETE. */
> static int
> -delete_flows_loose(struct ofconn *ofconn, const struct ofputil_flow_mod *fm,
> +delete_flows_loose(struct ofproto *ofproto, struct ofconn *ofconn,
> + const struct ofputil_flow_mod *fm,
> const struct ofp_header *request)
> {
> - struct ofproto *p = ofconn_get_ofproto(ofconn);
> struct list rules;
> int error;
>
> - error = collect_rules_loose(p, fm->table_id, &fm->cr, fm->out_port,
> + error = collect_rules_loose(ofproto, fm->table_id, &fm->cr, fm->out_port,
> &rules);
> return (error ? error
> - : !list_is_empty(&rules) ? delete_flows__(ofconn, request, &rules)
> + : !list_is_empty(&rules) ? delete_flows__(ofproto, ofconn, request,
> + &rules)
> : 0);
> }
>
> /* Implements OFPFC_DELETE_STRICT. */
> static int
> -delete_flow_strict(struct ofconn *ofconn, struct ofputil_flow_mod *fm,
> +delete_flow_strict(struct ofproto *ofproto, struct ofconn *ofconn,
> + struct ofputil_flow_mod *fm,
> const struct ofp_header *request)
> {
> - struct ofproto *p = ofconn_get_ofproto(ofconn);
> struct list rules;
> int error;
>
> - error = collect_rules_strict(p, fm->table_id, &fm->cr, fm->out_port,
> + error = collect_rules_strict(ofproto, fm->table_id, &fm->cr, fm->out_port,
> &rules);
> return (error ? error
> - : list_is_singleton(&rules) ? delete_flows__(ofconn, request,
> - &rules)
> + : list_is_singleton(&rules) ? delete_flows__(ofproto, ofconn,
> + request, &rules)
> : 0);
> }
>
> @@ -2439,7 +2440,7 @@ ofproto_rule_expire(struct rule *rule, uint8_t reason)
>
> ofproto_rule_send_removed(rule, reason);
>
> - group = ofopgroup_create(ofproto);
> + group = ofopgroup_create_unattached(ofproto);
> ofoperation_create(group, rule, OFOPERATION_DELETE);
> classifier_remove(&ofproto->tables[rule->table_id], &rule->cr);
> rule->ofproto->ofproto_class->rule_destruct(rule);
> @@ -2482,16 +2483,16 @@ handle_flow_mod(struct ofconn *ofconn, const struct ofp_header *oh)
> return add_flow(ofproto, ofconn, &fm, oh);
>
> case OFPFC_MODIFY:
> - return modify_flows_loose(ofconn, &fm, oh);
> + return modify_flows_loose(ofproto, ofconn, &fm, oh);
>
> case OFPFC_MODIFY_STRICT:
> - return modify_flow_strict(ofconn, &fm, oh);
> + return modify_flow_strict(ofproto, ofconn, &fm, oh);
>
> case OFPFC_DELETE:
> - return delete_flows_loose(ofconn, &fm, oh);
> + return delete_flows_loose(ofproto, ofconn, &fm, oh);
>
> case OFPFC_DELETE_STRICT:
> - return delete_flow_strict(ofconn, &fm, oh);
> + return delete_flow_strict(ofproto, ofconn, &fm, oh);
>
> default:
> if (fm.command > 0xff) {
> @@ -2716,7 +2717,7 @@ handle_openflow(struct ofconn *ofconn, struct ofpbuf *ofp_msg)
> * The caller should add operations to the returned group with
> * ofoperation_create() and then submit it with ofopgroup_submit(). */
> static struct ofopgroup *
> -ofopgroup_create(struct ofproto *ofproto)
> +ofopgroup_create_unattached(struct ofproto *ofproto)
> {
> struct ofopgroup *group = xzalloc(sizeof *group);
> group->ofproto = ofproto;
> @@ -2726,26 +2727,33 @@ ofopgroup_create(struct ofproto *ofproto)
> return group;
> }
>
> -/* Creates and returns a new ofopgroup that is associated with 'ofconn'. If
> - * the ofopgroup eventually fails, then the error reply will include 'request'.
> - * If the ofopgroup eventually succeeds, then the packet with buffer id
> - * 'buffer_id' on 'ofconn' will be sent by 'ofconn''s ofproto.
> +/* Creates and returns a new ofopgroup for 'ofproto'.
> + *
> + * If 'ofconn' is NULL, the new ofopgroup is not associated with any OpenFlow
> + * connection. The 'request' and 'buffer_id' arguments are ignored.
> + *
> + * If 'ofconn' is nonnull, then the new ofopgroup is associated with 'ofconn'.
> + * If the ofopgroup eventually fails, then the error reply will include
> + * 'request'. If the ofopgroup eventually succeeds, then the packet with
> + * buffer id 'buffer_id' on 'ofconn' will be sent by 'ofconn''s ofproto.
> *
> * The caller should add operations to the returned group with
> * ofoperation_create() and then submit it with ofopgroup_submit(). */
> static struct ofopgroup *
> -ofopgroup_create_for_ofconn(struct ofconn *ofconn,
> - const struct ofp_header *request,
> - uint32_t buffer_id)
> +ofopgroup_create(struct ofproto *ofproto, struct ofconn *ofconn,
> + const struct ofp_header *request, uint32_t buffer_id)
> {
> - struct ofopgroup *group = ofopgroup_create(ofconn_get_ofproto(ofconn));
> - size_t request_len = ntohs(request->length);
> + struct ofopgroup *group = ofopgroup_create_unattached(ofproto);
> + if (ofconn) {
> + size_t request_len = ntohs(request->length);
>
> - ofconn_add_opgroup(ofconn, &group->ofconn_node);
> - group->ofconn = ofconn;
> - group->request = xmemdup(request, MIN(request_len, 64));
> - group->buffer_id = buffer_id;
> + assert(ofconn_get_ofproto(ofconn) == ofproto);
>
> + ofconn_add_opgroup(ofconn, &group->ofconn_node);
> + group->ofconn = ofconn;
> + group->request = xmemdup(request, MIN(request_len, 64));
> + group->buffer_id = buffer_id;
> + }
> return group;
> }
>
> --
> 1.7.4.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list