old api:
    OFPActionSetField(MTInPort(OXM_OF_IN_PORT, 1))

new api:
    OFPActionSetField("in_port", 1)

Signed-off-by: YAMAMOTO Takashi <[email protected]>
---
 ryu/ofproto/ofproto_v1_2_parser.py | 155 +++++++++++++++++++++++++++++--------
 1 file changed, 122 insertions(+), 33 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_2_parser.py 
b/ryu/ofproto/ofproto_v1_2_parser.py
index a9bd0b1..6c12031 100644
--- a/ryu/ofproto/ofproto_v1_2_parser.py
+++ b/ryu/ofproto/ofproto_v1_2_parser.py
@@ -50,6 +50,39 @@ def msg_parser(datapath, version, msg_type, msg_len, xid, 
buf):
     return parser(datapath, version, msg_type, msg_len, xid, buf)
 
 
+def oxm_tlv_parse(buf, offset):
+    hdr_pack_str = '!I'
+    (header, ) = struct.unpack_from(hdr_pack_str, buf, offset)
+    hdr_len = struct.calcsize(hdr_pack_str)
+    oxm_type = header >> 9  # class|field
+    oxm_hasmask = ofproto_v1_2.oxm_tlv_header_extract_hasmask(header)
+    value_len = ofproto_v1_2.oxm_tlv_header_extract_length(header)
+    value_pack_str = '!%ds' % value_len
+    assert struct.calcsize(value_pack_str) == value_len
+    (value, ) = struct.unpack_from(value_pack_str, buf,
+                                   offset + hdr_len)
+    if oxm_hasmask:
+        (mask, ) = struct.unpack_from(value_pack_str, buf,
+                                      offset + hdr_len + value_len)
+    else:
+        mask = None
+    field_len = hdr_len + (header & 0xff)
+    return oxm_type, value, mask, field_len
+
+
+def oxm_tlv_serialize(n, value, mask, buf, offset):
+    if mask:
+        assert len(value) == len(mask)
+        pack_str = "!I%ds%ds" % (len(value), len(mask))
+        msg_pack_into(pack_str, buf, offset,
+                      (n << 9) | (1 << 8) | (len(value) * 2), value, mask)
+    else:
+        pack_str = "!I%ds" % (len(value),)
+        msg_pack_into(pack_str, buf, offset,
+                      (n << 9) | (0 << 8) | len(value), value)
+    return struct.calcsize(pack_str)
+
+
 @_register_parser
 @_set_msg_type(ofproto_v1_2.OFPT_HELLO)
 class OFPHello(MsgBase):
@@ -794,19 +827,51 @@ class OFPActionPopMpls(OFPAction):
 @OFPAction.register_action_type(ofproto_v1_2.OFPAT_SET_FIELD,
                                 ofproto_v1_2.OFP_ACTION_SET_FIELD_SIZE)
 class OFPActionSetField(OFPAction):
-    def __init__(self, field):
+    def __init__(self, field=None, value=None, key=None):
+        # old api
+        #   OFPActionSetField(field)
+        # new api
+        #   OFPActionSetField("eth_src", "00:00:00:00:00")
         super(OFPActionSetField, self).__init__()
-        self.field = field
+        if isinstance(field, OFPMatchField):
+            # old api compat
+            assert value is None
+            self.field = field
+        else:
+            if key is None:
+                key = field
+            assert isinstance(key, (str, unicode))
+            assert not isinstance(value, tuple)  # no mask
+            self.key = key
+            self.value = value
 
     @classmethod
     def parser(cls, buf, offset):
         (type_, len_) = struct.unpack_from('!HH', buf, offset)
-        field = OFPMatchField.parser(buf, offset + 4)
-        action = cls(field)
+        (n, value, mask, _len) = oxm_tlv_parse(buf, offset + 4)
+        k, uv = ofproto_v1_2.oxm_to_user(n, value, mask)
+        action = cls(k, uv)
         action.len = len_
+
+        # old api compat
+        action.field = OFPMatchField.parser(buf, offset + 4)
+
         return action
 
     def serialize(self, buf, offset):
+        # old api compat
+        if self._composed_with_old_api():
+            return self.serialize_old(buf, offset)
+
+        n, value, mask = ofproto_v1_2.oxm_from_user(self.key, self.value)
+        len_ = oxm_tlv_serialize(n, value, mask, buf, offset + 4)
+        self.len = utils.round_up(4 + len_, 8)
+        msg_pack_into('!HH', buf, offset, self.type, self.len)
+        pad_len = self.len - len_
+        ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset + 4 + len_)
+
+    # XXX old api compat
+    def serialize_old(self, buf, offset):
         len_ = ofproto_v1_2.OFP_ACTION_SET_FIELD_SIZE + self.field.oxm_len()
         self.len = utils.round_up(len_, 8)
         pad_len = self.len - len_
@@ -816,6 +881,55 @@ class OFPActionSetField(OFPAction):
         offset += len_
         ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset)
 
+    # XXX old api compat
+    def _composed_with_old_api(self):
+        return not hasattr(self, 'value')
+
+    def to_jsondict(self):
+        # XXX old api compat
+        if self._composed_with_old_api():
+            # copy object first because serialize_old is destructive
+            o2 = OFPActionSetField(self.field)
+            # serialize and parse to fill new fields
+            buf = bytearray()
+            o2.serialize(buf, 0)
+            o = OFPActionSetField.parser(str(buf), 0)
+        else:
+            o = self
+        return super(OFPActionSetField, o).to_jsondict(lambda x: x)
+
+    @classmethod
+    def from_jsondict(cls, dict_):
+        # XXX old api compat
+        o = super(OFPActionSetField, cls).from_jsondict(dict_, lambda x: x)
+
+        # XXX old api compat
+        # serialize and parse to fill old attributes
+        buf = bytearray()
+        o.serialize(buf, 0)
+        return OFPActionSetField.parser(str(buf), 0)
+
+    # XXX old api compat
+    def __str__(self):
+        # XXX old api compat
+        if self._composed_with_old_api():
+            # copy object first because serialize_old is destructive
+            o2 = OFPActionSetField(self.field)
+            # serialize and parse to fill new fields
+            buf = bytearray()
+            o2.serialize(buf, 0)
+            o = OFPActionSetField.parser(str(buf), 0)
+        else:
+            o = self
+        return super(OFPActionSetField, o).__str__()
+
+    __repr__ = __str__
+
+    # XXX old api compat
+    def stringify_attrs(self):
+        yield "key", self.key
+        yield "value", self.value
+
 
 @OFPAction.register_action_type(
     ofproto_v1_2.OFPAT_EXPERIMENTER,
@@ -1700,18 +1814,8 @@ class OFPMatch(StringifyMixin):
         hdr_pack_str = '!HH'
         field_offset = offset + struct.calcsize(hdr_pack_str)
         for (n, value, mask) in fields:
-            if mask:
-                assert len(value) == len(mask)
-                pack_str = "!I%ds%ds" % (len(value), len(mask))
-                msg_pack_into(pack_str, buf, field_offset,
-                              (n << 9) | (1 << 8) | (len(value) * 2),
-                              value, mask)
-            else:
-                pack_str = "!I%ds" % (len(value),)
-                msg_pack_into(pack_str, buf, field_offset,
-                              (n << 9) | (0 << 8) | len(value),
-                              value)
-            field_offset += struct.calcsize(pack_str)
+            field_offset += oxm_tlv_serialize(n, value, mask, buf,
+                                              field_offset)
 
         length = field_offset - offset
         msg_pack_into(hdr_pack_str, buf, offset,
@@ -1939,24 +2043,9 @@ class OFPMatch(StringifyMixin):
 
         fields = {}
         while length > 0:
-            hdr_pack_str = '!I'
-            (header, ) = struct.unpack_from(hdr_pack_str, buf, offset)
-            hdr_len = struct.calcsize(hdr_pack_str)
-            oxm_type = header >> 9  # class|field
-            oxm_hasmask = ofproto_v1_2.oxm_tlv_header_extract_hasmask(header)
-            value_len = ofproto_v1_2.oxm_tlv_header_extract_length(header)
-            value_pack_str = '!%ds' % value_len
-            assert struct.calcsize(value_pack_str) == value_len
-            (value, ) = struct.unpack_from(value_pack_str, buf,
-                                           offset + hdr_len)
-            if oxm_hasmask:
-                (mask, ) = struct.unpack_from(value_pack_str, buf,
-                                              offset + hdr_len + value_len)
-            else:
-                mask = None
-            k, uv = ofproto_v1_2.oxm_to_user(oxm_type, value, mask)
+            n, value, mask, field_len = oxm_tlv_parse(buf, offset)
+            k, uv = ofproto_v1_2.oxm_to_user(n, value, mask)
             fields[k] = uv
-            field_len = hdr_len + (header & 0xff)
             offset += field_len
             length -= field_len
         match._fields2 = fields
-- 
1.8.1.5


------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to