summaryrefslogtreecommitdiffstats
path: root/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces
diff options
context:
space:
mode:
Diffstat (limited to 'v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces')
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/EthernetCustomizer.java58
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/GreCustomizer.java166
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/InterconnectionWriteUtils.java159
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/InterfaceCustomizer.java121
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/L2Customizer.java89
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/LoopbackCustomizer.java112
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ProxyArpCustomizer.java108
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RewriteCustomizer.java136
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RoutingCustomizer.java122
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/SubInterfaceCustomizer.java193
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/SubInterfaceL2Customizer.java100
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/TapCustomizer.java182
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VhostUserCustomizer.java157
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VxlanCustomizer.java192
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VxlanGpeCustomizer.java194
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/IetfAclWriter.java106
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AbstractIetfAclWriter.java251
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceEthWriter.java85
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIp4Writer.java94
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIp6Writer.java99
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIpAndEthWriter.java129
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceWriter.java54
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTableContextManager.java53
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTableContextManagerImpl.java68
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTranslator.java74
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/IetfAclWriter.java47
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/Ip4AclTranslator.java149
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/Ip6AclTranslator.java182
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/L2AclTranslator.java90
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/PortPair.java126
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/EgressIetfAclWriter.java120
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/IetfAclCustomizer.java85
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/SubInterfaceIetfAclCustomizer.java105
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/AclCustomizer.java83
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/AclWriter.java73
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/IetfAclCustomizer.java89
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/IngressIetfAclWriter.java118
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/SubInterfaceAclCustomizer.java93
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/SubInterfaceIetfAclCustomizer.java108
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4AddressCustomizer.java151
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4Customizer.java56
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4NeighbourCustomizer.java126
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4Writer.java108
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv6Customizer.java55
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/SubInterfaceIpv4AddressCustomizer.java131
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/subnet/validation/SubnetValidationException.java50
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/subnet/validation/SubnetValidator.java80
-rw-r--r--v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/pbb/PbbRewriteCustomizer.java130
48 files changed, 0 insertions, 5457 deletions
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/EthernetCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/EthernetCustomizer.java
deleted file mode 100644
index 856366f2b..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/EthernetCustomizer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.Ethernet;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class EthernetCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Ethernet> {
-
- private static final Logger LOG = LoggerFactory.getLogger(EthernetCustomizer.class);
-
- public EthernetCustomizer(final FutureJVppCore vppApi) {
- super(vppApi);
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Ethernet> id,
- @Nonnull final Ethernet dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- LOG.warn("Unsupported, ignoring configuration {}", dataAfter);
- // VPP API does not support setting MTU
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Ethernet> id,
- @Nonnull final Ethernet dataBefore, @Nonnull final Ethernet dataAfter,
- @Nonnull final WriteContext writeContext) {
- LOG.warn("Unsupported, ignoring configuration {}", dataAfter);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Ethernet> id,
- @Nonnull final Ethernet dataBefore, @Nonnull final WriteContext writeContext) {
- LOG.warn("Unsupported, ignoring configuration delete {}", id);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/GreCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/GreCustomizer.java
deleted file mode 100644
index 146d97c5c..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/GreCustomizer.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) 2016 Intel 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.translate.v3po.interfaces;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.net.InetAddresses;
-import io.fd.honeycomb.translate.vpp.util.AbstractInterfaceTypeCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.GreAddDelTunnel;
-import io.fd.vpp.jvpp.core.dto.GreAddDelTunnelReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.net.InetAddress;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.GreTunnel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.Gre;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GreCustomizer extends AbstractInterfaceTypeCustomizer<Gre> implements JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(GreCustomizer.class);
- private final NamingContext interfaceContext;
-
- public GreCustomizer(final FutureJVppCore vppApi, final NamingContext interfaceContext) {
- super(vppApi);
- this.interfaceContext = interfaceContext;
- }
-
- private static GreAddDelTunnel getGreTunnelRequest(final byte isAdd, final byte[] srcAddr, final byte[] dstAddr,
- final int outerFibId, final byte isIpv6) {
- final GreAddDelTunnel greAddDelTunnel = new GreAddDelTunnel();
- greAddDelTunnel.isAdd = isAdd;
- greAddDelTunnel.srcAddress = srcAddr;
- greAddDelTunnel.dstAddress = dstAddr;
- greAddDelTunnel.outerFibId = outerFibId;
- greAddDelTunnel.isIpv6 = isIpv6;
- return greAddDelTunnel;
- }
-
- @Override
- protected Class<? extends InterfaceType> getExpectedInterfaceType() {
- return GreTunnel.class;
- }
-
- @Override
- protected final void writeInterface(@Nonnull final InstanceIdentifier<Gre> id, @Nonnull final Gre dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
-
- createGreTunnel(id, swIfName, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Gre> id, @Nonnull final Gre dataBefore,
- @Nonnull final Gre dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException.UpdateFailedException {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter,
- new UnsupportedOperationException("Gre tunnel update is not supported"));
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Gre> id, @Nonnull final Gre dataBefore,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- deleteGreTunnel(id, swIfName, dataBefore, writeContext);
- }
-
- private void createGreTunnel(final InstanceIdentifier<Gre> id, final String swIfName, final Gre gre,
- final WriteContext writeContext) throws WriteFailedException {
- final byte isIpv6 = (byte) (isIpv6(gre)
- ? 1
- : 0);
- final InetAddress srcAddress = InetAddresses.forString(getAddressString(gre.getSrc()));
- final InetAddress dstAddress = InetAddresses.forString(getAddressString(gre.getDst()));
-
- int outerFibId = gre.getOuterFibId().intValue();
-
- LOG.debug("Setting gre tunnel for interface: {}. Gre: {}", swIfName, gre);
- final CompletionStage<GreAddDelTunnelReply> greAddDelTunnelReplyCompletionStage =
- getFutureJVpp().greAddDelTunnel(getGreTunnelRequest((byte) 1 /* is add */, srcAddress.getAddress(),
- dstAddress.getAddress(), outerFibId, isIpv6));
-
- final GreAddDelTunnelReply reply =
- getReplyForCreate(greAddDelTunnelReplyCompletionStage.toCompletableFuture(), id, gre);
- LOG.debug("Gre tunnel set successfully for: {}, gre: {}", swIfName, gre);
- if (interfaceContext.containsName(reply.swIfIndex, writeContext.getMappingContext())) {
- // VPP keeps gre tunnels present even after they are delete(reserving ID for next tunnel)
- // This may cause inconsistencies in mapping context when configuring tunnels like this:
- // 1. Add tunnel 2. Delete tunnel 3. Read interfaces (reserved mapping e.g. gre_tunnel0 -> 6
- // will get into mapping context) 4. Add tunnel (this will add another mapping with the same
- // reserved ID and context is invalid)
- // That's why a check has to be performed here removing mapping gre_tunnel0 -> 6 mapping and storing
- // new name for that ID
- final String formerName = interfaceContext.getName(reply.swIfIndex, writeContext.getMappingContext());
- LOG.debug("Removing updated mapping of a gre tunnel, id: {}, former name: {}, new name: {}",
- reply.swIfIndex, formerName, swIfName);
- interfaceContext.removeName(formerName, writeContext.getMappingContext());
- }
- // Add new interface to our interface context
- interfaceContext.addName(reply.swIfIndex, swIfName, writeContext.getMappingContext());
- }
-
- private boolean isIpv6(final Gre gre) {
- if (gre.getSrc().getIpv4Address() == null) {
- checkArgument(gre.getDst().getIpv4Address() == null, "Inconsistent ip addresses: %s, %s", gre.getSrc(),
- gre.getDst());
- return true;
- } else {
- checkArgument(gre.getDst().getIpv6Address() == null, "Inconsistent ip addresses: %s, %s", gre.getSrc(),
- gre.getDst());
- return false;
- }
- }
-
- private String getAddressString(final IpAddress addr) {
- return addr.getIpv4Address() == null
- ? addr.getIpv6Address().getValue()
- : addr.getIpv4Address().getValue();
- }
-
- private void deleteGreTunnel(final InstanceIdentifier<Gre> id, final String swIfName, final Gre gre,
- final WriteContext writeContext) throws WriteFailedException {
- final byte isIpv6 = (byte) (isIpv6(gre)
- ? 1
- : 0);
- final InetAddress srcAddress = InetAddresses.forString(getAddressString(gre.getSrc()));
- final InetAddress dstAddress = InetAddresses.forString(getAddressString(gre.getDst()));
-
- int outerFibId = gre.getOuterFibId().intValue();
-
- LOG.debug("Deleting gre tunnel for interface: {}. Gre: {}", swIfName, gre);
- final CompletionStage<GreAddDelTunnelReply> greAddDelTunnelReplyCompletionStage =
- getFutureJVpp().greAddDelTunnel(getGreTunnelRequest((byte) 0 /* is add */, srcAddress.getAddress(),
- dstAddress.getAddress(), outerFibId, isIpv6));
-
- getReplyForDelete(greAddDelTunnelReplyCompletionStage.toCompletableFuture(), id);
- LOG.debug("Gre tunnel deleted successfully for: {}, gre: {}", swIfName, gre);
- // Remove interface from our interface context
- interfaceContext.removeName(swIfName, writeContext.getMappingContext());
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/InterconnectionWriteUtils.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/InterconnectionWriteUtils.java
deleted file mode 100644
index 7d2d28c90..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/InterconnectionWriteUtils.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static java.util.Objects.requireNonNull;
-
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetL2Bridge;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetL2BridgeReply;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetL2Xconnect;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetL2XconnectReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.Interconnection;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.interconnection.BridgeBased;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.l2.base.attributes.interconnection.XconnectBased;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Utility class providing Interconnection CUD support.
- */
-final class InterconnectionWriteUtils implements JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(InterconnectionWriteUtils.class);
-
- private final FutureJVppCore futureJVppCore;
- private final NamingContext interfaceContext;
- private final NamingContext bridgeDomainContext;
-
- InterconnectionWriteUtils(@Nonnull final FutureJVppCore futureJVppCore,
- @Nonnull final NamingContext interfaceContext,
- @Nonnull final NamingContext bridgeDomainContext) {
- this.futureJVppCore = requireNonNull(futureJVppCore, "futureJVppCore should not be null");
- this.interfaceContext = requireNonNull(interfaceContext, "interfaceContext should not be null");
- this.bridgeDomainContext = requireNonNull(bridgeDomainContext, "bridgeDomainContext should not be null");
- }
-
- void setInterconnection(final InstanceIdentifier<? extends DataObject> id, final int swIfIndex,
- final String ifcName, final Interconnection ic, final WriteContext writeContext)
- throws WriteFailedException {
-
- if (ic == null) { // TODO in case of update we should delete interconnection
- LOG.trace("Interconnection is not set. Skipping");
- } else if (ic instanceof XconnectBased) {
- setXconnectBasedL2(id, swIfIndex, ifcName, (XconnectBased) ic, writeContext, (byte) 1 /*enable*/);
- } else if (ic instanceof BridgeBased) {
- setBridgeBasedL2(id, swIfIndex, ifcName, (BridgeBased) ic, writeContext, (byte) 1 /*enable*/);
- } else {
- // Choices&cases are not data objects, so they cannot have a dedicated Reader/Writer
- // This choice is already from augment, so its not possible to augment augmented choice
- LOG.error("Unable to handle Interconnection of type {}", ic.getClass());
- throw new WriteFailedException(id, "Unable to handle Interconnection of type " + ic.getClass());
- }
- }
-
- void deleteInterconnection(final InstanceIdentifier<? extends DataObject> id, final int swIfIndex,
- final String ifcName, final Interconnection ic, final WriteContext writeContext)
- throws WriteFailedException {
-
- if (ic == null) { // TODO in case of update we should delete interconnection
- LOG.trace("Interconnection is not set. Skipping");
- } else if (ic instanceof XconnectBased) {
- setXconnectBasedL2(id, swIfIndex, ifcName, (XconnectBased) ic, writeContext, (byte) 0 /*disable*/);
- } else if (ic instanceof BridgeBased) {
- setBridgeBasedL2(id, swIfIndex, ifcName, (BridgeBased) ic, writeContext, (byte) 0 /*disable*/);
- } else {
- LOG.error("Unable to delete Interconnection of type {}", ic.getClass());
- throw new WriteFailedException(id, "Unable to delete Interconnection of type " + ic.getClass());
- }
- }
-
- private void setBridgeBasedL2(final InstanceIdentifier<? extends DataObject> id, final int swIfIndex,
- final String ifcName, final BridgeBased bb,
- final WriteContext writeContext, final byte enabled) throws WriteFailedException {
- LOG.debug("Setting bridge based interconnection(bridge-domain={}) for interface: {}", bb.getBridgeDomain(),
- ifcName);
-
- String bdName = bb.getBridgeDomain();
-
- int bdId = bridgeDomainContext.getIndex(bdName, writeContext.getMappingContext());
- checkArgument(bdId > 0, "Unable to set Interconnection for Interface: %s, bridge domain: %s does not exist",
- ifcName, bdName);
-
- byte bvi = bb.isBridgedVirtualInterface()
- ? (byte) 1
- : (byte) 0;
- byte shg = 0;
- if (bb.getSplitHorizonGroup() != null) {
- shg = bb.getSplitHorizonGroup().byteValue();
- }
-
- final CompletionStage<SwInterfaceSetL2BridgeReply> swInterfaceSetL2BridgeReplyCompletionStage = futureJVppCore
- .swInterfaceSetL2Bridge(getL2BridgeRequest(swIfIndex, bdId, shg, bvi, enabled));
- getReplyForWrite(swInterfaceSetL2BridgeReplyCompletionStage.toCompletableFuture(), id);
-
- LOG.debug("Bridge based interconnection updated successfully for: {}, interconnection: {}", ifcName, bb);
- }
-
- private SwInterfaceSetL2Bridge getL2BridgeRequest(final int swIfIndex, final int bdId, final byte shg,
- final byte bvi, final byte enabled) {
- final SwInterfaceSetL2Bridge swInterfaceSetL2Bridge = new SwInterfaceSetL2Bridge();
- swInterfaceSetL2Bridge.rxSwIfIndex = swIfIndex;
- swInterfaceSetL2Bridge.bdId = bdId;
- swInterfaceSetL2Bridge.shg = shg;
- swInterfaceSetL2Bridge.bvi = bvi;
- swInterfaceSetL2Bridge.enable = enabled;
- return swInterfaceSetL2Bridge;
- }
-
- private void setXconnectBasedL2(final InstanceIdentifier<? extends DataObject> id, final int swIfIndex,
- final String ifcName, final XconnectBased ic,
- final WriteContext writeContext, final byte enabled) throws WriteFailedException {
- String outSwIfName = ic.getXconnectOutgoingInterface();
- LOG.debug("Setting xconnect based interconnection(outgoing ifc={}) for interface: {}", outSwIfName, ifcName);
-
- int outSwIfIndex = interfaceContext.getIndex(outSwIfName, writeContext.getMappingContext());
- checkArgument(outSwIfIndex > 0,
- "Unable to set Interconnection for Interface: %s, outgoing interface: %s does not exist",
- ifcName, outSwIfIndex);
-
- final CompletionStage<SwInterfaceSetL2XconnectReply> swInterfaceSetL2XconnectReplyCompletionStage =
- futureJVppCore
- .swInterfaceSetL2Xconnect(getL2XConnectRequest(swIfIndex, outSwIfIndex, enabled));
- getReplyForWrite(swInterfaceSetL2XconnectReplyCompletionStage.toCompletableFuture(), id);
- LOG.debug("Xconnect based interconnection updated successfully for: {}, interconnection: {}", ifcName, ic);
- }
-
- private SwInterfaceSetL2Xconnect getL2XConnectRequest(final int rxIfc, final int txIfc,
- final byte enabled) {
-
- final SwInterfaceSetL2Xconnect swInterfaceSetL2Xconnect = new SwInterfaceSetL2Xconnect();
- swInterfaceSetL2Xconnect.enable = enabled;
- swInterfaceSetL2Xconnect.rxSwIfIndex = rxIfc;
- swInterfaceSetL2Xconnect.txSwIfIndex = txIfc;
- return swInterfaceSetL2Xconnect;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/InterfaceCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/InterfaceCustomizer.java
deleted file mode 100644
index 17b48f628..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/InterfaceCustomizer.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlags;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlagsReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Ietf interface write customizer that only caches interface objects for child writers
- */
-public class InterfaceCustomizer extends FutureJVppCustomizer
- implements ListWriterCustomizer<Interface, InterfaceKey>, JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(InterfaceCustomizer.class);
- private final NamingContext interfaceContext;
-
- public InterfaceCustomizer(final FutureJVppCore vppApi, final NamingContext interfaceContext) {
- super(vppApi);
- this.interfaceContext = interfaceContext;
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Interface> id,
- @Nonnull final Interface dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
-
- setInterface(id, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Interface> id,
- @Nonnull final Interface dataBefore,
- @Nonnull final Interface dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- updateInterface(id, dataBefore, dataAfter, writeContext);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Interface> id,
- @Nonnull final Interface dataBefore,
- @Nonnull final WriteContext writeContext) {
- // Nothing to be done here, customizers for specific interface types e.g. vxlan handle the delete
- }
-
- private void setInterface(final InstanceIdentifier<Interface> id, final Interface swIf,
- final WriteContext writeContext) throws WriteFailedException {
- LOG.debug("Setting interface: {} to: {}", id, swIf);
- setInterfaceAttributes(id, swIf, swIf.getName(), writeContext);
- }
-
- private void setInterfaceAttributes(final InstanceIdentifier<Interface> id, final Interface swIf,
- final String swIfName, final WriteContext writeContext)
- throws WriteFailedException {
-
- setInterfaceFlags(id, swIfName, interfaceContext.getIndex(swIfName, writeContext.getMappingContext()),
- swIf.isEnabled()
- ? (byte) 1
- : (byte) 0);
- }
-
- private void updateInterface(final InstanceIdentifier<Interface> id,
- final Interface dataBefore,
- final Interface dataAfter, final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Updating interface:{} to: {}", id, dataAfter);
- setInterfaceAttributes(id, dataAfter, dataAfter.getName(), writeContext);
- }
-
- private void setInterfaceFlags(final InstanceIdentifier<Interface> id, final String swIfName, final int swIfIndex,
- final byte enabled) throws WriteFailedException {
- final CompletionStage<SwInterfaceSetFlagsReply> swInterfaceSetFlagsReplyFuture =
- getFutureJVpp().swInterfaceSetFlags(
- getSwInterfaceSetFlagsInput(swIfIndex, enabled, (byte) 0 /* deleted */));
-
- LOG.debug("Updating interface flags for: {}, index: {}, enabled: {}", swIfName, swIfIndex, enabled);
-
- getReplyForWrite(swInterfaceSetFlagsReplyFuture.toCompletableFuture(), id);
- LOG.debug("Interface flags updated successfully for: {}, index: {}, enabled: {}",
- swIfName, swIfIndex, enabled);
- }
-
- private SwInterfaceSetFlags getSwInterfaceSetFlagsInput(final int swIfIndex, final byte enabled,
- final byte deleted) {
- final SwInterfaceSetFlags swInterfaceSetFlags = new SwInterfaceSetFlags();
- swInterfaceSetFlags.swIfIndex = swIfIndex;
- swInterfaceSetFlags.adminUpDown = enabled;
- swInterfaceSetFlags.linkUpDown = enabled;
- swInterfaceSetFlags.deleted = deleted;
- return swInterfaceSetFlags;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/L2Customizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/L2Customizer.java
deleted file mode 100644
index cf9da357d..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/L2Customizer.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.L2;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class L2Customizer extends FutureJVppCustomizer implements WriterCustomizer<L2> {
-
- private static final Logger LOG = LoggerFactory.getLogger(L2Customizer.class);
- private final NamingContext interfaceContext;
- private final InterconnectionWriteUtils icWriteUtils;
-
- public L2Customizer(final FutureJVppCore vppApi, final NamingContext interfaceContext,
- final NamingContext bridgeDomainContext) {
- super(vppApi);
- this.interfaceContext = interfaceContext;
- this.icWriteUtils = new InterconnectionWriteUtils(vppApi, interfaceContext, bridgeDomainContext);
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
-
- final String ifcName = id.firstKeyOf(Interface.class).getName();
- final int swIfc = interfaceContext.getIndex(ifcName, writeContext.getMappingContext());
- setL2(id, swIfc, ifcName, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataBefore,
- @Nonnull final L2 dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
-
- final String ifcName = id.firstKeyOf(Interface.class).getName();
- final int swIfc = interfaceContext.getIndex(ifcName, writeContext.getMappingContext());
- // No update, again calling set
- setL2(id, swIfc, ifcName, dataAfter, writeContext);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataBefore,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String ifcName = id.firstKeyOf(Interface.class).getName();
- final int swIfc = interfaceContext.getIndex(ifcName, writeContext.getMappingContext());
- deleteL2(id, swIfc, ifcName, dataBefore, writeContext);
- }
-
- private void setL2(final InstanceIdentifier<L2> id, final int swIfIndex, final String ifcName, final L2 l2,
- final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Setting L2 for interface: {}", ifcName);
- // Nothing besides interconnection here
- icWriteUtils.setInterconnection(id, swIfIndex, ifcName, l2.getInterconnection(), writeContext);
- }
-
- private void deleteL2(final InstanceIdentifier<L2> id, final int swIfIndex, final String ifcName, final L2 l2Before,
- final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Deleting L2 for interface: {}", ifcName);
- // Nothing besides interconnection here
- icWriteUtils.deleteInterconnection(id, swIfIndex, ifcName, l2Before.getInterconnection(), writeContext);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/LoopbackCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/LoopbackCustomizer.java
deleted file mode 100644
index 47a71750d..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/LoopbackCustomizer.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import io.fd.honeycomb.translate.vpp.util.AbstractInterfaceTypeCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.MacTranslator;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.CreateLoopback;
-import io.fd.vpp.jvpp.core.dto.CreateLoopbackReply;
-import io.fd.vpp.jvpp.core.dto.DeleteLoopback;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.Loopback;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class LoopbackCustomizer extends AbstractInterfaceTypeCustomizer<Loopback>
- implements MacTranslator, JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(LoopbackCustomizer.class);
- private final NamingContext interfaceContext;
-
- public LoopbackCustomizer(final FutureJVppCore vppApi, final NamingContext interfaceContext) {
- super(vppApi);
- this.interfaceContext = interfaceContext;
- }
-
- @Override
- protected Class<? extends InterfaceType> getExpectedInterfaceType() {
- return org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.Loopback.class;
- }
-
- @Override
- protected final void writeInterface(@Nonnull final InstanceIdentifier<Loopback> id, @Nonnull final Loopback dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String ifcName = id.firstKeyOf(Interface.class).getName();
- createLoopback(id, ifcName, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Loopback> id, @Nonnull final Loopback dataBefore,
- @Nonnull final Loopback dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter,
- new UnsupportedOperationException("Modification of loopback interface is not supported"));
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Loopback> id, @Nonnull final Loopback dataBefore,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String ifcName = id.firstKeyOf(Interface.class).getName();
-
- final int index;
- try {
- index = interfaceContext.getIndex(ifcName, writeContext.getMappingContext());
- } catch (IllegalArgumentException e) {
- throw new WriteFailedException.DeleteFailedException(id, e);
- }
-
- deleteLoopback(id, ifcName, index, dataBefore, writeContext);
- }
-
- private void createLoopback(final InstanceIdentifier<Loopback> id, final String swIfName, final Loopback loopback,
- final WriteContext writeContext) throws WriteFailedException {
- LOG.debug("Setting loopback interface: {}. Loopback: {}", swIfName, loopback);
-
- final CreateLoopback createLoopback = new CreateLoopback();
- if (loopback.getMac() != null) {
- createLoopback.macAddress = parseMac(loopback.getMac().getValue());
- }
- final CreateLoopbackReply reply =
- getReplyForCreate(getFutureJVpp().createLoopback(createLoopback).toCompletableFuture(), id, loopback);
-
- LOG.debug("Loopback set successfully for: {}, loopback: {}", swIfName, loopback);
- // Add new interface to our interface context
- interfaceContext.addName(reply.swIfIndex, swIfName, writeContext.getMappingContext());
- }
-
- private void deleteLoopback(final InstanceIdentifier<Loopback> id, final String swIfName, final int index,
- final Loopback dataBefore, final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Deleting loopback interface: {}. Loopback: {}", swIfName, dataBefore);
- final DeleteLoopback deleteLoopback = new DeleteLoopback();
- deleteLoopback.swIfIndex = index;
- getReplyForDelete(getFutureJVpp().deleteLoopback(deleteLoopback).toCompletableFuture(), id);
- LOG.debug("Loopback deleted successfully for: {}, loopback: {}", swIfName, dataBefore);
- // Remove deleted interface from interface context
- interfaceContext.removeName(swIfName, writeContext.getMappingContext());
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ProxyArpCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ProxyArpCustomizer.java
deleted file mode 100644
index 43a34cdcd..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ProxyArpCustomizer.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import com.google.common.net.InetAddresses;
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.ProxyArpAddDel;
-import io.fd.vpp.jvpp.core.dto.ProxyArpAddDelReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.net.InetAddress;
-import java.util.concurrent.Future;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.ProxyArp;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ProxyArpCustomizer extends FutureJVppCustomizer implements WriterCustomizer<ProxyArp>, JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(ProxyArpCustomizer.class);
-
- public ProxyArpCustomizer(final FutureJVppCore vppApi) {
- super(vppApi);
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull InstanceIdentifier<ProxyArp> id, @Nonnull ProxyArp dataAfter,
- @Nonnull WriteContext writeContext) throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- createProxyArp(getProxyArpRequestFuture(id, swIfName, dataAfter, (byte) 1 /* 1 is add */), id, dataAfter);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull InstanceIdentifier<ProxyArp> id, @Nonnull ProxyArp dataBefore,
- @Nonnull ProxyArp dataAfter, @Nonnull WriteContext writeContext)
- throws WriteFailedException.UpdateFailedException {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter,
- new UnsupportedOperationException("ARP proxy update is not supported"));
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull InstanceIdentifier<ProxyArp> id, @Nonnull ProxyArp dataBefore,
- @Nonnull WriteContext writeContext) throws WriteFailedException {
-
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- deleteProxyArp(getProxyArpRequestFuture(id, swIfName, dataBefore, (byte) 0 /* 0 is delete */), id);
- }
-
- private Future<ProxyArpAddDelReply> getProxyArpRequestFuture(InstanceIdentifier<ProxyArp> id, String swIfName,
- ProxyArp proxyArp, byte operation)
- throws WriteFailedException {
- LOG.debug("Setting Proxy ARP settings for interface: {}", swIfName);
- final InetAddress srcAddress = InetAddresses.forString(getv4AddressString(proxyArp.getLowAddr()));
- final InetAddress dstAddress = InetAddresses.forString(getv4AddressString(proxyArp.getHighAddr()));
- final int vrfId = proxyArp.getVrfId().intValue();
- return getFutureJVpp().proxyArpAddDel(
- getProxyArpConfRequest(operation, srcAddress.getAddress(), dstAddress.getAddress(), vrfId))
- .toCompletableFuture();
- }
-
- private void createProxyArp(final Future<ProxyArpAddDelReply> future, final InstanceIdentifier<ProxyArp> identifier,
- final ProxyArp data)
- throws WriteFailedException {
- final ProxyArpAddDelReply reply = getReplyForCreate(future, identifier, data);
- LOG.debug("Proxy ARP setting create successful, with reply context:", reply.context);
- }
-
- private void deleteProxyArp(final Future<ProxyArpAddDelReply> future, final InstanceIdentifier<ProxyArp> identifier)
- throws WriteFailedException {
- final ProxyArpAddDelReply reply = getReplyForDelete(future, identifier);
- LOG.debug("Proxy ARP setting delete successful, with reply context:", reply.context);
- }
-
- private static ProxyArpAddDel getProxyArpConfRequest(final byte isAdd, final byte[] lAddr, final byte[] hAddr,
- final int vrfId) {
-
- final ProxyArpAddDel proxyArpAddDel = new ProxyArpAddDel();
- proxyArpAddDel.isAdd = isAdd;
- proxyArpAddDel.lowAddress = lAddr;
- proxyArpAddDel.hiAddress = hAddr;
- proxyArpAddDel.vrfId = vrfId;
- return proxyArpAddDel;
- }
-
- private String getv4AddressString(@Nonnull final Ipv4Address addr) {
- return addr.getValue();
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RewriteCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RewriteCustomizer.java
deleted file mode 100644
index 204f5e152..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RewriteCustomizer.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import com.google.common.base.Preconditions;
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils;
-import io.fd.honeycomb.translate.vpp.util.TagRewriteOperation;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.L2InterfaceVlanTagRewrite;
-import io.fd.vpp.jvpp.core.dto.L2InterfaceVlanTagRewriteReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.List;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214._802dot1q;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.base.attributes.l2.Rewrite;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.base.attributes.l2.RewriteBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.tag.rewrite.PushTags;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Writer Customizer responsible for vlan tag rewrite.<br> Sends {@code l2_interface_vlan_tag_rewrite} message to
- * VPP.<br> Equivalent of invoking {@code vppctl set interface l2 tag-rewrite} command.
- */
-public class RewriteCustomizer extends FutureJVppCustomizer
- implements WriterCustomizer<Rewrite>, ByteDataTranslator, JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(RewriteCustomizer.class);
- private final NamingContext interfaceContext;
-
- public RewriteCustomizer(@Nonnull final FutureJVppCore futureJVppCore,
- @Nonnull final NamingContext interfaceContext) {
- super(futureJVppCore);
- this.interfaceContext = Preconditions.checkNotNull(interfaceContext, "interfaceContext should not be null");
- }
-
- @Override
- public void writeCurrentAttributes(final InstanceIdentifier<Rewrite> id, final Rewrite dataAfter,
- final WriteContext writeContext)
- throws WriteFailedException {
- final String subifName = getSubInterfaceName(id);
- setTagRewrite(id, subifName, dataAfter, writeContext);
- }
-
- private static String getSubInterfaceName(final InstanceIdentifier<Rewrite> id) {
- return SubInterfaceUtils.getSubInterfaceName(id.firstKeyOf(Interface.class).getName(),
- Math.toIntExact(id.firstKeyOf(SubInterface.class).getIdentifier()));
- }
-
- private void setTagRewrite(final InstanceIdentifier<Rewrite> id, final String ifname, final Rewrite rewrite,
- final WriteContext writeContext) throws WriteFailedException {
- final int swIfIndex = interfaceContext.getIndex(ifname, writeContext.getMappingContext());
- LOG.debug("Setting tag rewrite for interface {}(id=): {}", ifname, swIfIndex, rewrite);
-
- final CompletionStage<L2InterfaceVlanTagRewriteReply> replyCompletionStage =
- getFutureJVpp().l2InterfaceVlanTagRewrite(getTagRewriteRequest(swIfIndex, rewrite));
-
- getReplyForWrite(replyCompletionStage.toCompletableFuture(), id);
- LOG.debug("Tag rewrite for interface {}(id=) set successfully: {}", ifname, swIfIndex, rewrite);
- }
-
- private L2InterfaceVlanTagRewrite getTagRewriteRequest(final int swIfIndex, final Rewrite rewrite) {
- final L2InterfaceVlanTagRewrite request = new L2InterfaceVlanTagRewrite();
- request.swIfIndex = swIfIndex;
- request.pushDot1Q = booleanToByte(_802dot1q.class == rewrite.getVlanType());
-
- final List<PushTags> pushTags = rewrite.getPushTags();
- final Short popTags = rewrite.getPopTags();
-
- final int numberOfTagsToPop = popTags == null
- ? 0
- : popTags.intValue();
- final int numberOfTagsToPush = pushTags == null
- ? 0
- : pushTags.size();
-
- request.vtrOp = TagRewriteOperation.get(numberOfTagsToPop, numberOfTagsToPush).ordinal();
-
- if (numberOfTagsToPush > 0) {
- for (final PushTags tag : pushTags) {
- if (tag.getIndex() == 0) {
- request.tag1 = tag.getDot1qTag().getVlanId().getValue();
- } else {
- request.tag2 = tag.getDot1qTag().getVlanId().getValue();
- }
- }
- }
-
- LOG.debug("Generated tag rewrite request: {}", request);
- return request;
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Rewrite> id,
- @Nonnull final Rewrite dataBefore,
- @Nonnull final Rewrite dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String subifName = getSubInterfaceName(id);
- setTagRewrite(id, subifName, dataAfter, writeContext);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Rewrite> id,
- @Nonnull final Rewrite dataBefore, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String subifName = getSubInterfaceName(id);
-
- LOG.debug("Disabling tag rewrite for interface {}", subifName);
- final Rewrite rewrite = new RewriteBuilder().build(); // rewrite without push and pops will cause delete
- setTagRewrite(id, subifName, rewrite, writeContext);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RoutingCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RoutingCustomizer.java
deleted file mode 100644
index 05ecf3648..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/RoutingCustomizer.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetTable;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetTableReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.Routing;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RoutingCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Routing>, JvppReplyConsumer,
- ByteDataTranslator {
-
- private static final Logger LOG = LoggerFactory.getLogger(RoutingCustomizer.class);
- private final NamingContext interfaceContext;
-
- public RoutingCustomizer(final FutureJVppCore vppApi, final NamingContext interfaceContext) {
- super(vppApi);
- this.interfaceContext = interfaceContext;
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Routing> id,
- @Nonnull final Routing dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
-
- final String ifName = id.firstKeyOf(Interface.class).getName();
- setRouting(id, ifName, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Routing> id,
- @Nonnull final Routing dataBefore, @Nonnull final Routing dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
-
- final String ifName = id.firstKeyOf(Interface.class).getName();
- setRouting(id, ifName, dataAfter, writeContext);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Routing> id,
- @Nonnull final Routing dataBefore, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String ifName = id.firstKeyOf(Interface.class).getName();
- disableRouting(id, ifName, writeContext);
- }
-
- private void setRouting(@Nonnull final InstanceIdentifier<Routing> id, @Nonnull final String name,
- @Nonnull final Routing rt,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final int swIfc = interfaceContext.getIndex(name, writeContext.getMappingContext());
- LOG.debug("Setting routing for interface: {}, {}. Routing: {}", name, swIfc, rt);
- checkArgument(rt.getIpv4VrfId() != null || rt.getIpv6VrfId() != null, "No vrf-id given");
-
- setVrfId(id, swIfc, rt.getIpv4VrfId(), false);
- setVrfId(id, swIfc, rt.getIpv6VrfId(), true);
-
- LOG.debug("Routing set successfully for interface: {}, {}, routing: {}", name, swIfc, rt);
- }
-
- private void setVrfId(final InstanceIdentifier<Routing> id, final int swIfc, final Long vrfId, boolean isIp6)
- throws WriteFailedException {
- if (vrfId == null) {
- return;
- }
- final CompletionStage<SwInterfaceSetTableReply> cs = getFutureJVpp()
- .swInterfaceSetTable(getInterfaceSetTableRequest(swIfc, booleanToByte(isIp6), vrfId.intValue()));
- getReplyForWrite(cs.toCompletableFuture(), id);
- }
-
- /**
- * In this case, there is no such thing as delete routing,only thing that can be done is to disable it by setting
- * default value 0
- */
- private void disableRouting(final InstanceIdentifier<Routing> id, final String name,
- final WriteContext writeContext) throws WriteFailedException {
- final int swIfc = interfaceContext.getIndex(name, writeContext.getMappingContext());
- LOG.debug("Disabling routing for interface: {}, {}.", name, swIfc);
-
- getReplyForDelete(getFutureJVpp()
- .swInterfaceSetTable(getInterfaceSetTableRequest(swIfc, (byte) 0, 0)).toCompletableFuture(), id);
- LOG.debug("Routing for interface: {}, {} successfully disabled", name, swIfc);
-
- }
-
- private SwInterfaceSetTable getInterfaceSetTableRequest(final int swIfc, final byte isIpv6, final int vrfId) {
- final SwInterfaceSetTable swInterfaceSetTable = new SwInterfaceSetTable();
- swInterfaceSetTable.isIpv6 = isIpv6;
- swInterfaceSetTable.swIfIndex = swIfc;
- swInterfaceSetTable.vrfId = vrfId;
- return swInterfaceSetTable;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/SubInterfaceCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/SubInterfaceCustomizer.java
deleted file mode 100644
index 364567772..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/SubInterfaceCustomizer.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import static com.google.common.base.Preconditions.checkState;
-import static io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils.getNumberOfTags;
-import static io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils.getSubInterfaceName;
-
-import com.google.common.base.Preconditions;
-import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.CreateSubif;
-import io.fd.vpp.jvpp.core.dto.CreateSubifReply;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlags;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlagsReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ieee.params.xml.ns.yang.dot1q.types.rev150626.CVlan;
-import org.opendaylight.yang.gen.v1.urn.ieee.params.xml.ns.yang.dot1q.types.rev150626.Dot1qVlanId;
-import org.opendaylight.yang.gen.v1.urn.ieee.params.xml.ns.yang.dot1q.types.rev150626.SVlan;
-import org.opendaylight.yang.gen.v1.urn.ieee.params.xml.ns.yang.dot1q.types.rev150626.dot1q.tag.or.any.Dot1qTag;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214._802dot1ad;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.match.attributes.MatchType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.match.attributes.match.type.Default;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.match.attributes.match.type.vlan.tagged.VlanTagged;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.base.attributes.tags.Tag;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Writer Customizer responsible for sub interface creation.<br> Sends {@code create_subif} message to VPP.<br>
- * Equivalent of invoking {@code vppclt create subif} command.
- */
-public class SubInterfaceCustomizer extends FutureJVppCustomizer
- implements ListWriterCustomizer<SubInterface, SubInterfaceKey>, ByteDataTranslator, JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(SubInterfaceCustomizer.class);
- private final NamingContext interfaceContext;
-
- public SubInterfaceCustomizer(@Nonnull final FutureJVppCore futureJVppCore,
- @Nonnull final NamingContext interfaceContext) {
- super(futureJVppCore);
- this.interfaceContext = Preconditions.checkNotNull(interfaceContext, "interfaceContext should not be null");
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<SubInterface> id,
- @Nonnull final SubInterface dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String superIfName = id.firstKeyOf(Interface.class).getName();
- createSubInterface(id, superIfName, dataAfter, writeContext);
- }
-
- private void createSubInterface(final InstanceIdentifier<SubInterface> id, @Nonnull final String superIfName,
- @Nonnull final SubInterface subInterface, final WriteContext writeContext)
- throws WriteFailedException {
- final int superIfIndex = interfaceContext.getIndex(superIfName, writeContext.getMappingContext());
- final CompletionStage<CreateSubifReply> createSubifReplyCompletionStage =
- getFutureJVpp().createSubif(getCreateSubifRequest(subInterface, superIfIndex));
-
- final CreateSubifReply reply =
- getReplyForCreate(createSubifReplyCompletionStage.toCompletableFuture(), id, subInterface);
-
- setInterfaceState(id, reply.swIfIndex, booleanToByte(subInterface.isEnabled()));
- interfaceContext.addName(reply.swIfIndex,
- getSubInterfaceName(superIfName, Math.toIntExact(subInterface.getIdentifier())),
- writeContext.getMappingContext());
- LOG.debug("Sub interface created successfully for: {}, subInterface: {}", superIfName, subInterface);
- }
-
- private CreateSubif getCreateSubifRequest(@Nonnull final SubInterface subInterface, final int swIfIndex) {
- // TODO HONEYCOMB-183 add validation
- CreateSubif request = new CreateSubif();
- request.subId = Math.toIntExact(subInterface.getIdentifier().intValue());
- request.swIfIndex = swIfIndex;
-
- final int numberOfTags = getNumberOfTags(subInterface.getTags());
- switch (numberOfTags) {
- case 0:
- request.noTags = 1;
- break;
- case 1:
- request.oneTag = 1;
- break;
- case 2:
- request.twoTags = 1;
- break;
- }
- request.dot1Ad = booleanToByte(_802dot1ad.class == subInterface.getVlanType());
-
- // TODO HONEYCOMB-183 match should be mandatory
- final MatchType matchType = subInterface.getMatch().getMatchType();
- request.exactMatch =
- booleanToByte(matchType instanceof VlanTagged && ((VlanTagged) matchType).isMatchExactTags());
- request.defaultSub = booleanToByte(matchType instanceof Default);
-
- if (numberOfTags > 0) {
- for (final Tag tag : subInterface.getTags().getTag()) {
- if (tag.getIndex() == 0) {
- setOuterTag(request, tag);
- } else if (tag.getIndex() == 1) {
- setInnerTag(request, tag);
- }
- }
- }
- return request;
- }
-
- private void setOuterTag(final CreateSubif request, final Tag outerTag) {
- checkState(SVlan.class == outerTag.getDot1qTag().getTagType(), "Service Tag expected at index 0");
- final Dot1qTag.VlanId vlanId = outerTag.getDot1qTag().getVlanId();
-
- request.outerVlanId = dot1qVlanIdToShort(vlanId.getDot1qVlanId());
- request.outerVlanIdAny = booleanToByte(Dot1qTag.VlanId.Enumeration.Any.equals(vlanId.getEnumeration()));
- }
-
- private void setInnerTag(final CreateSubif request, final Tag innerTag) {
- checkState(CVlan.class == innerTag.getDot1qTag().getTagType(), "Customer Tag expected at index 1");
- final Dot1qTag.VlanId vlanId = innerTag.getDot1qTag().getVlanId();
-
- request.innerVlanId = dot1qVlanIdToShort(vlanId.getDot1qVlanId());
- request.innerVlanIdAny = booleanToByte(Dot1qTag.VlanId.Enumeration.Any.equals(vlanId.getEnumeration()));
- }
-
- private static short dot1qVlanIdToShort(@Nullable Dot1qVlanId dot1qVlanId) {
- if (dot1qVlanId == null) {
- return 0; // tell VPP that optional argument is missing
- } else {
- return dot1qVlanId.getValue().shortValue();
- }
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<SubInterface> id,
- @Nonnull final SubInterface dataBefore, @Nonnull final SubInterface dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String subIfaceName = getSubInterfaceName(id.firstKeyOf(Interface.class).getName(),
- Math.toIntExact(dataAfter.getIdentifier()));
- setInterfaceState(id, interfaceContext.getIndex(subIfaceName, writeContext.getMappingContext()),
- booleanToByte(dataAfter.isEnabled()));
- }
-
- private void setInterfaceState(final InstanceIdentifier<SubInterface> id, final int swIfIndex, final byte enabled)
- throws WriteFailedException {
- final SwInterfaceSetFlags swInterfaceSetFlags = new SwInterfaceSetFlags();
- swInterfaceSetFlags.swIfIndex = swIfIndex;
- swInterfaceSetFlags.adminUpDown = enabled;
-
- final CompletionStage<SwInterfaceSetFlagsReply> swInterfaceSetFlagsReplyFuture =
- getFutureJVpp().swInterfaceSetFlags(swInterfaceSetFlags);
-
- LOG.debug("Updating interface state for interface if={}, enabled: {}", swIfIndex, enabled);
-
- SwInterfaceSetFlagsReply reply =
- getReplyForWrite(swInterfaceSetFlagsReplyFuture.toCompletableFuture(), id);
- LOG.debug("Interface state updated successfully for interface index: {}, enabled: {}, ctxId: {}",
- swIfIndex, enabled, reply.context);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<SubInterface> id,
- @Nonnull final SubInterface dataBefore,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException.DeleteFailedException {
- throw new UnsupportedOperationException("Sub interface delete is not supported");
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/SubInterfaceL2Customizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/SubInterfaceL2Customizer.java
deleted file mode 100644
index a485d0749..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/SubInterfaceL2Customizer.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.base.attributes.L2;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Customizer for writing vlan sub interface l2 configuration
- */
-public class SubInterfaceL2Customizer extends FutureJVppCustomizer implements WriterCustomizer<L2> {
-
- private static final Logger LOG = LoggerFactory.getLogger(SubInterfaceL2Customizer.class);
- private final NamingContext interfaceContext;
- private final InterconnectionWriteUtils icWriterUtils;
-
- public SubInterfaceL2Customizer(final FutureJVppCore vppApi, final NamingContext interfaceContext,
- final NamingContext bridgeDomainContext) {
- super(vppApi);
- this.interfaceContext = interfaceContext;
- this.icWriterUtils = new InterconnectionWriteUtils(vppApi, interfaceContext, bridgeDomainContext);
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String subInterfaceName = getSubInterfaceName(id);
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
- setL2(id, subInterfaceIndex, subInterfaceName, dataAfter, writeContext);
- }
-
- private String getSubInterfaceName(@Nonnull final InstanceIdentifier<L2> id) {
- final InterfaceKey parentInterfacekey = id.firstKeyOf(Interface.class);
- final SubInterfaceKey subInterfacekey = id.firstKeyOf(SubInterface.class);
- return SubInterfaceUtils
- .getSubInterfaceName(parentInterfacekey.getName(), subInterfacekey.getIdentifier().intValue());
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataBefore,
- @Nonnull final L2 dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
-
- final String subInterfaceName = getSubInterfaceName(id);
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
- // Setting L2 to new values
- setL2(id, subInterfaceIndex, subInterfaceName, dataAfter, writeContext);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataBefore,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String subInterfaceName = getSubInterfaceName(id);
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
- deleteL2(id, subInterfaceIndex, subInterfaceName, dataBefore, writeContext);
- }
-
- private void setL2(final InstanceIdentifier<L2> id, final int swIfIndex, final String ifcName, final L2 l2,
- final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Setting L2 for sub-interface: {}", ifcName);
- icWriterUtils.setInterconnection(id, swIfIndex, ifcName, l2.getInterconnection(), writeContext);
- }
-
- private void deleteL2(final InstanceIdentifier<L2> id, final int swIfIndex, final String ifcName, final L2 l2Before,
- final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Deleting L2 for sub-interface: {}", ifcName);
- icWriterUtils.deleteInterconnection(id, swIfIndex, ifcName, l2Before.getInterconnection(), writeContext);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/TapCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/TapCustomizer.java
deleted file mode 100644
index ef3fd32ff..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/TapCustomizer.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import io.fd.honeycomb.translate.vpp.util.AbstractInterfaceTypeCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.MacTranslator;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.TapConnect;
-import io.fd.vpp.jvpp.core.dto.TapConnectReply;
-import io.fd.vpp.jvpp.core.dto.TapDelete;
-import io.fd.vpp.jvpp.core.dto.TapDeleteReply;
-import io.fd.vpp.jvpp.core.dto.TapModify;
-import io.fd.vpp.jvpp.core.dto.TapModifyReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.Tap;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TapCustomizer extends AbstractInterfaceTypeCustomizer<Tap> implements MacTranslator, JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(TapCustomizer.class);
- private final NamingContext interfaceContext;
-
- public TapCustomizer(final FutureJVppCore vppApi, final NamingContext interfaceContext) {
- super(vppApi);
- this.interfaceContext = interfaceContext;
- }
-
- @Override
- protected Class<? extends InterfaceType> getExpectedInterfaceType() {
- return org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.Tap.class;
- }
-
- @Override
- protected final void writeInterface(@Nonnull final InstanceIdentifier<Tap> id, @Nonnull final Tap dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String ifcName = id.firstKeyOf(Interface.class).getName();
- createTap(id, ifcName, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Tap> id, @Nonnull final Tap dataBefore,
- @Nonnull final Tap dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String ifcName = id.firstKeyOf(Interface.class).getName();
-
- final int index;
- try {
- index = interfaceContext.getIndex(ifcName, writeContext.getMappingContext());
- } catch (IllegalArgumentException e) {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, e);
- }
-
- modifyTap(id, ifcName, index, dataBefore, dataAfter);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Tap> id, @Nonnull final Tap dataBefore,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String ifcName = id.firstKeyOf(Interface.class).getName();
-
- final int index;
- try {
- index = interfaceContext.getIndex(ifcName, writeContext.getMappingContext());
- } catch (IllegalArgumentException e) {
- throw new WriteFailedException.DeleteFailedException(id, e);
- }
-
- deleteTap(id, ifcName, index, dataBefore, writeContext);
- }
-
- private void createTap(final InstanceIdentifier<Tap> id, final String swIfName, final Tap tap,
- final WriteContext writeContext) throws WriteFailedException {
- LOG.debug("Setting tap interface: {}. Tap: {}", swIfName, tap);
- final CompletionStage<TapConnectReply> tapConnectFuture = getFutureJVpp()
- .tapConnect(getTapConnectRequest(tap.getTapName(), tap.getMac(), tap.getDeviceInstance()));
- final TapConnectReply reply = getReplyForCreate(tapConnectFuture.toCompletableFuture(), id, tap);
- LOG.debug("Tap set successfully for: {}, tap: {}", swIfName, tap);
- // Add new interface to our interface context
- interfaceContext.addName(reply.swIfIndex, swIfName, writeContext.getMappingContext());
- }
-
- private void modifyTap(final InstanceIdentifier<Tap> id, final String swIfName, final int index,
- final Tap tapBefore, final Tap tapAfter) throws WriteFailedException {
- LOG.debug("Modifying tap interface: {}. Tap: {}", swIfName, tapAfter);
- final CompletionStage<TapModifyReply> vxlanAddDelTunnelReplyCompletionStage =
- getFutureJVpp()
- .tapModify(getTapModifyRequest(tapAfter.getTapName(), index, tapAfter.getMac(),
- tapAfter.getDeviceInstance()));
- getReplyForUpdate(vxlanAddDelTunnelReplyCompletionStage.toCompletableFuture(), id, tapBefore, tapAfter);
- LOG.debug("Tap modified successfully for: {}, tap: {}", swIfName, tapAfter);
- }
-
- private void deleteTap(final InstanceIdentifier<Tap> id, final String swIfName, final int index,
- final Tap dataBefore, final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Deleting tap interface: {}. Tap: {}", swIfName, dataBefore);
- final CompletionStage<TapDeleteReply> vxlanAddDelTunnelReplyCompletionStage =
- getFutureJVpp().tapDelete(getTapDeleteRequest(index));
- getReplyForDelete(vxlanAddDelTunnelReplyCompletionStage.toCompletableFuture(), id);
- LOG.debug("Tap deleted successfully for: {}, tap: {}", swIfName, dataBefore);
- // Remove deleted interface from interface context
- interfaceContext.removeName(swIfName, writeContext.getMappingContext());
- }
-
- private TapConnect getTapConnectRequest(final String tapName, final PhysAddress mac, final Long deviceInstance) {
- final TapConnect tapConnect = new TapConnect();
- tapConnect.tapName = tapName.getBytes();
-
- if (mac == null) {
- tapConnect.useRandomMac = 1;
- tapConnect.macAddress = new byte[6];
- } else {
- tapConnect.useRandomMac = 0;
- tapConnect.macAddress = parseMac(mac.getValue());
- }
-
- if (deviceInstance == null) {
- tapConnect.renumber = 0;
- } else {
- tapConnect.renumber = 1;
- tapConnect.customDevInstance = Math.toIntExact(deviceInstance);
- }
-
- return tapConnect;
- }
-
- private TapModify getTapModifyRequest(final String tapName, final int swIndex, final PhysAddress mac,
- final Long deviceInstance) {
- final TapModify tapConnect = new TapModify();
- tapConnect.tapName = tapName.getBytes();
- tapConnect.swIfIndex = swIndex;
-
- if (mac == null) {
- tapConnect.useRandomMac = 1;
- tapConnect.macAddress = new byte[6];
- } else {
- tapConnect.useRandomMac = 0;
- tapConnect.macAddress = parseMac(mac.getValue());
- }
-
- if (deviceInstance == null) {
- tapConnect.renumber = 0;
- } else {
- tapConnect.renumber = 1;
- tapConnect.customDevInstance = Math.toIntExact(deviceInstance);
- }
-
- return tapConnect;
- }
-
- private TapDelete getTapDeleteRequest(final int swIndex) {
- final TapDelete tapConnect = new TapDelete();
- tapConnect.swIfIndex = swIndex;
- return tapConnect;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VhostUserCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VhostUserCustomizer.java
deleted file mode 100644
index 4f834c239..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VhostUserCustomizer.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import com.google.common.base.Preconditions;
-import io.fd.honeycomb.translate.vpp.util.AbstractInterfaceTypeCustomizer;
-import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.CreateVhostUserIf;
-import io.fd.vpp.jvpp.core.dto.CreateVhostUserIfReply;
-import io.fd.vpp.jvpp.core.dto.DeleteVhostUserIf;
-import io.fd.vpp.jvpp.core.dto.DeleteVhostUserIfReply;
-import io.fd.vpp.jvpp.core.dto.ModifyVhostUserIf;
-import io.fd.vpp.jvpp.core.dto.ModifyVhostUserIfReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VhostUserRole;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.VhostUser;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Writer Customizer responsible for passing vhost user interface CRD operations to VPP
- */
-public class VhostUserCustomizer extends AbstractInterfaceTypeCustomizer<VhostUser>
- implements ByteDataTranslator, JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(VhostUserCustomizer.class);
- private final NamingContext interfaceContext;
-
- public VhostUserCustomizer(@Nonnull final FutureJVppCore vppApi, @Nonnull final NamingContext interfaceContext) {
- super(vppApi);
- this.interfaceContext = Preconditions.checkNotNull(interfaceContext, "interfaceContext should not be null");
- }
-
- @Override
- protected Class<? extends InterfaceType> getExpectedInterfaceType() {
- return org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VhostUser.class;
- }
-
- @Override
- protected final void writeInterface(@Nonnull final InstanceIdentifier<VhostUser> id,
- @Nonnull final VhostUser dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- createVhostUserIf(id, swIfName, dataAfter, writeContext);
- }
-
- private void createVhostUserIf(final InstanceIdentifier<VhostUser> id, final String swIfName,
- final VhostUser vhostUser, final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Creating vhost user interface: name={}, vhostUser={}", swIfName, vhostUser);
-
- final CompletionStage<CreateVhostUserIfReply> createVhostUserIfReplyCompletionStage =
- getFutureJVpp().createVhostUserIf(getCreateVhostUserIfRequest(vhostUser));
- final CreateVhostUserIfReply reply =
- getReplyForCreate(createVhostUserIfReplyCompletionStage.toCompletableFuture(), id, vhostUser);
- LOG.debug("Vhost user interface created successfully for: {}, vhostUser: {}", swIfName, vhostUser);
- // Add new interface to our interface context
- interfaceContext.addName(reply.swIfIndex, swIfName, writeContext.getMappingContext());
- }
-
- private CreateVhostUserIf getCreateVhostUserIfRequest(final VhostUser vhostUser) {
- CreateVhostUserIf request = new CreateVhostUserIf();
- request.isServer = booleanToByte(VhostUserRole.Server.equals(vhostUser.getRole()));
- request.sockFilename = vhostUser.getSocket().getBytes();
- // TODO HONEYCOMB-177 expose device instance attribute just like for TAP
- request.renumber = 0;
- request.customDevInstance = 0;
- request.useCustomMac = 0;
- request.macAddress = new byte[]{};
- return request;
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<VhostUser> id,
- @Nonnull final VhostUser dataBefore, @Nonnull final VhostUser dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- modifyVhostUserIf(id, swIfName, dataBefore, dataAfter, writeContext);
- }
-
- private void modifyVhostUserIf(final InstanceIdentifier<VhostUser> id, final String swIfName,
- final VhostUser vhostUserBefore, final VhostUser vhostUserAfter,
- final WriteContext writeContext) throws WriteFailedException {
- LOG.debug("Updating vhost user interface: name={}, vhostUser={}", swIfName, vhostUserAfter);
- final CompletionStage<ModifyVhostUserIfReply> modifyVhostUserIfReplyCompletionStage =
- getFutureJVpp()
- .modifyVhostUserIf(getModifyVhostUserIfRequest(vhostUserAfter,
- interfaceContext.getIndex(swIfName, writeContext.getMappingContext())));
-
- getReplyForUpdate(modifyVhostUserIfReplyCompletionStage.toCompletableFuture(), id, vhostUserBefore,
- vhostUserAfter);
- LOG.debug("Vhost user interface updated successfully for: {}, vhostUser: {}", swIfName, vhostUserAfter);
- }
-
- private ModifyVhostUserIf getModifyVhostUserIfRequest(final VhostUser vhostUser, final int swIfIndex) {
- ModifyVhostUserIf request = new ModifyVhostUserIf();
- request.isServer = booleanToByte(VhostUserRole.Server.equals(vhostUser.getRole()));
- request.sockFilename = vhostUser.getSocket().getBytes();
- // TODO HONEYCOMB-177
- request.renumber = 0;
- request.customDevInstance = 0;
- request.swIfIndex = swIfIndex;
- return request;
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<VhostUser> id,
- @Nonnull final VhostUser dataBefore, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- deleteVhostUserIf(id, swIfName, dataBefore, writeContext);
- }
-
- private void deleteVhostUserIf(final InstanceIdentifier<VhostUser> id, final String swIfName,
- final VhostUser vhostUser, final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Deleting vhost user interface: name={}, vhostUser={}", swIfName, vhostUser);
- final CompletionStage<DeleteVhostUserIfReply> deleteVhostUserIfReplyCompletionStage =
- getFutureJVpp().deleteVhostUserIf(getDeleteVhostUserIfRequest(
- interfaceContext.getIndex(swIfName, writeContext.getMappingContext())));
-
- getReplyForDelete(deleteVhostUserIfReplyCompletionStage.toCompletableFuture(), id);
- LOG.debug("Vhost user interface deleted successfully for: {}, vhostUser: {}", swIfName, vhostUser);
- // Remove interface from our interface context
- interfaceContext.removeName(swIfName, writeContext.getMappingContext());
- }
-
- private DeleteVhostUserIf getDeleteVhostUserIfRequest(final int swIfIndex) {
- DeleteVhostUserIf request = new DeleteVhostUserIf();
- request.swIfIndex = swIfIndex;
- return request;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VxlanCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VxlanCustomizer.java
deleted file mode 100644
index 4248a1f1c..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VxlanCustomizer.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.net.InetAddresses;
-import io.fd.honeycomb.translate.v3po.DisabledInterfacesManager;
-import io.fd.honeycomb.translate.vpp.util.AbstractInterfaceTypeCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.VxlanAddDelTunnel;
-import io.fd.vpp.jvpp.core.dto.VxlanAddDelTunnelReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.net.InetAddress;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VxlanTunnel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.Vxlan;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class VxlanCustomizer extends AbstractInterfaceTypeCustomizer<Vxlan> implements JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(VxlanCustomizer.class);
-
- private final NamingContext interfaceNamingContext;
- private final DisabledInterfacesManager interfaceDisableContext;
-
- public VxlanCustomizer(@Nonnull final FutureJVppCore vppApi,
- @Nonnull final NamingContext interfaceNamingContext,
- @Nonnull final DisabledInterfacesManager interfaceDisableContext) {
- super(vppApi);
- this.interfaceNamingContext = interfaceNamingContext;
- this.interfaceDisableContext = interfaceDisableContext;
- }
-
- @Override
- protected Class<? extends InterfaceType> getExpectedInterfaceType() {
- return VxlanTunnel.class;
- }
-
- @Override
- protected final void writeInterface(@Nonnull final InstanceIdentifier<Vxlan> id, @Nonnull final Vxlan dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- createVxlanTunnel(id, swIfName, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Vxlan> id, @Nonnull final Vxlan dataBefore,
- @Nonnull final Vxlan dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException.UpdateFailedException {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter,
- new UnsupportedOperationException("Vxlan tunnel update is not supported"));
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Vxlan> id, @Nonnull final Vxlan dataBefore,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- deleteVxlanTunnel(id, swIfName, dataBefore, writeContext);
- }
-
- private void createVxlanTunnel(final InstanceIdentifier<Vxlan> id, final String swIfName, final Vxlan vxlan,
- final WriteContext writeContext)
- throws WriteFailedException {
- final byte isIpv6 = (byte) (isIpv6(vxlan)
- ? 1
- : 0);
- final InetAddress srcAddress = InetAddresses.forString(getAddressString(vxlan.getSrc()));
- final InetAddress dstAddress = InetAddresses.forString(getAddressString(vxlan.getDst()));
-
- int encapVrfId = vxlan.getEncapVrfId().intValue();
- int vni = vxlan.getVni().getValue().intValue();
-
- LOG.debug("Setting vxlan tunnel for interface: {}. Vxlan: {}", swIfName, vxlan);
- final CompletionStage<VxlanAddDelTunnelReply> vxlanAddDelTunnelReplyCompletionStage =
- getFutureJVpp().vxlanAddDelTunnel(getVxlanTunnelRequest((byte) 1 /* is add */, srcAddress.getAddress(),
- dstAddress.getAddress(), encapVrfId, -1, vni, isIpv6));
-
- final VxlanAddDelTunnelReply reply =
- getReplyForCreate(vxlanAddDelTunnelReplyCompletionStage.toCompletableFuture(), id, vxlan);
- LOG.debug("Vxlan tunnel set successfully for: {}, vxlan: {}", swIfName, vxlan);
- if (interfaceNamingContext.containsName(reply.swIfIndex, writeContext.getMappingContext())) {
- // VPP keeps vxlan tunnels present even after they are delete(reserving ID for next tunnel)
- // This may cause inconsistencies in mapping context when configuring tunnels like this:
- // 1. Add tunnel 2. Delete tunnel 3. Read interfaces (reserved mapping e.g. vxlan_tunnel0 -> 6
- // will get into mapping context) 4. Add tunnel (this will add another mapping with the same
- // reserved ID and context is invalid)
- // That's why a check has to be performed here removing mapping vxlan_tunnel0 -> 6 mapping and storing
- // new name for that ID
- final String formerName = interfaceNamingContext.getName(reply.swIfIndex, writeContext.getMappingContext());
- LOG.debug("Removing updated mapping of a vxlan tunnel, id: {}, former name: {}, new name: {}",
- reply.swIfIndex, formerName, swIfName);
- interfaceNamingContext.removeName(formerName, writeContext.getMappingContext());
-
- }
-
- // Removing disability of an interface in case a vxlan tunnel formerly deleted is being reused in VPP
- // further details in above comment
- if (interfaceDisableContext.isInterfaceDisabled(reply.swIfIndex, writeContext.getMappingContext())) {
- LOG.debug("Removing disability of vxlan tunnel, id: {}, name: {}", reply.swIfIndex, swIfName);
- interfaceDisableContext.removeDisabledInterface(reply.swIfIndex, writeContext.getMappingContext());
- }
-
- // Add new interface to our interface context
- interfaceNamingContext.addName(reply.swIfIndex, swIfName, writeContext.getMappingContext());
- }
-
- private boolean isIpv6(final Vxlan vxlan) {
- if (vxlan.getSrc().getIpv4Address() == null) {
- checkArgument(vxlan.getDst().getIpv4Address() == null, "Inconsistent ip addresses: %s, %s", vxlan.getSrc(),
- vxlan.getDst());
- return true;
- } else {
- checkArgument(vxlan.getDst().getIpv6Address() == null, "Inconsistent ip addresses: %s, %s", vxlan.getSrc(),
- vxlan.getDst());
- return false;
- }
- }
-
- private String getAddressString(final IpAddress addr) {
- return addr.getIpv4Address() == null
- ? addr.getIpv6Address().getValue()
- : addr.getIpv4Address().getValue();
- }
-
- private void deleteVxlanTunnel(final InstanceIdentifier<Vxlan> id, final String swIfName, final Vxlan vxlan,
- final WriteContext writeContext) throws WriteFailedException {
- final byte isIpv6 = (byte) (isIpv6(vxlan)
- ? 1
- : 0);
- final InetAddress srcAddress = InetAddresses.forString(getAddressString(vxlan.getSrc()));
- final InetAddress dstAddress = InetAddresses.forString(getAddressString(vxlan.getDst()));
-
- int encapVrfId = vxlan.getEncapVrfId().intValue();
- int vni = vxlan.getVni().getValue().intValue();
-
- LOG.debug("Deleting vxlan tunnel for interface: {}. Vxlan: {}", swIfName, vxlan);
- final CompletionStage<VxlanAddDelTunnelReply> vxlanAddDelTunnelReplyCompletionStage =
- getFutureJVpp().vxlanAddDelTunnel(getVxlanTunnelRequest((byte) 0 /* is add */, srcAddress.getAddress(),
- dstAddress.getAddress(), encapVrfId, -1, vni, isIpv6));
-
- getReplyForDelete(vxlanAddDelTunnelReplyCompletionStage.toCompletableFuture(), id);
- LOG.debug("Vxlan tunnel deleted successfully for: {}, vxlan: {}", swIfName, vxlan);
-
- final int index = interfaceNamingContext.getIndex(swIfName, writeContext.getMappingContext());
- // Mark this interface as disabled to not include it in operational reads
- // because VPP will keep the interface there
- LOG.debug("Marking vxlan tunnel as disabled, id: {}, name: {}", index, swIfName);
- interfaceDisableContext.disableInterface(index, writeContext.getMappingContext());
- // Remove interface from our interface naming context
- interfaceNamingContext.removeName(swIfName, writeContext.getMappingContext());
- }
-
- private static VxlanAddDelTunnel getVxlanTunnelRequest(final byte isAdd, final byte[] srcAddr, final byte[] dstAddr,
- final int encapVrfId,
- final int decapNextIndex, final int vni, final byte isIpv6) {
- final VxlanAddDelTunnel vxlanAddDelTunnel = new VxlanAddDelTunnel();
- vxlanAddDelTunnel.isAdd = isAdd;
- vxlanAddDelTunnel.srcAddress = srcAddr;
- vxlanAddDelTunnel.dstAddress = dstAddr;
- vxlanAddDelTunnel.encapVrfId = encapVrfId;
- vxlanAddDelTunnel.vni = vni;
- vxlanAddDelTunnel.decapNextIndex = decapNextIndex;
- vxlanAddDelTunnel.isIpv6 = isIpv6;
- return vxlanAddDelTunnel;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VxlanGpeCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VxlanGpeCustomizer.java
deleted file mode 100644
index 3e1891e0f..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/VxlanGpeCustomizer.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * 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.translate.v3po.interfaces;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.net.InetAddresses;
-import io.fd.honeycomb.translate.v3po.DisabledInterfacesManager;
-import io.fd.honeycomb.translate.vpp.util.AbstractInterfaceTypeCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.VxlanGpeAddDelTunnel;
-import io.fd.vpp.jvpp.core.dto.VxlanGpeAddDelTunnelReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.net.InetAddress;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VxlanGpeTunnel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.VxlanGpe;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class VxlanGpeCustomizer extends AbstractInterfaceTypeCustomizer<VxlanGpe> implements JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(VxlanGpeCustomizer.class);
- private final NamingContext interfaceNamingContext;
- private final DisabledInterfacesManager interfaceDisableContext;
-
- public VxlanGpeCustomizer(@Nonnull final FutureJVppCore vppApi,
- @Nonnull final NamingContext interfaceNamingContext,
- @Nonnull final DisabledInterfacesManager interfaceDisableContext) {
- super(vppApi);
- this.interfaceNamingContext = interfaceNamingContext;
- this.interfaceDisableContext = interfaceDisableContext;
- }
-
- @Override
- protected Class<? extends InterfaceType> getExpectedInterfaceType() {
- return VxlanGpeTunnel.class;
- }
-
- @Override
- protected final void writeInterface(@Nonnull final InstanceIdentifier<VxlanGpe> id,
- @Nonnull final VxlanGpe dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- createVxlanGpeTunnel(id, swIfName, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<VxlanGpe> id,
- @Nonnull final VxlanGpe dataBefore,
- @Nonnull final VxlanGpe dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException.UpdateFailedException {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter,
- new UnsupportedOperationException("VxlanGpe tunnel update is not supported"));
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<VxlanGpe> id,
- @Nonnull final VxlanGpe dataBefore,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String swIfName = id.firstKeyOf(Interface.class).getName();
- deleteVxlanGpeTunnel(id, swIfName, dataBefore, writeContext);
- }
-
- private void createVxlanGpeTunnel(final InstanceIdentifier<VxlanGpe> id, final String swIfName,
- final VxlanGpe vxlanGpe, final WriteContext writeContext)
- throws WriteFailedException {
- final byte isIpv6 = (byte) (isIpv6(vxlanGpe)
- ? 1
- : 0);
- final InetAddress Local = InetAddresses.forString(getAddressString(vxlanGpe.getLocal()));
- final InetAddress Remote = InetAddresses.forString(getAddressString(vxlanGpe.getRemote()));
-
- int vni = vxlanGpe.getVni().getValue().intValue();
- byte protocol = (byte) vxlanGpe.getNextProtocol().getIntValue();
- int encapVrfId = vxlanGpe.getEncapVrfId().intValue();
- int decapVrfId = vxlanGpe.getDecapVrfId().intValue();
-
- LOG.debug("Setting VxlanGpe tunnel for interface: {}. VxlanGpe: {}", swIfName, vxlanGpe);
- final CompletionStage<VxlanGpeAddDelTunnelReply> VxlanGpeAddDelTunnelReplyCompletionStage =
- getFutureJVpp().vxlanGpeAddDelTunnel(getVxlanGpeTunnelRequest((byte) 1 /* is add */, Local.getAddress(),
- Remote.getAddress(), vni, protocol, encapVrfId, decapVrfId, isIpv6));
-
- final VxlanGpeAddDelTunnelReply reply =
- getReplyForCreate(VxlanGpeAddDelTunnelReplyCompletionStage.toCompletableFuture(), id, vxlanGpe);
- LOG.debug("VxlanGpe tunnel set successfully for: {}, VxlanGpe: {}", swIfName, vxlanGpe);
- if (interfaceNamingContext.containsName(reply.swIfIndex, writeContext.getMappingContext())) {
- final String formerName = interfaceNamingContext.getName(reply.swIfIndex, writeContext.getMappingContext());
- LOG.debug("Removing updated mapping of a vxlan-gpe tunnel, id: {}, former name: {}, new name: {}",
- reply.swIfIndex, formerName, swIfName);
- interfaceNamingContext.removeName(formerName, writeContext.getMappingContext());
- }
-
- // Removing disability of an interface in case a vxlan-gpe tunnel formerly deleted is being reused in VPP
- // further details in above comment
- if (interfaceDisableContext.isInterfaceDisabled(reply.swIfIndex, writeContext.getMappingContext())) {
- LOG.debug("Removing disability of vxlan tunnel, id: {}, name: {}", reply.swIfIndex, swIfName);
- interfaceDisableContext.removeDisabledInterface(reply.swIfIndex, writeContext.getMappingContext());
- }
-
- // Add new interface to our interface context
- interfaceNamingContext.addName(reply.swIfIndex, swIfName, writeContext.getMappingContext());
- }
-
- private boolean isIpv6(final VxlanGpe vxlanGpe) {
- if (vxlanGpe.getLocal().getIpv4Address() == null) {
- checkArgument(vxlanGpe.getRemote().getIpv4Address() == null, "Inconsistent ip addresses: %s, %s",
- vxlanGpe.getLocal(),
- vxlanGpe.getRemote());
- return true;
- } else {
- checkArgument(vxlanGpe.getRemote().getIpv6Address() == null, "Inconsistent ip addresses: %s, %s",
- vxlanGpe.getLocal(),
- vxlanGpe.getRemote());
- return false;
- }
- }
-
- private String getAddressString(final IpAddress addr) {
- return addr.getIpv4Address() == null
- ? addr.getIpv6Address().getValue()
- : addr.getIpv4Address().getValue();
- }
-
- private void deleteVxlanGpeTunnel(final InstanceIdentifier<VxlanGpe> id, final String swIfName,
- final VxlanGpe vxlanGpe, final WriteContext writeContext)
- throws WriteFailedException {
- final byte isIpv6 = (byte) (isIpv6(vxlanGpe)
- ? 1
- : 0);
- final InetAddress local = InetAddresses.forString(getAddressString(vxlanGpe.getLocal()));
- final InetAddress remote = InetAddresses.forString(getAddressString(vxlanGpe.getRemote()));
-
- int vni = vxlanGpe.getVni().getValue().intValue();
- byte protocol = (byte) vxlanGpe.getNextProtocol().getIntValue();
- int encapVrfId = vxlanGpe.getEncapVrfId().intValue();
- int decapVrfId = vxlanGpe.getDecapVrfId().intValue();
-
- LOG.debug("Deleting VxlanGpe tunnel for interface: {}. VxlanGpe: {}", swIfName, vxlanGpe);
- final CompletionStage<VxlanGpeAddDelTunnelReply> VxlanGpeAddDelTunnelReplyCompletionStage =
- getFutureJVpp()
- .vxlanGpeAddDelTunnel(getVxlanGpeTunnelRequest((byte) 0 /* is delete */, local.getAddress(),
- remote.getAddress(), vni, protocol, encapVrfId, decapVrfId, isIpv6));
- getReplyForDelete(VxlanGpeAddDelTunnelReplyCompletionStage.toCompletableFuture(), id);
- final int index = interfaceNamingContext.getIndex(swIfName, writeContext.getMappingContext());
- // Mark this interface as disabled to not include it in operational reads
- // because VPP will keep the interface there
- LOG.debug("Marking vxlan tunnel as disabled, id: {}, name: {}", index, swIfName);
- interfaceDisableContext.disableInterface(index, writeContext.getMappingContext());
- // Remove interface from our interface naming context
- interfaceNamingContext.removeName(swIfName, writeContext.getMappingContext());
- }
-
- private static VxlanGpeAddDelTunnel getVxlanGpeTunnelRequest(final byte isAdd, final byte[] local,
- final byte[] remote,
- final int vni, final byte protocol,
- final int encapVrfId, final int decapVrfId,
- final byte isIpv6) {
- final VxlanGpeAddDelTunnel VxlanGpeAddDelTunnel = new VxlanGpeAddDelTunnel();
- VxlanGpeAddDelTunnel.isAdd = isAdd;
- VxlanGpeAddDelTunnel.local = local;
- VxlanGpeAddDelTunnel.remote = remote;
- VxlanGpeAddDelTunnel.vni = vni;
- VxlanGpeAddDelTunnel.protocol = protocol;
- VxlanGpeAddDelTunnel.encapVrfId = encapVrfId;
- VxlanGpeAddDelTunnel.decapVrfId = decapVrfId;
- VxlanGpeAddDelTunnel.isIpv6 = isIpv6;
- return VxlanGpeAddDelTunnel;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/IetfAclWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/IetfAclWriter.java
deleted file mode 100644
index e46f53ebf..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/IetfAclWriter.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl;
-
-import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import java.util.Optional;
-import java.util.stream.Stream;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.AccessLists;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.AclBase;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.AclKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.VppInterfaceAugmentation;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Writer customizer responsible for Access Control Lists management. Does not send any messages to VPP. All the config
- * data are stored in HC and used when acl is assigned/unassigned to/from an interface.
- *
- * ACLs that are currently assigned to an interface cannot be updated/deleted.
- */
-public class IetfAclWriter implements ListWriterCustomizer<Acl, AclKey> {
-
- public static final InstanceIdentifier<AccessLists> ACL_ID =
- InstanceIdentifier.create(AccessLists.class);
-
- private static final Logger LOG = LoggerFactory.getLogger(IetfAclWriter.class);
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Acl> id, @Nonnull final Acl dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- LOG.debug("Creating ACL: iid={} dataAfter={}", id, dataAfter);
-
- // no vpp call, just updates DataTree
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Acl> id, @Nonnull final Acl dataBefore,
- @Nonnull final Acl dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Updating ACL: iid={} dataBefore={} dataAfter={}", id, dataBefore, dataAfter);
-
- if (isAssigned(dataAfter, writeContext)) {
- throw new WriteFailedException(id,
- String.format("Failed to update data at %s: acl %s is already assigned", id, dataAfter));
- }
-
- LOG.debug("Updating unassigned ACL: iid={} dataBefore={} dataAfter={}", id, dataBefore, dataAfter);
-
- // no vpp call, just updates DataTree
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Acl> id, @Nonnull final Acl dataBefore,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- LOG.debug("Deleting ACL: iid={} dataBefore={}", id, dataBefore);
-
- if (isAssigned(dataBefore, writeContext)) {
- throw new WriteFailedException(id,
- String.format("Failed to delete data at %s: acl %s is already assigned", id, dataBefore));
- }
-
- LOG.debug("Deleting unassigned ACL: iid={} dataBefore={}", id, dataBefore);
-
- // no vpp call, just updates DataTree
- }
-
- private static boolean isAssigned(@Nonnull final Acl acl,
- @Nonnull final WriteContext writeContext) {
- final String aclName = acl.getAclName();
- final Class<? extends AclBase> aclType = acl.getAclType();
- final Interfaces interfaces = writeContext.readAfter(InstanceIdentifier.create(Interfaces.class)).get();
-
- return interfaces.getInterface().stream()
- .map(i -> Optional.ofNullable(i.getAugmentation(VppInterfaceAugmentation.class))
- .map(aug -> aug.getIetfAcl())
- .map(ietfAcl -> ietfAcl.getIngress())
- .map(ingress -> ingress.getAccessLists())
- .map(accessLists -> accessLists.getAcl())
- )
- .flatMap(iacl -> iacl.isPresent()
- ? iacl.get().stream()
- : Stream.empty())
- .filter(assignedAcl -> aclName.equals(assignedAcl.getName()) && aclType.equals(assignedAcl.getType()))
- .findFirst().isPresent();
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AbstractIetfAclWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AbstractIetfAclWriter.java
deleted file mode 100644
index 347397aa3..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AbstractIetfAclWriter.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSessionReply;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTableReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.concurrent.CompletionStage;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.AclBase;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.AclKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.AccessListEntries;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.AceType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.AceEth;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIp;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.AceIpVersion;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv6;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.mapping.table.MappingEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIpAndEth;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.AccessLists;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.access.lists.Acl;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class AbstractIetfAclWriter implements IetfAclWriter, JvppReplyConsumer, AclTranslator {
-
- private static final Logger LOG = LoggerFactory.getLogger(AbstractIetfAclWriter.class);
- protected static final int NOT_DEFINED = -1;
- protected final FutureJVppCore jvpp;
-
- private Map<AclType, AceWriter<? extends AceType>> aceWriters = new HashMap<>();
-
- public AbstractIetfAclWriter(@Nonnull final FutureJVppCore futureJVppCore) {
- this.jvpp = Preconditions.checkNotNull(futureJVppCore, "futureJVppCore should not be null");
- aceWriters.put(AclType.ETH, new AceEthWriter());
- aceWriters.put(AclType.IP4, new AceIp4Writer());
- aceWriters.put(AclType.IP6, new AceIp6Writer());
- aceWriters.put(AclType.ETH_AND_IP, new AceIpAndEthWriter());
- }
-
- private static Stream<Ace> aclToAceStream(@Nonnull final Acl assignedAcl,
- @Nonnull final WriteContext writeContext) {
- final String aclName = assignedAcl.getName();
- final Class<? extends AclBase> aclType = assignedAcl.getType();
-
- // ietf-acl updates are handled first, so we use writeContext.readAfter
- final Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl>
- aclOptional =
- writeContext.readAfter(io.fd.honeycomb.translate.v3po.interfaces.acl.IetfAclWriter.ACL_ID.child(
- org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl.class,
- new AclKey(aclName, aclType)));
- checkArgument(aclOptional.isPresent(), "Acl lists not configured");
- final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl
- acl = aclOptional.get();
-
- final AccessListEntries accessListEntries = acl.getAccessListEntries();
- checkArgument(accessListEntries != null, "access list entries not configured");
-
- return accessListEntries.getAce().stream();
- }
-
- protected void removeClassifyTables(@Nonnull final InstanceIdentifier<?> id, @Nonnull final MappingEntry entry)
- throws WriteFailedException {
- removeClassifyTable(id, entry.getL2TableId());
- removeClassifyTable(id, entry.getIp4TableId());
- removeClassifyTable(id, entry.getIp6TableId());
- }
-
- private void removeClassifyTable(@Nonnull final InstanceIdentifier<?> id, final int tableIndex)
- throws WriteFailedException {
-
- if (tableIndex == -1) {
- return; // classify table id is absent
- }
- final ClassifyAddDelTable request = new ClassifyAddDelTable();
- request.tableIndex = tableIndex;
- final CompletionStage<ClassifyAddDelTableReply> cs = jvpp.classifyAddDelTable(request);
- getReplyForDelete(cs.toCompletableFuture(), id);
- }
-
- protected static boolean appliesToIp4Path(final Ace ace) {
- final AceType aceType = ace.getMatches().getAceType();
- final AclType aclType = AclType.fromAce(ace);
- if (aclType == AclType.IP4) {
- return true;
- }
- if (aclType == AclType.ETH) {
- return true; // L2 only rules are possible for IP4 traffic
- }
- if (aclType == AclType.ETH_AND_IP && ((AceIpAndEth) aceType)
- .getAceIpVersion() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.and.eth.ace.ip.version.AceIpv4) {
- return true;
- }
- return false;
- }
-
- protected static boolean appliesToIp6Path(final Ace ace) {
- final AceType aceType = ace.getMatches().getAceType();
- final AclType aclType = AclType.fromAce(ace);
- if (aclType == AclType.IP6) {
- return true;
- }
- if (aclType == AclType.ETH) {
- return true; // L2 only rules are possible for IP6 traffic
- }
- if (aclType == AclType.ETH_AND_IP && ((AceIpAndEth) aceType)
- .getAceIpVersion() instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.and.eth.ace.ip.version.AceIpv6) {
- return true;
- }
- return false;
- }
-
- protected static List<Ace> getACEs(@Nonnull final List<Acl> acls, @Nonnull final WriteContext writeContext,
- final Predicate<? super Ace> filter) {
- return acls.stream().flatMap(acl -> aclToAceStream(acl, writeContext)).filter(filter)
- .collect(Collectors.toList());
- }
-
- protected int writeAces(final InstanceIdentifier<?> id, final List<Ace> aces,
- final AccessLists.DefaultAction defaultAction, final InterfaceMode mode,
- final int vlanTags) throws WriteFailedException {
- if (aces.isEmpty()) {
- return NOT_DEFINED;
- }
-
- int nextTableIndex = configureDefaultAction(id, defaultAction);
- final ListIterator<Ace> iterator = aces.listIterator(aces.size());
- while (iterator.hasPrevious()) {
- final Ace ace = iterator.previous();
- LOG.trace("Processing ACE: {}", ace);
-
- final AceWriter aceWriter =
- aceWriters.get(AclType.fromAce(ace));
- if (aceWriter == null) {
- LOG.warn("AceProcessor for {} not registered. Skipping ACE.", ace.getClass());
- } else {
- final AceType aceType = ace.getMatches().getAceType();
- final PacketHandling action = ace.getActions().getPacketHandling();
- final ClassifyAddDelTable ctRequest = aceWriter.createTable(aceType, mode, nextTableIndex, vlanTags);
- nextTableIndex = createClassifyTable(id, ctRequest);
- final List<ClassifyAddDelSession> sessionRequests =
- aceWriter.createSession(action, aceType, mode, nextTableIndex, vlanTags);
- for (ClassifyAddDelSession csRequest : sessionRequests) {
- createClassifySession(id, csRequest);
- }
- }
- }
- return nextTableIndex;
- }
-
- private int configureDefaultAction(@Nonnull final InstanceIdentifier<?> id,
- final AccessLists.DefaultAction defaultAction)
- throws WriteFailedException {
- ClassifyAddDelTable ctRequest = createTable(-1);
- if (AccessLists.DefaultAction.Permit.equals(defaultAction)) {
- ctRequest.missNextIndex = -1;
- } else {
- ctRequest.missNextIndex = 0;
- }
- ctRequest.mask = new byte[16];
- ctRequest.skipNVectors = 0;
- ctRequest.matchNVectors = 1;
- return createClassifyTable(id, ctRequest);
- }
-
- private int createClassifyTable(@Nonnull final InstanceIdentifier<?> id,
- @Nonnull final ClassifyAddDelTable request)
- throws WriteFailedException {
- final CompletionStage<ClassifyAddDelTableReply> cs = jvpp.classifyAddDelTable(request);
-
- final ClassifyAddDelTableReply reply = getReplyForWrite(cs.toCompletableFuture(), id);
- return reply.newTableIndex;
- }
-
- private void createClassifySession(@Nonnull final InstanceIdentifier<?> id,
- @Nonnull final ClassifyAddDelSession request)
- throws WriteFailedException {
- final CompletionStage<ClassifyAddDelSessionReply> cs = jvpp.classifyAddDelSession(request);
-
- getReplyForWrite(cs.toCompletableFuture(), id);
- }
-
- private enum AclType {
- ETH, IP4, IP6, ETH_AND_IP;
-
- @Nonnull
- private static AclType fromAce(final Ace ace) {
- AclType result = null;
- final AceType aceType;
- try {
- aceType = ace.getMatches().getAceType();
- if (aceType instanceof AceEth) {
- result = ETH;
- } else if (aceType instanceof AceIp) {
- final AceIpVersion aceIpVersion = ((AceIp) aceType).getAceIpVersion();
- if (aceIpVersion == null) {
- throw new IllegalArgumentException("Incomplete ACE (ip-version was not provided): " + ace);
- }
- if (aceIpVersion instanceof AceIpv4) {
- result = IP4;
- } else if (aceIpVersion instanceof AceIpv6) {
- result = IP6;
- }
- } else if (aceType instanceof AceIpAndEth) {
- result = ETH_AND_IP;
- }
- } catch (NullPointerException e) {
- throw new IllegalArgumentException("Incomplete ACE: " + ace, e);
- }
- if (result == null) {
- throw new IllegalArgumentException(String.format("Not supported ace type %s", aceType));
- }
- return result;
- }
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceEthWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceEthWriter.java
deleted file mode 100644
index 14124dcc7..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceEthWriter.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import com.google.common.annotations.VisibleForTesting;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import java.util.Collections;
-import java.util.List;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.AceEth;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-final class AceEthWriter implements AceWriter<AceEth>, AclTranslator, L2AclTranslator {
-
- @VisibleForTesting
- static final int MATCH_N_VECTORS = 1;
- private static final Logger LOG = LoggerFactory.getLogger(AceEthWriter.class);
-
- @Override
- public ClassifyAddDelTable createTable(@Nonnull final AceEth aceEth,
- @Nullable final InterfaceMode mode,
- final int nextTableIndex,
- final int vlanTags) {
- final ClassifyAddDelTable request = createTable(nextTableIndex);
-
- request.mask = new byte[16];
- boolean aceIsEmpty =
- destinationMacAddressMask(aceEth.getDestinationMacAddressMask(), aceEth.getDestinationMacAddress(),
- request);
- aceIsEmpty &=
- sourceMacAddressMask(aceEth.getSourceMacAddressMask(), aceEth.getSourceMacAddress(), request);
-
- if (aceIsEmpty) {
- throw new IllegalArgumentException(
- String.format("Ace %s does not define packet field match values", aceEth.toString()));
- }
-
- request.skipNVectors = 0;
- request.matchNVectors = MATCH_N_VECTORS;
-
- LOG.debug("ACE rule={} translated to table={}.", aceEth, request);
- return request;
- }
-
- @Override
- public List<ClassifyAddDelSession> createSession(@Nonnull final PacketHandling action,
- @Nonnull final AceEth aceEth,
- @Nullable final InterfaceMode mode,
- final int tableIndex,
- final int vlanTags) {
- final ClassifyAddDelSession request = createSession(action, tableIndex);
-
- request.match = new byte[16];
- boolean noMatch = destinationMacAddressMatch(aceEth.getDestinationMacAddress(), request);
- noMatch &= sourceMacAddressMatch(aceEth.getSourceMacAddress(), request);
-
- if (noMatch) {
- throw new IllegalArgumentException(
- String.format("Ace %s does not define neither source nor destination MAC address",
- aceEth.toString()));
- }
-
- LOG.debug("ACE action={}, rule={} translated to session={}.", action, aceEth, request);
- return Collections.singletonList(request);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIp4Writer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIp4Writer.java
deleted file mode 100644
index 7d75e3969..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIp4Writer.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.annotations.VisibleForTesting;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import java.util.ArrayList;
-import java.util.List;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIp;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-final class AceIp4Writer implements AceWriter<AceIp>, AclTranslator, Ip4AclTranslator {
-
- @VisibleForTesting
- static final int MATCH_N_VECTORS = 3; // number of 16B vectors
- private static final int TABLE_MASK_LENGTH = 48;
- private static final Logger LOG = LoggerFactory.getLogger(AceIp4Writer.class);
-
- @Override
- public ClassifyAddDelTable createTable(@Nonnull final AceIp aceIp,
- @Nullable final InterfaceMode mode,
- final int nextTableIndex,
- final int vlanTags) {
- checkArgument(aceIp.getAceIpVersion() instanceof AceIpv4, "Expected AceIpv4 version, but was %", aceIp);
- final AceIpv4 ipVersion = (AceIpv4) aceIp.getAceIpVersion();
-
- final int numberOfSessions = PortPair.fromRange(aceIp.getSourcePortRange(), aceIp.getDestinationPortRange()).size();
- final ClassifyAddDelTable request = createTable(nextTableIndex, numberOfSessions);
- request.skipNVectors = 0; // match entire L2 and L3 header
- request.matchNVectors = MATCH_N_VECTORS;
- request.mask = new byte[TABLE_MASK_LENGTH];
-
- final int baseOffset = getVlanTagsLen(vlanTags);
- boolean aceIsEmpty = ip4Mask(baseOffset, mode, aceIp, ipVersion, request);
- if (aceIsEmpty) {
- throw new IllegalArgumentException(
- String.format("Ace %s does not define packet field match values", aceIp.toString()));
- }
-
- LOG.debug("ACE rule={} translated to table={}.", aceIp, request);
- return request;
- }
-
- @Override
- public List<ClassifyAddDelSession> createSession(@Nonnull final PacketHandling action,
- @Nonnull final AceIp aceIp,
- @Nullable final InterfaceMode mode,
- final int tableIndex,
- final int vlanTags) {
- checkArgument(aceIp.getAceIpVersion() instanceof AceIpv4, "Expected AceIpv4 version, but was %", aceIp);
- final AceIpv4 ipVersion = (AceIpv4) aceIp.getAceIpVersion();
-
- final List<PortPair> portPairs = PortPair.fromRange(aceIp.getSourcePortRange(), aceIp.getDestinationPortRange());
- final List<ClassifyAddDelSession> requests = new ArrayList<>(portPairs.size());
- for (final PortPair pair : portPairs) {
- final ClassifyAddDelSession request = createSession(action, tableIndex);
- request.match = new byte[TABLE_MASK_LENGTH];
-
- final int baseOffset = getVlanTagsLen(vlanTags);
- boolean noMatch = ip4Match(baseOffset, mode, aceIp, ipVersion, pair.getSrc(), pair.getDst(), request);
- if (noMatch) {
- throw new IllegalArgumentException(
- String.format("Ace %s does not define packet field match values", aceIp.toString()));
- }
-
- LOG.debug("ACE action={}, rule={} translated to session={}.", action, aceIp, request);
- requests.add(request);
- }
- return requests;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIp6Writer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIp6Writer.java
deleted file mode 100644
index cad80022e..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIp6Writer.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import java.util.ArrayList;
-import java.util.List;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIp;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv6;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-final class AceIp6Writer implements AceWriter<AceIp>, AclTranslator, Ip6AclTranslator {
-
- private static final Logger LOG = LoggerFactory.getLogger(AceIp6Writer.class);
-
- @Override
- public ClassifyAddDelTable createTable(@Nonnull final AceIp aceIp,
- @Nullable final InterfaceMode mode,
- final int nextTableIndex,
- final int vlanTags) {
- checkArgument(aceIp.getAceIpVersion() instanceof AceIpv6, "Expected AceIpv6 version, but was %", aceIp);
- final AceIpv6 ipVersion = (AceIpv6) aceIp.getAceIpVersion();
-
- final int numberOfSessions = PortPair.fromRange(aceIp.getSourcePortRange(), aceIp.getDestinationPortRange()).size();
- final ClassifyAddDelTable request = createTable(nextTableIndex, numberOfSessions);
- request.skipNVectors = 0; // match entire L2 and L3 header
- request.mask = new byte[getTableMaskLength(vlanTags)];
- request.matchNVectors = request.mask.length/16;
-
- final int baseOffset = getVlanTagsLen(vlanTags);
- boolean aceIsEmpty = ip6Mask(baseOffset, mode, aceIp, ipVersion, request);
- if (aceIsEmpty) {
- throw new IllegalArgumentException(
- String.format("Ace %s does not define packet field match values", aceIp.toString()));
- }
-
- LOG.debug("ACE rule={} translated to table={}.", aceIp, request);
- return request;
- }
-
- private static int getTableMaskLength(final int vlanTags) {
- if (vlanTags == 2) {
- return 80;
- } else {
- return 64;
- }
- }
-
- @Override
- public List<ClassifyAddDelSession> createSession(@Nonnull final PacketHandling action,
- @Nonnull final AceIp aceIp,
- @Nullable final InterfaceMode mode,
- final int tableIndex,
- final int vlanTags) {
- checkArgument(aceIp.getAceIpVersion() instanceof AceIpv6, "Expected AceIpv6 version, but was %", aceIp);
- final AceIpv6 ipVersion = (AceIpv6) aceIp.getAceIpVersion();
- final List<PortPair> portPairs =
- PortPair.fromRange(aceIp.getSourcePortRange(), aceIp.getDestinationPortRange());
-
- final List<ClassifyAddDelSession> requests = new ArrayList<>(portPairs.size());
- for (final PortPair pair : portPairs) {
- final ClassifyAddDelSession request = createSession(action, tableIndex);
- request.match = new byte[getTableMaskLength(vlanTags)];
-
- final int baseOffset = getVlanTagsLen(vlanTags);
- boolean noMatch = ip6Match(baseOffset, mode, aceIp, ipVersion, pair.getSrc(), pair.getDst(), request);
- if (noMatch) {
- throw new IllegalArgumentException(
- String.format("Ace %s does not define packet field match values", aceIp.toString()));
- }
-
- LOG.debug("ACE action={}, rule={} translated to session={}.", action, aceIp, request);
- requests.add(request);
- }
- return requests;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIpAndEthWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIpAndEthWriter.java
deleted file mode 100644
index ca12cbe19..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceIpAndEthWriter.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import java.util.ArrayList;
-import java.util.List;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIpAndEth;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.and.eth.AceIpVersion;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.and.eth.ace.ip.version.AceIpv4;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.and.eth.ace.ip.version.AceIpv6;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class AceIpAndEthWriter
- implements AceWriter<AceIpAndEth>, AclTranslator, L2AclTranslator, Ip4AclTranslator, Ip6AclTranslator {
-
- private static final Logger LOG = LoggerFactory.getLogger(AceIpAndEthWriter.class);
-
- private static int maskLength(@Nonnull final AceIpAndEth ace, final int vlanTags) {
- if (ace.getAceIpVersion() != null) {
- if (ace.getAceIpVersion() instanceof AceIpv4) {
- return 48;
- } else {
- return vlanTags == 2
- ? 80
- : 64;
- }
- }
- return 16;
- }
-
- @Override
- public ClassifyAddDelTable createTable(@Nonnull final AceIpAndEth ace, @Nullable final InterfaceMode mode,
- final int nextTableIndex, final int vlanTags) {
- final int numberOfSessions = PortPair.fromRange(ace.getSourcePortRange(), ace.getDestinationPortRange()).size();
- final ClassifyAddDelTable request = createTable(nextTableIndex, numberOfSessions);
- final int maskLength = maskLength(ace, vlanTags);
- request.mask = new byte[maskLength];
- request.skipNVectors = 0;
- request.matchNVectors = maskLength / 16;
-
- boolean aceIsEmpty =
- destinationMacAddressMask(ace.getDestinationMacAddressMask(), ace.getDestinationMacAddress(), request);
- aceIsEmpty &= sourceMacAddressMask(ace.getSourceMacAddressMask(), ace.getSourceMacAddress(), request);
-
- // if we use classifier API, we need to know ip version (fields common for ip4 and ip6 have different offsets):
- final AceIpVersion aceIpVersion = ace.getAceIpVersion();
- checkArgument(aceIpVersion != null, "AceIpAndEth have to define IpVersion");
-
- final int baseOffset = getVlanTagsLen(vlanTags);
- if (aceIpVersion instanceof AceIpv4) {
- final AceIpv4 ipVersion = (AceIpv4) aceIpVersion;
- aceIsEmpty &= ip4Mask(baseOffset, mode, ace, ipVersion, request);
- } else if (aceIpVersion instanceof AceIpv6) {
- final AceIpv6 ipVersion = (AceIpv6) aceIpVersion;
- aceIsEmpty &= ip6Mask(baseOffset, mode, ace, ipVersion, request);
- } else {
- throw new IllegalArgumentException(String.format("Unsupported IP version %s", aceIpVersion));
- }
-
- if (aceIsEmpty) {
- throw new IllegalArgumentException(
- String.format("Ace %s does not define packet field match values", ace.toString()));
- }
-
- LOG.debug("ACE rule={} translated to table={}.", ace, request);
- return request;
- }
-
- @Override
- public List<ClassifyAddDelSession> createSession(@Nonnull final PacketHandling action,
- @Nonnull final AceIpAndEth ace,
- @Nullable final InterfaceMode mode, final int tableIndex,
- final int vlanTags) {
- final List<PortPair> portPairs = PortPair.fromRange(ace.getSourcePortRange(), ace.getDestinationPortRange());
- final List<ClassifyAddDelSession> requests = new ArrayList<>(portPairs.size());
- for (final PortPair pair : portPairs) {
- final ClassifyAddDelSession request = createSession(action, tableIndex);
- request.match = new byte[maskLength(ace, vlanTags)];
-
- boolean noMatch = destinationMacAddressMatch(ace.getDestinationMacAddress(), request);
- noMatch &= sourceMacAddressMatch(ace.getSourceMacAddress(), request);
-
- final AceIpVersion aceIpVersion = ace.getAceIpVersion();
- checkArgument(aceIpVersion != null, "AceIpAndEth have to define IpVersion");
-
- final int baseOffset = getVlanTagsLen(vlanTags);
- if (aceIpVersion instanceof AceIpv4) {
- final AceIpv4 ipVersion = (AceIpv4) aceIpVersion;
- noMatch &= ip4Match(baseOffset, mode, ace, ipVersion, pair.getSrc(), pair.getDst(), request);
- } else if (aceIpVersion instanceof AceIpv6) {
- final AceIpv6 ipVersion = (AceIpv6) aceIpVersion;
- noMatch &= ip6Match(baseOffset, mode, ace, ipVersion, pair.getSrc(), pair.getDst(), request);
- } else {
- throw new IllegalArgumentException(String.format("Unsupported IP version %s", aceIpVersion));
- }
-
- if (noMatch) {
- throw new IllegalArgumentException(
- String.format("Ace %s does not define packet field match values", ace.toString()));
- }
- LOG.debug("ACE action={}, rule={} translated to session={}.", action, ace, request);
- requests.add(request);
- }
- return requests;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceWriter.java
deleted file mode 100644
index ae540f94d..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AceWriter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import java.util.List;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.AceType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-
-/**
- * Writer responsible for translation of ietf-acl model ACEs to VPP's classify tables and sessions.
- *
- * @param <T> type of access control list entry
- */
-interface AceWriter<T extends AceType> {
- /**
- * @param ace access list entry
- * @param mode interface mode (L2/L3)
- * @param nextTableIndex index of the next classify table in chain
- * @param vlanTags number of vlan tags
- */
- @Nonnull
- ClassifyAddDelTable createTable(@Nonnull final T ace, @Nullable final InterfaceMode mode, final int nextTableIndex,
- final int vlanTags);
-
- /**
- * @param action to be taken when packet does match the specified ace
- * @param ace access list entry
- * @param mode interface mode (L2/L3)
- * @param tableIndex index of corresponding classify table
- * @param vlanTags number of vlan tags
- */
- @Nonnull
- List<ClassifyAddDelSession> createSession(@Nonnull final PacketHandling action, @Nonnull T ace,
- @Nullable final InterfaceMode mode, final int tableIndex, final int vlanTags);
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTableContextManager.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTableContextManager.java
deleted file mode 100644
index bddc16a23..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTableContextManager.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import com.google.common.base.Optional;
-import io.fd.honeycomb.translate.MappingContext;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.mapping.table.MappingEntry;
-
-/**
- * Manages interface metadata for ietf-acl model.
- */
-public interface AclTableContextManager {
-
- /**
- * Obtains mapping entry for given interface.
- *
- * @param index interface index
- * @param mappingContext mapping context providing context data for current transaction
- * @return ietf-acl metadata for given interface
- */
- Optional<MappingEntry> getEntry(final int index, @Nonnull final MappingContext mappingContext);
-
- /**
- * Adds mapping entry.
- *
- * @param entry to be added
- * @param mappingContext mapping context providing context data for current transaction
- */
- void addEntry(@Nonnull final MappingEntry entry, @Nonnull final MappingContext mappingContext);
-
- /**
- * Removes entry for given interface (if present).
- *
- * @param index interface index
- * @param mappingContext mapping context providing context data for current transaction
- */
- void removeEntry(final int index, @Nonnull final MappingContext mappingContext);
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTableContextManagerImpl.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTableContextManagerImpl.java
deleted file mode 100644
index 60fb0d24b..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTableContextManagerImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Optional;
-import io.fd.honeycomb.translate.MappingContext;
-import javax.annotation.Nonnull;
-import javax.annotation.concurrent.ThreadSafe;
-import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.Contexts;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.AclMappingEntryCtxAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.AclMappingEntryContext;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.MappingTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.MappingTableKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.mapping.table.MappingEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.mapping.table.MappingEntryKey;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-@ThreadSafe
-public class AclTableContextManagerImpl implements AclTableContextManager {
-
- private MappingTable.Direction direction;
-
- public AclTableContextManagerImpl(@Nonnull final MappingTable.Direction direction) {
- this.direction = checkNotNull(direction, "direction should not be null");
- }
-
- @Nonnull
- @Override
- public synchronized Optional<MappingEntry> getEntry(final int swIfIndex, @Nonnull final MappingContext mappingContext) {
- return mappingContext.read(getId(swIfIndex));
- }
-
- @Override
- public synchronized void addEntry(@Nonnull final MappingEntry entry, @Nonnull final MappingContext mappingContext) {
- mappingContext.put(getId(entry.getIndex()), entry);
- }
-
- @Override
- public synchronized void removeEntry(final int swIfIndex, @Nonnull final MappingContext mappingContext) {
- mappingContext.delete(getId(swIfIndex));
- }
-
- @VisibleForTesting
- protected InstanceIdentifier<MappingEntry> getId(final int index) {
- return InstanceIdentifier.create(Contexts.class)
- .augmentation(AclMappingEntryCtxAugmentation.class)
- .child(AclMappingEntryContext.class)
- .child(MappingTable.class, new MappingTableKey(direction))
- .child(MappingEntry.class, new MappingEntryKey(index));
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTranslator.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTranslator.java
deleted file mode 100644
index 2d898f1d9..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/AclTranslator.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.Permit;
-
-/**
- * Utility that helps translating of ietf-acl model ACEs to VPP's classify tables and sessions.
- */
-interface AclTranslator {
- int TABLE_MEM_SIZE = 8 * 1024;
- int VLAN_TAG_LEN = 4;
-
- default ClassifyAddDelTable createTable(final int nextTableIndex) {
- return createTable(nextTableIndex, 1);
- }
-
- default ClassifyAddDelTable createTable(final int nextTableIndex, @Nonnegative final int numberOfSessions) {
- final ClassifyAddDelTable request = new ClassifyAddDelTable();
- request.isAdd = 1;
- request.tableIndex = -1; // value not present
- request.nbuckets = numberOfSessions;
- request.nextTableIndex = nextTableIndex;
-
-
- // TODO: HONEYCOMB-181 minimise memory used by classify tables (we create a lot of them to make ietf-acl model
- // mapping more convenient):
- // according to https://wiki.fd.io/view/VPP/Introduction_To_N-tuple_Classifiers#Creating_a_classifier_table,
- // classify table needs 16*(1 + match_n_vectors) bytes, but this does not quite work,
- // so setting 8K +1k*numberOfSessions for now
- checkArgument(numberOfSessions>0, "negative numberOfSessions %s", numberOfSessions);
- request.memorySize = TABLE_MEM_SIZE+1024*(numberOfSessions-1);
- request.missNextIndex = -1; // value not set, but anyway it is ignored for tables in chain
- return request;
- }
-
- default ClassifyAddDelSession createSession(@Nonnull final PacketHandling action, final int tableIndex) {
- final ClassifyAddDelSession request = new ClassifyAddDelSession();
- request.isAdd = 1;
- request.tableIndex = tableIndex;
- request.opaqueIndex = ~0; // value not used
-
- if (action instanceof Permit) {
- request.hitNextIndex = -1;
- } // deny (0) is default value
-
- return request;
- }
-
- default int getVlanTagsLen(final int vlanTags) {
- return vlanTags * VLAN_TAG_LEN;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/IetfAclWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/IetfAclWriter.java
deleted file mode 100644
index 2e8750cd5..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/IetfAclWriter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import io.fd.honeycomb.translate.MappingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import java.util.List;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.AccessLists;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.access.lists.Acl;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public interface IetfAclWriter {
- default void write(@Nonnull final InstanceIdentifier<?> id, final int ifIndex, @Nonnull final List<Acl> acls,
- final AccessLists.DefaultAction defaultAction, @Nullable final InterfaceMode mode,
- @Nonnull final WriteContext writeContext, @Nonnull final MappingContext mappingContext)
- throws WriteFailedException {
- write(id, ifIndex, acls, defaultAction, mode, writeContext, 0, mappingContext);
- }
-
- void write(@Nonnull final InstanceIdentifier<?> id, int ifIndex, @Nonnull final List<Acl> acls,
- final AccessLists.DefaultAction defaultAction, @Nullable InterfaceMode mode,
- @Nonnull final WriteContext writeContext, @Nonnegative final int numberOfTags,
- @Nonnull final MappingContext mappingContext)
- throws WriteFailedException;
-
- void deleteAcl(@Nonnull final InstanceIdentifier<?> id, int ifIndex, @Nonnull final MappingContext mappingContext)
- throws WriteFailedException;
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/Ip4AclTranslator.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/Ip4AclTranslator.java
deleted file mode 100644
index 304d6c1f0..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/Ip4AclTranslator.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import com.google.common.primitives.Ints;
-import io.fd.honeycomb.translate.vpp.util.Ipv4Translator;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.AclIpHeaderFields;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.AclIpv4HeaderFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-
-interface Ip4AclTranslator extends Ipv4Translator {
- int ETHER_TYPE_OFFSET = 12; // first 14 bytes represent L2 header (2x6)
- int DSCP_OFFSET = 15;
- int DSCP_MASK = 0xfc;
-
- int IP_PROTOCOL_OFFSET = ETHER_TYPE_OFFSET + 11;
- int IP_PROTOCOL_MASK = 0xff;
-
- int IP4_LEN = 4;
- int IP4_MASK_BIT_LENGTH = 32;
- int SRC_IP_OFFSET = ETHER_TYPE_OFFSET + 14;
- int DST_IP_OFFSET = SRC_IP_OFFSET + IP4_LEN;
- int SRC_PORT_OFFSET = DST_IP_OFFSET + IP4_LEN;
- int DST_PORT_OFFSET = SRC_PORT_OFFSET + 2;
-
- default boolean ip4Mask(final int baseOffset, final InterfaceMode mode, final AclIpHeaderFields header,
- final AclIpv4HeaderFields ip4, final ClassifyAddDelTable request) {
- boolean aceIsEmpty = true;
- if (InterfaceMode.L2.equals(mode)) {
- // in L2 mode we need to match ether type
- request.mask[baseOffset + ETHER_TYPE_OFFSET] = (byte) 0xff;
- request.mask[baseOffset + ETHER_TYPE_OFFSET + 1] = (byte) 0xff;
- }
- if (header.getDscp() != null) {
- aceIsEmpty = false;
- request.mask[baseOffset + DSCP_OFFSET] = (byte) DSCP_MASK; // first 6 bits
- }
- if (header.getProtocol() != null) { // Internet Protocol number
- aceIsEmpty = false;
- request.mask[baseOffset + IP_PROTOCOL_OFFSET] = (byte) IP_PROTOCOL_MASK;
- }
- if (header.getSourcePortRange() != null) {
- // TODO (HONEYCOMB-253): port matching will not work correctly if Options are present
- aceIsEmpty = false;
- request.mask[baseOffset + SRC_PORT_OFFSET] = (byte) 0xff;
- request.mask[baseOffset + SRC_PORT_OFFSET + 1] = (byte) 0xff;
- }
- if (header.getDestinationPortRange() != null) {
- // TODO (HONEYCOMB-253): port matching will not work correctly if Options are present
- aceIsEmpty = false;
- request.mask[baseOffset + DST_PORT_OFFSET] = (byte) 0xff;
- request.mask[baseOffset + DST_PORT_OFFSET + 1] = (byte) 0xff;
- }
- if (ip4.getSourceIpv4Network() != null) {
- aceIsEmpty = false;
- System.arraycopy(Impl.toByteMask(ip4.getSourceIpv4Network()), 0, request.mask,
- baseOffset + SRC_IP_OFFSET, IP4_LEN);
- }
- if (ip4.getDestinationIpv4Network() != null) {
- aceIsEmpty = false;
- System.arraycopy(Impl.toByteMask(ip4.getDestinationIpv4Network()), 0, request.mask,
- baseOffset + DST_IP_OFFSET, IP4_LEN);
- }
- return aceIsEmpty;
- }
-
- default boolean ip4Match(final int baseOffset, final InterfaceMode mode, final AclIpHeaderFields header,
- final AclIpv4HeaderFields ip4, final Integer srcPort,
- final Integer dstPort, final ClassifyAddDelSession request) {
- boolean noMatch = true;
- if (InterfaceMode.L2.equals(mode)) {
- // match IP4 etherType (0x0800)
- request.match[baseOffset + ETHER_TYPE_OFFSET] = 0x08;
- request.match[baseOffset + ETHER_TYPE_OFFSET + 1] = 0x00;
- }
- if (header.getDscp() != null) {
- noMatch = false;
- request.match[baseOffset + DSCP_OFFSET] = (byte) (DSCP_MASK & (header.getDscp().getValue() << 2));
- }
- if (header.getProtocol() != null) { // Internet Protocol number
- noMatch = false;
- request.match[baseOffset + IP_PROTOCOL_OFFSET] = (byte) (IP_PROTOCOL_MASK & header.getProtocol());
- }
- if (srcPort != null) {
- // TODO (HONEYCOMB-253): port matching will not work correctly if Options are present
- noMatch = false;
- request.match[baseOffset + SRC_PORT_OFFSET] = (byte) (0xff & srcPort >> 8);
- request.match[baseOffset + SRC_PORT_OFFSET + 1] = (byte) (0xff & srcPort);
- }
- if (header.getDestinationPortRange() != null) {
- // TODO (HONEYCOMB-253): port matching will not work correctly if Options are present
- noMatch = false;
- request.match[baseOffset + DST_PORT_OFFSET] = (byte) (0xff & dstPort >> 8);
- request.match[baseOffset + DST_PORT_OFFSET + 1] = (byte) (0xff & dstPort);
- }
- if (ip4.getSourceIpv4Network() != null) {
- noMatch = false;
- System.arraycopy(Impl.toMatchValue(ip4.getSourceIpv4Network()), 0, request.match,
- baseOffset + SRC_IP_OFFSET, IP4_LEN);
-
- }
- if (ip4.getDestinationIpv4Network() != null) {
- noMatch = false;
- System.arraycopy(Impl.toMatchValue(ip4.getDestinationIpv4Network()), 0, request.match,
- baseOffset + DST_IP_OFFSET, IP4_LEN);
-
- }
- return noMatch;
- }
-
- class Impl {
- private static byte[] toByteMask(final int prefixLength) {
- final long mask = ((1L << prefixLength) - 1) << (IP4_MASK_BIT_LENGTH - prefixLength);
- return Ints.toByteArray((int) mask);
- }
-
- private static byte[] toByteMask(final Ipv4Prefix ipv4Prefix) {
- final int prefixLength = Byte.valueOf(ipv4Prefix.getValue().split("/")[1]);
- return toByteMask(prefixLength);
- }
-
- private static byte[] toMatchValue(final Ipv4Prefix ipv4Prefix) {
- final String[] split = ipv4Prefix.getValue().split("/");
- final byte[] addressBytes = Ipv4Translator.INSTANCE.ipv4AddressNoZoneToArray(split[0]);
- final byte[] mask = Impl.toByteMask(Byte.valueOf(split[1]));
- for (int i = 0; i < addressBytes.length; ++i) {
- addressBytes[i] &= mask[i];
- }
- return addressBytes;
- }
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/Ip6AclTranslator.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/Ip6AclTranslator.java
deleted file mode 100644
index c0da75687..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/Ip6AclTranslator.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.BitSet;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.AclIpHeaderFields;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.AclIpv6HeaderFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-
-interface Ip6AclTranslator {
-
- int ETHER_TYPE_OFFSET = 12; // first 14 bytes represent L2 header (2x6)
- int IP_VERSION_OFFSET = ETHER_TYPE_OFFSET + 2;
- int DSCP_MASK1 = 0x0f;
- int DSCP_MASK2 = 0xc0;
- int IP_PROTOCOL_OFFSET = IP_VERSION_OFFSET + 6;
- int IP_PROTOCOL_MASK = 0xff;
- int IP6_LEN = 16;
- int SRC_IP_OFFSET = IP_VERSION_OFFSET + 8;
- int DST_IP_OFFSET = SRC_IP_OFFSET + IP6_LEN;
- int SRC_PORT_OFFSET = DST_IP_OFFSET + IP6_LEN;
- int DST_PORT_OFFSET = SRC_PORT_OFFSET + 2;
-
- default boolean ip6Mask(final int baseOffset, final InterfaceMode mode, final AclIpHeaderFields header,
- final AclIpv6HeaderFields ip6, final ClassifyAddDelTable request) {
- boolean aceIsEmpty = true;
- if (InterfaceMode.L2.equals(mode)) {
- // in L2 mode we need to match ether type
- request.mask[baseOffset + ETHER_TYPE_OFFSET] = (byte) 0xff;
- request.mask[baseOffset + ETHER_TYPE_OFFSET + 1] = (byte) 0xff;
- }
- if (header.getDscp() != null) {
- aceIsEmpty = false;
- // DCSP (bits 4-9 of IP6 header)
- request.mask[baseOffset + IP_VERSION_OFFSET] |= DSCP_MASK1;
- request.mask[baseOffset + IP_VERSION_OFFSET + 1] |= DSCP_MASK2;
- }
- if (header.getProtocol() != null) { // Internet Protocol number
- aceIsEmpty = false;
- request.mask[baseOffset + IP_PROTOCOL_OFFSET] = (byte) IP_PROTOCOL_MASK;
- }
- if (ip6.getFlowLabel() != null) {
- aceIsEmpty = false;
- // bits 12-31
- request.mask[baseOffset + IP_VERSION_OFFSET + 1] |= (byte) 0x0f;
- request.mask[baseOffset + IP_VERSION_OFFSET + 2] = (byte) 0xff;
- request.mask[baseOffset + IP_VERSION_OFFSET + 3] = (byte) 0xff;
- }
- if (header.getSourcePortRange() != null) {
- // TODO (HONEYCOMB-253): port matching will not work correctly if Options are present
- aceIsEmpty = false;
- request.mask[baseOffset + SRC_PORT_OFFSET] = (byte) 0xff;
- request.mask[baseOffset + SRC_PORT_OFFSET + 1] = (byte) 0xff;
- }
- if (header.getDestinationPortRange() != null) {
- // TODO (HONEYCOMB-253): port matching will not work correctly if Options are present
- aceIsEmpty = false;
- request.mask[baseOffset + DST_PORT_OFFSET] = (byte) 0xff;
- request.mask[baseOffset + DST_PORT_OFFSET + 1] = (byte) 0xff;
- }
- if (ip6.getSourceIpv6Network() != null) {
- aceIsEmpty = false;
- final byte[] mask = Impl.toByteMask(ip6.getSourceIpv6Network());
- System.arraycopy(mask, 0, request.mask, baseOffset + SRC_IP_OFFSET, mask.length);
- }
- if (ip6.getDestinationIpv6Network() != null) {
- aceIsEmpty = false;
- final byte[] mask = Impl.toByteMask(ip6.getDestinationIpv6Network());
- System.arraycopy(mask, 0, request.mask, baseOffset + DST_IP_OFFSET, mask.length);
- }
- return aceIsEmpty;
- }
-
- default boolean ip6Match(final int baseOffset, final InterfaceMode mode, final AclIpHeaderFields header,
- final AclIpv6HeaderFields ip6, final Integer srcPort, final Integer dstPort, final ClassifyAddDelSession request) {
- boolean noMatch = true;
- if (InterfaceMode.L2.equals(mode)) {
- // match IP6 etherType (0x86dd)
- request.match[baseOffset + ETHER_TYPE_OFFSET] = (byte) 0x86;
- request.match[baseOffset + ETHER_TYPE_OFFSET + 1] = (byte) 0xdd;
- }
- if (header.getDscp() != null) {
- noMatch = false;
- final int dcsp = header.getDscp().getValue();
- // set bits 4-9 of IP6 header:
- request.match[baseOffset + IP_VERSION_OFFSET] |= (byte) (DSCP_MASK1 & (dcsp >> 2));
- request.match[baseOffset + IP_VERSION_OFFSET + 1] |= (byte) (DSCP_MASK2 & (dcsp << 6));
- }
- if (header.getProtocol() != null) { // Internet Protocol number
- noMatch = false;
- request.match[baseOffset + IP_PROTOCOL_OFFSET] = (byte) (IP_PROTOCOL_MASK & header.getProtocol());
- }
- if (ip6.getFlowLabel() != null) {
- noMatch = false;
- final int flowLabel = ip6.getFlowLabel().getValue().intValue();
- // bits 12-31
- request.match[baseOffset + IP_VERSION_OFFSET + 1] |= (byte) (0x0f & (flowLabel >> 16));
- request.match[baseOffset + IP_VERSION_OFFSET + 2] = (byte) (0xff & (flowLabel >> 8));
- request.match[baseOffset + IP_VERSION_OFFSET + 3] = (byte) (0xff & flowLabel);
- }
- if (header.getSourcePortRange() != null) {
- // TODO (HONEYCOMB-253): port matching will not work correctly if Options are present
- noMatch = false;
- request.match[baseOffset + SRC_PORT_OFFSET] = (byte) (0xff & srcPort >> 8);
- request.match[baseOffset + SRC_PORT_OFFSET + 1] = (byte) (0xff & srcPort);
- }
- if (header.getDestinationPortRange() != null) {
- // TODO (HONEYCOMB-253): port matching will not work correctly if Options are present
- noMatch = false;
- request.match[baseOffset + DST_PORT_OFFSET] = (byte) (0xff & dstPort >> 8);
- request.match[baseOffset + DST_PORT_OFFSET + 1] = (byte) (0xff & dstPort);
- }
- if (ip6.getSourceIpv6Network() != null) {
- noMatch = false;
- final byte[] match = Impl.toMatchValue(ip6.getSourceIpv6Network());
- System.arraycopy(match, 0, request.match, baseOffset + SRC_IP_OFFSET, IP6_LEN);
- }
- if (ip6.getDestinationIpv6Network() != null) {
- noMatch = false;
- final byte[] match = Impl.toMatchValue(ip6.getDestinationIpv6Network());
- System.arraycopy(match, 0, request.match, baseOffset + DST_IP_OFFSET, IP6_LEN);
- }
- return noMatch;
- }
-
- class Impl {
- private static final int IP6_MASK_BIT_LENGTH = 128;
-
- private static byte[] toByteMask(final int prefixLength) {
- final BitSet mask = new BitSet(IP6_MASK_BIT_LENGTH);
- mask.set(0, prefixLength, true);
- if (prefixLength < IP6_MASK_BIT_LENGTH) {
- mask.set(prefixLength, IP6_MASK_BIT_LENGTH, false);
- }
- return mask.toByteArray();
- }
-
- private static byte[] toByteMask(final Ipv6Prefix ipv6Prefix) {
- final int prefixLength = Short.valueOf(ipv6Prefix.getValue().split("/")[1]);
- return toByteMask(prefixLength);
- }
-
- private static byte[] toMatchValue(final Ipv6Prefix ipv6Prefix) {
- final String[] split = ipv6Prefix.getValue().split("/");
- final byte[] addressBytes;
- try {
- addressBytes = InetAddress.getByName(split[0]).getAddress();
- } catch (UnknownHostException e) {
- throw new IllegalArgumentException("Invalid IP6 address", e);
- }
- final byte[] mask = toByteMask(Short.valueOf(split[1]));
- int pos = 0;
- for (; pos < mask.length; ++pos) {
- addressBytes[pos] &= mask[pos];
- }
- // mask can be shorter that address, so we need to clear rest of the address:
- for (; pos < addressBytes.length; ++pos) {
- addressBytes[pos] = 0;
- }
- return addressBytes;
- }
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/L2AclTranslator.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/L2AclTranslator.java
deleted file mode 100644
index c74db7e2a..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/L2AclTranslator.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import io.fd.honeycomb.translate.vpp.util.MacTranslator;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import java.util.List;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
-
-interface L2AclTranslator extends MacTranslator {
-
- default boolean destinationMacAddressMask(final MacAddress dstMask, final MacAddress dstAddress,
- final ClassifyAddDelTable request) {
- // destination-mac-address or destination-mac-address-mask is present =>
- // ff:ff:ff:ff:ff:ff:00:00:00:00:00:00:00:00:00:00
- if (dstMask != null) {
- final List<String> parts = COLON_SPLITTER.splitToList(dstMask.getValue());
- int i = 0;
- for (String part : parts) {
- request.mask[i++] = parseHexByte(part);
- }
- return false;
- } else if (dstAddress != null) {
- for (int i = 0; i < 6; ++i) {
- request.mask[i] = (byte) 0xff;
- }
- return false;
- }
- return true;
- }
-
- default boolean sourceMacAddressMask(final MacAddress srcMask, final MacAddress srcAddress,
- final ClassifyAddDelTable request) {
- // source-mac-address or source-mac-address-mask =>
- // 00:00:00:00:00:00:ff:ff:ff:ff:ff:ff:00:00:00:00
- if (srcMask != null) {
- final List<String> parts = COLON_SPLITTER.splitToList(srcMask.getValue());
- int i = 6;
- for (String part : parts) {
- request.mask[i++] = parseHexByte(part);
- }
- return false;
- } else if (srcAddress != null) {
- for (int i = 6; i < 12; ++i) {
- request.mask[i] = (byte) 0xff;
- }
- return false;
- }
- return true;
- }
-
- default boolean destinationMacAddressMatch(final MacAddress dstAddress, final ClassifyAddDelSession request) {
- if (dstAddress != null) {
- final List<String> parts = COLON_SPLITTER.splitToList(dstAddress.getValue());
- int i = 0;
- for (String part : parts) {
- request.match[i++] = parseHexByte(part);
- }
- return false;
- }
- return true;
- }
-
- default boolean sourceMacAddressMatch(final MacAddress srcAddress, final ClassifyAddDelSession request) {
- if (srcAddress != null) {
- final List<String> parts = COLON_SPLITTER.splitToList(srcAddress.getValue());
- int i = 6;
- for (String part : parts) {
- request.match[i++] = parseHexByte(part);
- }
- return false;
- }
- return true;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/PortPair.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/PortPair.java
deleted file mode 100644
index 6d5d506d8..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/common/PortPair.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.common;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.function.BiFunction;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRange;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRange;
-
-/**
- * Utility that produces cartesian product out of src and dst port ranges (used to translate ranges into
- * list of classify sessions).
- */
-final class PortPair {
- private final Integer src;
- private final Integer dst;
-
- PortPair(@Nullable final Integer src, @Nullable final Integer dst) {
- this.src = src;
- this.dst = dst;
- }
-
- Integer getSrc() {
- return src;
- }
-
- Integer getDst() {
- return dst;
- }
-
- @Override
- public String toString() {
- return "(" + src + "," + dst + ")";
- }
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
-
- final PortPair that = (PortPair) o;
- if (!Objects.equals(src, that.src)) {
- return false;
- }
- if (!Objects.equals(dst, that.dst)) {
- return false;
- }
- return true;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(src, dst);
- }
-
- static List<PortPair> fromRange(final SourcePortRange srcRange,
- final DestinationPortRange dstRange) {
- final List<PortPair> result = new ArrayList<>();
- if (srcRange == null && dstRange == null) {
- result.add(new PortPair(null, null));
- } else if (srcRange != null && dstRange == null) {
- processSingleRange(result, srcRange.getLowerPort(), srcRange.getUpperPort(), PortPair::new);
- } else if (srcRange == null && dstRange != null) {
- processSingleRange(result, dstRange.getLowerPort(), dstRange.getUpperPort(),
- (dst, src) -> new PortPair(src, dst));
- } else {
- processDoubleRange(result, srcRange, dstRange);
- }
- return result;
- }
-
- private static void processSingleRange(final List<PortPair> result,
- final PortNumber lowerPort,
- final PortNumber upperPort,
- final BiFunction<Integer, Integer, PortPair> f) {
- int low = lowerPort.getValue(); // mandatory
- int hi = low;
- if (upperPort != null) {
- hi = upperPort.getValue();
- }
- for (; low <= hi; ++low) {
- result.add(f.apply(low, null));
- }
- }
-
- private static void processDoubleRange(final List<PortPair> result, final SourcePortRange srcRange,
- final DestinationPortRange dstRange) {
- int srcL = srcRange.getLowerPort().getValue();
- int srcH = srcL;
- if (srcRange.getUpperPort() != null) {
- srcH = srcRange.getUpperPort().getValue();
- }
- int dstL = dstRange.getLowerPort().getValue();
- int dstH = dstL;
- if (dstRange.getUpperPort() != null) {
- dstH = dstRange.getUpperPort().getValue();
- }
- for (int i=srcL; i <= srcH; ++i) {
- for (int j=dstL; j <= dstH; ++j) {
- result.add(new PortPair(i, j));
- }
- }
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/EgressIetfAclWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/EgressIetfAclWriter.java
deleted file mode 100644
index bfd58cf4a..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/EgressIetfAclWriter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.egress;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.base.Optional;
-import io.fd.honeycomb.translate.MappingContext;
-import io.fd.honeycomb.translate.v3po.interfaces.acl.common.AbstractIetfAclWriter;
-import io.fd.honeycomb.translate.v3po.interfaces.acl.common.AclTableContextManager;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.ClassifySetInterfaceL2Tables;
-import io.fd.vpp.jvpp.core.dto.ClassifySetInterfaceL2TablesReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.List;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Matches;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.matches.ace.type.AceEth;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.mapping.table.MappingEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.mapping.table.MappingEntryBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.AccessLists;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.access.lists.Acl;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public final class EgressIetfAclWriter extends AbstractIetfAclWriter {
- private final AclTableContextManager aclCtx;
-
- public EgressIetfAclWriter(@Nonnull final FutureJVppCore futureJVppCore, @Nonnull AclTableContextManager aclCtx) {
- super(futureJVppCore);
- this.aclCtx = checkNotNull(aclCtx, "aclCtx should not be null");
- }
-
- @Override
- public void deleteAcl(@Nonnull final InstanceIdentifier<?> id, final int swIfIndex,
- @Nonnull final MappingContext mappingContext)
- throws WriteFailedException {
- Optional<MappingEntry> optional = aclCtx.getEntry(swIfIndex, mappingContext);
- checkState(optional.isPresent(), "Removing ACL id=%s, but acl mapping entry is not present", id);
- final MappingEntry entry = optional.get();
- unassignClassifyTables(id, swIfIndex);
- removeClassifyTables(id, entry);
- aclCtx.removeEntry(swIfIndex, mappingContext);
- }
-
- private void unassignClassifyTables(@Nonnull final InstanceIdentifier<?> id, final int swIfIndex)
- throws WriteFailedException {
- final ClassifySetInterfaceL2Tables request = new ClassifySetInterfaceL2Tables();
- request.swIfIndex = swIfIndex;
- request.ip4TableIndex = NOT_DEFINED;
- request.ip6TableIndex = NOT_DEFINED;
- request.otherTableIndex = NOT_DEFINED;
- request.isInput = 0; // egress
- final CompletionStage<ClassifySetInterfaceL2TablesReply> cs = jvpp.classifySetInterfaceL2Tables(request);
- getReplyForDelete(cs.toCompletableFuture(), id);
- }
-
- @Override
- public void write(@Nonnull final InstanceIdentifier<?> id, int swIfIndex, @Nonnull final List<Acl> acls,
- @Nonnull final AccessLists.DefaultAction defaultAction, @Nullable InterfaceMode mode,
- @Nonnull final WriteContext writeContext, @Nonnegative final int numberOfTags,
- @Nonnull final MappingContext mappingContext)
- throws WriteFailedException {
- checkArgument(numberOfTags >= 0 && numberOfTags <= 2, "Number of vlan tags %s is not in [0,2] range");
- checkArgument(InterfaceMode.L2.equals(mode), "Writing egress Acls is supported only in L2 mode");
-
- final ClassifySetInterfaceL2Tables request = new ClassifySetInterfaceL2Tables();
- request.isInput = 0; // egress
- request.swIfIndex = swIfIndex;
-
- // applied to packets according to their ether type
- final List<Ace> ip4Aces = getACEs(acls, writeContext, (AbstractIetfAclWriter::appliesToIp4Path));
- request.ip4TableIndex = writeAces(id, ip4Aces, defaultAction, mode, numberOfTags);
- final List<Ace> ip6Aces = getACEs(acls, writeContext, (AbstractIetfAclWriter::appliesToIp6Path));
- request.ip6TableIndex = writeAces(id, ip6Aces, defaultAction, mode, numberOfTags);
- final List<Ace> aces = getACEs(acls, writeContext, EgressIetfAclWriter::isNotIpRule);
- request.otherTableIndex = writeAces(id, aces, defaultAction, mode, numberOfTags);
-
- final MappingEntry entry = new MappingEntryBuilder().setIndex(swIfIndex)
- .setIp4TableId(request.ip4TableIndex)
- .setIp6TableId(request.ip6TableIndex)
- .setL2TableId(request.otherTableIndex)
- .build();
- aclCtx.addEntry(entry, mappingContext);
-
- try {
- getReplyForWrite(jvpp.classifySetInterfaceL2Tables(request).toCompletableFuture(), id);
- } catch (WriteFailedException e) {
- removeClassifyTables(id, entry);
- throw e;
- }
- }
-
- private static boolean isNotIpRule(final Ace ace) {
- final Matches matches = ace.getMatches();
- checkArgument(matches != null, "Incomplete ACE: %s", ace);
- return matches.getAceType() instanceof AceEth;
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/IetfAclCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/IetfAclCustomizer.java
deleted file mode 100644
index c0e4c3d14..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/IetfAclCustomizer.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.egress;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.acl.common.IetfAclWriter;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.ietf.acl.Egress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.AccessLists;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class IetfAclCustomizer implements WriterCustomizer<Egress> {
- private static final Logger LOG = LoggerFactory.getLogger(IetfAclCustomizer.class);
- private final IetfAclWriter aclWriter;
- private final NamingContext interfaceContext;
-
- public IetfAclCustomizer(final IetfAclWriter aclWriter, final NamingContext interfaceContext) {
- this.aclWriter = checkNotNull(aclWriter, "aclWriter should not be null");
- this.interfaceContext = checkNotNull(interfaceContext, "interfaceContext should not be null");
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Egress> id, @Nonnull final Egress dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String ifName = id.firstKeyOf(Interface.class).getName();
- final int ifIndex = interfaceContext.getIndex(ifName, writeContext.getMappingContext());
- LOG.debug("Adding egress ACLs for interface={}(id={}): {}", ifName, ifIndex, dataAfter);
-
- final AccessLists accessLists = dataAfter.getAccessLists();
- checkArgument(accessLists != null && accessLists.getAcl() != null,
- "ietf-acl container does not define acl list");
-
- if (!InterfaceMode.L2.equals(accessLists.getMode())) {
- LOG.debug("Writing egress Acls is supported only in L2 mode. Ignoring config: {}", dataAfter);
- return;
- }
-
- aclWriter.write(id, ifIndex, accessLists.getAcl(), accessLists.getDefaultAction(), accessLists.getMode(),
- writeContext, writeContext.getMappingContext());
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Egress> id, @Nonnull final Egress dataBefore,
- @Nonnull final Egress dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("ACLs update: removing previously configured ACLs");
- deleteCurrentAttributes(id, dataBefore, writeContext);
- LOG.debug("ACLs update: adding updated ACLs");
- writeCurrentAttributes(id, dataAfter, writeContext);
- LOG.debug("ACLs update was successful");
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Egress> id, @Nonnull final Egress dataBefore,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String ifName = id.firstKeyOf(Interface.class).getName();
- final int ifIndex = interfaceContext.getIndex(ifName, writeContext.getMappingContext());
- LOG.debug("Removing ACLs for interface={}(id={}): {}", ifName, ifIndex, dataBefore);
- aclWriter.deleteAcl(id, ifIndex, writeContext.getMappingContext());
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/SubInterfaceIetfAclCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/SubInterfaceIetfAclCustomizer.java
deleted file mode 100644
index bf7c0eb46..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/egress/SubInterfaceIetfAclCustomizer.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.egress;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils.getNumberOfTags;
-
-import com.google.common.base.Optional;
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.v3po.interfaces.acl.common.IetfAclWriter;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.AccessLists;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.base.attributes.ietf.acl.Egress;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SubInterfaceIetfAclCustomizer implements WriterCustomizer<Egress> {
- private static final Logger LOG = LoggerFactory.getLogger(SubInterfaceIetfAclCustomizer.class);
- private final IetfAclWriter aclWriter;
- private final NamingContext interfaceContext;
-
- public SubInterfaceIetfAclCustomizer(final IetfAclWriter aclWriter, final NamingContext interfaceContext) {
- this.aclWriter = checkNotNull(aclWriter, "aclWriter should not be null");
- this.interfaceContext = checkNotNull(interfaceContext, "interfaceContext should not be null");
- }
-
- private String getSubInterfaceName(@Nonnull final InstanceIdentifier<Egress> id) {
- final InterfaceKey parentInterfacekey = id.firstKeyOf(Interface.class);
- final SubInterfaceKey subInterfacekey = id.firstKeyOf(SubInterface.class);
- return SubInterfaceUtils
- .getSubInterfaceName(parentInterfacekey.getName(), subInterfacekey.getIdentifier().intValue());
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Egress> id, @Nonnull final Egress dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String subInterfaceName = getSubInterfaceName(id);
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
- LOG.debug("Adding IETF-ACL for sub-interface: {}(id={}): {}", subInterfaceName, subInterfaceIndex, dataAfter);
-
- final AccessLists accessLists = dataAfter.getAccessLists();
- checkArgument(accessLists != null && accessLists.getAcl() != null,
- "ietf-acl container does not define acl list");
-
- final Optional<SubInterface> subInterfaceOptional =
- writeContext.readAfter(id.firstIdentifierOf(SubInterface.class));
- checkState(subInterfaceOptional.isPresent(), "Could not read SubInterface data object for %s", id);
- final SubInterface subInterface = subInterfaceOptional.get();
-
- if (!InterfaceMode.L2.equals(accessLists.getMode())) {
- LOG.debug("Writing egress Acls is supported only in L2 mode. Ignoring config: {}", dataAfter);
- return;
- }
-
- aclWriter
- .write(id, subInterfaceIndex, accessLists.getAcl(), accessLists.getDefaultAction(), accessLists.getMode(),
- writeContext, getNumberOfTags(subInterface.getTags()), writeContext.getMappingContext());
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Egress> id, @Nonnull final Egress dataBefore,
- @Nonnull final Egress dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("Sub-interface ACLs update: removing previously configured ACLs");
- deleteCurrentAttributes(id, dataBefore, writeContext);
- LOG.debug("Sub-interface ACLs update: adding updated ACLs");
- writeCurrentAttributes(id, dataAfter, writeContext);
- LOG.debug("Sub-interface ACLs update was successful");
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Egress> id, @Nonnull final Egress dataBefore,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String subInterfaceName = getSubInterfaceName(id);
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
- LOG.debug("Removing ACLs for sub-interface={}(id={}): {}", subInterfaceName, subInterfaceIndex, dataBefore);
- aclWriter.deleteAcl(id, subInterfaceIndex, writeContext.getMappingContext());
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/AclCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/AclCustomizer.java
deleted file mode 100644
index 550c2cc92..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/AclCustomizer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.ingress;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.v3po.vppclassifier.VppClassifierContextManager;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.acl.Ingress;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Customizer for enabling/disabling ingress ACLs on given interface based on low lever classfier model.
- */
-public class AclCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Ingress>, AclWriter {
-
- private static final Logger LOG = LoggerFactory.getLogger(AclCustomizer.class);
- private final NamingContext interfaceContext;
- private final VppClassifierContextManager classifyTableContext;
-
- public AclCustomizer(@Nonnull final FutureJVppCore vppApi, @Nonnull final NamingContext interfaceContext,
- @Nonnull final VppClassifierContextManager classifyTableContext) {
- super(vppApi);
- this.interfaceContext = checkNotNull(interfaceContext, "interfaceContext should not be null");
- this.classifyTableContext = checkNotNull(classifyTableContext, "classifyTableContext should not be null");
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id, @Nonnull final Ingress dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- setAcl(true, id, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id,
- @Nonnull final Ingress dataBefore,
- @Nonnull final Ingress dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- throw new UnsupportedOperationException("Acl update is not supported. Please delete Acl container first.");
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id,
- @Nonnull final Ingress dataBefore,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- setAcl(false, id, dataBefore, writeContext);
- }
-
- private void setAcl(final boolean isAdd, @Nonnull final InstanceIdentifier<Ingress> id, @Nonnull final Ingress acl,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String ifName = id.firstKeyOf(Interface.class).getName();
- final int ifIndex = interfaceContext.getIndex(ifName, writeContext.getMappingContext());
-
- LOG.debug("Setting ACL(isAdd={}) on interface={}(id={}): {}", isAdd, ifName, ifIndex, acl);
-
- inputAclSetInterface(getFutureJVpp(), isAdd, id, acl, ifIndex, classifyTableContext,
- writeContext.getMappingContext());
- LOG.debug("Successfully set ACL(isAdd={}) on interface={}(id={}): {}", isAdd, ifName, ifIndex, acl);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/AclWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/AclWriter.java
deleted file mode 100644
index d299ec88a..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/AclWriter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.ingress;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.honeycomb.translate.MappingContext;
-import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.v3po.vppclassifier.VppClassifierContextManager;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.AclBaseAttributes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.base.attributes.Ip4Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.base.attributes.Ip6Acl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.base.attributes.L2Acl;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.core.dto.InputAclSetInterface;
-import io.fd.vpp.jvpp.core.dto.InputAclSetInterfaceReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-
-interface AclWriter extends ByteDataTranslator, JvppReplyConsumer {
-
- default void inputAclSetInterface(@Nonnull final FutureJVppCore futureJVppCore, final boolean isAdd,
- @Nonnull final InstanceIdentifier<?> id, @Nonnull final AclBaseAttributes acl,
- @Nonnegative final int ifIndex,
- @Nonnull final VppClassifierContextManager classifyTableContext,
- @Nonnull final MappingContext mappingContext) throws WriteFailedException {
- final InputAclSetInterface request = new InputAclSetInterface();
- request.isAdd = booleanToByte(isAdd);
- request.swIfIndex = ifIndex;
- request.l2TableIndex = ~0; // skip
- request.ip4TableIndex = ~0; // skip
- request.ip6TableIndex = ~0; // skip
-
- final L2Acl l2Acl = acl.getL2Acl();
- if (l2Acl != null) {
- final String tableName = checkNotNull(l2Acl.getClassifyTable(), "L2 classify table is null");
- request.l2TableIndex = classifyTableContext.getTableIndex(tableName, mappingContext);
- }
- final Ip4Acl ip4Acl = acl.getIp4Acl();
- if (ip4Acl != null) {
- final String tableName = checkNotNull(ip4Acl.getClassifyTable(), "IPv4 classify table is null");
- request.ip4TableIndex = classifyTableContext.getTableIndex(tableName, mappingContext);
- }
- final Ip6Acl ip6Acl = acl.getIp6Acl();
- if (ip6Acl != null) {
- final String tableName = checkNotNull(ip6Acl.getClassifyTable(), "IPv6 classify table is null");
- request.ip6TableIndex = classifyTableContext.getTableIndex(tableName, mappingContext);
- }
-
- final CompletionStage<InputAclSetInterfaceReply> inputAclSetInterfaceReplyCompletionStage =
- futureJVppCore.inputAclSetInterface(request);
-
- getReplyForWrite(inputAclSetInterfaceReplyCompletionStage.toCompletableFuture(), id);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/IetfAclCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/IetfAclCustomizer.java
deleted file mode 100644
index ec051e091..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/IetfAclCustomizer.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.ingress;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev161214.interfaces._interface.ietf.acl.Ingress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.AccessLists;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Customizer for enabling/disabling ingress ACLs for given interface (as defined in ietf-acl model).
- *
- * The customizer assumes it owns classify table management for interfaces where ietf-acl container is present. Using
- * low level classifier model or direct changes to classify tables in combination with ietf-acls are not supported and
- * can result in unpredictable behaviour.
- */
-public class IetfAclCustomizer implements WriterCustomizer<Ingress> {
-
- private static final Logger LOG = LoggerFactory.getLogger(IetfAclCustomizer.class);
- private final IngressIetfAclWriter aclWriter;
- private final NamingContext interfaceContext;
-
- public IetfAclCustomizer(@Nonnull final IngressIetfAclWriter aclWriter,
- @Nonnull final NamingContext interfaceContext) {
- this.aclWriter = checkNotNull(aclWriter, "aclWriter should not be null");
- this.interfaceContext = checkNotNull(interfaceContext, "interfaceContext should not be null");
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id, @Nonnull final Ingress dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String ifName = id.firstKeyOf(Interface.class).getName();
- final int ifIndex = interfaceContext.getIndex(ifName, writeContext.getMappingContext());
- LOG.debug("Adding ACLs for interface={}(id={}): {}", ifName, ifIndex, dataAfter);
-
- final AccessLists accessLists = dataAfter.getAccessLists();
- checkArgument(accessLists != null && accessLists.getAcl() != null,
- "ietf-acl container does not define acl list");
-
- aclWriter.write(id, ifIndex, accessLists.getAcl(), accessLists.getDefaultAction(), accessLists.getMode(),
- writeContext, writeContext.getMappingContext());
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id,
- @Nonnull final Ingress dataBefore, @Nonnull final Ingress dataAfter,
- @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- LOG.debug("ACLs update: removing previously configured ACLs");
- deleteCurrentAttributes(id, dataBefore, writeContext);
- LOG.debug("ACLs update: adding updated ACLs");
- writeCurrentAttributes(id, dataAfter, writeContext);
- LOG.debug("ACLs update was successful");
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id,
- @Nonnull final Ingress dataBefore,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String ifName = id.firstKeyOf(Interface.class).getName();
- final int ifIndex = interfaceContext.getIndex(ifName, writeContext.getMappingContext());
- LOG.debug("Removing ACLs for interface={}(id={}): {}", ifName, ifIndex, dataBefore);
- aclWriter.deleteAcl(id, ifIndex, writeContext.getMappingContext());
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/IngressIetfAclWriter.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/IngressIetfAclWriter.java
deleted file mode 100644
index b7da14ecf..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/IngressIetfAclWriter.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.ingress;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.base.Optional;
-import io.fd.honeycomb.translate.MappingContext;
-import io.fd.honeycomb.translate.v3po.interfaces.acl.common.AbstractIetfAclWriter;
-import io.fd.honeycomb.translate.v3po.interfaces.acl.common.AclTableContextManager;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.InputAclSetInterface;
-import io.fd.vpp.jvpp.core.dto.InputAclSetInterfaceReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.List;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.mapping.table.MappingEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev161214.mapping.entry.context.attributes.acl.mapping.entry.context.mapping.table.MappingEntryBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.InterfaceMode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.AccessLists;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.access.lists.Acl;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public final class IngressIetfAclWriter extends AbstractIetfAclWriter {
- private final AclTableContextManager aclCtx;
-
- public IngressIetfAclWriter(@Nonnull final FutureJVppCore futureJVppCore, @Nonnull AclTableContextManager aclCtx) {
- super(futureJVppCore);
- this.aclCtx = checkNotNull(aclCtx, "aclCtx should not be null");
- }
-
- @Override
- public void deleteAcl(@Nonnull final InstanceIdentifier<?> id, final int swIfIndex,
- @Nonnull final MappingContext mappingContext)
- throws WriteFailedException {
- Optional<MappingEntry> optional = aclCtx.getEntry(swIfIndex, mappingContext);
- checkState(optional.isPresent(), "Removing ACL id=%s, but acl mapping entry is not present", id);
- final MappingEntry entry = optional.get();
- unassignClassifyTables(id, entry);
- removeClassifyTables(id, entry);
- aclCtx.removeEntry(swIfIndex, mappingContext);
- }
-
- private void unassignClassifyTables(@Nonnull final InstanceIdentifier<?> id,
- @Nonnull final MappingEntry entry)
- throws WriteFailedException {
- final InputAclSetInterface request = new InputAclSetInterface();
- request.isAdd = 0;
- request.swIfIndex = entry.getIndex();
- request.l2TableIndex = entry.getL2TableId();
- request.ip4TableIndex = entry.getIp4TableId();
- request.ip6TableIndex = entry.getIp6TableId();
- final CompletionStage<InputAclSetInterfaceReply> inputAclSetInterfaceReplyCompletionStage =
- jvpp.inputAclSetInterface(request);
- getReplyForDelete(inputAclSetInterfaceReplyCompletionStage.toCompletableFuture(), id);
- }
-
- @Override
- public void write(@Nonnull final InstanceIdentifier<?> id, int swIfIndex, @Nonnull final List<Acl> acls,
- @Nonnull final AccessLists.DefaultAction defaultAction, @Nullable final InterfaceMode mode,
- @Nonnull final WriteContext writeContext, @Nonnegative final int numberOfTags,
- @Nonnull final MappingContext mappingContext)
- throws WriteFailedException {
- checkArgument(numberOfTags >= 0 && numberOfTags <= 2, "Number of vlan tags %s is not in [0,2] range");
-
- final InputAclSetInterface request = new InputAclSetInterface();
- request.isAdd = 1;
- request.swIfIndex = swIfIndex;
- request.l2TableIndex = NOT_DEFINED;
- request.ip4TableIndex = NOT_DEFINED;
- request.ip6TableIndex = NOT_DEFINED;
-
- if (InterfaceMode.L2.equals(mode)) {
- final List<Ace> aces = getACEs(acls, writeContext, ace -> true);
- request.l2TableIndex = writeAces(id, aces, defaultAction, mode, numberOfTags);
- } else {
- final List<Ace> ip4Aces = getACEs(acls, writeContext, (AbstractIetfAclWriter::appliesToIp4Path));
- request.ip4TableIndex = writeAces(id, ip4Aces, defaultAction, mode, numberOfTags);
- final List<Ace> ip6Aces = getACEs(acls, writeContext, (AbstractIetfAclWriter::appliesToIp6Path));
- request.ip6TableIndex = writeAces(id, ip6Aces, defaultAction, mode, numberOfTags);
- }
-
- final MappingEntry entry = new MappingEntryBuilder().setIndex(swIfIndex)
- .setIp4TableId(request.ip4TableIndex)
- .setIp6TableId(request.ip6TableIndex)
- .setL2TableId(request.l2TableIndex)
- .build();
- aclCtx.addEntry(entry, mappingContext);
-
- try {
- getReplyForWrite(jvpp.inputAclSetInterface(request).toCompletableFuture(), id);
- } catch (WriteFailedException e) {
- removeClassifyTables(id, entry);
- throw e;
- }
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/SubInterfaceAclCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/SubInterfaceAclCustomizer.java
deleted file mode 100644
index bda096490..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/SubInterfaceAclCustomizer.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.ingress;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.v3po.vppclassifier.VppClassifierContextManager;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.base.attributes.acl.Ingress;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Customizer for enabling/disabling ingress ACLs on given sub-interface.
- */
-public class SubInterfaceAclCustomizer extends FutureJVppCustomizer
- implements WriterCustomizer<Ingress>, AclWriter {
-
- private static final Logger LOG = LoggerFactory.getLogger(SubInterfaceAclCustomizer.class);
- private final NamingContext interfaceContext;
- private final VppClassifierContextManager classifyTableContext;
-
- public SubInterfaceAclCustomizer(@Nonnull final FutureJVppCore vppApi,
- @Nonnull final NamingContext interfaceContext,
- @Nonnull final VppClassifierContextManager classifyTableContext) {
- super(vppApi);
- this.interfaceContext = checkNotNull(interfaceContext, "interfaceContext should not be null");
- this.classifyTableContext = checkNotNull(classifyTableContext, "classifyTableContext should not be null");
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id, @Nonnull final Ingress dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- setAcl(true, id, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id,
- @Nonnull final Ingress dataBefore,
- @Nonnull final Ingress dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- throw new UnsupportedOperationException("Acl update is not supported. Please delete Acl container first.");
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id,
- @Nonnull final Ingress dataBefore,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- setAcl(false, id, dataBefore, writeContext);
- }
-
- private void setAcl(final boolean isAdd, @Nonnull final InstanceIdentifier<Ingress> id, @Nonnull final Ingress acl,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final InterfaceKey parentInterfacekey = id.firstKeyOf(Interface.class);
- final SubInterfaceKey subInterfacekey = id.firstKeyOf(SubInterface.class);
- final String subInterfaceName = SubInterfaceUtils
- .getSubInterfaceName(parentInterfacekey.getName(), subInterfacekey.getIdentifier().intValue());
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
-
- LOG.debug("Setting ACL(isAdd={}) on sub-interface={}(id={}): {}",
- isAdd, subInterfaceName, subInterfaceIndex, acl);
- inputAclSetInterface(getFutureJVpp(), isAdd, id, acl, subInterfaceIndex, classifyTableContext,
- writeContext.getMappingContext());
- LOG.debug("Successfully set ACL(isAdd={}) on sub-interface={}(id={}): {}",
- isAdd, subInterfaceName, subInterfaceIndex, acl);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/SubInterfaceIetfAclCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/SubInterfaceIetfAclCustomizer.java
deleted file mode 100644
index a9fcc83a3..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/acl/ingress/SubInterfaceIetfAclCustomizer.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.acl.ingress;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils.getNumberOfTags;
-
-import com.google.common.base.Optional;
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.ietf.acl.base.attributes.AccessLists;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.base.attributes.ietf.acl.Ingress;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Customizer for enabling/disabling ingress ACLs for given sub-interface (as defined in ietf-acl model).
- *
- * The customizer assumes it owns classify table management for sub-interfaces where ietf-acl container is present.
- * Using low level classifier model or direct changes to classify tables in combination with ietf-acls are not supported
- * and can result in unpredictable behaviour.
- */
-public class SubInterfaceIetfAclCustomizer implements WriterCustomizer<Ingress> {
-
- private static final Logger LOG = LoggerFactory.getLogger(SubInterfaceIetfAclCustomizer.class);
- private final IngressIetfAclWriter aclWriter;
- private final NamingContext interfaceContext;
-
- public SubInterfaceIetfAclCustomizer(@Nonnull final IngressIetfAclWriter aclWriter,
- @Nonnull final NamingContext interfaceContext) {
- this.aclWriter = checkNotNull(aclWriter, "aclWriter should not be null");
- this.interfaceContext = checkNotNull(interfaceContext, "interfaceContext should not be null");
- }
-
- private String getSubInterfaceName(@Nonnull final InstanceIdentifier<Ingress> id) {
- final InterfaceKey parentInterfacekey = id.firstKeyOf(Interface.class);
- final SubInterfaceKey subInterfacekey = id.firstKeyOf(SubInterface.class);
- return SubInterfaceUtils
- .getSubInterfaceName(parentInterfacekey.getName(), subInterfacekey.getIdentifier().intValue());
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id, @Nonnull final Ingress dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- final String subInterfaceName = getSubInterfaceName(id);
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
- LOG.debug("Adding IETF-ACL for sub-interface: {}(id={}): {}", subInterfaceName, subInterfaceIndex, dataAfter);
-
- final AccessLists accessLists = dataAfter.getAccessLists();
- checkArgument(accessLists != null && accessLists.getAcl() != null,
- "ietf-acl container does not define acl list");
-
- final Optional<SubInterface> subInterfaceOptional =
- writeContext.readAfter(id.firstIdentifierOf(SubInterface.class));
- checkState(subInterfaceOptional.isPresent(), "Could not read SubInterface data object for %s", id);
- final SubInterface subInterface = subInterfaceOptional.get();
-
- aclWriter
- .write(id, subInterfaceIndex, accessLists.getAcl(), accessLists.getDefaultAction(), accessLists.getMode(),
- writeContext, getNumberOfTags(subInterface.getTags()), writeContext.getMappingContext());
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id,
- @Nonnull final Ingress dataBefore, @Nonnull final Ingress dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- LOG.debug("Sub-interface ACLs update: removing previously configured ACLs");
- deleteCurrentAttributes(id, dataBefore, writeContext);
- LOG.debug("Sub-interface ACLs update: adding updated ACLs");
- writeCurrentAttributes(id, dataAfter, writeContext);
- LOG.debug("Sub-interface ACLs update was successful");
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Ingress> id,
- @Nonnull final Ingress dataBefore, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- final String subInterfaceName = getSubInterfaceName(id);
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
- LOG.debug("Removing ACLs for sub-interface={}(id={}): {}", subInterfaceName, subInterfaceIndex, dataBefore);
- aclWriter.deleteAcl(id, subInterfaceIndex, writeContext.getMappingContext());
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4AddressCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4AddressCustomizer.java
deleted file mode 100644
index 2cec90695..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4AddressCustomizer.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.ip;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.Optional;
-import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
-import io.fd.honeycomb.translate.util.RWUtils;
-import io.fd.honeycomb.translate.v3po.interfaces.ip.subnet.validation.SubnetValidationException;
-import io.fd.honeycomb.translate.v3po.interfaces.ip.subnet.validation.SubnetValidator;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Address;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.AddressKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.Subnet;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.subnet.Netmask;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.subnet.PrefixLength;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Customizer for writing {@link Address}
- */
-public class Ipv4AddressCustomizer extends FutureJVppCustomizer
- implements ListWriterCustomizer<Address, AddressKey>, Ipv4Writer {
-
- private static final Logger LOG = LoggerFactory.getLogger(Ipv4AddressCustomizer.class);
- private final NamingContext interfaceContext;
- private final SubnetValidator subnetValidator;
-
- Ipv4AddressCustomizer(@Nonnull final FutureJVppCore futureJVppCore, @Nonnull final NamingContext interfaceContext,
- @Nonnull final SubnetValidator subnetValidator) {
- super(futureJVppCore);
- this.interfaceContext = checkNotNull(interfaceContext, "Interface context cannot be null");
- this.subnetValidator = checkNotNull(subnetValidator, "Subnet validator cannot be null");
- }
-
- public Ipv4AddressCustomizer(@Nonnull final FutureJVppCore futureJVppCore,
- @Nonnull final NamingContext interfaceContext) {
- this(futureJVppCore, interfaceContext, new SubnetValidator());
- }
-
- @Override
- public void writeCurrentAttributes(InstanceIdentifier<Address> id, Address dataAfter, WriteContext writeContext)
- throws WriteFailedException {
-
- final String interfaceName = id.firstKeyOf(Interface.class).getName();
- final int interfaceIndex = interfaceContext.getIndex(interfaceName, writeContext.getMappingContext());
-
- // checks whether address is not from same subnet of some address already defined on this interface
- try {
-
- final InstanceIdentifier<Ipv4> parentId = RWUtils.cutId(id, InstanceIdentifier.create(Ipv4.class));
- final Optional<Ipv4> ipv4Optional = writeContext.readAfter(parentId);
-
- //no need to check isPresent() - we are inside of address customizer, therefore there must be Address data
- //that is being processed by infrastructure
-
- subnetValidator.checkNotAddingToSameSubnet(ipv4Optional.get().getAddress());
- } catch (SubnetValidationException e) {
- throw new WriteFailedException(id, e);
- }
-
- setAddress(true, id, interfaceName, interfaceIndex, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(InstanceIdentifier<Address> id, Address dataBefore, Address dataAfter,
- WriteContext writeContext) throws WriteFailedException {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter,
- new UnsupportedOperationException("Operation not supported"));
- }
-
- @Override
- public void deleteCurrentAttributes(InstanceIdentifier<Address> id, Address dataBefore, WriteContext writeContext)
- throws WriteFailedException {
-
- final String interfaceName = id.firstKeyOf(Interface.class).getName();
- final int interfaceIndex = interfaceContext.getIndex(interfaceName, writeContext.getMappingContext());
-
- setAddress(false, id, interfaceName, interfaceIndex, dataBefore, writeContext);
- }
-
- private void setAddress(boolean add, final InstanceIdentifier<Address> id, final String interfaceName,
- final int interfaceIndex, final Address address,
- final WriteContext writeContext) throws WriteFailedException {
-
- Subnet subnet = address.getSubnet();
-
- if (subnet instanceof PrefixLength) {
- setPrefixLengthSubnet(add, id, interfaceName, interfaceIndex, address, (PrefixLength) subnet);
- } else if (subnet instanceof Netmask) {
- setNetmaskSubnet(add, id, interfaceName, interfaceIndex, address, (Netmask) subnet);
- } else {
- LOG.error("Unable to handle subnet of type {}", subnet.getClass());
- throw new WriteFailedException(id, "Unable to handle subnet of type " + subnet.getClass());
- }
- }
-
- private void setNetmaskSubnet(final boolean add, @Nonnull final InstanceIdentifier<Address> id,
- @Nonnull final String interfaceName, final int interfaceIndex,
- @Nonnull final Address address, @Nonnull final Netmask subnet)
- throws WriteFailedException {
-
- LOG.debug("Setting Subnet(subnet-mask) for interface: {}(id={}). Subnet: {}, address: {}",
- interfaceName, interfaceIndex, subnet, address);
-
- final DottedQuad netmask = subnet.getNetmask();
- checkNotNull(netmask, "netmask value should not be null");
-
- final byte subnetLength = getSubnetMaskLength(netmask.getValue());
- addDelAddress(getFutureJVpp(), add, id, interfaceIndex, address.getIp(), subnetLength);
- }
-
- private void setPrefixLengthSubnet(final boolean add, @Nonnull final InstanceIdentifier<Address> id,
- @Nonnull final String interfaceName, final int interfaceIndex,
- @Nonnull final Address address, @Nonnull final PrefixLength subnet)
- throws WriteFailedException {
- LOG.debug("Setting Subnet(prefix-length) for interface: {}(id={}). Subnet: {}, address: {}",
- interfaceName, interfaceIndex, subnet, address);
-
- addDelAddress(getFutureJVpp(), add, id, interfaceIndex, address.getIp(),
- subnet.getPrefixLength().byteValue());
-
- LOG.debug("Subnet(prefix-length) set successfully for interface: {}(id={}). Subnet: {}, address: {}",
- interfaceName, interfaceIndex, subnet, address);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4Customizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4Customizer.java
deleted file mode 100644
index 929e82ea1..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4Customizer.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.ip;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.write.WriteContext;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Ipv4Customizer extends FutureJVppCustomizer implements WriterCustomizer<Ipv4> {
-
- private static final Logger LOG = LoggerFactory.getLogger(Ipv4Customizer.class);
-
- public Ipv4Customizer(final FutureJVppCore vppApi) {
- super(vppApi);
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Ipv4> id,
- @Nonnull final Ipv4 dataAfter, @Nonnull final WriteContext writeContext) {
- LOG.debug("Handling Ipv4 leaves (mtu, forwarding) is not supported by VPP API. Ignoring configuration");
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Ipv4> id,
- @Nonnull final Ipv4 dataBefore, @Nonnull final Ipv4 dataAfter,
- @Nonnull final WriteContext writeContext) {
- LOG.debug("Handling Ipv4 leaves (mtu, forwarding) is not supported by VPP API. Ignoring configuration");
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Ipv4> id,
- @Nonnull final Ipv4 dataBefore, @Nonnull final WriteContext writeContext) {
- LOG.debug("Handling Ipv4 leaves (mtu, forwarding) is not supported by VPP API. Ignoring configuration");
- }
-
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4NeighbourCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4NeighbourCustomizer.java
deleted file mode 100644
index be4ef28cf..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4NeighbourCustomizer.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.ip;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import io.fd.honeycomb.translate.MappingContext;
-import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.AddressTranslator;
-import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.IpNeighborAddDel;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv4;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Neighbor;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.NeighborKey;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * Customizer for writing {@link Neighbor} for {@link Ipv4}.
- */
-public class Ipv4NeighbourCustomizer extends FutureJVppCustomizer
- implements ListWriterCustomizer<Neighbor, NeighborKey>, ByteDataTranslator, AddressTranslator,
- JvppReplyConsumer {
-
-
- private static final Logger LOG = LoggerFactory.getLogger(Ipv4NeighbourCustomizer.class);
- final NamingContext interfaceContext;
-
- public Ipv4NeighbourCustomizer(final FutureJVppCore futureJVppCore, final NamingContext interfaceContext) {
- super(futureJVppCore);
- this.interfaceContext = interfaceContext;
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull InstanceIdentifier<Neighbor> id, @Nonnull Neighbor dataAfter,
- @Nonnull WriteContext writeContext)
- throws WriteFailedException {
-
- checkNotNull(dataAfter, "Cannot write null neighbour");
- checkArgument(id.firstKeyOf(Interface.class) != null, "No parent interface key found");
-
- LOG.debug("Processing request for Neigbour write");
- String interfaceName = id.firstKeyOf(Interface.class).getName();
- MappingContext mappingContext = writeContext.getMappingContext();
-
- checkState(interfaceContext.containsIndex(interfaceName, mappingContext),
- "Mapping does not contains mapping for provider interface name ".concat(interfaceName));
-
- LOG.debug("Parent interface index found");
- addDelNeighbourAndReply(id, true,
- interfaceContext.getIndex(interfaceName, mappingContext), dataAfter);
- LOG.info("Neighbour successfully written");
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull InstanceIdentifier<Neighbor> id, @Nonnull Neighbor dataBefore,
- @Nonnull Neighbor dataAfter,
- @Nonnull WriteContext writeContext) throws WriteFailedException {
- throw new UnsupportedOperationException("Operation not supported");
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull InstanceIdentifier<Neighbor> id, @Nonnull Neighbor dataBefore,
- @Nonnull WriteContext writeContext)
- throws WriteFailedException {
-
- checkNotNull(dataBefore, "Cannot delete null neighbour");
- checkArgument(id.firstKeyOf(Interface.class) != null, "No parent interface key found");
-
- LOG.debug("Processing request for Neigbour delete");
- String interfaceName = id.firstKeyOf(Interface.class).getName();
- MappingContext mappingContext = writeContext.getMappingContext();
-
- checkState(interfaceContext.containsIndex(interfaceName, mappingContext),
- "Mapping does not contains mapping for provider interface name %s", interfaceName);
-
- LOG.debug("Parent interface[{}] index found", interfaceName);
-
- addDelNeighbourAndReply(id, false,
- interfaceContext.getIndex(interfaceName, mappingContext), dataBefore);
- LOG.info("Neighbour {} successfully deleted", id);
- }
-
- private void addDelNeighbourAndReply(InstanceIdentifier<Neighbor> id, boolean add, int parentInterfaceIndex,
- Neighbor data) throws WriteFailedException {
-
- IpNeighborAddDel request = new IpNeighborAddDel();
-
- request.isAdd = booleanToByte(add);
- request.isIpv6 = 0;
- request.isStatic = 1;
- request.dstAddress = ipv4AddressNoZoneToArray(data.getIp());
- request.macAddress = parseMac(data.getLinkLayerAddress().getValue());
- request.swIfIndex = parentInterfaceIndex;
-
- //TODO HONEYCOMB-182 if it is necessary for future use ,make adjustments to be able to set vrfid
- //request.vrfId
- getReplyForWrite(getFutureJVpp().ipNeighborAddDel(request).toCompletableFuture(), id);
- }
-} \ No newline at end of file
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4Writer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4Writer.java
deleted file mode 100644
index 788deab3b..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv4Writer.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.ip;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.honeycomb.translate.vpp.util.ByteDataTranslator;
-import io.fd.honeycomb.translate.vpp.util.Ipv4Translator;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceAddDelAddress;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceAddDelAddressReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.CompletionStage;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-/**
- * Utility class providing Ipv4 CUD support.
- */
-public interface Ipv4Writer extends ByteDataTranslator, Ipv4Translator, JvppReplyConsumer {
-
- int DOTTED_QUAD_MASK_LENGTH = 4;
- int IPV4_ADDRESS_PART_BITS_COUNT = 8;
- int NETMASK_PART_LIMIT = 256; // 2 power to 8
-
- default void addDelAddress(@Nonnull final FutureJVppCore futureJVppCore, final boolean add,
- final InstanceIdentifier<?> id,
- @Nonnegative final int ifaceId,
- @Nonnull final Ipv4AddressNoZone address, @Nonnegative final byte prefixLength)
- throws WriteFailedException {
- checkArgument(prefixLength > 0, "Invalid prefix length");
- checkNotNull(address, "address should not be null");
-
- final byte[] addressBytes = ipv4AddressNoZoneToArray(address);
-
- final CompletionStage<SwInterfaceAddDelAddressReply> swInterfaceAddDelAddressReplyCompletionStage =
- futureJVppCore.swInterfaceAddDelAddress(
- getSwInterfaceAddDelAddressRequest(ifaceId, booleanToByte(add) /* isAdd */,
- (byte) 0 /* isIpv6 */, (byte) 0 /* delAll */, prefixLength, addressBytes));
-
- getReplyForWrite(swInterfaceAddDelAddressReplyCompletionStage.toCompletableFuture(), id);
- }
-
- default SwInterfaceAddDelAddress getSwInterfaceAddDelAddressRequest(final int swIfc, final byte isAdd,
- final byte ipv6, final byte deleteAll,
- final byte length, final byte[] addr) {
- final SwInterfaceAddDelAddress swInterfaceAddDelAddress = new SwInterfaceAddDelAddress();
- swInterfaceAddDelAddress.swIfIndex = swIfc;
- swInterfaceAddDelAddress.isAdd = isAdd;
- swInterfaceAddDelAddress.isIpv6 = ipv6;
- swInterfaceAddDelAddress.delAll = deleteAll;
- swInterfaceAddDelAddress.address = addr;
- swInterfaceAddDelAddress.addressLength = length;
- return swInterfaceAddDelAddress;
- }
-
- /**
- * Returns the prefix size in bits of the specified subnet mask. Example: For the subnet mask 255.255.255.128 it
- * returns 25 while for 255.0.0.0 it returns 8. If the passed subnetMask array is not complete or contains not only
- * leading ones, IllegalArgumentExpression is thrown
- *
- * @param mask the subnet mask in dot notation 255.255.255.255
- * @return the prefix length as number of bits
- */
- default byte getSubnetMaskLength(final String mask) {
- String[] maskParts = mask.split("\\.");
-
- checkArgument(maskParts.length == DOTTED_QUAD_MASK_LENGTH,
- "Network mask %s is not in Quad Dotted Decimal notation!", mask);
-
- long maskAsNumber = 0;
- for (int i = 0; i < DOTTED_QUAD_MASK_LENGTH; i++) {
- maskAsNumber <<= IPV4_ADDRESS_PART_BITS_COUNT;
- int value = Integer.parseInt(maskParts[i]);
- checkArgument(value < NETMASK_PART_LIMIT, "Network mask %s contains invalid number(s) over 255!", mask);
- checkArgument(value >= 0, "Network mask %s contains invalid negative number(s)!", mask);
- maskAsNumber += value;
- }
-
- String bits = Long.toBinaryString(maskAsNumber);
- checkArgument(bits.length() == IPV4_ADDRESS_PART_BITS_COUNT * DOTTED_QUAD_MASK_LENGTH,
- "Incorrect network mask %s", mask);
- final int leadingOnes = bits.indexOf('0');
- checkArgument(leadingOnes != -1, "Broadcast address %s is not allowed!", mask);
- checkArgument(bits.substring(leadingOnes).indexOf('1') == -1,
- "Non-contiguous network mask %s is not allowed!", mask);
- return (byte) leadingOnes;
- }
-
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv6Customizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv6Customizer.java
deleted file mode 100644
index 094957a91..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/Ipv6Customizer.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.ip;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.write.WriteContext;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.Ipv6;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Ipv6Customizer extends FutureJVppCustomizer implements WriterCustomizer<Ipv6> {
-
- private static final Logger LOG = LoggerFactory.getLogger(Ipv6Customizer.class);
-
- public Ipv6Customizer(final FutureJVppCore vppApi) {
- super(vppApi);
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Ipv6> id,
- @Nonnull final Ipv6 dataAfter, @Nonnull final WriteContext writeContext) {
- LOG.warn("Unsupported, ignoring configuration {}", dataAfter);
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Ipv6> id,
- @Nonnull final Ipv6 dataBefore, @Nonnull final Ipv6 dataAfter,
- @Nonnull final WriteContext writeContext) {
- LOG.warn("Unsupported, ignoring configuration {}", dataAfter);
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Ipv6> id,
- @Nonnull final Ipv6 dataBefore, @Nonnull final WriteContext writeContext) {
- LOG.warn("Unsupported, ignoring configuration delete {}", id);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/SubInterfaceIpv4AddressCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/SubInterfaceIpv4AddressCustomizer.java
deleted file mode 100644
index 52c541198..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/SubInterfaceIpv4AddressCustomizer.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.ip;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.vpp.util.SubInterfaceUtils;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.interfaces._interface.sub.interfaces.SubInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.ip4.attributes.ipv4.Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.ip4.attributes.ipv4.AddressKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.ip4.attributes.ipv4.address.Subnet;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.ip4.attributes.ipv4.address.subnet.Netmask;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vlan.rev161214.sub._interface.ip4.attributes.ipv4.address.subnet.PrefixLength;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Write customizer for sub-interface {@link Address}
- */
-public class SubInterfaceIpv4AddressCustomizer extends FutureJVppCustomizer
- implements ListWriterCustomizer<Address, AddressKey>, Ipv4Writer {
-
- private static final Logger LOG = LoggerFactory.getLogger(SubInterfaceIpv4AddressCustomizer.class);
- private final NamingContext interfaceContext;
-
- public SubInterfaceIpv4AddressCustomizer(@Nonnull final FutureJVppCore futureJVppCore,
- @Nonnull final NamingContext interfaceContext) {
- super(futureJVppCore);
- this.interfaceContext = checkNotNull(interfaceContext, "interface context should not be null");
- }
-
- @Override
- public void writeCurrentAttributes(InstanceIdentifier<Address> id, Address dataAfter, WriteContext writeContext)
- throws WriteFailedException {
- setAddress(true, id, dataAfter, writeContext);
- }
-
- @Override
- public void updateCurrentAttributes(InstanceIdentifier<Address> id, Address dataBefore, Address dataAfter,
- WriteContext writeContext) throws WriteFailedException {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter,
- new UnsupportedOperationException("Operation not supported"));
- }
-
- @Override
- public void deleteCurrentAttributes(InstanceIdentifier<Address> id, Address dataBefore, WriteContext writeContext)
- throws WriteFailedException {
- setAddress(false, id, dataBefore, writeContext);
- }
-
- private void setAddress(boolean add, final InstanceIdentifier<Address> id, final Address address,
- final WriteContext writeContext) throws WriteFailedException {
-
- final String interfaceName = id.firstKeyOf(Interface.class).getName();
- final String subInterfaceName = getSubInterfaceName(id);
- final int subInterfaceIndex = interfaceContext.getIndex(subInterfaceName, writeContext.getMappingContext());
-
- Subnet subnet = address.getSubnet();
-
- if (subnet instanceof PrefixLength) {
- setPrefixLengthSubnet(add, id, interfaceName, subInterfaceIndex, address, (PrefixLength) subnet);
- } else if (subnet instanceof Netmask) {
- setNetmaskSubnet(add, id, interfaceName, subInterfaceIndex, address, (Netmask) subnet);
- } else {
- LOG.error("Unable to handle subnet of type {}", subnet.getClass());
- throw new WriteFailedException(id, "Unable to handle subnet of type " + subnet.getClass());
- }
- }
-
- private String getSubInterfaceName(@Nonnull final InstanceIdentifier<Address> id) {
- final InterfaceKey parentInterfacekey = id.firstKeyOf(Interface.class);
- final SubInterfaceKey subInterfacekey = id.firstKeyOf(SubInterface.class);
- return SubInterfaceUtils
- .getSubInterfaceName(parentInterfacekey.getName(), subInterfacekey.getIdentifier().intValue());
- }
-
- private void setNetmaskSubnet(final boolean add, @Nonnull final InstanceIdentifier<Address> id,
- @Nonnull final String subInterfaceName, final int subInterfaceIndex,
- @Nonnull final Address address, @Nonnull final Netmask subnet)
- throws WriteFailedException {
-
- LOG.debug("Setting Subnet(subnet-mask) for sub-interface: {}(id={}). Subnet: {}, address: {}",
- subInterfaceName, subInterfaceIndex, subnet, address);
-
- final DottedQuad netmask = subnet.getNetmask();
- checkNotNull(netmask, "netmask value should not be null");
-
- final byte subnetLength = getSubnetMaskLength(netmask.getValue());
- addDelAddress(getFutureJVpp(), add, id, subInterfaceIndex, address.getIp(), subnetLength);
- }
-
- private void setPrefixLengthSubnet(final boolean add, @Nonnull final InstanceIdentifier<Address> id,
- @Nonnull final String subInterfaceName, final int subInterfaceIndex,
- @Nonnull final Address address, @Nonnull final PrefixLength subnet)
- throws WriteFailedException {
- LOG.debug("Setting Subnet(prefix-length) for sub-interface: {}(id={}). Subnet: {}, address: {}",
- subInterfaceName, subInterfaceIndex, subnet, address);
-
- addDelAddress(getFutureJVpp(), add, id, subInterfaceIndex, address.getIp(),
- subnet.getPrefixLength().byteValue());
-
- LOG.debug("Subnet(prefix-length) set successfully for sub-interface: {}(id={}). Subnet: {}, address: {}",
- subInterfaceName, subInterfaceIndex, subnet, address);
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/subnet/validation/SubnetValidationException.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/subnet/validation/SubnetValidationException.java
deleted file mode 100644
index ae8291027..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/subnet/validation/SubnetValidationException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.ip.subnet.validation;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collection;
-import javax.annotation.Nonnull;
-import org.apache.commons.lang3.StringUtils;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Address;
-
-/**
- * Thrown as negative result of subnet validation
- */
-public class SubnetValidationException extends Exception {
-
- private SubnetValidationException(@Nonnull final String message) {
- super(message);
- }
-
- public static SubnetValidationException forConflictingData(@Nonnull final Short prefix, @Nonnull Collection<Address> addresses) {
- return new SubnetValidationException(
- "Attempt to define multiple addresses for same subnet[prefixLen = " + prefixToString(prefix) + "], "
- + "addresses : " + addressesToString(addresses));
- }
-
- private static String prefixToString(final Short prefix) {
- return checkNotNull(prefix, "Cannot create " + SubnetValidationException.class.getName() + " for null prefix")
- .toString();
- }
-
- private static String addressesToString(final Collection<Address> addresses) {
- return StringUtils.join(checkNotNull(addresses,
- "Cannot create " + SubnetValidationException.class.getName() + " for null address list"), " | ");
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/subnet/validation/SubnetValidator.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/subnet/validation/SubnetValidator.java
deleted file mode 100644
index a314eaf14..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/ip/subnet/validation/SubnetValidator.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.ip.subnet.validation;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
-import io.fd.honeycomb.translate.v3po.interfaces.ip.Ipv4Writer;
-import java.util.List;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.Address;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.Subnet;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.subnet.Netmask;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev140616.interfaces._interface.ipv4.address.subnet.PrefixLength;
-
-/**
- * Validator for detecting if there is an attempt to assign multiple addresses from same subnet
- */
-public class SubnetValidator implements Ipv4Writer {
-
- /**
- * Checks whether data provided for writing are not in collision with already existing data
- */
- public void checkNotAddingToSameSubnet(@Nonnull final List<Address> addresses)
- throws SubnetValidationException {
-
- final Multimap<Short, Address> prefixLengthRegister = Multimaps.index(addresses, toPrefixLength());
- final int keySetSize = prefixLengthRegister.keySet().size();
-
- if (keySetSize == 0 || keySetSize == addresses.size()) {
- //this means that every key is unique(has only one value) or no addresses were prefix-length based ,so there is no conflict
- return;
- }
-
- //finds conflicting prefix
- final Short conflictingPrefix = prefixLengthRegister.keySet()
- .stream()
- .filter(a -> prefixLengthRegister.get(a).size() > 1)
- .findFirst()
- .get();
-
- //and reports it with affected addresses
- throw SubnetValidationException
- .forConflictingData(conflictingPrefix, prefixLengthRegister.get(conflictingPrefix));
- }
-
- private Function<Address, Short> toPrefixLength() {
- return (final Address address) -> {
- final Subnet subnet = address.getSubnet();
-
- if (subnet instanceof PrefixLength) {
- return ((PrefixLength) subnet).getPrefixLength();
- }
-
- if (address.getSubnet() instanceof Netmask) {
- return (short) getSubnetMaskLength(
- checkNotNull(((Netmask) subnet).getNetmask(), "No netmask defined for %s", subnet)
- .getValue());
- }
-
- throw new IllegalArgumentException("Unsupported subnet : " + subnet);
- };
- }
-}
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/pbb/PbbRewriteCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/pbb/PbbRewriteCustomizer.java
deleted file mode 100644
index 8b6ccb128..000000000
--- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/translate/v3po/interfaces/pbb/PbbRewriteCustomizer.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.translate.v3po.interfaces.pbb;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
-import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.vpp.util.MacTranslator;
-import io.fd.honeycomb.translate.vpp.util.NamingContext;
-import io.fd.honeycomb.translate.write.WriteContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.VppBaseCallException;
-import io.fd.vpp.jvpp.core.dto.L2InterfacePbbTagRewrite;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-import java.util.concurrent.TimeoutException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.pbb.rev161214.interfaces._interface.PbbRewrite;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public class PbbRewriteCustomizer extends FutureJVppCustomizer
- implements WriterCustomizer<PbbRewrite>, MacTranslator, JvppReplyConsumer {
-
- private static final int OPERATION_DISABLE = 0;
-
- private final NamingContext interfaceNamingContext;
-
- public PbbRewriteCustomizer(@Nonnull final FutureJVppCore futureJVppCore,
- @Nonnull final NamingContext interfaceNamingContext) {
- super(futureJVppCore);
- this.interfaceNamingContext = checkNotNull(interfaceNamingContext, "Interface naming context cannot be null");
- }
-
- @Override
- public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<PbbRewrite> id,
- @Nonnull final PbbRewrite dataAfter, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
- try {
- setPbbRewrite(id, dataAfter, writeContext, false);
- } catch (TimeoutException | VppBaseCallException e) {
- throw new WriteFailedException.CreateFailedException(id, dataAfter, e);
- }
- }
-
- @Override
- public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<PbbRewrite> id,
- @Nonnull final PbbRewrite dataBefore, @Nonnull final PbbRewrite dataAfter,
- @Nonnull final WriteContext writeContext) throws WriteFailedException {
- try {
- setPbbRewrite(id, dataAfter, writeContext, false);
- } catch (TimeoutException | VppBaseCallException e) {
- throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, e);
- }
- }
-
- @Override
- public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<PbbRewrite> id,
- @Nonnull final PbbRewrite dataBefore, @Nonnull final WriteContext writeContext)
- throws WriteFailedException {
-
- try {
- setPbbRewrite(id, dataBefore, writeContext, true);
- } catch (TimeoutException | VppBaseCallException e) {
- throw new WriteFailedException.DeleteFailedException(id, e);
- }
- }
-
- private void setPbbRewrite(final InstanceIdentifier<PbbRewrite> id, final PbbRewrite data,
- final WriteContext writeContext, final boolean disable)
- throws TimeoutException, VppBaseCallException {
- final String interfaceName = checkNotNull(id.firstKeyOf(Interface.class), "Interface key not found").getName();
-
- final L2InterfacePbbTagRewrite request = new L2InterfacePbbTagRewrite();
-
- //checking all attributes in preconditions(pbb-rewrite is subcontainer, so there can't be mandatory statements)
- request.swIfIndex = interfaceNamingContext.getIndex(interfaceName, writeContext.getMappingContext());
- request.bDmac = parseMac(verifiedDestinationAddress(data));
- request.bSmac = parseMac(verifiedSourceAddress(data));
- request.bVlanid = verifiedBVlanId(data);
- request.iSid = verifiedISid(data);
- request.vtrOp = verifiedOperation(data, disable);
-
- //not sure whats gonna happen to this attribute, so its left optional for now
- if (data.getOuterTag() != null) {
- request.outerTag = data.getOuterTag().shortValue();
- }
-
- getReply(getFutureJVpp().l2InterfacePbbTagRewrite(request).toCompletableFuture());
- }
-
- private String verifiedDestinationAddress(final PbbRewrite data) {
- return checkNotNull(data.getDestinationAddress(), "Destination address cannot be null").getValue();
- }
-
- private String verifiedSourceAddress(final PbbRewrite data) {
- return checkNotNull(data.getSourceAddress(), "Destination address cannot be null").getValue();
- }
-
- private byte verifiedBVlanId(final PbbRewrite data) {
- return (byte) checkNotNull(data.getBVlanTagVlanId(), "BVlan id cannot be null").shortValue();
- }
-
- private int verifiedISid(final PbbRewrite data) {
- return checkNotNull(data.getITagIsid(), "ISid cannot be null").intValue();
- }
-
- // if disabled ,then uses non-public allowed value 0, which is equal to operation disable
- private int verifiedOperation(final PbbRewrite data, final boolean disable) {
-
- return disable
- ? OPERATION_DISABLE
- : checkNotNull(data.getInterfaceOperation(), "Operation cannot be null").getIntValue();
- }
-}