Jonathan Hart
Committed by Gerrit Code Review

Fix for SDN-IP installing wrong point-to-point intents.

Fixes ONOS-2514.

Change-Id: I0d3d6012daa8dd2a45707a58cf6e745314f6dc24
...@@ -90,6 +90,14 @@ public interface RoutingConfigurationService { ...@@ -90,6 +90,14 @@ public interface RoutingConfigurationService {
90 Interface getInterface(ConnectPoint connectPoint); 90 Interface getInterface(ConnectPoint connectPoint);
91 91
92 /** 92 /**
93 + * Retrieves the interface associated with the given IP address.
94 + *
95 + * @param ip IP address of the interface
96 + * @return the interface
97 + */
98 + Interface getInterface(IpAddress ip);
99 +
100 + /**
93 * Retrieves the interface that matches the given IP address. Matching 101 * Retrieves the interface that matches the given IP address. Matching
94 * means that the IP address is in one of the interface's assigned subnets. 102 * means that the IP address is in one of the interface's assigned subnets.
95 * 103 *
......
...@@ -63,6 +63,20 @@ public class HostToInterfaceAdaptor { ...@@ -63,6 +63,20 @@ public class HostToInterfaceAdaptor {
63 return null; 63 return null;
64 } 64 }
65 65
66 + public Interface getInterface(IpAddress ip) {
67 + Set<PortAddresses> portAddresses = hostService.getAddressBindings();
68 +
69 + for (PortAddresses portAddress : portAddresses) {
70 + for (InterfaceIpAddress portIp : portAddress.ipAddresses()) {
71 + if (portIp.ipAddress().equals(ip)) {
72 + return new Interface(portAddress);
73 + }
74 + }
75 + }
76 +
77 + return null;
78 + }
79 +
66 public Interface getMatchingInterface(IpAddress ipAddress) { 80 public Interface getMatchingInterface(IpAddress ipAddress) {
67 checkNotNull(ipAddress); 81 checkNotNull(ipAddress);
68 82
......
...@@ -159,6 +159,11 @@ public class RoutingConfigurationImpl implements RoutingConfigurationService { ...@@ -159,6 +159,11 @@ public class RoutingConfigurationImpl implements RoutingConfigurationService {
159 } 159 }
160 160
161 @Override 161 @Override
162 + public Interface getInterface(IpAddress ip) {
163 + return hostAdaptor.getInterface(ip);
164 + }
165 +
166 + @Override
162 public Interface getMatchingInterface(IpAddress ipAddress) { 167 public Interface getMatchingInterface(IpAddress ipAddress) {
163 return hostAdaptor.getMatchingInterface(ipAddress); 168 return hostAdaptor.getMatchingInterface(ipAddress);
164 } 169 }
......
...@@ -173,7 +173,8 @@ public class HostToInterfaceAdaptorTest { ...@@ -173,7 +173,8 @@ public class HostToInterfaceAdaptorTest {
173 */ 173 */
174 @Test(expected = NullPointerException.class) 174 @Test(expected = NullPointerException.class)
175 public void testGetInterfaceNull() { 175 public void testGetInterfaceNull() {
176 - adaptor.getInterface(null); 176 + ConnectPoint c = null;
177 + adaptor.getInterface(c);
177 } 178 }
178 179
179 /** 180 /**
......
...@@ -139,24 +139,22 @@ public class PeerConnectivityManager { ...@@ -139,24 +139,22 @@ public class PeerConnectivityManager {
139 List<InterfaceAddress> interfaceAddresses = 139 List<InterfaceAddress> interfaceAddresses =
140 bgpSpeaker.interfaceAddresses(); 140 bgpSpeaker.interfaceAddresses();
141 141
142 - Interface peerInterface = configService.getInterface(
143 - bgpPeer.connectPoint());
144 -
145 - if (peerInterface == null) {
146 - log.error("No interface found for peer {}", bgpPeer.ipAddress());
147 - return intents;
148 - }
149 -
150 IpAddress bgpdAddress = null; 142 IpAddress bgpdAddress = null;
151 for (InterfaceAddress interfaceAddress : interfaceAddresses) { 143 for (InterfaceAddress interfaceAddress : interfaceAddresses) {
152 - if (interfaceAddress.connectPoint().equals(peerInterface.connectPoint())) { 144 + Interface peerInterface = configService.getInterface(interfaceAddress.ipAddress());
153 - for (InterfaceIpAddress interfaceIpAddress : peerInterface.ipAddresses()) { 145 + if (peerInterface == null) {
154 - // Only add intents where the peer and ONOS's addresses are 146 + continue;
155 - // in the same subnet 147 + }
156 - if (interfaceIpAddress.subnetAddress().contains(bgpPeer.ipAddress())) { 148 +
157 - bgpdAddress = interfaceAddress.ipAddress(); 149 + for (InterfaceIpAddress interfaceIpAddress : peerInterface.ipAddresses()) {
158 - } 150 + // Only add intents where the peer and ONOS's addresses are
151 + // in the same subnet
152 + if (interfaceIpAddress.subnetAddress().contains(bgpPeer.ipAddress())) {
153 + bgpdAddress = interfaceAddress.ipAddress();
154 + break;
159 } 155 }
156 + }
157 + if (bgpdAddress != null) {
160 break; 158 break;
161 } 159 }
162 } 160 }
...@@ -167,7 +165,7 @@ public class PeerConnectivityManager { ...@@ -167,7 +165,7 @@ public class PeerConnectivityManager {
167 } 165 }
168 166
169 IpAddress bgpdPeerAddress = bgpPeer.ipAddress(); 167 IpAddress bgpdPeerAddress = bgpPeer.ipAddress();
170 - ConnectPoint bgpdPeerConnectPoint = peerInterface.connectPoint(); 168 + ConnectPoint bgpdPeerConnectPoint = bgpPeer.connectPoint();
171 169
172 if (bgpdAddress.version() != bgpdPeerAddress.version()) { 170 if (bgpdAddress.version() != bgpdPeerAddress.version()) {
173 return intents; 171 return intents;
......