2
0
mirror of https://github.com/openvswitch/ovs synced 2025-09-03 15:55:19 +00:00

ofp-util: ofputil_pull_ofp11_match: Allow OXM match

* Allow OXM matches which specified in OpenFlow 1.2.
  Also allow them for OpenFlow 1.1 as there seems little reason not to.

* Pass padded_match_len parameter which if on NULL will be set to
  the padded match len. This will be used when decoding flow statistics
  response messages.

Signed-off-by: Simon Horman <horms@verge.net.au>
Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Simon Horman
2012-08-08 06:49:36 +09:00
committed by Ben Pfaff
parent a78b6a9e19
commit 36a16881d0
2 changed files with 24 additions and 9 deletions

View File

@@ -267,23 +267,36 @@ ofputil_cls_rule_to_ofp10_match(const struct cls_rule *rule,
enum ofperr enum ofperr
ofputil_pull_ofp11_match(struct ofpbuf *buf, unsigned int priority, ofputil_pull_ofp11_match(struct ofpbuf *buf, unsigned int priority,
struct cls_rule *rule) struct cls_rule *rule, uint16_t *padded_match_len)
{ {
struct ofp11_match_header *omh; struct ofp11_match_header *omh = buf->data;
struct ofp11_match *om; uint16_t match_len;
if (buf->size < sizeof(struct ofp11_match_header)) { if (buf->size < sizeof *omh) {
return OFPERR_OFPBMC_BAD_LEN; return OFPERR_OFPBMC_BAD_LEN;
} }
omh = buf->data; match_len = ntohs(omh->length);
switch (ntohs(omh->type)) { switch (ntohs(omh->type)) {
case OFPMT_STANDARD: case OFPMT_STANDARD: {
if (omh->length != htons(sizeof *om) || buf->size < sizeof *om) { struct ofp11_match *om;
if (match_len != sizeof *om || buf->size < sizeof *om) {
return OFPERR_OFPBMC_BAD_LEN; return OFPERR_OFPBMC_BAD_LEN;
} }
om = ofpbuf_pull(buf, sizeof *om); om = ofpbuf_pull(buf, sizeof *om);
if (padded_match_len) {
*padded_match_len = match_len;
}
return ofputil_cls_rule_from_ofp11_match(om, priority, rule); return ofputil_cls_rule_from_ofp11_match(om, priority, rule);
}
case OFPMT_OXM:
if (padded_match_len) {
*padded_match_len = ROUND_UP(match_len, 8);
}
return oxm_pull_match(buf, priority, rule);
default: default:
return OFPERR_OFPBMC_BAD_TYPE; return OFPERR_OFPBMC_BAD_TYPE;
@@ -1137,7 +1150,8 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm,
ofm = ofpbuf_pull(&b, sizeof *ofm); ofm = ofpbuf_pull(&b, sizeof *ofm);
error = ofputil_pull_ofp11_match(&b, ntohs(ofm->priority), &fm->cr); error = ofputil_pull_ofp11_match(&b, ntohs(ofm->priority), &fm->cr,
NULL);
if (error) { if (error) {
return error; return error;
} }

View File

@@ -120,7 +120,8 @@ void ofputil_cls_rule_to_ofp10_match(const struct cls_rule *,
/* Work with ofp11_match. */ /* Work with ofp11_match. */
enum ofperr ofputil_pull_ofp11_match(struct ofpbuf *, unsigned int priority, enum ofperr ofputil_pull_ofp11_match(struct ofpbuf *, unsigned int priority,
struct cls_rule *); struct cls_rule *,
uint16_t *padded_match_len);
enum ofperr ofputil_cls_rule_from_ofp11_match(const struct ofp11_match *, enum ofperr ofputil_cls_rule_from_ofp11_match(const struct ofp11_match *,
unsigned int priority, unsigned int priority,
struct cls_rule *); struct cls_rule *);