[ONOS-4171] BGP topology port problem.

Change-Id: I603aa7eafd72b8104179234fafc4877fa0f0fdad
diff --git a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
index 83fc693..e95eba09 100644
--- a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
+++ b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
@@ -20,9 +20,10 @@
 import static org.onosproject.incubator.net.resource.label.LabelResourceId.labelResourceId;
 import static java.util.stream.Collectors.toList;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+import java.util.HashMap;
 
 import org.onlab.packet.ChassisId;
 import org.onlab.packet.Ip4Address;
@@ -160,6 +161,7 @@
     public static final int DELAY = 2;
     private LabelResourceId beginLabel = labelResourceId(5122);
     private LabelResourceId endLabel = labelResourceId(9217);
+    private HashMap<DeviceId, List<PortDescription>> portMap = new HashMap<>();
 
     @Activate
     public void activate() {
@@ -286,14 +288,35 @@
             deviceProviderService.deviceDisconnected(deviceId);
         }
 
+        private List<PortDescription> buildPortDescriptions(DeviceId deviceId,
+                                                            PortNumber portNumber) {
+
+            List<PortDescription> portList;
+
+            if (portMap.containsKey(deviceId)) {
+                portList = portMap.get(deviceId);
+            } else {
+                portList = new ArrayList<>();
+            }
+            if (portNumber != null) {
+                PortDescription portDescriptions = new DefaultPortDescription(portNumber, true);
+                portList.add(portDescriptions);
+            }
+
+            portMap.put(deviceId, portList);
+            return portList;
+        }
+
         @Override
         public void addLink(BgpLinkLsNlriVer4 linkNlri, PathAttrNlriDetails details) throws BgpParseException {
             log.debug("Addlink {}", linkNlri.toString());
 
-            if (linkProviderService == null) {
+            LinkDescription linkDes = buildLinkDes(linkNlri, details, true);
+
+            //If already link exists, return
+            if (linkService.getLink(linkDes.src(), linkDes.dst()) != null || linkProviderService == null) {
                 return;
             }
-            LinkDescription linkDes = buildLinkDes(linkNlri, details, true);
 
             /*
              * Update link ports and configure bandwidth on source and destination port using networkConfig service
@@ -304,13 +327,11 @@
             }
 
             //Updating ports of the link
-            List<PortDescription> srcPortDescriptions = new LinkedList<>();
-            srcPortDescriptions.add(new DefaultPortDescription(linkDes.src().port(), true));
-            deviceProviderService.updatePorts(linkDes.src().deviceId(), srcPortDescriptions);
+            deviceProviderService.updatePorts(linkDes.src().deviceId(), buildPortDescriptions(linkDes.src().deviceId(),
+                    linkDes.src().port()));
 
-            List<PortDescription> dstPortDescriptions = new LinkedList<>();
-            dstPortDescriptions.add(new DefaultPortDescription(linkDes.dst().port(), true));
-            deviceProviderService.updatePorts(linkDes.dst().deviceId(), dstPortDescriptions);
+            deviceProviderService.updatePorts(linkDes.dst().deviceId(), buildPortDescriptions(linkDes.dst().deviceId(),
+                    linkDes.dst().port()));
 
             linkProviderService.linkDetected(linkDes);
         }