ofproto: Openflow 1.5 support (work-in-progress)

Work done:
- The baseline is copied over from ofproto_v1_4.py and
  ofproto_v1_4_parser.py and into ofproto_v1_5.py and
  ofproto_v1_5_parser.py respectively.
- Most of structs, enums, and pack strings in ofproto_v1_5.py has been
  updated to spec. Exception is oxs_fields has not been done yet.
- ofproto_v1_5_parser.py has not been updated except those necessary to
  allow run_tests.sh to complete successfully
- ofproto_protocol.py imports ofproto_v1_5 and ofproto_v1_5_parser now
- oxm_fields.py is updated for OFPXMC_PACKET_REGS
- Tests are updated to include Openflow v1.5 when it's obvious. But not
  much work has been done to acutally test v1.5 yet. I also found tests
  for v1.4 are scarce.

TODO:
- Add oxs_fields support. It shall be similar to oxm_fields
- Update and implement ofproto_v1_5_parser.py
- More tests, tests, tests.

Signed-off-by: Shu Shen <shu.shen@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
Shu Shen 2015-02-11 16:22:20 -08:00 committed by FUJITA Tomonori
parent 45e37843b9
commit 2889711e46
7 changed files with 7932 additions and 3 deletions

View File

@ -22,6 +22,8 @@ from . import ofproto_v1_3
from . import ofproto_v1_3_parser
from . import ofproto_v1_4
from . import ofproto_v1_4_parser
from . import ofproto_v1_5
from . import ofproto_v1_5_parser
_versions = {
@ -29,6 +31,7 @@ _versions = {
ofproto_v1_2.OFP_VERSION: (ofproto_v1_2, ofproto_v1_2_parser),
ofproto_v1_3.OFP_VERSION: (ofproto_v1_3, ofproto_v1_3_parser),
ofproto_v1_4.OFP_VERSION: (ofproto_v1_4, ofproto_v1_4_parser),
ofproto_v1_5.OFP_VERSION: (ofproto_v1_5, ofproto_v1_5_parser),
}

1798
ryu/ofproto/ofproto_v1_5.py Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -70,6 +70,7 @@ from ryu.lib import type_desc
OFPXMC_NXM_0 = 0 # Nicira Extended Match (NXM_OF_)
OFPXMC_NXM_1 = 1 # Nicira Extended Match (NXM_NX_)
OFPXMC_OPENFLOW_BASIC = 0x8000
OFPXMC_PACKET_REGS = 0x8001
OFPXMC_EXPERIMENTER = 0xffff
@ -87,6 +88,10 @@ class OpenFlowBasic(_OxmClass):
_class = OFPXMC_OPENFLOW_BASIC
class PacketRegs(_OxmClass):
_class = OFPXMC_PACKET_REGS
class _Experimenter(_OxmClass):
_class = OFPXMC_EXPERIMENTER

View File

@ -51,6 +51,7 @@ from ryu.ofproto import ofproto_protocol
from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import ofproto_v1_3_parser
from ryu.ofproto import ofproto_v1_4
from ryu.ofproto import ofproto_v1_5
""" Required test network:
@ -287,13 +288,15 @@ class OfTester(app_manager.RyuApp):
def __get_version(opt):
vers = {
'openflow13': ofproto_v1_3.OFP_VERSION,
'openflow14': ofproto_v1_4.OFP_VERSION
'openflow14': ofproto_v1_4.OFP_VERSION,
'openflow15': ofproto_v1_5.OFP_VERSION
}
ver = vers.get(opt.lower())
if ver is None:
self.logger.error(
'%s is not supported. '
'Supported versions are openflow13 and openflow14.',
'Supported versions are openflow13, '
'openflow14 and openflow15.',
opt)
self._test_end()
return ver
@ -360,7 +363,8 @@ class OfTester(app_manager.RyuApp):
def _register_sw(self, dp):
vers = {
ofproto_v1_3.OFP_VERSION: 'openflow13',
ofproto_v1_4.OFP_VERSION: 'openflow14'
ofproto_v1_4.OFP_VERSION: 'openflow14',
ofproto_v1_5.OFP_VERSION: 'openflow15'
}
if dp.id == self.target_dpid:
if dp.ofproto.OFP_VERSION != OfTester.target_ver:

View File

@ -45,16 +45,19 @@ class TestOfprotCommon(unittest.TestCase):
import ryu.ofproto.ofproto_v1_2
import ryu.ofproto.ofproto_v1_3
import ryu.ofproto.ofproto_v1_4
import ryu.ofproto.ofproto_v1_5
eq_(set(ofp_modules.keys()), set([ryu.ofproto.ofproto_v1_0.OFP_VERSION,
ryu.ofproto.ofproto_v1_2.OFP_VERSION,
ryu.ofproto.ofproto_v1_3.OFP_VERSION,
ryu.ofproto.ofproto_v1_4.OFP_VERSION,
ryu.ofproto.ofproto_v1_5.OFP_VERSION,
]))
consts_mods = set([ofp_mod[0] for ofp_mod in ofp_modules.values()])
eq_(consts_mods, set([ryu.ofproto.ofproto_v1_0,
ryu.ofproto.ofproto_v1_2,
ryu.ofproto.ofproto_v1_3,
ryu.ofproto.ofproto_v1_4,
ryu.ofproto.ofproto_v1_5,
]))
parser_mods = set([ofp_mod[1] for ofp_mod in ofp_modules.values()])
@ -62,8 +65,10 @@ class TestOfprotCommon(unittest.TestCase):
import ryu.ofproto.ofproto_v1_2_parser
import ryu.ofproto.ofproto_v1_3_parser
import ryu.ofproto.ofproto_v1_4_parser
import ryu.ofproto.ofproto_v1_5_parser
eq_(parser_mods, set([ryu.ofproto.ofproto_v1_0_parser,
ryu.ofproto.ofproto_v1_2_parser,
ryu.ofproto.ofproto_v1_3_parser,
ryu.ofproto.ofproto_v1_4_parser,
ryu.ofproto.ofproto_v1_5_parser,
]))

View File

@ -26,6 +26,7 @@ from ryu.ofproto import ofproto_v1_0
from ryu.ofproto import ofproto_v1_2
from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import ofproto_v1_4
from ryu.ofproto import ofproto_v1_5
import json
@ -117,6 +118,36 @@ implemented = {
ofproto_v1_4.OFPT_BUNDLE_CONTROL: (False, True),
ofproto_v1_4.OFPT_BUNDLE_ADD_MESSAGE: (False, True),
},
6: {
ofproto_v1_5.OFPT_HELLO: (True, False),
ofproto_v1_5.OFPT_FEATURES_REQUEST: (False, True),
ofproto_v1_5.OFPT_FEATURES_REPLY: (True, False),
ofproto_v1_5.OFPT_GET_CONFIG_REQUEST: (False, True),
ofproto_v1_5.OFPT_GET_CONFIG_REPLY: (True, False),
ofproto_v1_5.OFPT_SET_CONFIG: (False, True),
ofproto_v1_5.OFPT_PACKET_IN: (True, False),
ofproto_v1_5.OFPT_FLOW_REMOVED: (True, False),
ofproto_v1_5.OFPT_PORT_STATUS: (True, False),
ofproto_v1_5.OFPT_PACKET_OUT: (False, True),
ofproto_v1_5.OFPT_FLOW_MOD: (False, True),
ofproto_v1_5.OFPT_GROUP_MOD: (False, True),
ofproto_v1_5.OFPT_PORT_MOD: (False, True),
ofproto_v1_5.OFPT_METER_MOD: (False, True),
ofproto_v1_5.OFPT_TABLE_MOD: (False, True),
ofproto_v1_5.OFPT_MULTIPART_REQUEST: (False, True),
ofproto_v1_5.OFPT_MULTIPART_REPLY: (True, False),
ofproto_v1_5.OFPT_BARRIER_REQUEST: (False, True),
ofproto_v1_5.OFPT_ROLE_REQUEST: (False, True),
ofproto_v1_5.OFPT_ROLE_REPLY: (True, False),
ofproto_v1_5.OFPT_GET_ASYNC_REQUEST: (False, True),
ofproto_v1_5.OFPT_GET_ASYNC_REPLY: (True, False),
ofproto_v1_5.OFPT_SET_ASYNC: (False, True),
ofproto_v1_5.OFPT_ROLE_STATUS: (True, False),
ofproto_v1_5.OFPT_TABLE_STATUS: (True, False),
ofproto_v1_5.OFPT_REQUESTFORWARD: (False, True),
ofproto_v1_5.OFPT_BUNDLE_CONTROL: (False, True),
ofproto_v1_5.OFPT_BUNDLE_ADD_MESSAGE: (False, True),
},
}