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
# Maps a name prefix into an (experimenter ID, class) pair, so:
#
# - Standard OXM classes are written as (0, <oxm_class>)
#
# - Experimenter OXM classes are written as (<oxm_vender>, 0xffff)
#
# If a name matches more than one prefix, the longest one is used.
OXM_CLASSES = {"NXM_OF_": (0, 0x0000),
"NXM_NX_": (0, 0x0001),
"NXOXM_NSH_": (0x005ad650, 0xffff),
"OXM_OF_": (0, 0x8000),
"OXM_OF_PKT_REG": (0, 0x8001),
"ONFOXM_ET_": (0x4f4e4600, 0xffff),
"OXM_TRH_": (0x144b0350, 0xffff),
<------------------------ Here is my class definition
The following is my match field definition
/* "trh_nextuid".
*
* The twenty-four bits h-VNF UID and the eight bits flags fields.
*
* Type: be32.
* Maskable: bitwise.
* Formatting: hexadecimal.
* Prerequisites: IPv6.
* Access: read/write.
* NXM: none.
* OXM: OXM_TRH_NEXTUID(45) since OF1.2 and v2.8.
*/
Now I am trying to modify Ryu so that I can utilize it in a controller
application with the following line
"match = ofp_parser.OFPMatch(trh_nextuid=0x9f8e7dab,
eth_type=ETH_TYPE_IPV6)"
Here is what I have done so far in Ryu
diff --git a/ryu/ofproto/ofproto_common.py b/ryu/ofproto/ofproto_common.py
index ffdf1a4..b91fd21 100644
--- a/ryu/ofproto/ofproto_common.py
+++ b/ryu/ofproto/ofproto_common.py
@@ -33,5 +33,6 @@
# https://rs.opennetworking.org/wiki/display/PUBLIC/ONF+Registry
NX_EXPERIMENTER_ID = 0x00002320 # Nicira
NX_NSH_EXPERIMENTER_ID = 0x005ad650 # Nicira Ext for Network Service
Header
BSN_EXPERIMENTER_ID = 0x005c16c7 # Big Switch Networks
ONF_EXPERIMENTER_ID = 0x4f4e4600 # OpenFlow Extensions for 1.3.X Pack 1
+TRH_EXPERIMENTER_ID = 0x144b0350 # TRF
\ No newline at end of file
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__)
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
@@ -693,10 +693,11 @@
self.mpls_tc = 0
self.mpls_bos = 0
self.pbb_isid = 0
self.tunnel_id = 0
self.ipv6_exthdr = 0
+ self.trh_nextuid = 0
class FlowWildcards(object):
def __init__(self):
self.metadata_mask = 0
@@ -713,10 +714,11 @@
self.ipv6_dst_mask = []
self.ipv6_flabel_mask = 0
self.pbb_isid_mask = 0
self.tunnel_id_mask = 0
self.ipv6_exthdr_mask = 0
+ self.trh_nextuid_mask = 0
self.wildcards = (1 << 64) - 1
def ft_set(self, shift):
self.wildcards &= ~(1 << shift)
@@ -783,10 +785,11 @@
(EXT-256 Old version of ONF Extension)
tcp_flags Integer 16bit TCP flags
(EXT-109 ONF Extension)
actset_output Integer 32bit Output port from action set metadata
(EXT-233 ONF Extension)
+ trh_nextuid Integer 32bit TRH Next h-VNF UID
================ =============== ==================================
Example::
>>> # compose
@@ -1029,10 +1032,11 @@
OXM_OF_MPLS_TC MPLS TC
OXM_OF_MPLS_BOS MPLS BoS bit
OXM_OF_PBB_ISID PBB I-SID
OXM_OF_TUNNEL_ID Logical Port Metadata
OXM_OF_IPV6_EXTHDR IPv6 Extension Header pseudo-field
+ OXM_OF_TRH_NEXTUID TRH Next h-VNF UID
====================== ===================================
"""
self.fields.append(OFPMatchField.make(header, value, mask))
def _composed_with_old_api(self):
@@ -1286,10 +1290,18 @@
else:
header = ofproto.OXM_OF_IPV6_EXTHDR
self.append_field(header, self._flow.ipv6_exthdr,
self._wc.ipv6_exthdr_mask)
+ if self._wc.ft_test(ofproto.OFPXMT_TRHBB_NEXTUID):
+ if self._wc.ipv6_flabel_mask == UINT32_MAX:
+ header = ofproto.OXM_TRH_NEXTUID
+ else:
+ header = ofproto.OXM_TRH_NEXTUID_W
+ self.append_field(header, self._flow.trh_nextuid,
+ self._wc.trh_nextuid_mask)
+
field_offset = offset + 4
for f in self.fields:
f.serialize(buf, field_offset)
field_offset += f.length
@@ -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):
"""
diff --git a/ryu/ofproto/oxm_fields.py b/ryu/ofproto/oxm_fields.py
index f978f5b..d5015cf 100644
--- a/ryu/ofproto/oxm_fields.py
+++ b/ryu/ofproto/oxm_fields.py
@@ -82,11 +82,11 @@
OFPXMC_NXM_0 = 0 # Nicira Extended Match (NXM_OF_)
OFPXMC_NXM_1 = 1 # Nicira Extended Match (NXM_NX_)
OFPXMC_OPENFLOW_BASIC = 0x8000
OFPXMC_PACKET_REGS = 0x8001
OFPXMC_EXPERIMENTER = 0xffff
-
+OFPXMC_TRH = 0xffff
class _OxmClass(object):
def __init__(self, name, num, type_):
self.name = name
self.oxm_field = num
@@ -97,24 +97,24 @@
self.type = type_
class OpenFlowBasic(_OxmClass):
_class = OFPXMC_OPENFLOW_BASIC
-
-
+
class PacketRegs(_OxmClass):
_class = OFPXMC_PACKET_REGS
-
class _Experimenter(_OxmClass):
_class = OFPXMC_EXPERIMENTER
def __init__(self, name, num, type_):
super(_Experimenter, self).__init__(name, num, type_)
self.num = (self.experimenter_id, self.oxm_type)
self.exp_type = self.oxm_field
+class Trh(_OxmClass):
+ _class = OFPXMC_TRH
class ONFExperimenter(_Experimenter):
experimenter_id = ofproto_common.ONF_EXPERIMENTER_ID
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'
For now, I am not interested in the REST API side of things; it would be
enough if I can use this match in the FLOW_MOD messages. I'd appreciate if
anyone could point me in the right direction.
Thanks,
Alan
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel