Hi,
On Fri, 12 Oct 2018 06:29:33 +0900,
Alan Kayahan wrote:
>
> Hello,
>
> I have implemented a custom OXM match in OVS that works fine over
> OpenFlow13 when used in a rule installed via ovs-ofctl add-flow. The match
> definition in OVS looks as following
> diff --git a/ryu/ofproto/ofproto_v1_3.py b/ryu/ofproto/ofproto_v1_3.py
> index d599c1c..018bdad 100644
> --- a/ryu/ofproto/ofproto_v1_3.py
> +++ b/ryu/ofproto/ofproto_v1_3.py
> @@ -175,10 +175,11 @@
> # enum ofp_oxm_class
> OFPXMC_NXM_0 = 0x0000 # Backward compatibility with NXM
> OFPXMC_NXM_1 = 0x0001 # Backward compatibility with NXM
> OFPXMC_OPENFLOW_BASIC = 0x8000 # Basic class for OpenFlow
> OFPXMC_EXPERIMENTER = 0xFFFF # Experimenter class
> +OFPXMC_TRH = 0xFFFF # TRF
>
> # enum ofp_vlan_id
> OFPVID_PRESENT = 0x1000 # bit that indicate that a VLAN id is set.
> OFPVID_NONE = 0x0000 # No VLAN id was set.
>
> @@ -1227,10 +1228,12 @@
> # EXT-109 TCP flags match field Extension
> oxm_fields.ONFExperimenter('tcp_flags', 42, type_desc.Int2),
> # EXT-233 Output match Extension
> # NOTE(yamamoto): The spec says uint64_t but I assume it's an error.
> oxm_fields.ONFExperimenter('actset_output', 43, type_desc.Int4),
> + #TRH
> + oxm_fields.Trh('trh_nextuid', 45, type_desc.Int4),
> ] + nicira_ext.oxm_types
>
> oxm_fields.generate(__name__)
Please look at what oxm_fields.generate does.
> diff --git a/ryu/ofproto/ofproto_v1_3_parser.py
> b/ryu/ofproto/ofproto_v1_3_parser.py
> index 0324c82..41977e8 100644
> --- a/ryu/ofproto/ofproto_v1_3_parser.py
> +++ b/ryu/ofproto/ofproto_v1_3_parser.py
> @@ -2244,21 +2256,29 @@
> def __init__(self, header, value, mask=None):
> super(MTTunnelId, self).__init__(header)
> self.value = value
> self.mask = mask
>
> -
> @OFPMatchField.register_field_header([ofproto.OXM_OF_IPV6_EXTHDR,
> ofproto.OXM_OF_IPV6_EXTHDR_W])
> class MTIPv6ExtHdr(OFPMatchField):
> pack_str = '!H'
>
> def __init__(self, header, value, mask=None):
> super(MTIPv6ExtHdr, self).__init__(header)
> self.value = value
> self.mask = mask
>
> [email protected]_field_header([ofproto.OXM_TRH_NEXTUID,
> + ofproto.OXM_TRH_NEXTUID_W])
> +class MTTrhNextuid(OFPMatchField):
> + pack_str = '!I'
> +
> + def __init__(self, header, value, mask=None):
> + super(MTTrhNextuid, self).__init__(header)
> + self.value = value
> + self.mask = mask
>
> @_register_parser
> @_set_msg_type(ofproto.OFPT_PACKET_IN)
> class OFPPacketIn(MsgBase):
> """
> And the following is the error when I try to launch the controller app
>
> File
> "/root/.local/lib/python2.7/site-packages/ryu/ofproto/ofproto_protocol.py",
> line 22, in <module>
> from ryu.ofproto import ofproto_v1_3_parser
> File
> "/root/.local/lib/python2.7/site-packages/ryu/ofproto/ofproto_v1_3_parser.py",
> line 2271, in <module>
> @OFPMatchField.register_field_header([ofproto.OXM_TRH_NEXTUID,
> AttributeError: 'module' object has no attribute 'OXM_TRH_NEXTUID'
The error message has the answer. :)
Other header constants such as OXM_OF_IPV6_EXTHDR are genereted in
oxm_fields.generate. You can modify this to accomodate constant
generation, or more simply, you can just define the needed constants
as done for NXM_NX_* constants in nicira_ext.py.
--
IWAMOTO Toshihiro
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel