Hi Fujita-san,

On Fri, Jun 22, 2012 at 02:44:20PM +0900, FUJITA Tomonori wrote:
> I think that we complete nx_match except for NXM_NX_COOKIE that I've
> not tested. I might miss something though.

It may be worth considering splitting out adding the header parameter
to the initialiser of MFField into a separate patch. I think that would
make the NXM_NX_REG changes more obvious.

> =
> >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)

Should the last parameter to set_reg_masked() be UINT32_MAX?

> +
> +    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
> 

------------------------------------------------------------------------------
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