2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-30 22:05: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
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 *om;
struct ofp11_match_header *omh = buf->data;
uint16_t match_len;
if (buf->size < sizeof(struct ofp11_match_header)) {
if (buf->size < sizeof *omh) {
return OFPERR_OFPBMC_BAD_LEN;
}
omh = buf->data;
match_len = ntohs(omh->length);
switch (ntohs(omh->type)) {
case OFPMT_STANDARD:
if (omh->length != htons(sizeof *om) || buf->size < sizeof *om) {
case OFPMT_STANDARD: {
struct ofp11_match *om;
if (match_len != sizeof *om || buf->size < sizeof *om) {
return OFPERR_OFPBMC_BAD_LEN;
}
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);
}
case OFPMT_OXM:
if (padded_match_len) {
*padded_match_len = ROUND_UP(match_len, 8);
}
return oxm_pull_match(buf, priority, rule);
default:
return OFPERR_OFPBMC_BAD_TYPE;
@@ -1137,7 +1150,8 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm,
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) {
return error;
}