X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flearn.c;h=8727a5539c2b0900922cb4a964c010925af687a7;hb=6d308b28c023e864925b1a6775b3b91d215e89bf;hp=49d9efdba653dbae320793d6d7d3de252e8694ce;hpb=2334285719dffc1f193a2fdf0e5f7f54062348da;p=sliver-openvswitch.git diff --git a/lib/learn.c b/lib/learn.c index 49d9efdba..8727a5539 100644 --- a/lib/learn.c +++ b/lib/learn.c @@ -97,12 +97,23 @@ learn_from_openflow(const struct nx_action_learn *nal, struct ofpbuf *ofpacts) learn->hard_timeout = ntohs(nal->hard_timeout); learn->priority = ntohs(nal->priority); learn->cookie = ntohll(nal->cookie); - learn->flags = ntohs(nal->flags); learn->table_id = nal->table_id; learn->fin_idle_timeout = ntohs(nal->fin_idle_timeout); learn->fin_hard_timeout = ntohs(nal->fin_hard_timeout); - if (learn->flags & ~OFPFF_SEND_FLOW_REM || learn->table_id == 0xff) { + /* We only support "send-flow-removed" for now. */ + switch (ntohs(nal->flags)) { + case 0: + learn->flags = 0; + break; + case OFPFF_SEND_FLOW_REM: + learn->flags = OFPUTIL_FF_SEND_FLOW_REM; + break; + default: + return OFPERR_OFPBAC_BAD_ARGUMENT; + } + + if (learn->table_id == 0xff) { return OFPERR_OFPBAC_BAD_ARGUMENT; } @@ -116,7 +127,7 @@ learn_from_openflow(const struct nx_action_learn *nal, struct ofpbuf *ofpacts) } spec = ofpbuf_put_zeros(ofpacts, sizeof *spec); - learn = ofpacts->l2; + learn = ofpacts->frame; learn->n_specs++; spec->src_type = header & NX_LEARN_SRC_MASK; @@ -244,7 +255,7 @@ learn_to_nxast(const struct ofpact_learn *learn, struct ofpbuf *openflow) struct nx_action_learn *nal; size_t start_ofs; - start_ofs = openflow->size; + start_ofs = ofpbuf_size(openflow); nal = ofputil_put_NXAST_LEARN(openflow); nal->idle_timeout = htons(learn->idle_timeout); nal->hard_timeout = htons(learn->hard_timeout); @@ -276,12 +287,12 @@ learn_to_nxast(const struct ofpact_learn *learn, struct ofpbuf *openflow) } } - if ((openflow->size - start_ofs) % 8) { - ofpbuf_put_zeros(openflow, 8 - (openflow->size - start_ofs) % 8); + if ((ofpbuf_size(openflow) - start_ofs) % 8) { + ofpbuf_put_zeros(openflow, 8 - (ofpbuf_size(openflow) - start_ofs) % 8); } nal = ofpbuf_at_assert(openflow, start_ofs, sizeof *nal); - nal->len = htons(openflow->size - start_ofs); + nal->len = htons(ofpbuf_size(openflow) - start_ofs); } /* Composes 'fm' so that executing it will implement 'learn' given that the @@ -303,7 +314,7 @@ learn_execute(const struct ofpact_learn *learn, const struct flow *flow, fm->cookie = htonll(0); fm->cookie_mask = htonll(0); fm->new_cookie = htonll(learn->cookie); - fm->modify_cookie = fm->new_cookie != htonll(UINT64_MAX); + fm->modify_cookie = fm->new_cookie != OVS_BE64_MAX; fm->table_id = learn->table_id; fm->command = OFPFC_MODIFY_STRICT; fm->idle_timeout = learn->idle_timeout; @@ -371,8 +382,8 @@ learn_execute(const struct ofpact_learn *learn, const struct flow *flow, } ofpact_pad(ofpacts); - fm->ofpacts = ofpacts->data; - fm->ofpacts_len = ofpacts->size; + fm->ofpacts = ofpbuf_data(ofpacts); + fm->ofpacts_len = ofpbuf_size(ofpacts); } /* Perform a bitwise-OR on 'wc''s fields that are relevant as sources in @@ -574,7 +585,7 @@ learn_parse__(char *orig, char *arg, struct ofpbuf *ofpacts) char *error; spec = ofpbuf_put_zeros(ofpacts, sizeof *spec); - learn = ofpacts->l2; + learn = ofpacts->frame; learn->n_specs++; error = learn_parse_spec(orig, name, value, spec);