diff options
author | Marek Gradzki <mgradzki@cisco.com> | 2018-01-31 14:39:29 +0100 |
---|---|---|
committer | Marek Gradzki <mgradzki@cisco.com> | 2018-01-31 16:05:17 +0000 |
commit | 140fe3d19adcc23dc2a819eb34dfd09b843e4eac (patch) | |
tree | 7326bf984dd0e1bd799499e696c5042d65bc8931 /mpls | |
parent | 12f5de88789d72a05bd87c73b319ef9093f3e8d0 (diff) |
HC2VPP-280: make next-hop optional for impose-and-forward
Next hop address is not mandatory in VPP CLI, e.g.
ip route add 192.0.2.11/32 via loop0 out-labels 3
Also hc2vpp-ietf-routing-types@2017-02-27.yang defines it as optional.
Change-Id: I6bd63a3ac75d40b14ae553e128b7ebe43dee5118
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
(cherry picked from commit 710a7932be189a6bfc342b471efa1044f8a9798a)
Diffstat (limited to 'mpls')
-rw-r--r-- | mpls/impl/src/main/java/io/fd/hc2vpp/mpls/ImposeAndForwardWriter.java | 22 | ||||
-rw-r--r-- | mpls/impl/src/test/java/io/fd/hc2vpp/mpls/ImposeAndForwardTest.java | 23 |
2 files changed, 35 insertions, 10 deletions
diff --git a/mpls/impl/src/main/java/io/fd/hc2vpp/mpls/ImposeAndForwardWriter.java b/mpls/impl/src/main/java/io/fd/hc2vpp/mpls/ImposeAndForwardWriter.java index 14053b63d..861ab9ddf 100644 --- a/mpls/impl/src/main/java/io/fd/hc2vpp/mpls/ImposeAndForwardWriter.java +++ b/mpls/impl/src/main/java/io/fd/hc2vpp/mpls/ImposeAndForwardWriter.java @@ -103,12 +103,15 @@ final class ImposeAndForwardWriter implements LspWriter, Ipv4Translator { private String translate(@Nonnull final SimplePath path, @Nonnull final IpAddDelRoute request) { final IpAddress nextHop = path.getNextHop(); - checkArgument(nextHop != null, "Configuring impose-and-forward, but next-hop is missing."); // TODO(HC2VPP-264): add support for mpls + v6 - final Ipv4Address address = nextHop.getIpv4Address(); - checkArgument(address != null, "Only IPv4 next-hop address is supported."); - request.nextHopAddress = ipv4AddressNoZoneToArray(address.getValue()); + if (nextHop != null) { + final Ipv4Address address = nextHop.getIpv4Address(); + checkArgument(address != null, "Only IPv4 next-hop address is supported."); + request.nextHopAddress = ipv4AddressNoZoneToArray(address.getValue()); + } else { + request.nextHopAddress = new byte[0]; + } final MplsLabel outgoingLabel = path.getOutgoingLabel(); checkArgument(outgoingLabel != null, "Configuring impose-and-forward, but outgoing-label is missing."); @@ -122,12 +125,15 @@ final class ImposeAndForwardWriter implements LspWriter, Ipv4Translator { checkArgument(pathList.getPaths() != null && pathList.getPaths().size() == 1, "Only single path is supported"); final Paths paths = pathList.getPaths().get(0); final IpAddress nextHop = paths.getNextHop(); - checkArgument(nextHop != null, "Configuring impose-and-forward, but next-hop is missing."); // TODO(HC2VPP-264): add support for mpls + v6 - final Ipv4Address address = nextHop.getIpv4Address(); - checkArgument(address != null, "Only IPv4 next-hop address is supported."); - request.nextHopAddress = ipv4AddressNoZoneToArray(address.getValue()); + if (nextHop != null) { + final Ipv4Address address = nextHop.getIpv4Address(); + checkArgument(address != null, "Only IPv4 next-hop address is supported."); + request.nextHopAddress = ipv4AddressNoZoneToArray(address.getValue()); + } else { + request.nextHopAddress = new byte[0]; + } final List<MplsLabel> labels = paths.getOutgoingLabels(); final int numberOfLabels = labels.size(); diff --git a/mpls/impl/src/test/java/io/fd/hc2vpp/mpls/ImposeAndForwardTest.java b/mpls/impl/src/test/java/io/fd/hc2vpp/mpls/ImposeAndForwardTest.java index a4689a74c..c1ced8e1d 100644 --- a/mpls/impl/src/test/java/io/fd/hc2vpp/mpls/ImposeAndForwardTest.java +++ b/mpls/impl/src/test/java/io/fd/hc2vpp/mpls/ImposeAndForwardTest.java @@ -32,6 +32,7 @@ import java.util.Arrays; import java.util.Collections; import org.junit.Test; import org.mockito.Mock; +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.inet.types.rev130715.IpAddressBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.mpls._static.rev170310.Mpls1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.mpls._static.rev170310.StaticLspConfig; @@ -68,6 +69,10 @@ public class ImposeAndForwardTest extends WriterCustomizerTest implements ByteDa private StaticLspCustomizer customizer; private static StaticLsp getSimpleLsp(final long label) { + return getSimpleLsp(label, IpAddressBuilder.getDefaultInstance("5.6.7.8")); + } + private static StaticLsp getSimpleLsp(final long label, + final IpAddress nextHop) { return new StaticLspBuilder() .setName(LSP_NAME) .setConfig(new ConfigBuilder() @@ -78,7 +83,7 @@ public class ImposeAndForwardTest extends WriterCustomizerTest implements ByteDa ) .setOperation(StaticLspConfig.Operation.ImposeAndForward) .setOutSegment(new SimplePathBuilder() - .setNextHop(IpAddressBuilder.getDefaultInstance("5.6.7.8")) + .setNextHop(nextHop) .setOutgoingInterface(IF_NAME) .setOutgoingLabel(new MplsLabel(label)) .build()) @@ -122,6 +127,12 @@ public class ImposeAndForwardTest extends WriterCustomizerTest implements ByteDa } @Test + public void testWriteSimpleWithoutNextHop() throws WriteFailedException { + customizer.writeCurrentAttributes(IID, getSimpleLsp((long) LABEL, null), writeContext); + verify(jvpp).ipAddDelRoute(getRequestForSimpleLsp(true, new byte[0])); + } + + @Test public void testWriteComplex() throws WriteFailedException { customizer.writeCurrentAttributes(IID, COMPLEX_LSP, writeContext); verify(jvpp).ipAddDelRoute(getRequestForComplexLsp(true)); @@ -151,14 +162,22 @@ public class ImposeAndForwardTest extends WriterCustomizerTest implements ByteDa return getRequestForSimpleLsp(add, LABEL); } + private IpAddDelRoute getRequestForSimpleLsp(final boolean add, final byte[] nextHop) { + return getRequestForSimpleLsp(add, LABEL, nextHop); + } + private IpAddDelRoute getRequestForSimpleLsp(final boolean add, final int label) { + return getRequestForSimpleLsp(add, label, new byte[] {5, 6, 7, 8}); + } + + private IpAddDelRoute getRequestForSimpleLsp(final boolean add, final int label, final byte[] nextHop) { final IpAddDelRoute request = new IpAddDelRoute(); request.nextHopSwIfIndex = IF_INDEX; request.isAdd = booleanToByte(add); request.nextHopWeight = 1; request.dstAddressLength = (byte) 24; request.dstAddress = new byte[] {1, 2, 3, 4}; - request.nextHopAddress = new byte[] {5, 6, 7, 8}; + request.nextHopAddress = nextHop; request.nextHopNOutLabels = 1; request.nextHopViaLabel = LspWriter.MPLS_LABEL_INVALID; request.nextHopOutLabelStack = new int[] {label}; |