[ONOS-3952] Implement FloatingIP Handler for OpenstackRoutingService

 - Implements floatingIp REST interfaces & event handler
 - Implements rulePopulate method for floatingIp handler
 - Fixes minor logics
 - Changes app structure
 - exports configuration
 - Implements case issue.
   when openstack deletes vm w/o deassociating floatingIp,
   openstack doesn`t send floatingIp deassociation event.

Change-Id: If4d8ac3fecfed1957d84139f94ae31f593a9097b
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
index 4d9b60a..2912d7d 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
@@ -56,19 +56,18 @@
     private final int portNum;
     private final OpenstackPort openstackPort;
     private final Port port;
+    private OpenstackRoutingConfig config;
 
     private static final String DEVICE_OWNER_ROUTER_INTERFACE = "network:router_interface";
-    // TODO: This will be replaced to get the information from openstacknetworkingservice.
-    private static final MacAddress GATEWAYMAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
-    private static final MacAddress EXTERNAL_INTERFACE_MAC = MacAddress.valueOf("00:00:00:00:00:11");
 
     OpenstackPnatHandler(OpenstackRoutingRulePopulator rulePopulator, PacketContext context,
-                         int portNum, OpenstackPort openstackPort, Port port) {
+                         int portNum, OpenstackPort openstackPort, Port port, OpenstackRoutingConfig config) {
         this.rulePopulator = checkNotNull(rulePopulator);
         this.context = checkNotNull(context);
         this.portNum = checkNotNull(portNum);
         this.openstackPort = checkNotNull(openstackPort);
         this.port = checkNotNull(port);
+        this.config = checkNotNull(config);
     }
 
     @Override
@@ -85,7 +84,8 @@
         OpenstackRouter router = getOpenstackRouter(openstackPort);
 
         rulePopulator.populatePnatFlowRules(inboundPacket, openstackPort, portNum,
-                getExternalIp(router), getExternalInterfaceMacAddress(), getExternalRouterMacAddress());
+                getExternalIp(router), MacAddress.valueOf(config.gatewayExternalInterfaceMac()),
+                MacAddress.valueOf(config.physicalRouterMac()));
 
         packetOut((Ethernet) ethernet.clone(), inboundPacket.receivedFrom().deviceId(), portNum, router);
     }
@@ -144,8 +144,9 @@
         iPacket.setSourceAddress(getExternalIp(router).toString());
         iPacket.resetChecksum();
         iPacket.setParent(ethernet);
-        ethernet.setSourceMACAddress(getExternalInterfaceMacAddress())
-                .setDestinationMACAddress(getExternalRouterMacAddress());
+        ethernet.setPayload(iPacket);
+        ethernet.setSourceMACAddress(config.gatewayExternalInterfaceMac())
+                .setDestinationMACAddress(config.physicalRouterMac());
         ethernet.resetChecksum();
 
         treatment.setOutput(port.number());
@@ -153,11 +154,4 @@
         packetService.emit(new DefaultOutboundPacket(deviceId, treatment.build(),
                 ByteBuffer.wrap(ethernet.serialize())));
     }
-
-    private MacAddress getExternalInterfaceMacAddress() {
-        return EXTERNAL_INTERFACE_MAC;
-    }
-    private MacAddress getExternalRouterMacAddress() {
-        return GATEWAYMAC;
-    }
 }
\ No newline at end of file