blob: 820a6571a7cb75e0a31d2395939ac90ec29b165f [file] [log] [blame]
/*
* Copyright 2020-present Open Networking Foundation
*
* 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.
*/
package org.onosproject.drivers.server;
import org.onlab.packet.VlanId;
import org.onosproject.drivers.server.devices.RestServerSBDevice;
import org.onosproject.drivers.server.devices.nic.NicDevice;
import org.onosproject.drivers.server.devices.nic.NicRxFilter.RxFilter;
import org.onosproject.net.DeviceId;
import org.onosproject.net.behaviour.InterfaceConfig;
import org.onosproject.net.behaviour.PatchDescription;
import org.onosproject.net.behaviour.TunnelDescription;
import org.onosproject.net.device.DefaultDeviceInterfaceDescription;
import org.onosproject.net.device.DeviceInterfaceDescription;
import org.slf4j.Logger;
import com.google.common.collect.Lists;
import com.google.common.collect.ImmutableList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.onosproject.drivers.server.Constants.MSG_DEVICE_ID_NULL;
import static org.onosproject.drivers.server.Constants.MSG_DEVICE_NULL;
import static org.onosproject.net.device.DeviceInterfaceDescription.Mode;
import static org.slf4j.LoggerFactory.getLogger;
/**
* Implementation of interface config behaviour for server devices.
*/
public class ServerInterfaceConfig
extends BasicServerDriver
implements InterfaceConfig {
private final Logger log = getLogger(getClass());
private static final boolean RATE_LIMIT_STATUS = false;
private static final short NO_LIMIT = -1;
public ServerInterfaceConfig() {
super();
log.debug("Started");
}
@Override
public boolean addTunnelMode(String ifaceName, TunnelDescription tunnelDesc) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean removeTunnelMode(String ifaceName) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean addAccessMode(String ifaceName, VlanId vlanId) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean removeAccessMode(String ifaceName) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean addPatchMode(String ifaceName, PatchDescription patchDesc) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean removePatchMode(String ifaceName) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean addTrunkMode(String ifaceName, List<VlanId> vlanIds) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean removeTrunkMode(String ifaceName) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean addRateLimit(String ifaceName, short limit) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public boolean removeRateLimit(String ifaceName) {
throw new UnsupportedOperationException("Interface operation not supported");
}
@Override
public List<DeviceInterfaceDescription> getInterfaces() {
// Retrieve the device ID
DeviceId deviceId = getDeviceId();
checkNotNull(deviceId, MSG_DEVICE_ID_NULL);
// .. and the device itself
RestServerSBDevice device = null;
try {
device = (RestServerSBDevice) getDevice(deviceId);
} catch (ClassCastException ccEx) {
log.error("Failed to get interfaces for device {}", deviceId);
return Collections.EMPTY_LIST;
}
if (device == null) {
log.error("No device with ID {} is available for interface discovery", deviceId);
return Collections.EMPTY_LIST;
}
if ((device.nics() == null) || (device.nics().size() == 0)) {
log.error("No interfaces available on {}", deviceId);
return Collections.EMPTY_LIST;
}
// List of port descriptions to return
List<DeviceInterfaceDescription> intfDescriptions = Lists.newArrayList();
// Sorted list of NIC ports
Set<NicDevice> nics = new TreeSet(device.nics());
// Iterate through the NICs of this device to populate the list
for (NicDevice nic : nics) {
List<VlanId> devVlanIds = getVlanIdListForDevice(nic);
Mode devMode = getDeviceMode(devVlanIds);
// Create an interface description and add it to the list
intfDescriptions.add(
new DefaultDeviceInterfaceDescription(
nic.name(), devMode, devVlanIds, RATE_LIMIT_STATUS, NO_LIMIT));
}
return ImmutableList.copyOf(intfDescriptions);
}
/**
* Returns a list of VLAN IDs associated with a NIC device.
*
* @param nic the NIC device to be queried
* @return a list of VLAN IDs (if any)
*/
private List<VlanId> getVlanIdListForDevice(NicDevice nic) {
checkNotNull(nic, MSG_DEVICE_NULL);
List<VlanId> vlanIds = Lists.newArrayList();
short vlanIdValue = 0;
for (RxFilter rxFilter : nic.rxFilterMechanisms().rxFilters()) {
if (rxFilter == RxFilter.VLAN) {
vlanIds.add(VlanId.vlanId(vlanIdValue++));
}
}
return ImmutableList.copyOf(vlanIds);
}
/**
* Returns the interface mode of a NIC device, by looking at its VLAN IDs.
*
* @param vlanIds a list of VLAN IDs associated with the device
* @return interface mode
*/
private Mode getDeviceMode(List<VlanId> vlanIds) {
if (vlanIds.size() == 1) {
return Mode.ACCESS;
} else if (vlanIds.size() > 1) {
return Mode.TRUNK;
}
return Mode.NORMAL;
}
}