diff options
author | Marek Gradzki <mgradzki@cisco.com> | 2018-06-20 16:37:06 +0200 |
---|---|---|
committer | Marek Gradzki <mgradzki@cisco.com> | 2018-06-22 10:04:34 +0200 |
commit | b9e58bf303a099805ecb24ca3a97027b3c34a211 (patch) | |
tree | c7dfa86c0e70436775658d83f6e65273da2cebd2 /v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces | |
parent | bf9cd1463cf5f23e6a2e8db891b13457315df272 (diff) |
HC2VPP-88: translation layer for af_packet interface management
Includes postman collection with RESTCONF examples.
Change-Id: If6f7ba1e2e7ab37433ebc5215e4731f1193c62a2
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
Diffstat (limited to 'v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces')
-rw-r--r-- | v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/AfPacketCustomizer.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/AfPacketCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/AfPacketCustomizer.java new file mode 100644 index 000000000..67d879bd7 --- /dev/null +++ b/v3po/v3po2vpp/src/main/java/io/fd/hc2vpp/v3po/interfaces/AfPacketCustomizer.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.hc2vpp.v3po.interfaces; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import io.fd.hc2vpp.common.translate.util.AbstractInterfaceTypeCustomizer; +import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; +import io.fd.hc2vpp.common.translate.util.MacTranslator; +import io.fd.hc2vpp.common.translate.util.NamingContext; +import io.fd.honeycomb.translate.write.WriteContext; +import io.fd.honeycomb.translate.write.WriteFailedException; +import io.fd.vpp.jvpp.core.dto.AfPacketCreate; +import io.fd.vpp.jvpp.core.dto.AfPacketCreateReply; +import io.fd.vpp.jvpp.core.dto.AfPacketDelete; +import io.fd.vpp.jvpp.core.dto.AfPacketDeleteReply; +import io.fd.vpp.jvpp.core.future.FutureJVppCore; +import java.nio.charset.StandardCharsets; +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.rev170607.interfaces._interface.AfPacket; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AfPacketCustomizer extends AbstractInterfaceTypeCustomizer<AfPacket> + implements MacTranslator, JvppReplyConsumer { + + private static final Logger LOG = LoggerFactory.getLogger(AfPacketCustomizer.class); + private final NamingContext interfaceContext; + + public AfPacketCustomizer(@Nonnull final FutureJVppCore vppApi, @Nonnull final NamingContext interfaceContext) { + super(vppApi); + this.interfaceContext = 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.rev170607.AfPacket.class; + } + + @Override + protected final void writeInterface(@Nonnull final InstanceIdentifier<AfPacket> id, + @Nonnull final AfPacket dataAfter, @Nonnull final WriteContext writeContext) + throws WriteFailedException { + final String swIfName = id.firstKeyOf(Interface.class).getName(); + final int swIfIndex = createAfPacketIfc(id, swIfName, dataAfter); + + // Add new interface to our interface context + interfaceContext.addName(swIfIndex, swIfName, writeContext.getMappingContext()); + } + + @Override + public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<AfPacket> id, + @Nonnull final AfPacket dataBefore, @Nonnull final WriteContext writeContext) + throws WriteFailedException { + final String swIfName = id.firstKeyOf(Interface.class).getName(); + deleteAfPacketIfc(id, swIfName, dataBefore); + + // Remove interface from interface context + interfaceContext.removeName(swIfName, writeContext.getMappingContext()); + } + + private int createAfPacketIfc(final InstanceIdentifier<AfPacket> id, final String swIfName, final AfPacket afPacket) + throws WriteFailedException { + LOG.debug("Creating af_packet interface {}: {}", swIfName, afPacket); + final CompletionStage<AfPacketCreateReply> createAfPacketIfReplyCompletionStage = + getFutureJVpp().afPacketCreate(getCreateRequest(afPacket)); + final AfPacketCreateReply reply = + getReplyForCreate(createAfPacketIfReplyCompletionStage.toCompletableFuture(), id, afPacket); + LOG.debug("Af_packet interface {} created successfully: {}", swIfName, afPacket); + return reply.swIfIndex; + } + + private AfPacketCreate getCreateRequest(@Nonnull final AfPacket afPacket) { + final AfPacketCreate request = new AfPacketCreate(); + checkArgument(afPacket.getHostInterfaceName() != null, + "host-interface-name is mandatory for af-packet interface"); + request.hostIfName = afPacket.getHostInterfaceName().getBytes(StandardCharsets.UTF_8); + checkArgument(request.hostIfName.length <= 64, + "Interface name for af_packet interface should not be longer than 64 bytes, but was %s", + request.hostIfName.length); + final PhysAddress mac = afPacket.getMac(); + if (mac == null) { + request.useRandomHwAddr = 1; + request.hwAddr = new byte[6]; + } else { + request.useRandomHwAddr = 0; + request.hwAddr = parseMac(mac.getValue()); + } + return request; + } + + private void deleteAfPacketIfc(final InstanceIdentifier<AfPacket> id, final String swIfName, + final AfPacket afPacket) throws WriteFailedException { + LOG.debug("Deleting af_packet interface {}: {}", swIfName, afPacket); + final CompletionStage<AfPacketDeleteReply> deleteAfPacketIfReplyCompletionStage = + getFutureJVpp().afPacketDelete(getDeleteRequest(afPacket)); + + getReplyForDelete(deleteAfPacketIfReplyCompletionStage.toCompletableFuture(), id); + LOG.debug("Af_packet interface {} deleted successfully: {}", swIfName, afPacket); + } + + private AfPacketDelete getDeleteRequest(@Nonnull final AfPacket afPacket) { + final AfPacketDelete request = new AfPacketDelete(); + request.hostIfName = afPacket.getHostInterfaceName().getBytes(StandardCharsets.UTF_8); + return request; + } +} |