neutron/neutron/plugins/ml2/drivers/mech_sriov/agent/pci_lib.py

111 lines
3.5 KiB
Python

# Copyright 2014 Mellanox Technologies, Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import enum
from oslo_log import log as logging
from neutron.agent.linux import ip_lib
LOG = logging.getLogger(__name__)
class LinkState(enum.Enum):
auto = 0
enable = 1
disable = 2
class PciDeviceIPWrapper(ip_lib.IPWrapper):
"""Wrapper class for ip link commands related to virtual functions."""
def __init__(self, dev_name):
super(PciDeviceIPWrapper, self).__init__()
self.dev_name = dev_name
def get_assigned_macs(self, vf_list):
"""Get assigned mac addresses for vf list.
@param vf_list: list of vf indexes
@return: dict mapping of vf to mac
"""
ip = self.device(self.dev_name)
vfs = ip.link.get_vfs()
vf_to_mac_mapping = {}
for vf_num in vf_list:
if vfs.get(vf_num):
vf_to_mac_mapping[vf_num] = vfs[vf_num]['mac']
return vf_to_mac_mapping
def get_vf_state(self, vf_index):
"""Get vf state {enable/disable/auto}
@param vf_index: vf index
"""
ip = self.device(self.dev_name)
vfs = ip.link.get_vfs()
vf = vfs.get(vf_index)
if vf:
return LinkState(int(vf['link_state'])).name
return LinkState.disable.name
def set_vf_state(self, vf_index, state, auto=False):
"""sets vf state.
@param vf_index: vf index
@param state: required state {True: enable (1)
False: disable (2)}
@param auto: set link_state to auto (0)
"""
ip = self.device(self.dev_name)
if auto:
link_state = 0
else:
link_state = 1 if state else 2
vf_config = {'vf': vf_index, 'link_state': link_state}
ip.link.set_vf_feature(vf_config)
def set_vf_spoofcheck(self, vf_index, enabled):
"""sets vf spoofcheck
@param vf_index: vf index
@param enabled: True to enable (1) spoof checking,
False to disable (0)
"""
ip = self.device(self.dev_name)
vf_config = {'vf': vf_index, 'spoofchk': int(enabled)}
ip.link.set_vf_feature(vf_config)
def set_vf_rate(self, vf_index, rate_type, rate_value):
"""sets vf rate.
@param vf_index: vf index
@param rate_type: vf rate type ('max_tx_rate', 'min_tx_rate')
@param rate_value: vf rate in Mbps
"""
ip = self.device(self.dev_name)
vf_config = {'vf': vf_index, 'rate': {rate_type: int(rate_value)}}
try:
ip.link.set_vf_feature(vf_config)
except ip_lib.InvalidArgument:
# NOTE(ralonsoh): some NICs do not support "min_tx_rate" parameter.
# https://bugs.launchpad.net/neutron/+bug/1918464
LOG.error('Device %(device)s does not support ip-link vf '
'"%(rate_type)s" parameter.',
{'device': self.dev_name, 'rate_type': rate_type})