diff options
-rw-r--r-- | ryu/ofproto/ofproto_v1_2_parser.py | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/ryu/ofproto/ofproto_v1_2_parser.py b/ryu/ofproto/ofproto_v1_2_parser.py index 4c04e5ea..43ad0de5 100644 --- a/ryu/ofproto/ofproto_v1_2_parser.py +++ b/ryu/ofproto/ofproto_v1_2_parser.py @@ -1862,10 +1862,20 @@ class OFPMatchField(object): (header,) = struct.unpack_from('!I', buf, offset) # TODO: handle unknown field cls_ = OFPMatchField._FIELDS_HEADERS.get(header) - field = cls_.parser(header, buf, offset) + field = cls_.field_parser(header, buf, offset) field.length = (header & 0xff) + 4 return field + @classmethod + def field_parser(cls, header, buf, offset): + hasmask = (header >> 8) & 1 + if hasmask: + pack_str = '!' + cls.pack_str[1:] * 2 + (value, mask) = struct.unpack_from(pack_str, buf, offset + 4) + else: + (value,) = struct.unpack_from(cls.pack_str, buf, offset + 4) + return cls(header) + def _put_header(self, buf, offset): ofproto_parser.msg_pack_into('!I', buf, offset, self.header) self.length += 4 |