diff options
author | Simon Horman <horms@verge.net.au> | 2012-03-13 09:06:13 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-03-13 21:41:25 -0700 |
commit | 85fe60abe04493e4dd70f619eeedbf9a52ba3a1e (patch) | |
tree | 9bf3c98d53b5cebc8ba5e5339557ec2c6ad65468 | |
parent | 0f8c795c997352886608d17a965068fc597ec507 (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.py | 16 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_0.py | 12 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_0_parser.py | 12 |
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 |