diff options
Diffstat (limited to 'vswitches')
-rw-r--r-- | vswitches/ovs_dpdk_vhost.py | 50 | ||||
-rw-r--r-- | vswitches/ovs_vanilla.py | 49 | ||||
-rw-r--r-- | vswitches/vswitch.py | 28 |
3 files changed, 114 insertions, 13 deletions
diff --git a/vswitches/ovs_dpdk_vhost.py b/vswitches/ovs_dpdk_vhost.py index 2c7b81ff..074e15f8 100644 --- a/vswitches/ovs_dpdk_vhost.py +++ b/vswitches/ovs_dpdk_vhost.py @@ -1,4 +1,4 @@ -# Copyright 2015 Intel Corporation. +# Copyright 2015-2016 Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ from vswitches.vswitch import IVSwitch from src.ovs import VSwitchd, OFBridge from src.dpdk import dpdk -_VSWITCHD_CONST_ARGS = ['--', '--log-file'] +_VSWITCHD_CONST_ARGS = ['--', '--pidfile', '--log-file'] class OvsDpdkVhost(IVSwitch): """VSwitch implementation using DPDK and vhost ports @@ -77,7 +77,7 @@ class OvsDpdkVhost(IVSwitch): 'datapath_type=netdev']) else: bridge.create(['--', 'set', 'bridge', switch_name, - 'datapath_type=netdev'] + params) + 'datapath_type=netdev'] + params) bridge.set_db_attribute('Open_vSwitch', '.', 'other_config:max-idle', @@ -106,7 +106,7 @@ class OvsDpdkVhost(IVSwitch): The new port is named dpdk<n> where n is an integer starting from 0. """ bridge = self._bridges[switch_name] - dpdk_count = self._get_port_count(bridge, 'type=dpdk') + dpdk_count = self._get_port_count('type=dpdk') port_name = 'dpdk' + str(dpdk_count) params = ['--', 'set', 'Interface', port_name, 'type=dpdk'] of_port = bridge.add_port(port_name, params) @@ -123,11 +123,11 @@ class OvsDpdkVhost(IVSwitch): bridge = self._bridges[switch_name] # Changed dpdkvhost to dpdkvhostuser to be able to run in Qemu 2.2 if settings.getValue('VNF').endswith('Cuse'): - vhost_count = self._get_port_count(bridge, 'type=dpdkvhostcuse') + vhost_count = self._get_port_count('type=dpdkvhostcuse') port_name = 'dpdkvhostcuse' + str(vhost_count) params = ['--', 'set', 'Interface', port_name, 'type=dpdkvhostcuse'] else: - vhost_count = self._get_port_count(bridge, 'type=dpdkvhostuser') + vhost_count = self._get_port_count('type=dpdkvhostuser') port_name = 'dpdkvhostuser' + str(vhost_count) params = ['--', 'set', 'Interface', port_name, 'type=dpdkvhostuser'] @@ -135,6 +135,17 @@ class OvsDpdkVhost(IVSwitch): return (port_name, of_port) + def add_tunnel_port(self, switch_name, remote_ip, tunnel_type='vxlan'): + """Creates tunneling port + """ + bridge = self._bridges[switch_name] + pcount = str(self._get_port_count('type=' + tunnel_type)) + port_name = tunnel_type + pcount + params = ['--', 'set', 'Interface', port_name, 'type=' + tunnel_type, + 'options:remote_ip=' + remote_ip] + of_port = bridge.add_port(port_name, params) + return (port_name, of_port) + def get_ports(self, switch_name): """See IVswitch for general description """ @@ -167,14 +178,31 @@ class OvsDpdkVhost(IVSwitch): bridge = self._bridges[switch_name] bridge.dump_flows() - @staticmethod - def _get_port_count(bridge, param): + def add_route(self, switch_name, network, destination): + """See IVswitch for general description + """ + bridge = self._bridges[switch_name] + bridge.add_route(network, destination) + + def set_tunnel_arp(self, ip_addr, mac_addr, switch_name): + """See IVswitch for general description + """ + bridge = self._bridges[switch_name] + bridge.set_tunnel_arp(ip_addr, mac_addr, switch_name) + + def _get_port_count(self, param): """Returns the number of ports having a certain parameter :param bridge: The src.ovs.ofctl.OFBridge on which to operate :param param: The parameter to search for :returns: Count of matches """ - port_params = [c for (_, (_, c)) in list(bridge.get_ports().items())] - param_hits = [i for i in port_params if param in i] - return len(param_hits) + cnt = 0 + for k in self._bridges: + pparams = [c for (_, (_, c)) in list(self._bridges[k].get_ports().items())] + phits = [i for i in pparams if param in i] + cnt += len(phits) + + if cnt is None: + cnt = 0 + return cnt diff --git a/vswitches/ovs_vanilla.py b/vswitches/ovs_vanilla.py index 3078de02..77d3deaf 100644 --- a/vswitches/ovs_vanilla.py +++ b/vswitches/ovs_vanilla.py @@ -1,4 +1,4 @@ -# Copyright 2015 Intel Corporation. +# Copyright 2015-2016 Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -150,6 +150,22 @@ class OvsVanilla(IVSwitch): of_port = bridge.add_port(tap_name, []) return (tap_name, of_port) + def add_tunnel_port(self, switch_name, remote_ip, tunnel_type='vxlan', + params=None): + """Creates tunneling port + """ + bridge = self._bridges[switch_name] + pcount = str(self._get_port_count('type=' + tunnel_type)) + port_name = tunnel_type + pcount + local_params = ['--', 'set', 'Interface', port_name, + 'type=' + tunnel_type, + 'options:remote_ip=' + remote_ip] + + if params is not None: + local_params = local_params + params + + of_port = bridge.add_port(port_name, local_params) + return (port_name, of_port) def get_ports(self, switch_name): """See IVswitch for general description @@ -182,3 +198,34 @@ class OvsVanilla(IVSwitch): """ bridge = self._bridges[switch_name] bridge.dump_flows() + + def add_route(self, switch_name, network, destination): + """See IVswitch for general description + """ + bridge = self._bridges[switch_name] + bridge.add_route(network, destination) + + def set_tunnel_arp(self, ip_addr, mac_addr, switch_name): + """See IVswitch for general description + """ + bridge = self._bridges[switch_name] + bridge.set_tunnel_arp(ip_addr, mac_addr, switch_name) + + def _get_port_count(self, param): + """Returns the number of ports having a certain parameter + + :param bridge: The src.ovs.ofctl.OFBridge on which to operate + :param param: The parameter to search for + :returns: Count of matches + """ + cnt = 0 + for k in self._bridges: + pparams = [c for (_, (_, c)) in list(self._bridges[k].get_ports().items())] + phits = [i for i in pparams if param in i] + cnt += len(phits) + + if cnt is None: + cnt = 0 + return cnt + + diff --git a/vswitches/vswitch.py b/vswitches/vswitch.py index a28c0f6b..73e0a0c3 100644 --- a/vswitches/vswitch.py +++ b/vswitches/vswitch.py @@ -1,4 +1,4 @@ -# Copyright 2015 Intel Corporation. +# Copyright 2015-2016 Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -71,6 +71,14 @@ class IVSwitch(object): """ raise NotImplementedError() + def add_tunnel_port(self, switch_name, remote_ip, tunnel_type, params=None): + """Create a new port to the logical switch for tunneling + + :param switch_name: The switch where the port is attached to + :returns: (port name, OpenFlow port number) + """ + raise NotImplementedError() + def get_ports(self, switch_name): """Return a list of tuples describing the ports of the logical switch @@ -128,3 +136,21 @@ class IVSwitch(object): :param switch_name: The switch on which to operate """ raise NotImplementedError() + + def add_route(self, switch_name, network, destination): + """Add a route for tunneling routing table + + :param switch_name: The switch on which to operate + :param network: Target destination network + :param destination: Gateway IP + """ + raise NotImplementedError() + + def set_tunnel_arp(self, ip_addr, mac_addr, switch_name): + """Add arp entry for tunneling + + :param ip_addr: IP of bridge + :param mac_addr: MAC address of the bridge + :param switch_name: Name of the bridge + """ + raise NotImplementedError() |