summaryrefslogtreecommitdiffstats
path: root/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering
diff options
context:
space:
mode:
Diffstat (limited to 'srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering')
-rw-r--r--srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/InterfacesConfigCustomizer.java92
-rw-r--r--srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/PrefixCustomizer.java71
-rw-r--r--srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/PrefixesConfigCustomizer.java91
-rw-r--r--srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/L2SteeringRequest.java65
-rw-r--r--srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/L3SteeringRequest.java99
-rw-r--r--srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/SteeringRequest.java52
6 files changed, 470 insertions, 0 deletions
diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/InterfacesConfigCustomizer.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/InterfacesConfigCustomizer.java
new file mode 100644
index 000000000..67ad9d56c
--- /dev/null
+++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/InterfacesConfigCustomizer.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2018 Bell Canada, Pantheon Technologies 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.srv6.write.steering;
+
+import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer;
+import io.fd.hc2vpp.common.translate.util.NamingContext;
+import io.fd.hc2vpp.srv6.util.Srv6Util;
+import io.fd.hc2vpp.srv6.write.steering.request.L2SteeringRequest;
+import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
+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.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.hc2vpp.params.xml.ns.yang.vpp.oc.srte.policy.rev180514.sr.interfaces._interface.Config;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class InterfacesConfigCustomizer extends FutureJVppCustomizer implements
+ ListWriterCustomizer<Interface, InterfaceKey> {
+ private final NamingContext interfaceContext;
+
+ public InterfacesConfigCustomizer(@Nonnull final FutureJVppCore futureJVppCore,
+ @Nonnull final NamingContext interfaceContext) {
+ super(futureJVppCore);
+ this.interfaceContext = interfaceContext;
+ }
+
+ @Override
+ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Interface> instanceIdentifier,
+ @Nonnull final Interface anInterface, @Nonnull final WriteContext writeContext)
+ throws WriteFailedException {
+ if (anInterface.getConfig() != null) {
+ writeInterfaces(instanceIdentifier, anInterface.getConfig(), writeContext, true);
+ }
+ }
+
+ @Override
+ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Interface> instanceIdentifier,
+ @Nonnull final Interface anInterface, @Nonnull final WriteContext writeContext)
+ throws WriteFailedException {
+ if (anInterface.getConfig() != null) {
+ writeInterfaces(instanceIdentifier, anInterface.getConfig(), writeContext, false);
+ }
+ }
+
+ private void writeInterfaces(final @Nonnull InstanceIdentifier<Interface> instanceIdentifier,
+ final @Nonnull Config config, final @Nonnull WriteContext writeContext,
+ final boolean isWrite)
+ throws WriteFailedException {
+ Ipv6Address bsid = Srv6Util.extractBsid(instanceIdentifier, writeContext, isWrite);
+
+ if (bsid == null) {
+ throw new WriteFailedException.CreateFailedException(instanceIdentifier, config,
+ new Throwable("Failed to extract BSID from policy for prefix"));
+ }
+ if (config.getInputInterface() != null) {
+ // forward all traffic to policy for current interface
+ int index = interfaceContext.getIndex(config.getInputInterface(), writeContext.getMappingContext());
+ sendL2Steering(instanceIdentifier, bsid, index, getFutureJVpp(), isWrite);
+ }
+ }
+
+ private void sendL2Steering(final InstanceIdentifier<Interface> instanceIdentifier, final Ipv6Address bsid,
+ final int inputInterface, final FutureJVppCore api, final boolean isWrite)
+ throws WriteFailedException {
+ L2SteeringRequest request = new L2SteeringRequest(api);
+ request.setBindingSid(bsid);
+ request.setInputInterfaceIndex(inputInterface);
+ if (isWrite) {
+ request.write(instanceIdentifier);
+ } else {
+ request.delete(instanceIdentifier);
+ }
+ }
+}
diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/PrefixCustomizer.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/PrefixCustomizer.java
new file mode 100644
index 000000000..7973c3203
--- /dev/null
+++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/PrefixCustomizer.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2018 Bell Canada, Pantheon Technologies 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.srv6.write.steering;
+
+import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer;
+import io.fd.hc2vpp.srv6.util.Srv6Util;
+import io.fd.hc2vpp.srv6.write.steering.request.L3SteeringRequest;
+import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
+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.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.Prefix;
+import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.PrefixKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class PrefixCustomizer extends FutureJVppCustomizer implements ListWriterCustomizer<Prefix, PrefixKey> {
+
+ public PrefixCustomizer(@Nonnull final FutureJVppCore futureJVppCore) {
+ super(futureJVppCore);
+ }
+
+ @Override
+ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Prefix> instanceIdentifier,
+ @Nonnull final Prefix prefix,
+ @Nonnull final WriteContext writeContext) throws WriteFailedException {
+ writePrefixes(instanceIdentifier, prefix, writeContext, true).write(instanceIdentifier);
+ }
+
+ @Override
+ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Prefix> instanceIdentifier,
+ @Nonnull final Prefix prefix,
+ @Nonnull final WriteContext writeContext) throws WriteFailedException {
+ writePrefixes(instanceIdentifier, prefix, writeContext, false).delete(instanceIdentifier);
+ }
+
+ private L3SteeringRequest writePrefixes(final @Nonnull InstanceIdentifier<Prefix> instanceIdentifier,
+ final @Nonnull Prefix prefix, final @Nonnull WriteContext writeContext,
+ final boolean isWrite)
+ throws WriteFailedException {
+ Ipv6Address bsid = Srv6Util.extractBsid(instanceIdentifier, writeContext, isWrite);
+ int vrfFib = Srv6Util.extractVrfFib(instanceIdentifier, writeContext, isWrite);
+
+ if (bsid == null) {
+ throw new WriteFailedException.CreateFailedException(instanceIdentifier, prefix,
+ new Throwable("Failed to extract BSID from policy for prefix"));
+ }
+ // forward only desired traffic to policy
+ L3SteeringRequest request = new L3SteeringRequest(getFutureJVpp());
+ request.setBindingSid(bsid);
+ request.setPrefix(prefix.getIpPrefix());
+ request.setFibTableIndex(vrfFib);
+ return request;
+ }
+}
diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/PrefixesConfigCustomizer.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/PrefixesConfigCustomizer.java
new file mode 100644
index 000000000..e366db3a3
--- /dev/null
+++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/PrefixesConfigCustomizer.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2018 Bell Canada, Pantheon Technologies 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.srv6.write.steering;
+
+import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer;
+import io.fd.hc2vpp.srv6.util.Srv6Util;
+import io.fd.hc2vpp.srv6.write.steering.request.L3SteeringRequest;
+import io.fd.honeycomb.translate.spi.write.WriterCustomizer;
+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.http.cisco.com.ns.yang.oc.srte.policy.rev170918.prefixes.properties.prefixes.Config;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
+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.inet.types.rev130715.Ipv6Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class PrefixesConfigCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Config> {
+
+ private static final IpPrefix
+ DEFAULT_IPV6_PREFIX = new IpPrefix(new Ipv6Prefix("::/0"));
+ private static final IpPrefix
+ DEFAULT_IPV4_PREFIX = new IpPrefix(new Ipv4Prefix("0.0.0.0/0"));
+
+ public PrefixesConfigCustomizer(@Nonnull final FutureJVppCore futureJVppCore) {
+ super(futureJVppCore);
+ }
+
+ private void writePrefixes(final @Nonnull InstanceIdentifier<Config> instanceIdentifier,
+ final @Nonnull Config config, final @Nonnull WriteContext writeContext,
+ final boolean isWrite)
+ throws WriteFailedException {
+ Ipv6Address bsid = Srv6Util.extractBsid(instanceIdentifier, writeContext, isWrite);
+ int vrfFib = Srv6Util.extractVrfFib(instanceIdentifier, writeContext, isWrite);
+
+ if (bsid == null) {
+ throw new WriteFailedException.CreateFailedException(instanceIdentifier, config,
+ new Throwable("Failed to extract BSID from policy for prefix"));
+ }
+ if (config.isPrefixesAll()) {
+ // forward all traffic to policy
+ writeL3Steering(vrfFib, instanceIdentifier, DEFAULT_IPV6_PREFIX, bsid, getFutureJVpp(), isWrite);
+ writeL3Steering(vrfFib, instanceIdentifier, DEFAULT_IPV4_PREFIX, bsid, getFutureJVpp(), isWrite);
+ }
+ }
+
+ private void writeL3Steering(int vrfFib, InstanceIdentifier instanceIdentifier, IpPrefix ipPrefix,
+ final Ipv6Address bsid, FutureJVppCore api, boolean isWrite)
+ throws WriteFailedException {
+ L3SteeringRequest request = new L3SteeringRequest(api);
+ request.setBindingSid(bsid);
+ request.setPrefix(ipPrefix);
+ request.setFibTableIndex(vrfFib);
+ if (isWrite) {
+ request.write(instanceIdentifier);
+ } else {
+ request.delete(instanceIdentifier);
+ }
+ }
+
+ @Override
+ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Config> instanceIdentifier,
+ @Nonnull final Config config,
+ @Nonnull final WriteContext writeContext) throws WriteFailedException {
+ writePrefixes(instanceIdentifier, config, writeContext, true);
+ }
+
+ @Override
+ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Config> instanceIdentifier,
+ @Nonnull final Config config,
+ @Nonnull final WriteContext writeContext) throws WriteFailedException {
+ writePrefixes(instanceIdentifier, config, writeContext, false);
+ }
+}
diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/L2SteeringRequest.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/L2SteeringRequest.java
new file mode 100644
index 000000000..960d17bb9
--- /dev/null
+++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/L2SteeringRequest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2018 Bell Canada, Pantheon Technologies 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.srv6.write.steering.request;
+
+import io.fd.hc2vpp.srv6.write.DeleteRequest;
+import io.fd.hc2vpp.srv6.write.WriteRequest;
+import io.fd.honeycomb.translate.write.WriteFailedException;
+import io.fd.vpp.jvpp.core.dto.SrSteeringAddDel;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Request for steering of L2 traffic
+ */
+public class L2SteeringRequest extends SteeringRequest implements WriteRequest, DeleteRequest {
+
+ private static final int L2_TRAFFIC_TYPE = 2;
+
+ /**
+ * Incoming interface for traffic
+ */
+ private int inputInterfaceIndex;
+
+ public L2SteeringRequest(final FutureJVppCore api) {
+ super(api);
+ }
+
+
+ @Override
+ public void delete(final InstanceIdentifier<?> identifier) throws WriteFailedException {
+ getReplyForDelete(getApi().srSteeringAddDel(bindRequest(true)).toCompletableFuture(), identifier);
+ }
+
+ @Override
+ public void write(final InstanceIdentifier<?> identifier) throws WriteFailedException {
+ getReplyForWrite(getApi().srSteeringAddDel(bindRequest(false)).toCompletableFuture(), identifier);
+ }
+
+ private SrSteeringAddDel bindRequest(final boolean isDel) {
+ final SrSteeringAddDel request = new SrSteeringAddDel();
+ request.isDel = booleanToByte(isDel);
+ request.bsidAddr = ipv6AddressNoZoneToArray(getBindingSid());
+ request.swIfIndex = inputInterfaceIndex;
+ request.trafficType = L2_TRAFFIC_TYPE;
+ return request;
+ }
+
+ public void setInputInterfaceIndex(final int inputInterfaceIndex) {
+ this.inputInterfaceIndex = inputInterfaceIndex;
+ }
+}
diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/L3SteeringRequest.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/L3SteeringRequest.java
new file mode 100644
index 000000000..850234c41
--- /dev/null
+++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/L3SteeringRequest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2018 Bell Canada, Pantheon Technologies 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.srv6.write.steering.request;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import io.fd.hc2vpp.srv6.write.DeleteRequest;
+import io.fd.hc2vpp.srv6.write.WriteRequest;
+import io.fd.honeycomb.translate.write.WriteFailedException;
+import io.fd.vpp.jvpp.core.dto.SrSteeringAddDel;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Request for steering of L3 traffic
+ */
+public class L3SteeringRequest extends SteeringRequest implements WriteRequest, DeleteRequest {
+
+ public static final byte VPP_IPV4_TYPE = 4;
+ public static final byte VPP_IPV6_TYPE = 6;
+ public static final byte VPP_UNRESOLVED_TYPE = 0;
+ /**
+ * Where to install FIB entry for this steering
+ */
+ private int fibTableIndex;
+
+ /**
+ * V4/V6 address for traffic type
+ */
+ private IpPrefix prefix;
+
+ public L3SteeringRequest(final FutureJVppCore api) {
+ super(api);
+ }
+
+ @Override
+ public void checkValid() {
+ super.checkValid();
+ checkNotNull(prefix, "Prefix is null");
+ checkArgument(resolveTrafficType(prefix) == 4 || resolveTrafficType(prefix) == 6,
+ "IpPrefix format not recognized");
+ }
+
+ @Override
+ public void delete(final InstanceIdentifier<?> identifier) throws WriteFailedException {
+ checkValid();
+ getReplyForDelete(getApi().srSteeringAddDel(bindRequest(true)).toCompletableFuture(), identifier);
+ }
+
+ @Override
+ public void write(final InstanceIdentifier<?> identifier) throws WriteFailedException {
+ checkValid();
+ getReplyForWrite(getApi().srSteeringAddDel(bindRequest(false)).toCompletableFuture(), identifier);
+ }
+
+ private SrSteeringAddDel bindRequest(final boolean isDel) {
+ final SrSteeringAddDel request = new SrSteeringAddDel();
+ request.isDel = booleanToByte(isDel);
+ request.bsidAddr = ipv6AddressNoZoneToArray(getBindingSid());
+ request.tableId = fibTableIndex;
+ request.trafficType = resolveTrafficType(prefix);
+ request.prefixAddr = ipPrefixToArray(prefix);
+ request.maskWidth = extractPrefix(prefix);
+ return request;
+ }
+
+ public void setFibTableIndex(final int fibTableIndex) {
+ this.fibTableIndex = fibTableIndex;
+ }
+
+ private byte resolveTrafficType(IpPrefix prefix) {
+ if (prefix.getIpv4Prefix() != null) {
+ return VPP_IPV4_TYPE;
+ } else if (prefix.getIpv6Prefix() != null) {
+ return VPP_IPV6_TYPE;
+ }
+ return VPP_UNRESOLVED_TYPE;
+ }
+
+ public void setPrefix(final IpPrefix prefix) {
+ this.prefix = prefix;
+ }
+}
diff --git a/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/SteeringRequest.java b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/SteeringRequest.java
new file mode 100644
index 000000000..2078ade5b
--- /dev/null
+++ b/srv6/srv6-impl/src/main/java/io/fd/hc2vpp/srv6/write/steering/request/SteeringRequest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2018 Bell Canada, Pantheon Technologies 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.srv6.write.steering.request;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import io.fd.hc2vpp.srv6.util.JVppRequest;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
+
+/**
+ * General template for steering requests
+ */
+public abstract class SteeringRequest extends JVppRequest {
+
+ /**
+ * Binding SID of policy that should be applied for this traffic
+ */
+ private Ipv6Address bindingSid;
+
+ SteeringRequest(final FutureJVppCore api) {
+ super(api);
+ }
+
+ @Override
+ public void checkValid() {
+ checkNotNull(bindingSid, "Binding SID is null");
+ }
+
+ Ipv6Address getBindingSid() {
+ return bindingSid;
+ }
+
+ public void setBindingSid(
+ final Ipv6Address bindingSid) {
+ this.bindingSid = bindingSid;
+ }
+}