HC2VPP-80: add support for protcol configuration 50/5450/3
authorMarek Gradzki <[email protected]>
Tue, 21 Feb 2017 12:02:12 +0000 (13:02 +0100)
committerJan Srnicek <[email protected]>
Thu, 23 Feb 2017 06:25:49 +0000 (06:25 +0000)
Change-Id: I7ad92c7ba78da3fd1b42605f4f0987df83d41d9f
Signed-off-by: Marek Gradzki <[email protected]>
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/write/MappingEntryCustomizer.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/write/MappingEntryCustomizerTest.java
nat/nat2vpp/src/test/resources/nat/static-mapping-unsupported-proto.json [new file with mode: 0644]
nat/nat2vpp/src/test/resources/nat/static-mapping.json

index b2852fa..ecffe9c 100644 (file)
@@ -19,10 +19,10 @@ package io.fd.hc2vpp.nat.write;
 import static com.google.common.base.Preconditions.checkArgument;
 
 import com.google.common.base.Optional;
-import io.fd.hc2vpp.nat.util.MappingEntryContext;
-import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
 import io.fd.hc2vpp.common.translate.util.Ipv4Translator;
 import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer;
+import io.fd.hc2vpp.nat.util.MappingEntryContext;
+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.snat.dto.SnatAddStaticMapping;
@@ -151,6 +151,13 @@ final class MappingEntryCustomizer implements ListWriterCustomizer<MappingEntry,
                 ipv4AddressNoZoneToArray(dataAfter.getInternalSrcAddress().getIpv4Address().getValue());
         request.externalIpAddress = ipv4AddressNoZoneToArray(dataAfter.getExternalSrcAddress().getValue());
         request.externalSwIfIndex = -1; // external ip address is ignored if externalSwIfIndex is given
+        request.protocol = -1;
+        final Short protocol = dataAfter.getTransportProtocol();
+        if (protocol != null) {
+            checkArgument(protocol == 1 || protocol == 6 || protocol == 17,
+                "Unsupported protocol %s only ICMP, TCP and UDP are currently supported", protocol);
+            request.protocol = protocol.byteValue();
+        }
 
         Optional<Short> internalPortNumber = getPortNumber(id, dataAfter,
                 (entry) -> Optional.fromNullable(entry.getInternalSrcPort()).transform(PortNumber::getPortType));
index 2627cba..649284a 100644 (file)
@@ -76,6 +76,13 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
         verify(jvppSnat).snatAddStaticMapping(expectedRequest);
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void testWriteUnsupportedProtocol(
+        @InjectTestData(resourcePath = "/nat/static-mapping-unsupported-proto.json", id = MAPPING_TABLE_PATH) MappingTable data)
+        throws WriteFailedException {
+        customizer.writeCurrentAttributes(IID, extractMappingEntry(data), writeContext);
+    }
+
     @Test(expected = WriteFailedException.UpdateFailedException.class)
     public void testUpdate() throws WriteFailedException {
         final MappingEntry data = mock(MappingEntry.class);
@@ -99,6 +106,7 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
         final SnatAddStaticMapping expectedRequest = new SnatAddStaticMapping();
         expectedRequest.isIp4 = 1;
         expectedRequest.addrOnly = 1;
+        expectedRequest.protocol = 17; // udp
         expectedRequest.vrfId = (int) NAT_INSTANCE_ID;
         expectedRequest.externalSwIfIndex = -1;
         expectedRequest.localIpAddress = new byte[] {(byte) 192, (byte) 168, 1, 87};
diff --git a/nat/nat2vpp/src/test/resources/nat/static-mapping-unsupported-proto.json b/nat/nat2vpp/src/test/resources/nat/static-mapping-unsupported-proto.json
new file mode 100644 (file)
index 0000000..455465d
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "mapping-table" : {
+    "mapping-entry": {
+      "index": 22,
+      "type": "static",
+      "transport-protocol": 123,
+      "internal-src-address": "192.168.1.87",
+      "external-src-address": "45.1.5.7"
+    }
+  }
+}
+
index 293e5be..b1561a4 100644 (file)
@@ -3,6 +3,7 @@
     "mapping-entry": {
       "index": 22,
       "type": "static",
+      "transport-protocol": 17,
       "internal-src-address": "192.168.1.87",
       "external-src-address": "45.1.5.7"
     }