From 1c690387dcfe8730ca9c0d4fc5ea732b172ae249 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Tue, 12 Apr 2016 10:13:34 +0200 Subject: HONEYCOMB-9: Add InterfaceCustomizer for ietf-interfaces Add custom reader for if:/interfaces-state/if:interface with no augmentations for now. Change-Id: Icc0f403db204430f27ac96cf7b32e7800e11dacb Signed-off-by: Stefan Kobza Signed-off-by: Maros Marsalek --- .../v3po/interfacesstate/InterfaceUtils.java | 149 +++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/InterfaceUtils.java (limited to 'v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/InterfaceUtils.java') diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/InterfaceUtils.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/InterfaceUtils.java new file mode 100644 index 000000000..d589c257f --- /dev/null +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfacesstate/InterfaceUtils.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * + * 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 io.fd.honeycomb.v3po.translate.v3po.interfacesstate; + +import java.math.BigInteger; + +import javax.annotation.Nonnull; + +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Gauge64; + +import com.google.common.base.Preconditions; +import org.openvpp.vppjapi.vppApi; +import org.openvpp.vppjapi.vppInterfaceDetails; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InterfaceUtils { + private static final Logger LOG = LoggerFactory.getLogger(InterfaceUtils.class); + + private static final Gauge64 vppLinkSpeed0 = new Gauge64(BigInteger.ZERO); + private static final Gauge64 vppLinkSpeed1 = new Gauge64(BigInteger.valueOf(10 * 1000000)); + private static final Gauge64 vppLinkSpeed2 = new Gauge64(BigInteger.valueOf(100 * 1000000)); + private static final Gauge64 vppLinkSpeed4 = new Gauge64(BigInteger.valueOf(1000 * 1000000)); + private static final Gauge64 vppLinkSpeed8 = new Gauge64(BigInteger.valueOf(10000L * 1000000)); + private static final Gauge64 vppLinkSpeed16 = new Gauge64(BigInteger.valueOf(40000L * 1000000)); + private static final Gauge64 vppLinkSpeed32 = new Gauge64(BigInteger.valueOf(100000L * 1000000)); + + private static final char[] HEX_CHARS = "0123456789abcdef".toCharArray(); + + /** + * Convert VPP's link speed bitmask to Yang type. 1 = 10M, 2 = 100M, 4 = 1G, + * 8 = 10G, 16 = 40G, 32 = 100G + * + * @param vppLinkSpeed Link speed in bitmask format from VPP. + * @return Converted value from VPP link speed + */ + public static Gauge64 vppInterfaceSpeedToYang(byte vppLinkSpeed) { + switch (vppLinkSpeed) { + case 1: + return vppLinkSpeed1; + case 2: + return vppLinkSpeed2; + case 4: + return vppLinkSpeed4; + case 8: + return vppLinkSpeed8; + case 16: + return vppLinkSpeed16; + case 32: + return vppLinkSpeed32; + default: + return vppLinkSpeed0; + } + } + + private static final void appendHexByte(final StringBuilder sb, final byte b) { + final int v = b & 0xFF; + sb.append(HEX_CHARS[v >>> 4]); + sb.append(HEX_CHARS[v & 15]); + } + + /** + * Convert VPP's physical address stored byte array format to string as Yang + * dictates + *

+ * Replace later with + * https://git.opendaylight.org/gerrit/#/c/34869/10/model/ietf/ietf-type- + * util/src/main/ + * java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfYangUtil.java + * + * @param vppPhysAddress byte array of bytes constructing the network IF physical + * address. + * @return String like "aa:bb:cc:dd:ee:ff" + */ + public static String vppPhysAddrToYang(@Nonnull final byte[] vppPhysAddress) { + Preconditions.checkNotNull(vppPhysAddress, "Empty physicall address bytes"); + Preconditions.checkArgument(vppPhysAddress.length == 6, "Invalid physical address size %s, expected 6", + vppPhysAddress.length); + StringBuilder physAddr = new StringBuilder(); + + appendHexByte(physAddr, vppPhysAddress[0]); + for (int i = 1; i < vppPhysAddress.length; i++) { + physAddr.append(":"); + appendHexByte(physAddr, vppPhysAddress[i]); + } + + return physAddr.toString(); + } + + /** + * VPP's interface index is counted from 0, whereas ietf-interface's + * if-index is from 1. This function converts from VPP's interface index to YANG's interface index. + * + * @param vppIfIndex the sw interface index VPP reported. + * @return VPP's interface index incremented by one + */ + public static int vppIfIndexToYang(int vppIfIndex) { + return vppIfIndex + 1; + } + + /** + * This function does the opposite of what {@link #vppIfIndexToYang(int)} does. + * + * @param yangIf if-index from ietf-interfaces. + * @return VPP's representation of the if-index + */ + public static int YangIfIndexToVpp(int yangIfIndex) { + Preconditions.checkArgument(yangIfIndex >= 1, "YANG if-index has invalid value %s", yangIfIndex); + return yangIfIndex - 1; + } + + + public static vppInterfaceDetails[] getVppInterfaceDetails(final vppApi api, + final boolean specificInterface, + String interfaceName) { + if (interfaceName == null) { + interfaceName = new String(); + } + vppInterfaceDetails[] ifaces = api.swInterfaceDump( + (byte) (specificInterface ? 1 : 0), + interfaceName.getBytes()); + if (null == ifaces) { + LOG.warn("VPP returned null instead of interface by key {}", interfaceName); + return null; + } + + if (1 != ifaces.length) { + LOG.error("Failed to extract interface {} details from VPP", interfaceName); + } + + return ifaces; + } + + +} -- cgit 1.2.3-korg