Add implementation for GPE native forwarding 05/58905/12
authorMichal Cmarada <mcmarada@cisco.com>
Tue, 4 Jul 2017 14:56:14 +0000 (16:56 +0200)
committerShakib Ahmed <sheikahm@cisco.com>
Mon, 24 Jul 2017 23:18:51 +0000 (16:18 -0700)
Change-Id: I61838e7d82011d8d2eaeb4e03d225861f1f316ce
Signed-off-by: Shakib Ahmed <sheikahm@cisco.com>
Signed-off-by: Michal Cmarada <mcmarada@cisco.com>
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureNativeForwardPathCommand.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/DeleteGpeFeatureDataCommand.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/DeleteNativeForwardPathsTablesDeleteCommand.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/LispCommandWrapper.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/NativeForwardPathDom.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/LispStateManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/flat/overlay/FlatOverlayManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/util/Constants.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/lisp/util/IpAddressUtil.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/VppRendererPolicyManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/util/VppIidFactory.java

diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureNativeForwardPathCommand.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/ConfigureNativeForwardPathCommand.java
new file mode 100644 (file)
index 0000000..786b1d7
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2017 Cisco Systems. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp;
+
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.NativeForwardPathDom;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPathKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Created by Shakib Ahmed on 6/13/17.
+ */
+public class ConfigureNativeForwardPathCommand extends AbstractLispCommand<NativeForwardPath> {
+    private NativeForwardPathDom nativeForwardPathDom;
+
+    public ConfigureNativeForwardPathCommand(NativeForwardPathDom nativeForwardPathDom) {
+        this.nativeForwardPathDom = nativeForwardPathDom;
+    }
+
+    @Override
+    public InstanceIdentifier<NativeForwardPath> getIid() {
+        return VppIidFactory.getNativeForwardPathIid(nativeForwardPathDom.getVrfId(),
+                                                    new NativeForwardPathKey(nativeForwardPathDom.getNextHopIp()));
+    }
+
+    @Override
+    public NativeForwardPath getData() {
+        return nativeForwardPathDom.getSALObject();
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/DeleteGpeFeatureDataCommand.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/DeleteGpeFeatureDataCommand.java
new file mode 100644 (file)
index 0000000..2293304
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2017 Cisco Systems. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp;
+
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.feature.data.grouping.GpeFeatureData;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created by Shakib Ahmed on 6/21/17.
+ */
+public class DeleteGpeFeatureDataCommand  extends AbstractLispCommand<GpeFeatureData> {
+    private static final Logger LOG = LoggerFactory.getLogger(DeleteGpeFeatureDataCommand.class);
+
+    @Override
+    public InstanceIdentifier<GpeFeatureData> getIid() {
+        return VppIidFactory.getGpeFeatureDataIid();
+    }
+
+    @Override
+    public GpeFeatureData getData() {
+        LOG.debug("Delete commands should not invoke getData()");
+        return null;
+    }
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/DeleteNativeForwardPathsTablesDeleteCommand.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/DeleteNativeForwardPathsTablesDeleteCommand.java
new file mode 100644 (file)
index 0000000..a8dc9ec
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2017 Cisco Systems. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp;
+
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.NativeForwardPathsTables;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created by Shakib Ahmed on 6/21/17.
+ */
+public class DeleteNativeForwardPathsTablesDeleteCommand extends AbstractLispCommand<NativeForwardPathsTables> {
+    private static final Logger LOG = LoggerFactory.getLogger(DeleteNativeForwardPathsTablesDeleteCommand.class);
+
+
+    @Override
+    public InstanceIdentifier<NativeForwardPathsTables> getIid() {
+        return VppIidFactory.getNativeForwardPathsTablesIid();
+    }
+
+    @Override
+    public NativeForwardPathsTables getData() {
+        LOG.debug("Delete commands should not invoke getData()");
+        return null;
+    }
+}
index 776bdfc01f9f63933a967a86cfb2d3414bc99e31..3db83349232a0693e7eec0541db7331508d0292c 100644 (file)
@@ -18,9 +18,12 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.LocatorS
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.MapRegisterDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.MapResolverDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.MapServerDom;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.NativeForwardPathDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.VniTableDom;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom.VrfSubtableDom;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.NativeForwardPathsTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.GpeEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.gpe.entry.RemoteEid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.feature.data.grouping.GpeFeatureData;
@@ -156,4 +159,20 @@ public class LispCommandWrapper {
 
         return new ConfigureItrRemoteLocatorSetCommand(itrRemoteLocatorSetDom);
     }
+
+    public static AbstractLispCommand<NativeForwardPath> addNativeForwardEntry(long vrf,
+                                                                               IpAddress nextHopIp) {
+        NativeForwardPathDom nativeForwardPathDom = new NativeForwardPathDom();
+        nativeForwardPathDom.setVrfId(vrf);
+        nativeForwardPathDom.setNextHopIp(nextHopIp);
+        return new ConfigureNativeForwardPathCommand(nativeForwardPathDom);
+    }
+
+    public static AbstractLispCommand<GpeFeatureData> deleteGpeFeatureData() {
+        return new DeleteGpeFeatureDataCommand();
+    }
+
+    public static AbstractLispCommand<NativeForwardPathsTables> deleteNativeForwardPathsTables() {
+        return new DeleteNativeForwardPathsTablesDeleteCommand();
+    }
 }
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/NativeForwardPathDom.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/lisp/dom/NativeForwardPathDom.java
new file mode 100644 (file)
index 0000000..515fdfd
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2017 Cisco Systems. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands.lisp.dom;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPathBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPathKey;
+
+/**
+ * Created by Shakib Ahmed on 6/13/17.
+ */
+public class NativeForwardPathDom implements CommandModel {
+    private IpAddress nextHopIp;
+    private String nextHopInterface;
+    private long vrfId;
+
+    public IpAddress getNextHopIp() {
+        return nextHopIp;
+    }
+
+    public void setNextHopIp(IpAddress nextHopIp) {
+        this.nextHopIp = nextHopIp;
+    }
+
+    public String getNextHopInterface() {
+        return nextHopInterface;
+    }
+
+    public void setNextHopInterface(String nextHopInterface) {
+        this.nextHopInterface = nextHopInterface;
+    }
+
+    public long getVrfId() {
+        return vrfId;
+    }
+
+    public void setVrfId(long vrfId) {
+        this.vrfId = vrfId;
+    }
+
+    @Override
+    public NativeForwardPath getSALObject() {
+       return new NativeForwardPathBuilder()
+                    .setKey(new NativeForwardPathKey(nextHopIp))
+                    .setNextHopAddress(nextHopIp)
+                    .setNextHopInterface(nextHopInterface).build();
+    }
+}
index 6fcc044224c9e24357b1621205fb3395172bc430..5a3b9c9a70f16cda842d59633f8b214ab0c13dcb 100644 (file)
@@ -26,6 +26,8 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProv
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.feature.data.grouping.GpeFeatureData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.NativeForwardPathsTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.Lisp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.local.mappings.LocalMapping;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev170315.dp.subtable.grouping.local.mappings.local.mapping.Eid;
@@ -268,6 +270,18 @@ public class LispStateManager {
         }
     }
 
+    private void addNativeForwardPath(EndpointHost endpointHost, long vrf, IpAddress nativeForwardIp)
+            throws LispConfigCommandFailedException {
+
+        AbstractLispCommand<NativeForwardPath> lispCommand =
+                LispCommandWrapper.addNativeForwardEntry(vrf, nativeForwardIp);
+        if (LispStateCommandExecutor.executePutCommand(endpointHost.getHostDataBroker(), lispCommand)) {
+            LOG.debug("Added {} as native forwarding IP");
+        } else {
+            throw new LispConfigCommandFailedException("Lisp add Native forward failed for VNI " + vrf);
+        }
+    }
+
     private void addEidInEidTable(DataBroker vppDataBroker,
                                   LispState lispState,
                                   Eid eid,
@@ -306,6 +320,7 @@ public class LispStateManager {
 
                 if (lispState.eidCount() == 0) {
                     deleteLispStatesFromHost(endpointHost);
+                    deleteNativeForwardPathsTables(endpointHost);
                 }
             }
         } catch (LispConfigCommandFailedException e) {
@@ -349,6 +364,17 @@ public class LispStateManager {
         }
     }
 
+    private void deleteNativeForwardPathsTables(EndpointHost endpointHost)
+            throws LispConfigCommandFailedException {
+        AbstractLispCommand<NativeForwardPathsTables> deleteNativeForwardPathsTables = LispCommandWrapper
+                .deleteNativeForwardPathsTables();
+
+        if (!LispStateCommandExecutor.executeDeleteCommand(endpointHost.getHostDataBroker(),
+                deleteNativeForwardPathsTables)) {
+            throw new LispConfigCommandFailedException("Delete Native Forward Paths Tables command failed!");
+        }
+    }
+
     private long getVni(String tenantUuid) {
         return neutronTenantToVniMapper.getVni(tenantUuid);
     }
index 352befd4b12f7f0399908ebd5bb4969b06590951..a3ae6b8549bc617cc70d4453c22f289fba4fdd91 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.StaticArpCommand;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.EndpointHost;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.HostRelatedInfoContainer;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.PhysicalInterfaces;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.PortInterfaces;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.PortRouteState;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.SubnetState;
@@ -24,6 +25,7 @@ import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.mappers.NeutronTenantToVniMapper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.ConfigManagerHelper;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.Constants;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.IpAddressUtil;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.GbpNetconfTransaction;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
@@ -258,6 +260,7 @@ public class FlatOverlayManager {
 
         if (!vrfHolderOfHost.hasVrf(vrfId)) {
             if (!staticRoutingHelper.addRoutingProtocolForVrf(vppDataBroker, vrfId, vrfHolderOfHost)) {
+                addStaticRouteToPublicInterface(vppDataBroker, hostName, vrfId);
                 LOG.warn("Failed to add Routing protocol for host {} and vrf {}!", hostName, vrfId);
             }
         }
@@ -279,6 +282,24 @@ public class FlatOverlayManager {
         }
     }
 
+    private void addStaticRouteToPublicInterface(DataBroker vppDataBroker, String hostName, long vrfId) {
+        Ipv4Address physicalInterfaceIp = hostRelatedInfoContainer
+                .getPhysicalInterfaceState(hostName)
+                .getIp(PhysicalInterfaces.PhysicalInterfaceType.PUBLIC).getIpv4Address();
+        String physicalInterfaceName = hostRelatedInfoContainer
+                .getPhysicalInterfaceState(hostName)
+                .getName(PhysicalInterfaces.PhysicalInterfaceType.PUBLIC);
+        if (physicalInterfaceName != null && !physicalInterfaceName.isEmpty()) {
+            if (!staticRoutingHelper.addSingleStaticRouteInRoutingProtocol(vppDataBroker,
+                    hostName, vrfId, Constants.PUBLIC_SUBNET_UUID, physicalInterfaceIp,
+                    IpAddressUtil.toIpV4Prefix(physicalInterfaceIp), physicalInterfaceName)) {
+                LOG.warn("Failed to add route for physical interface in vrf {} compute host {}", vrfId, hostName);
+            } else {
+                LOG.debug("Added route for physical interface {} in vrf {}", physicalInterfaceName, vrfId);
+            }
+        }
+    }
+
     private void deleteStaticRoute(AddressEndpointWithLocation addressEp) {
         DataBroker vppDataBroker = overlayHelper.getPotentialExternalDataBroker(addressEp).get();
         String hostName = overlayHelper.getHostName(addressEp).get();
index 11e306aefd0e8f1cf625ebdf839393c31210c3c1..6b91511dd90368e6f7d7658f450b5bc87e675ca5 100644 (file)
@@ -20,6 +20,6 @@ public class Constants {
     public static final String GPE_ENTRY_PREFIX = "gpe-entry-";
     public static final String DUMMY_PROTOCOL_BRIDGE_DOMAIN = "bridge-domain-dummy-protocol";
     public static final String TENANT_INTERFACE = "tenant-interface";
-
+    public static final String PUBLIC_SUBNET_UUID = "public-interface-subnet-uuid";
 
 }
index 9795347874e68b1d4c8b0b1a75dc7144eb70db57..4295d653058aab5354561bea29a66395d745b995 100644 (file)
@@ -67,6 +67,10 @@ public class IpAddressUtil {
         return new ImmutablePair<>(new Ipv4Prefix(firstSubnet), new Ipv4Prefix(secondSubnet));
     }
 
+    public static Ipv4Prefix toIpV4Prefix(Ipv4Address ipv4Address) {
+        return new Ipv4Prefix(ipv4Address.getValue() + "/32");
+    }
+
     public static boolean ipInRange(Ipv4Address ip, String startIpStr, String endIpStr) {
         String ipStr = ip.getValue();
 
index 59c67b103e9764c3edccfc9b38d813ee83b55d9f..f91ea1c780cfb04fb92b6135f80aca96f5c92e73 100644 (file)
@@ -309,9 +309,9 @@ public class VppRendererPolicyManager {
             fwManager.createDhcpRelay(rendererForwarding, vppNodesByL2Fd);
         }
 
+        rEpKeys.forEach(rEpKey -> fwManager.createForwardingForEndpoint(rEpKey, policyCtx));
         fwManager.syncNatEntries(policyCtx);
         fwManager.syncRouting(policyCtx);
-        rEpKeys.forEach(rEpKey -> fwManager.createForwardingForEndpoint(rEpKey, policyCtx));
     }
 
     private void rendererPolicyDeleted(RendererPolicy rendererPolicy) {
index f2f8f21f8f471ec4f52dcbb6d436d8d36d5da4ed..95b122fac58bf4dc543542e1a31c9a764113050b 100644 (file)
@@ -38,9 +38,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNodeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.VppAclInterfaceAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.Gpe;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.NativeForwardPathsTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables.NativeForwardPathsTableKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPath;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518._native.forward.paths.tables._native.forward.paths.table.NativeForwardPathKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.GpeEntryTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.GpeEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.gpe.rev170518.gpe.entry.table.grouping.gpe.entry.table.GpeEntryKey;
@@ -280,4 +284,15 @@ public class VppIidFactory {
                 .child(ItrRemoteLocatorSet.class);
     }
 
+    public static InstanceIdentifier<NativeForwardPath> getNativeForwardPathIid(Long vrf,
+                                                                                NativeForwardPathKey nativeForwardPathKey) {
+        return InstanceIdentifier.builder(NativeForwardPathsTables.class)
+                .child(NativeForwardPathsTable.class, new NativeForwardPathsTableKey(vrf))
+                .child(NativeForwardPath.class, nativeForwardPathKey).build();
+    }
+
+    public static InstanceIdentifier<NativeForwardPathsTables> getNativeForwardPathsTablesIid() {
+        return InstanceIdentifier.builder(NativeForwardPathsTables.class).build();
+    }
+
 }