I think that we complete nx_match except for NXM_NX_COOKIE that I've
not tested. I might miss something though.

=
>From 6936a39d75809ef8c260c4b8fc224780ab4e1972 Mon Sep 17 00:00:00 2001
From: FUJITA Tomonori <[email protected]>
Date: Fri, 22 Jun 2012 14:40:42 +0900
Subject: [PATCH] nxm: add NXM_NX_REG

Signed-off-by: FUJITA Tomonori <[email protected]>
---
 ryu/ofproto/nx_match.py |  144 +++++++++++++++++++++++++++++------------------
 1 files changed, 90 insertions(+), 54 deletions(-)

diff --git a/ryu/ofproto/nx_match.py b/ryu/ofproto/nx_match.py
index 02fa000..12453c7 100644
--- a/ryu/ofproto/nx_match.py
+++ b/ryu/ofproto/nx_match.py
@@ -69,6 +69,8 @@ MF_PACK_STRING_MAC = '!6s'
 
 _MF_FIELDS = {}
 
+FLOW_N_REGS = 8  # ovs 1.5
+
 
 class Flow(object):
     def __init__(self):
@@ -93,6 +95,7 @@ class Flow(object):
         self.ipv6_dst = []
         self.nd_target = []
         self.nw_frag = 0
+        self.regs = [0] * FLOW_N_REGS
         self.ipv6_label = 0
 
 
@@ -112,6 +115,8 @@ class FlowWildcards(object):
         self.ipv6_dst_mask = []
         self.nd_target_mask = []
         self.nw_frag_mask = 0
+        self.regs_bits = 0
+        self.regs_mask = [0] * FLOW_N_REGS
         self.wildcards = FWW_ALL
 
 
@@ -275,6 +280,14 @@ class ClsRule(object):
     def set_nd_target(self, target):
         self.flow.nd_target = target
 
+    def set_reg(self, reg_idx, value):
+        self.set_reg_masked(reg_idx, value, 0)
+
+    def set_reg_masked(self, reg_idx, value, mask):
+        self.wc.regs_mask[reg_idx] = mask
+        self.flow.regs[reg_idx] = value
+        self.wc.regs_bits |= (1 << reg_idx)
+
     def flow_format(self):
         # Tunnel ID is only supported by NXM
         if self.wc.tun_id_mask != 0:
@@ -336,11 +349,12 @@ def mf_from_nxm_header(nxm_header):
         return None
     make = _MF_FIELDS.get(nxm_header)
     assert make is not None
-    return make()
+    return make(nxm_header)
 
 
 class MFField(object):
-    def __init__(self, pack_str):
+    def __init__(self, nxm_header, pack_str):
+        self.nxm_header = nxm_header
         self.pack_str = pack_str
         self.n_bytes = struct.calcsize(pack_str)
         self.n_bits = self.n_bytes * 8
@@ -380,8 +394,8 @@ class MFField(object):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_IN_PORT])
 class MFInPort(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE16)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE16)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.in_port)
@@ -391,8 +405,8 @@ class MFInPort(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_ETH_DST, ofproto_v1_0.NXM_OF_ETH_DST_W])
 class MFEthDst(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_MAC)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_MAC)
 
     def put(self, buf, offset, rule):
         if rule.wc.dl_dst_mask:
@@ -406,8 +420,8 @@ class MFEthDst(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_ETH_SRC, ofproto_v1_0.NXM_OF_ETH_SRC_W])
 class MFEthSrc(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_MAC)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_MAC)
 
     def put(self, buf, offset, rule):
         if rule.wc.dl_src_mask:
@@ -421,8 +435,8 @@ class MFEthSrc(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_ETH_TYPE])
 class MFEthType(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE16)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE16)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.dl_type)
@@ -433,8 +447,8 @@ class MFEthType(MFField):
                    ofproto_v1_0.NXM_OF_VLAN_TCI_W])
 class MFVlan(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE16)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE16)
 
     def put(self, buf, offset, rule):
         return self.putm(buf, offset, rule.flow.vlan_tci,
@@ -445,8 +459,8 @@ class MFVlan(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_IP_TOS])
 class MFIPDSCP(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_8)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_8)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset,
@@ -457,8 +471,8 @@ class MFIPDSCP(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_NX_TUN_ID, ofproto_v1_0.NXM_NX_TUN_ID_W])
 class MFTunId(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE64)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE64)
 
     def put(self, buf, offset, rule):
         return self.putm(buf, offset, rule.flow.tun_id, rule.wc.tun_id_mask)
@@ -468,8 +482,8 @@ class MFTunId(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_IP_SRC, ofproto_v1_0.NXM_OF_IP_SRC_W])
 class MFIPSrc(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE32)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE32)
 
     def put(self, buf, offset, rule):
         return self.putm(buf, offset, rule.flow.nw_src, rule.wc.nw_src_mask)
@@ -479,8 +493,8 @@ class MFIPSrc(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_IP_DST, ofproto_v1_0.NXM_OF_IP_DST_W])
 class MFIPDst(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE32)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE32)
 
     def put(self, buf, offset, rule):
         return self.putm(buf, offset, rule.flow.nw_dst, rule.wc.nw_dst_mask)
@@ -490,8 +504,8 @@ class MFIPDst(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_NX_IP_ECN])
 class MFIPECN(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_8)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_8)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset,
@@ -502,8 +516,8 @@ class MFIPECN(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_NX_IP_TTL])
 class MFIPTTL(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_8)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_8)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.nw_ttl)
@@ -513,8 +527,8 @@ class MFIPTTL(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_IP_PROTO])
 class MFIPProto(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_8)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_8)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.nw_proto)
@@ -525,8 +539,8 @@ class MFIPProto(MFField):
                    ofproto_v1_0.NXM_OF_UDP_SRC, ofproto_v1_0.NXM_OF_UDP_SRC_W])
 class MFTPSRC(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE16)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE16)
 
     def put(self, buf, offset, rule):
         return self.putm(buf, offset, rule.flow.tp_src, rule.wc.tp_src_mask)
@@ -536,8 +550,8 @@ class MFTPSRC(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_ARP_SPA, ofproto_v1_0.NXM_OF_ARP_SPA_W])
 class MFArpSpa(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE32)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE32)
 
     def put(self, buf, offset, rule):
         return self.putm(buf, offset, rule.flow.arp_spa, rule.wc.arp_spa_mask)
@@ -547,8 +561,8 @@ class MFArpSpa(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_ARP_TPA, ofproto_v1_0.NXM_OF_ARP_TPA_W])
 class MFArpTpa(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE32)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE32)
 
     def put(self, buf, offset, rule):
         return self.putm(buf, offset, rule.flow.arp_tpa, rule.wc.arp_tpa_mask)
@@ -558,8 +572,8 @@ class MFArpTpa(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_NX_ARP_SHA])
 class MFArpSha(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_MAC)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_MAC)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.arp_sha)
@@ -570,8 +584,8 @@ class MFArpSha(MFField):
                    ofproto_v1_0.NXM_NX_IPV6_SRC_W])
 class MFIPV6Src(MFField):
     @classmethod
-    def make(cls):
-        return cls('!4I')
+    def make(cls, header):
+        return cls(header, '!4I')
 
     def put(self, buf, offset, rule):
         return self.putv6(buf, offset,
@@ -584,8 +598,8 @@ class MFIPV6Src(MFField):
                    ofproto_v1_0.NXM_NX_IPV6_DST_W])
 class MFIPV6Dst(MFField):
     @classmethod
-    def make(cls):
-        return cls('!4I')
+    def make(cls, header):
+        return cls(header, '!4I')
 
     def put(self, buf, offset, rule):
         return self.putv6(buf, offset,
@@ -598,8 +612,8 @@ class MFIPV6Dst(MFField):
                    ofproto_v1_0.NXM_NX_ND_TARGET_W])
 class MFNdTarget(MFField):
     @classmethod
-    def make(cls):
-        return cls('!4I')
+    def make(cls, header):
+        return cls(header, '!4I')
 
     def put(self, buf, offset, rule):
         return self.putv6(buf, offset,
@@ -612,8 +626,8 @@ class MFNdTarget(MFField):
                    ofproto_v1_0.NXM_NX_IP_FRAG_W])
 class MFIpFrag(MFField):
     @classmethod
-    def make(cls):
-        return cls('!B')
+    def make(cls, header):
+        return cls(header, '!B')
 
     def put(self, buf, offset, rule):
         if rule.wc.nw_frag_mask == FLOW_NW_FRAG_MASK:
@@ -627,8 +641,8 @@ class MFIpFrag(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_NX_ARP_THA])
 class MFArpTha(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_MAC)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_MAC)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.arp_tha)
@@ -638,8 +652,8 @@ class MFArpTha(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_ICMP_TYPE])
 class MFICMPType(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_8)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_8)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.tp_src)
@@ -649,8 +663,8 @@ class MFICMPType(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_OF_ICMP_CODE])
 class MFICMPCode(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_8)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_8)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.tp_dst)
@@ -660,8 +674,8 @@ class MFICMPCode(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_NX_ICMPV6_TYPE])
 class MFICMPV6Type(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_8)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_8)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.tp_src)
@@ -671,8 +685,8 @@ class MFICMPV6Type(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_NX_ICMPV6_CODE])
 class MFICMPV6Code(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_8)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_8)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.tp_dst)
@@ -682,13 +696,30 @@ class MFICMPV6Code(MFField):
 @_set_nxm_headers([ofproto_v1_0.NXM_NX_IPV6_LABEL])
 class MFICMPV6Label(MFField):
     @classmethod
-    def make(cls):
-        return cls(MF_PACK_STRING_BE32)
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE32)
 
     def put(self, buf, offset, rule):
         return self._put(buf, offset, rule.flow.ipv6_label)
 
 
+@_register_make
+@_set_nxm_headers([ofproto_v1_0.nxm_nx_reg(i) for i in range(FLOW_N_REGS)])
+class MFRegister(MFField):
+    @classmethod
+    def make(cls, header):
+        return cls(header, MF_PACK_STRING_BE32)
+
+    def put(self, buf, offset, rule):
+        for i in range(FLOW_N_REGS):
+            if ofproto_v1_0.nxm_nx_reg(i) == self.nxm_header:
+                if rule.wc.regs_mask[i]:
+                    return self.putm(buf, offset, rule.flow.regs[i],
+                                     rule.wc.regs_mask[i])
+                else:
+                    return self._put(buf, offset, rule.flow.regs[i])
+
+
 def serialize_nxm_match(rule, buf, offset):
     old_offset = offset
 
@@ -856,6 +887,11 @@ def serialize_nxm_match(rule, buf, offset):
 
     # XXX: Cookie
 
+    for i in range(FLOW_N_REGS):
+        if rule.wc.regs_bits & (1 << i):
+            header = ofproto_v1_0.nxm_nx_reg(i)
+            offset += nxm_put(buf, offset, header, rule)
+
     # Pad
     pad_len = round_up(offset) - offset
     ofproto_parser.msg_pack_into("%dx" % pad_len, buf, offset)
-- 
1.7.4.4


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to