summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Cmarada <mcmarada@cisco.com>2019-05-30 09:09:21 +0200
committerMichal Cmarada <mcmarada@cisco.com>2019-05-30 09:09:21 +0200
commit5a3e5fb8c3cc9ee6f2261d747bf9633b83108adf (patch)
treec42848e2edb241a4de5d0ddc69cc670dde485a8a
parent4dce3cd25ec520ce51da1ed34e5b439eea19232d (diff)
fix reload issues for Loopback interfaces
In some cases loopback on reload are recognized as ethernet interfaces, causing additional loopback interface to be created on startup. - fixes read of loopback interface type - fixes false identification as Ethernet interface Change-Id: I0fe76648bf649d3613e734ba0ddab19b635df1a3 Signed-off-by: Michal Cmarada <mcmarada@cisco.com>
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/InterfacesReaderFactory.java5
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/EthernetCustomizer.java5
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/LoopbackCustomizer.java94
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/write/EthernetCustomizer.java4
4 files changed, 106 insertions, 2 deletions
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/InterfacesReaderFactory.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/InterfacesReaderFactory.java
index a4e6b2a05..dbf30e92a 100644
--- a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/InterfacesReaderFactory.java
+++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/factory/InterfacesReaderFactory.java
@@ -28,6 +28,7 @@ import io.fd.hc2vpp.v3po.read.InterfaceCustomizer;
import io.fd.hc2vpp.v3po.read.InterfaceRoutingCustomizer;
import io.fd.hc2vpp.v3po.read.InterfaceStatisticsCustomizer;
import io.fd.hc2vpp.v3po.read.L2Customizer;
+import io.fd.hc2vpp.v3po.read.LoopbackCustomizer;
import io.fd.hc2vpp.v3po.read.TapV2Customizer;
import io.fd.hc2vpp.v3po.read.VhostUserCustomizer;
import io.fd.hc2vpp.v3po.read.VxlanCustomizer;
@@ -49,6 +50,7 @@ import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interf
import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.Ethernet;
import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.Gre;
import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.L2;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.Loopback;
import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.Routing;
import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.Span;
import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.SpanBuilder;
@@ -125,6 +127,9 @@ public final class InterfacesReaderFactory implements ReaderFactory {
// Ethernet
registry.add(new GenericInitReader<>(vppIfcAugId.child(Ethernet.class),
new EthernetCustomizer(ifaceDumpManager)));
+ // Loopback
+ registry.add(new GenericInitReader<>(vppIfcAugId.child(Loopback.class),
+ new LoopbackCustomizer(ifaceDumpManager)));
// Routing
registry.add(new GenericInitReader<>(vppIfcAugId.child(Routing.class),
new InterfaceRoutingCustomizer(jvpp, ifcNamingCtx)));
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/EthernetCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/EthernetCustomizer.java
index b98c15f70..ec011ab3f 100644
--- a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/EthernetCustomizer.java
+++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/EthernetCustomizer.java
@@ -65,6 +65,11 @@ public class EthernetCustomizer
final InterfaceKey key = id.firstKeyOf(Interface.class);
final SwInterfaceDetails iface = dumpManager.getInterfaceDetail(id, ctx, key.getName());
+ if (!EthernetCsmacd.class.equals(getInterfaceType(id.firstKeyOf(Interface.class).getName()))) {
+ // HW MTU is specific to Ethernet interface. Skip non ethernet interface
+ return;
+ }
+
if (iface.linkMtu != 0) {
// Read physical payload MTU (link_mtu) if given.
// VPP since 18.07 supports also setting MTUs for software interfaces,
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/LoopbackCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/LoopbackCustomizer.java
new file mode 100644
index 000000000..dbcb9a3f1
--- /dev/null
+++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/read/LoopbackCustomizer.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2019 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.hc2vpp.v3po.read;
+
+import io.fd.hc2vpp.common.translate.util.MacTranslator;
+import io.fd.hc2vpp.v3po.read.cache.InterfaceCacheDumpManager;
+import io.fd.honeycomb.translate.read.ReadContext;
+import io.fd.honeycomb.translate.read.ReadFailedException;
+import io.fd.honeycomb.translate.spi.read.Initialized;
+import io.fd.honeycomb.translate.spi.read.InitializingReaderCustomizer;
+import io.fd.honeycomb.translate.util.RWUtils;
+import io.fd.jvpp.core.dto.SwInterfaceDetails;
+import javax.annotation.Nonnull;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.VppInterfaceAugmentation;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.VppInterfaceAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.Loopback;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.interfaces._interface.LoopbackBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev180220.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev180220.interfaces.InterfaceKey;
+import org.opendaylight.yangtools.concepts.Builder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+
+public class LoopbackCustomizer
+ implements InitializingReaderCustomizer<Loopback, LoopbackBuilder>, MacTranslator, InterfaceDataTranslator {
+
+ private final InterfaceCacheDumpManager dumpManager;
+
+ public LoopbackCustomizer(@Nonnull final InterfaceCacheDumpManager dumpManager) {
+ this.dumpManager = dumpManager;
+ }
+
+ @Override
+ public void merge(@Nonnull final Builder<? extends DataObject> parentBuilder,
+ @Nonnull final Loopback readValue) {
+ ((VppInterfaceAugmentationBuilder) parentBuilder).setLoopback(readValue);
+ }
+
+ @Nonnull
+ @Override
+ public LoopbackBuilder getBuilder(@Nonnull InstanceIdentifier<Loopback> id) {
+ return new LoopbackBuilder();
+ }
+
+ @Override
+ public void readCurrentAttributes(@Nonnull final InstanceIdentifier<Loopback> id,
+ @Nonnull final LoopbackBuilder builder,
+ @Nonnull final ReadContext ctx) throws ReadFailedException {
+
+ final InterfaceKey key = id.firstKeyOf(Interface.class);
+ if (!org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.Loopback.class
+ .equals(getInterfaceType(id.firstKeyOf(Interface.class).getName()))) {
+ return;
+ }
+
+ final SwInterfaceDetails iface = dumpManager.getInterfaceDetail(id, ctx, key.getName());
+
+ if (iface.l2AddressLength == 6) {
+ builder.setMac(toPhysAddress(iface.l2Address));
+ }
+ }
+
+ @Override
+ public Initialized<Loopback> init(@Nonnull final InstanceIdentifier<Loopback> id, @Nonnull final Loopback readValue,
+ @Nonnull final ReadContext ctx) {
+ if (org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.v3po.rev190527.Loopback.class
+ .equals(getInterfaceType(id.firstKeyOf(Interface.class).getName()))) {
+ return Initialized.create(getCfgId(id), new LoopbackBuilder().setMac(readValue.getMac()).build());
+ } else {
+ return Initialized.create(getCfgId(id), new LoopbackBuilder().build());
+ }
+ }
+
+ private InstanceIdentifier<Loopback> getCfgId(final InstanceIdentifier<Loopback> id) {
+ return InterfaceCustomizer.getCfgId(RWUtils.cutId(id, Interface.class))
+ .augmentation(VppInterfaceAugmentation.class)
+ .child(Loopback.class);
+ }
+}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/write/EthernetCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/write/EthernetCustomizer.java
index 1029e8add..fa6d5ab78 100644
--- a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/write/EthernetCustomizer.java
+++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/write/EthernetCustomizer.java
@@ -48,8 +48,8 @@ public class EthernetCustomizer extends AbstractInterfaceTypeCustomizer<Ethernet
}
@Override
- public void writeInterface(@Nonnull final InstanceIdentifier<Ethernet> id,
- @Nonnull final Ethernet dataAfter, @Nonnull final WriteContext writeContext)
+ public void writeInterface(@Nonnull final InstanceIdentifier<Ethernet> id, @Nonnull final Ethernet dataAfter,
+ @Nonnull final WriteContext writeContext)
throws WriteFailedException {
setEthernetAttributes(id, dataAfter, writeContext);
}