Initial support GRE tunnel at SONA

Change-Id: I86536a3ed23d8df45e1dc4033c3068a4dfc9ec73
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
index a6e9915..66d1f2a 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
@@ -50,6 +50,7 @@
 import org.onlab.packet.VlanId;
 import org.onosproject.cfg.ConfigProperty;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficTreatment;
@@ -155,6 +156,7 @@
     private static final String ERR_FLOW = "Failed set flows for floating IP %s: ";
 
     private static final String VXLAN = "VXLAN";
+    private static final String GRE = "GRE";
     private static final String VLAN = "VLAN";
     private static final String DL_DST = "dl_dst=";
     private static final String NW_DST = "nw_dst=";
@@ -768,6 +770,7 @@
 
             String modifiedDstIp = dstIp;
             if (osNetService.networkType(srcInstancePort.networkId()).equals(VXLAN) ||
+                    osNetService.networkType(srcInstancePort.networkId()).equals(GRE) ||
                     osNetService.networkType(srcInstancePort.networkId()).equals(VLAN)) {
                 if (srcIp.equals(dstIp)) {
                     modifiedDstIp = osNetService.gatewayIp(srcInstancePort.portId());
@@ -795,6 +798,7 @@
                     .append(COMMA);
 
             if (osNetService.networkType(srcInstancePort.networkId()).equals(VXLAN) ||
+                    osNetService.networkType(srcInstancePort.networkId()).equals(GRE) ||
                     osNetService.networkType(srcInstancePort.networkId()).equals(VLAN)) {
                 requestStringBuilder.append(TUN_ID)
                         .append(osNetService.segmentId(srcInstancePort.networkId()))
@@ -1045,6 +1049,44 @@
                 .findAny().get().getIpAddress());
     }
 
+    /**
+     * Returns the tunnel port number with specified net ID and openstack node.
+     *
+     * @param netId network ID
+     * @param netService network service
+     * @param osNode openstack node
+     * @return tunnel port number
+     */
+    public static PortNumber tunnelPortNumByNetId(String netId,
+                                                  OpenstackNetworkService netService,
+                                                  OpenstackNode osNode) {
+        String netType = netService.networkType(netId);
+
+        if (netType == null) {
+            return null;
+        }
+
+        return tunnelPortNumByNetType(netType, osNode);
+    }
+
+    /**
+     * Returns the tunnel port number with specified net type and openstack node.
+     *
+     * @param netType network type
+     * @param osNode openstack node
+     * @return tunnel port number
+     */
+    public static PortNumber tunnelPortNumByNetType(String netType, OpenstackNode osNode) {
+        switch (netType) {
+            case VXLAN:
+                return osNode.vxlanTunnelPortNum();
+            case GRE:
+                return osNode.greTunnelPortNum();
+            default:
+                return null;
+        }
+    }
+
     private static Router getRouterFromSubnet(Subnet subnet,
                                               OpenstackRouterService osRouterService) {
         RouterInterface osRouterIface = osRouterService.routerInterfaces().stream()