diff options
author | takahashi.minoru <takahashi.minoru7@gmail.com> | 2014-07-08 15:00:51 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2014-07-17 15:04:35 +0900 |
commit | 78786a47c6f54a73f515bc439a9eeba24894a3f8 (patch) | |
tree | 3485497b0ed30be182c6a5da7a041065cb46dc3a | |
parent | 39c0fc00f9169e056b4e25af923d127d61b0aa3c (diff) |
ofctl_rest: support Port Modification Message
this patch makes ofctl_rest enable use of Port Modification Message.
usage)
URI: /stats/portdesc/modify
method: POST
the message body is as follows:
dpid
port_no (default:0)
config (default:0)
hw_addr (default:automatic-setting)
mask (default:0)
advertise (default:automatic-setting)
e.g. )
curl -X POST -d '{"dpid": 1,
"port_no": 1,
"mask": 0b0000001,
"config": 0b0000001}' http://localhost:8080/stats/portdesc/modify
Signed-off-by: TAKAHASHI Minoru <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/app/ofctl_rest.py | 49 | ||||
-rw-r--r-- | ryu/lib/ofctl_v1_0.py | 13 | ||||
-rw-r--r-- | ryu/lib/ofctl_v1_2.py | 13 | ||||
-rw-r--r-- | ryu/lib/ofctl_v1_3.py | 13 |
4 files changed, 88 insertions, 0 deletions
diff --git a/ryu/app/ofctl_rest.py b/ryu/app/ofctl_rest.py index 51c1eefd..ac857c0e 100644 --- a/ryu/app/ofctl_rest.py +++ b/ryu/app/ofctl_rest.py @@ -101,6 +101,9 @@ LOG = logging.getLogger('ryu.app.ofctl_rest') # delete a group entry # POST /stats/groupentry/delete # +# modify behavior of the physical port +# POST /stats/portdesc/modify +# # # send a experimeter message # POST /stats/experimenter/<dpid> @@ -380,6 +383,47 @@ class StatsController(ControllerBase): return Response(status=200) + def mod_port_behavior(self, req, cmd, **_kwargs): + try: + port_config = eval(req.body) + except SyntaxError: + LOG.debug('invalid syntax %s', req.body) + return Response(status=400) + + dpid = port_config.get('dpid') + + port_no = int(port_config.get('port_no', 0)) + port_info = self.dpset.port_state[int(dpid)].get(port_no) + + if 'hw_addr' not in port_config: + if port_info is not None: + port_config['hw_addr'] = port_info.hw_addr + else: + return Response(status=404) + + if 'advertise' not in port_config: + if port_info is not None: + port_config['advertise'] = port_info.advertised + else: + return Response(status=404) + + dp = self.dpset.get(int(dpid)) + if dp is None: + return Response(status=404) + + if cmd != 'modify': + return Response(status=404) + + if dp.ofproto.OFP_VERSION == ofproto_v1_0.OFP_VERSION: + ofctl_v1_0.mod_port_behavior(dp, port_config) + elif dp.ofproto.OFP_VERSION == ofproto_v1_2.OFP_VERSION: + ofctl_v1_2.mod_port_behavior(dp, port_config) + elif dp.ofproto.OFP_VERSION == ofproto_v1_3.OFP_VERSION: + ofctl_v1_3.mod_port_behavior(dp, port_config) + else: + LOG.debug('Unsupported OF protocol') + return Response(status=501) + def send_experimenter(self, req, dpid, **_kwargs): dp = self.dpset.get(int(dpid)) if dp is None: @@ -493,6 +537,11 @@ class RestStatsApi(app_manager.RyuApp): controller=StatsController, action='mod_group_entry', conditions=dict(method=['POST'])) + uri = path + '/portdesc/{cmd}' + mapper.connect('stats', uri, + controller=StatsController, action='mod_port_behavior', + conditions=dict(method=['POST'])) + uri = path + '/experimenter/{dpid}' mapper.connect('stats', uri, controller=StatsController, action='send_experimenter', diff --git a/ryu/lib/ofctl_v1_0.py b/ryu/lib/ofctl_v1_0.py index ea317f7a..729e7db6 100644 --- a/ryu/lib/ofctl_v1_0.py +++ b/ryu/lib/ofctl_v1_0.py @@ -308,3 +308,16 @@ def delete_flow_entry(dp): command=dp.ofproto.OFPFC_DELETE) dp.send_msg(flow_mod) + + +def mod_port_behavior(dp, port_config): + port_no = int(port_config.get('port_no', 0)) + hw_addr = port_config.get('hw_addr') + config = int(port_config.get('config', 0)) + mask = int(port_config.get('mask', 0)) + advertise = int(port_config.get('advertise')) + + port_mod = dp.ofproto_parser.OFPPortMod( + dp, port_no, hw_addr, config, mask, advertise) + + dp.send_msg(port_mod) diff --git a/ryu/lib/ofctl_v1_2.py b/ryu/lib/ofctl_v1_2.py index 41f0b939..61d35ad5 100644 --- a/ryu/lib/ofctl_v1_2.py +++ b/ryu/lib/ofctl_v1_2.py @@ -822,6 +822,19 @@ def mod_group_entry(dp, group, cmd): dp.send_msg(group_mod) +def mod_port_behavior(dp, port_config): + port_no = int(port_config.get('port_no', 0)) + hw_addr = port_config.get('hw_addr') + config = int(port_config.get('config', 0)) + mask = int(port_config.get('mask', 0)) + advertise = int(port_config.get('advertise')) + + port_mod = dp.ofproto_parser.OFPPortMod( + dp, port_no, hw_addr, config, mask, advertise) + + dp.send_msg(port_mod) + + def send_experimenter(dp, exp): experimenter = exp.get('experimenter', 0) exp_type = exp.get('exp_type', 0) diff --git a/ryu/lib/ofctl_v1_3.py b/ryu/lib/ofctl_v1_3.py index dda1090b..87b77a88 100644 --- a/ryu/lib/ofctl_v1_3.py +++ b/ryu/lib/ofctl_v1_3.py @@ -993,6 +993,19 @@ def mod_group_entry(dp, group, cmd): dp.send_msg(group_mod) +def mod_port_behavior(dp, port_config): + port_no = int(port_config.get('port_no', 0)) + hw_addr = port_config.get('hw_addr') + config = int(port_config.get('config', 0)) + mask = int(port_config.get('mask', 0)) + advertise = int(port_config.get('advertise')) + + port_mod = dp.ofproto_parser.OFPPortMod( + dp, port_no, hw_addr, config, mask, advertise) + + dp.send_msg(port_mod) + + def send_experimenter(dp, exp): experimenter = exp.get('experimenter', 0) exp_type = exp.get('exp_type', 0) |