summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSimon Horman <horms@verge.net.au>2012-03-13 09:06:13 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-03-13 21:41:25 -0700
commit85fe60abe04493e4dd70f619eeedbf9a52ba3a1e (patch)
tree9bf3c98d53b5cebc8ba5e5339557ec2c6ad65468
parent0f8c795c997352886608d17a965068fc597ec507 (diff)
Add support for NXT_SET_FLOW_FORMAT
This message may be used to request that the NXM flow format may be used. NXM is used as the match in NX vendor extension messages such as NXT_FLOW_MOD. Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/controller/controller.py16
-rw-r--r--ryu/ofproto/ofproto_v1_0.py12
-rw-r--r--ryu/ofproto/ofproto_v1_0_parser.py12
3 files changed, 40 insertions, 0 deletions
diff --git a/ryu/controller/controller.py b/ryu/controller/controller.py
index 860db850..3c5dc47a 100644
--- a/ryu/controller/controller.py
+++ b/ryu/controller/controller.py
@@ -98,6 +98,7 @@ class Datapath(object):
self.xid = random.randint(0, self.ofproto.MAX_XID)
self.id = None # datapath_id is unknown yet
self.ports = None
+ self.flow_format = ofproto_v1_0.NXFF_OPENFLOW10
def close(self):
"""
@@ -228,6 +229,21 @@ class Datapath(object):
barrier_request = self.ofproto_parser.OFPBarrierRequest(self)
self.send_msg(barrier_request)
+ def send_nxt_set_flow_format(self, format):
+ assert (format == ofproto_v1_0.NXFF_OPENFLOW10 or
+ format == ofproto_v1_0.NXFF_NXM)
+ if self.flow_format == format:
+ # Nothing to do
+ return
+ self.flow_format = format
+ set_format = self.ofproto_parser.NXTSetFlowFormat(self, format)
+ # FIXME: If NXT_SET_FLOW_FORMAT or NXFF_NXM is not supported by
+ # the switch then an error message will be received. It may be
+ # handled by setting self.flow_format to
+ # ofproto_v1_0.NXFF_OPENFLOW10 but currently isn't.
+ self.send_msg(set_format)
+ self.send_barrier()
+
def datapath_connection_factory(socket, address):
LOG.debug('connected socket:%s address:%s', socket, address)
diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py
index 1143fa0e..a06cdf89 100644
--- a/ryu/ofproto/ofproto_v1_0.py
+++ b/ryu/ofproto/ofproto_v1_0.py
@@ -485,7 +485,19 @@ assert (calcsize(OFP_QUEUE_PROP_MIN_RATE_PACK_STR) +
NX_VENDOR_ID = 0x00002320
+# enum nicira_type (abridged)
+NXT_SET_FLOW_FORMAT = 12
+
+# enum nx_flow_format
+NXFF_OPENFLOW10 = 0
+NXFF_NXM = 2
+
NICIRA_HEADER_PACK_STR = '!II'
NICIRA_HEADER_SIZE = 16
assert (calcsize(NICIRA_HEADER_PACK_STR) +
OFP_HEADER_SIZE == NICIRA_HEADER_SIZE)
+
+NX_SET_FLOW_FORMAT_PACK_STR = '!I'
+NX_SET_FLOW_FORMAT_SIZE = 20
+assert (calcsize(NX_SET_FLOW_FORMAT_PACK_STR) +
+ NICIRA_HEADER_SIZE == NX_SET_FLOW_FORMAT_SIZE)
diff --git a/ryu/ofproto/ofproto_v1_0_parser.py b/ryu/ofproto/ofproto_v1_0_parser.py
index a0ee2118..22ed26be 100644
--- a/ryu/ofproto/ofproto_v1_0_parser.py
+++ b/ryu/ofproto/ofproto_v1_0_parser.py
@@ -661,6 +661,18 @@ class NXTRequest(OFPVendor):
self.vendor, self.subtype)
+class NXTSetFlowFormat(NXTRequest):
+ def __init__(self, datapath, format):
+ super(NXTSetFlowFormat, self).__init__(datapath)
+ self.subtype = ofproto_v1_0.NXT_SET_FLOW_FORMAT
+ self.format = format
+
+ def _serialize_body(self):
+ self.serialize_header()
+ msg_pack_into(ofproto_v1_0.NX_SET_FLOW_FORMAT_PACK_STR,
+ self.buf, ofproto_v1_0.NICIRA_HEADER_SIZE, self.format)
+
+
#
# asymmetric message (datapath -> controller)
# parser only