summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-06-10 09:37:06 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-06-12 11:33:39 +0900
commit370d8d2b2f26bc233cf1050b8ca07732bbbe08f0 (patch)
tree9fcca348549d87ffe243b72e3608af5bf431ff61
parenta566ae916e5d7ac3ee4ee67823f0f90f470653f7 (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.py59
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: