On Wed, 29 Jan 2014 12:05:49 +0900
Simon Horman <[email protected]> wrote:

> Prior to this patch the code serialises an OFPMatch as:
> 
>    "OFPMatch": {
>       "oxm_fields": {
>          "arp_op": 1,
>          ...
>       }
>    }
> 
> But the parser fails, complaining that "oxm_fields" is an unknown field name.
> 
> Resolve this by using the same JSON format as OF1.3:
> 
>    "OFPMatch": {
>       "length": 329,
>       "oxm_fields": [
>          {
>             "OXMTlv": {
>                "field": "in_port",
>                "mask": null,
>                "value": 84281096
>             }
>          },
>          ...
>       }
>    }
> 
> Signed-off-by: Simon Horman <[email protected]>
> ---
>  ryu/ofproto/ofproto_v1_4_parser.py | 27 +++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
> 
> diff --git a/ryu/ofproto/ofproto_v1_4_parser.py 
> b/ryu/ofproto/ofproto_v1_4_parser.py
> index 616e0f5..980f201 100644
> --- a/ryu/ofproto/ofproto_v1_4_parser.py
> +++ b/ryu/ofproto/ofproto_v1_4_parser.py
> @@ -478,6 +478,33 @@ class OFPMatch(StringifyMixin):
>      def stringify_attrs(self):
>          yield "oxm_fields", dict(self._fields2)
>  
> +    def to_jsondict(self):
> +        """
> +        Returns a dict expressing the flow match.
> +        """
> +        body = {"oxm_fields": [ofproto.oxm_to_jsondict(k, uv) for k, uv
> +                               in self._fields2],
> +                "length": self.length,
> +                "type": self.type}
> +        return {self.__class__.__name__: body}
> +
> +    @classmethod
> +    def from_jsondict(cls, dict_):
> +        """
> +        Returns an object which is generated from a dict.
> +
> +        Exception raises:
> +        KeyError -- Unknown match field is defined in dict
> +        """
> +        fields = [ofproto.oxm_from_jsondict(f) for f
> +                  in dict_['oxm_fields']]
> +        o = OFPMatch()
> +        # XXX old api compat
> +        # serialize and parse to fill OFPMatch.fields
> +        buf = bytearray()
> +        o.serialize(buf, 0)
> +        return OFPMatch.parser(str(buf), 0)

Looks like from_jsondict() is broken. fields is not used to create
OFPmatch object. Here's a fix. We can avoid calling parser since we
dropped the old API.

=
>From 36d15083685a342a7cff635ba3fb677a2d857bc8 Mon Sep 17 00:00:00 2001
From: FUJITA Tomonori <[email protected]>
Date: Wed, 29 Jan 2014 15:09:06 +0900
Subject: [PATCH] of14: fix OFPMatch from_jsondict method

Signed-off-by: FUJITA Tomonori <[email protected]>
---
 ryu/ofproto/ofproto_v1_4_parser.py | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_4_parser.py 
b/ryu/ofproto/ofproto_v1_4_parser.py
index c067bb3..4a4a0d8 100644
--- a/ryu/ofproto/ofproto_v1_4_parser.py
+++ b/ryu/ofproto/ofproto_v1_4_parser.py
@@ -738,12 +738,7 @@ class OFPMatch(StringifyMixin):
         """
         fields = [ofproto.oxm_from_jsondict(f) for f
                   in dict_['oxm_fields']]
-        o = OFPMatch()
-        # XXX old api compat
-        # serialize and parse to fill OFPMatch.fields
-        buf = bytearray()
-        o.serialize(buf, 0)
-        return OFPMatch.parser(str(buf), 0)
+        return OFPMatch(**dict(fields))
 
 
 class OFPPortDescPropUnknown(StringifyMixin):
-- 
1.8.3.4 (Apple Git-47)


------------------------------------------------------------------------------
WatchGuard Dimension instantly turns raw network data into actionable 
security intelligence. It gives you real-time visual feedback on key
security issues and trends.  Skip the complicated setup - simply import
a virtual appliance and go from zero to informed in seconds.
http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to