mirror of
https://github.com/faucetsdn/ryu.git
synced 2026-05-09 14:26:10 +02:00
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:
parent
45e37843b9
commit
2889711e46
@ -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
1798
ryu/ofproto/ofproto_v1_5.py
Normal file
File diff suppressed because it is too large
Load Diff
6083
ryu/ofproto/ofproto_v1_5_parser.py
Normal file
6083
ryu/ofproto/ofproto_v1_5_parser.py
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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,
|
||||
]))
|
||||
|
||||
@ -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),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user