diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-06-10 09:37:06 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-06-12 11:33:39 +0900 |
commit | 370d8d2b2f26bc233cf1050b8ca07732bbbe08f0 (patch) | |
tree | 9fcca348549d87ffe243b72e3608af5bf431ff61 | |
parent | a566ae916e5d7ac3ee4ee67823f0f90f470653f7 (diff) |
nxm: add NXM_OF_IP_SRC and NXM_OF_IP_DST support
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Reviewed-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | ryu/ofproto/nx_match.py | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/ryu/ofproto/nx_match.py b/ryu/ofproto/nx_match.py index 97601189..e033a817 100644 --- a/ryu/ofproto/nx_match.py +++ b/ryu/ofproto/nx_match.py @@ -28,6 +28,7 @@ LOG = logging.getLogger('ryu.ofproto.nx_match') UINT64_MAX = (1 << 64) - 1 +UINT32_MAX = (1 << 32) - 1 UINT16_MAX = (1 << 16) - 1 FWW_IN_PORT = 1 << 0 @@ -52,6 +53,7 @@ IP_ECN_MASK = 0x03 IP_DSCP_MASK = 0xfc MF_PACK_STRING_BE64 = '!Q' +MF_PACK_STRING_BE32 = '!I' MF_PACK_STRING_BE16 = '!H' MF_PACK_STRING_8 = '!B' MF_PACK_STRING_MAC = '!6s' @@ -73,6 +75,8 @@ class Flow(object): self.nw_proto = 0 self.arp_sha = 0 self.arp_tha = 0 + self.nw_src = 0 + self.nw_dst = 0 class FlowWildcards(object): @@ -81,6 +85,8 @@ class FlowWildcards(object): self.dl_dst_mask = 0 self.tp_src_mask = 0 self.tp_dst_mask = 0 + self.nw_src_mask = 0 + self.nw_dst_mask = 0 self.tun_id_mask = 0 self.vlan_tci_mask = 0 self.wildcards = FWW_ALL @@ -143,6 +149,20 @@ class ClsRule(object): self.wc.wildcards &= ~FWW_NW_PROTO self.flow.nw_proto = nw_proto + def set_nw_src(self, nw_src): + self.set_nw_src_masked(nw_src, UINT32_MAX) + + def set_nw_src_masked(self, nw_src, mask): + self.flow.nw_src = nw_src + self.wc.nw_src_mask = mask + + def set_nw_dst(self, nw_dst): + self.set_nw_dst_masked(nw_dst, UINT32_MAX) + + def set_nw_dst_masked(self, nw_dst, mask): + self.flow.nw_dst = nw_dst + self.wc.nw_dst_mask = mask + def set_nw_dscp(self, nw_dscp): self.wc.wildcards &= ~FWW_NW_DSCP self.flow.nw_tos &= ~IP_DSCP_MASK @@ -351,6 +371,28 @@ class MFTunId(MFField): @_register_make +@_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 put(self, buf, offset, rule): + return self.putm(buf, offset, rule.flow.nw_src, rule.wc.nw_src_mask) + + +@_register_make +@_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 put(self, buf, offset, rule): + return self.putm(buf, offset, rule.flow.nw_dst, rule.wc.nw_dst_mask) + + +@_register_make @_set_nxm_headers([ofproto_v1_0.NXM_NX_IP_ECN]) class MFIPECN(MFField): @classmethod @@ -502,7 +544,22 @@ def serialize_nxm_match(rule, buf, offset): header = 0 if header != 0: offset += nxm_put(buf, offset, header, rule) - # XXX: IP Source and Destination + + # IP Source and Destination + if rule.flow.nw_src != 0: + if rule.wc.nw_src_mask == UINT32_MAX: + header = ofproto_v1_0.NXM_OF_IP_SRC + else: + header = ofproto_v1_0.NXM_OF_IP_SRC_W + offset += nxm_put(buf, offset, header, rule) + + if rule.flow.nw_dst != 0: + if rule.wc.nw_dst_mask == UINT32_MAX: + header = ofproto_v1_0.NXM_OF_IP_DST + else: + header = ofproto_v1_0.NXM_OF_IP_DST_W + offset += nxm_put(buf, offset, header, rule) + # XXX: IPv6 # ARP if not rule.wc.wildcards & FWW_ARP_SHA: |