Rafactored PeerConnectivityManager for code reuse between the two path types.
Change-Id: Ib05f676d071ef1c545e93244a9ed5ed89672113f
Showing
1 changed file
with
111 additions
and
166 deletions
| ... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onlab.onos.sdnip; | 16 | package org.onlab.onos.sdnip; |
| 17 | 17 | ||
| 18 | +import java.util.ArrayList; | ||
| 18 | import java.util.List; | 19 | import java.util.List; |
| 19 | 20 | ||
| 20 | import org.onlab.onos.core.ApplicationId; | 21 | import org.onlab.onos.core.ApplicationId; |
| ... | @@ -23,6 +24,7 @@ import org.onlab.onos.net.flow.DefaultTrafficSelector; | ... | @@ -23,6 +24,7 @@ import org.onlab.onos.net.flow.DefaultTrafficSelector; |
| 23 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; | 24 | import org.onlab.onos.net.flow.DefaultTrafficTreatment; |
| 24 | import org.onlab.onos.net.flow.TrafficSelector; | 25 | import org.onlab.onos.net.flow.TrafficSelector; |
| 25 | import org.onlab.onos.net.flow.TrafficTreatment; | 26 | import org.onlab.onos.net.flow.TrafficTreatment; |
| 27 | +import org.onlab.onos.net.intent.Intent; | ||
| 26 | import org.onlab.onos.net.intent.IntentService; | 28 | import org.onlab.onos.net.intent.IntentService; |
| 27 | import org.onlab.onos.net.intent.PointToPointIntent; | 29 | import org.onlab.onos.net.intent.PointToPointIntent; |
| 28 | import org.onlab.onos.sdnip.bgp.BgpConstants; | 30 | import org.onlab.onos.sdnip.bgp.BgpConstants; |
| ... | @@ -90,39 +92,50 @@ public class PeerConnectivityManager { | ... | @@ -90,39 +92,50 @@ public class PeerConnectivityManager { |
| 90 | return; | 92 | return; |
| 91 | } | 93 | } |
| 92 | 94 | ||
| 93 | - setupBgpPaths(); | 95 | + setUpConnectivity(); |
| 94 | - setupIcmpPaths(); | ||
| 95 | } | 96 | } |
| 96 | 97 | ||
| 97 | /** | 98 | /** |
| 98 | - * Sets up paths for all {@link BgpSpeaker}s and all external peers. | 99 | + * Sets up paths to establish connectivity between all internal |
| 99 | - * <p/> | 100 | + * {@link BgpSpeaker}s and all external {@link BgpPeer}s. |
| 100 | - * Run a loop for all BGP speakers and a loop for all BGP peers outside. | ||
| 101 | - * Push intents for paths from each BGP speaker to all peers. Push intents | ||
| 102 | - * for paths from all peers to each BGP speaker. | ||
| 103 | */ | 101 | */ |
| 104 | - private void setupBgpPaths() { | 102 | + private void setUpConnectivity() { |
| 105 | for (BgpSpeaker bgpSpeaker : configService.getBgpSpeakers() | 103 | for (BgpSpeaker bgpSpeaker : configService.getBgpSpeakers() |
| 106 | .values()) { | 104 | .values()) { |
| 107 | log.debug("Start to set up BGP paths for BGP speaker: {}", | 105 | log.debug("Start to set up BGP paths for BGP speaker: {}", |
| 108 | bgpSpeaker); | 106 | bgpSpeaker); |
| 109 | - ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint(); | ||
| 110 | - | ||
| 111 | - List<InterfaceAddress> interfaceAddresses = | ||
| 112 | - bgpSpeaker.interfaceAddresses(); | ||
| 113 | 107 | ||
| 114 | for (BgpPeer bgpPeer : configService.getBgpPeers().values()) { | 108 | for (BgpPeer bgpPeer : configService.getBgpPeers().values()) { |
| 115 | 109 | ||
| 116 | log.debug("Start to set up BGP paths between BGP speaker: {} " | 110 | log.debug("Start to set up BGP paths between BGP speaker: {} " |
| 117 | + "to BGP peer: {}", bgpSpeaker, bgpPeer); | 111 | + "to BGP peer: {}", bgpSpeaker, bgpPeer); |
| 118 | 112 | ||
| 113 | + buildPeerIntents(bgpSpeaker, bgpPeer); | ||
| 114 | + } | ||
| 115 | + } | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + /** | ||
| 119 | + * Builds the required intents between a given internal BGP speaker and | ||
| 120 | + * external BGP peer. | ||
| 121 | + * | ||
| 122 | + * @param bgpSpeaker the BGP speaker | ||
| 123 | + * @param bgpPeer the BGP peer | ||
| 124 | + */ | ||
| 125 | + private void buildPeerIntents(BgpSpeaker bgpSpeaker, BgpPeer bgpPeer) { | ||
| 126 | + List<Intent> intents = new ArrayList<Intent>(); | ||
| 127 | + | ||
| 128 | + ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint(); | ||
| 129 | + | ||
| 130 | + List<InterfaceAddress> interfaceAddresses = | ||
| 131 | + bgpSpeaker.interfaceAddresses(); | ||
| 132 | + | ||
| 119 | Interface peerInterface = interfaceService.getInterface( | 133 | Interface peerInterface = interfaceService.getInterface( |
| 120 | bgpPeer.connectPoint()); | 134 | bgpPeer.connectPoint()); |
| 135 | + | ||
| 121 | if (peerInterface == null) { | 136 | if (peerInterface == null) { |
| 122 | - log.error("Can not find the corresponding Interface from " | 137 | + log.error("No interface found for peer {}", bgpPeer.ipAddress()); |
| 123 | - + "configuration for BGP peer {}", | 138 | + return; |
| 124 | - bgpPeer.ipAddress()); | ||
| 125 | - continue; | ||
| 126 | } | 139 | } |
| 127 | 140 | ||
| 128 | IpAddress bgpdAddress = null; | 141 | IpAddress bgpdAddress = null; |
| ... | @@ -134,187 +147,119 @@ public class PeerConnectivityManager { | ... | @@ -134,187 +147,119 @@ public class PeerConnectivityManager { |
| 134 | } | 147 | } |
| 135 | } | 148 | } |
| 136 | if (bgpdAddress == null) { | 149 | if (bgpdAddress == null) { |
| 137 | - log.debug("There is no interface IP address for bgpPeer: {}" | 150 | + log.debug("No IP address found for peer {} on interface {}", |
| 138 | - + " on interface {}", bgpPeer, bgpPeer.connectPoint()); | 151 | + bgpPeer, bgpPeer.connectPoint()); |
| 139 | - continue; | 152 | + return; |
| 140 | } | 153 | } |
| 141 | 154 | ||
| 142 | IpAddress bgpdPeerAddress = bgpPeer.ipAddress(); | 155 | IpAddress bgpdPeerAddress = bgpPeer.ipAddress(); |
| 143 | ConnectPoint bgpdPeerConnectPoint = peerInterface.connectPoint(); | 156 | ConnectPoint bgpdPeerConnectPoint = peerInterface.connectPoint(); |
| 144 | 157 | ||
| 145 | - // install intent for BGP path from BGPd to BGP peer matching | ||
| 146 | - // destination TCP port 179 | ||
| 147 | - TrafficSelector selector = DefaultTrafficSelector.builder() | ||
| 148 | - .matchEthType(Ethernet.TYPE_IPV4) | ||
| 149 | - .matchIPProtocol(IPv4.PROTOCOL_TCP) | ||
| 150 | - .matchIPSrc(IpPrefix.valueOf(bgpdAddress, | ||
| 151 | - IpPrefix.MAX_INET_MASK_LENGTH)) | ||
| 152 | - .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress, | ||
| 153 | - IpPrefix.MAX_INET_MASK_LENGTH)) | ||
| 154 | - .matchTcpDst((short) BgpConstants.BGP_PORT) | ||
| 155 | - .build(); | ||
| 156 | - | ||
| 157 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() | 158 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() |
| 158 | .build(); | 159 | .build(); |
| 159 | 160 | ||
| 160 | - PointToPointIntent intentMatchDstTcpPort = | 161 | + TrafficSelector selector; |
| 161 | - new PointToPointIntent(appId, selector, treatment, | 162 | + |
| 162 | - bgpdConnectPoint, bgpdPeerConnectPoint); | 163 | + // install intent for BGP path from BGPd to BGP peer matching |
| 163 | - intentService.submit(intentMatchDstTcpPort); | 164 | + // destination TCP port 179 |
| 164 | - log.debug("Submitted BGP path intent matching dst TCP port 179 " | 165 | + selector = buildSelector(IPv4.PROTOCOL_TCP, |
| 165 | - + "from BGPd {} to peer {}: {}", | 166 | + bgpdAddress, |
| 166 | - bgpdAddress, bgpdPeerAddress, intentMatchDstTcpPort); | 167 | + bgpdPeerAddress, |
| 168 | + null, | ||
| 169 | + (short) BgpConstants.BGP_PORT); | ||
| 170 | + | ||
| 171 | + intents.add(new PointToPointIntent(appId, selector, treatment, | ||
| 172 | + bgpdConnectPoint, bgpdPeerConnectPoint)); | ||
| 167 | 173 | ||
| 168 | // install intent for BGP path from BGPd to BGP peer matching | 174 | // install intent for BGP path from BGPd to BGP peer matching |
| 169 | // source TCP port 179 | 175 | // source TCP port 179 |
| 170 | - selector = DefaultTrafficSelector.builder() | 176 | + selector = buildSelector(IPv4.PROTOCOL_TCP, |
| 171 | - .matchEthType(Ethernet.TYPE_IPV4) | 177 | + bgpdAddress, |
| 172 | - .matchIPProtocol(IPv4.PROTOCOL_TCP) | 178 | + bgpdPeerAddress, |
| 173 | - .matchIPSrc(IpPrefix.valueOf(bgpdAddress, | 179 | + (short) BgpConstants.BGP_PORT, |
| 174 | - IpPrefix.MAX_INET_MASK_LENGTH)) | 180 | + null); |
| 175 | - .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress, | ||
| 176 | - IpPrefix.MAX_INET_MASK_LENGTH)) | ||
| 177 | - .matchTcpSrc((short) BgpConstants.BGP_PORT) | ||
| 178 | - .build(); | ||
| 179 | 181 | ||
| 180 | - PointToPointIntent intentMatchSrcTcpPort = | 182 | + intents.add(new PointToPointIntent(appId, selector, treatment, |
| 181 | - new PointToPointIntent(appId, selector, treatment, | 183 | + bgpdConnectPoint, bgpdPeerConnectPoint)); |
| 182 | - bgpdConnectPoint, bgpdPeerConnectPoint); | ||
| 183 | - intentService.submit(intentMatchSrcTcpPort); | ||
| 184 | - log.debug("Submitted BGP path intent matching src TCP port 179" | ||
| 185 | - + "from BGPd {} to peer {}: {}", | ||
| 186 | - bgpdAddress, bgpdPeerAddress, intentMatchSrcTcpPort); | ||
| 187 | 184 | ||
| 188 | // install intent for reversed BGP path from BGP peer to BGPd | 185 | // install intent for reversed BGP path from BGP peer to BGPd |
| 189 | // matching destination TCP port 179 | 186 | // matching destination TCP port 179 |
| 190 | - selector = DefaultTrafficSelector.builder() | 187 | + selector = buildSelector(IPv4.PROTOCOL_TCP, |
| 191 | - .matchEthType(Ethernet.TYPE_IPV4) | 188 | + bgpdPeerAddress, |
| 192 | - .matchIPProtocol(IPv4.PROTOCOL_TCP) | 189 | + bgpdAddress, |
| 193 | - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress, | 190 | + null, |
| 194 | - IpPrefix.MAX_INET_MASK_LENGTH)) | 191 | + (short) BgpConstants.BGP_PORT); |
| 195 | - .matchIPDst(IpPrefix.valueOf(bgpdAddress, | ||
| 196 | - IpPrefix.MAX_INET_MASK_LENGTH)) | ||
| 197 | - .matchTcpDst((short) BgpConstants.BGP_PORT) | ||
| 198 | - .build(); | ||
| 199 | 192 | ||
| 200 | - PointToPointIntent reversedIntentMatchDstTcpPort = | 193 | + intents.add(new PointToPointIntent(appId, selector, treatment, |
| 201 | - new PointToPointIntent(appId, selector, treatment, | 194 | + bgpdPeerConnectPoint, bgpdConnectPoint)); |
| 202 | - bgpdPeerConnectPoint, bgpdConnectPoint); | ||
| 203 | - intentService.submit(reversedIntentMatchDstTcpPort); | ||
| 204 | - log.debug("Submitted BGP path intent matching dst TCP port 179" | ||
| 205 | - + "from BGP peer {} to BGPd {} : {}", | ||
| 206 | - bgpdPeerAddress, bgpdAddress, reversedIntentMatchDstTcpPort); | ||
| 207 | 195 | ||
| 208 | // install intent for reversed BGP path from BGP peer to BGPd | 196 | // install intent for reversed BGP path from BGP peer to BGPd |
| 209 | // matching source TCP port 179 | 197 | // matching source TCP port 179 |
| 210 | - selector = DefaultTrafficSelector.builder() | 198 | + selector = buildSelector(IPv4.PROTOCOL_TCP, |
| 211 | - .matchEthType(Ethernet.TYPE_IPV4) | 199 | + bgpdPeerAddress, |
| 212 | - .matchIPProtocol(IPv4.PROTOCOL_TCP) | 200 | + bgpdAddress, |
| 213 | - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress, | 201 | + (short) BgpConstants.BGP_PORT, |
| 214 | - IpPrefix.MAX_INET_MASK_LENGTH)) | 202 | + null); |
| 215 | - .matchIPDst(IpPrefix.valueOf(bgpdAddress, | ||
| 216 | - IpPrefix.MAX_INET_MASK_LENGTH)) | ||
| 217 | - .matchTcpSrc((short) BgpConstants.BGP_PORT) | ||
| 218 | - .build(); | ||
| 219 | - | ||
| 220 | - PointToPointIntent reversedIntentMatchSrcTcpPort = | ||
| 221 | - new PointToPointIntent(appId, selector, treatment, | ||
| 222 | - bgpdPeerConnectPoint, bgpdConnectPoint); | ||
| 223 | - intentService.submit(reversedIntentMatchSrcTcpPort); | ||
| 224 | - log.debug("Submitted BGP path intent matching src TCP port 179" | ||
| 225 | - + "from BGP peer {} to BGPd {} : {}", | ||
| 226 | - bgpdPeerAddress, bgpdAddress, reversedIntentMatchSrcTcpPort); | ||
| 227 | - | ||
| 228 | - } | ||
| 229 | - } | ||
| 230 | - } | ||
| 231 | - | ||
| 232 | - /** | ||
| 233 | - * Sets up ICMP paths between each {@link BgpSpeaker} and all BGP peers | ||
| 234 | - * located in other external networks. | ||
| 235 | - * <p/> | ||
| 236 | - * Run a loop for all BGP speakers and a loop for all BGP Peers. Push | ||
| 237 | - * intents for paths from each BGP speaker to all peers. Push intents | ||
| 238 | - * for paths from all peers to each BGP speaker. | ||
| 239 | - */ | ||
| 240 | - private void setupIcmpPaths() { | ||
| 241 | - for (BgpSpeaker bgpSpeaker : configService.getBgpSpeakers() | ||
| 242 | - .values()) { | ||
| 243 | - log.debug("Start to set up ICMP paths for BGP speaker: {}", | ||
| 244 | - bgpSpeaker); | ||
| 245 | - ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint(); | ||
| 246 | - List<InterfaceAddress> interfaceAddresses = bgpSpeaker | ||
| 247 | - .interfaceAddresses(); | ||
| 248 | - | ||
| 249 | - for (BgpPeer bgpPeer : configService.getBgpPeers().values()) { | ||
| 250 | - | ||
| 251 | - Interface peerInterface = interfaceService.getInterface( | ||
| 252 | - bgpPeer.connectPoint()); | ||
| 253 | 203 | ||
| 254 | - if (peerInterface == null) { | 204 | + intents.add(new PointToPointIntent(appId, selector, treatment, |
| 255 | - log.error("Can not find the corresponding Interface from " | 205 | + bgpdPeerConnectPoint, bgpdConnectPoint)); |
| 256 | - + "configuration for BGP peer {}", | ||
| 257 | - bgpPeer.ipAddress()); | ||
| 258 | - continue; | ||
| 259 | - } | ||
| 260 | - IpAddress bgpdAddress = null; | ||
| 261 | - for (InterfaceAddress interfaceAddress : interfaceAddresses) { | ||
| 262 | - if (interfaceAddress.connectPoint().equals( | ||
| 263 | - peerInterface.connectPoint())) { | ||
| 264 | - bgpdAddress = interfaceAddress.ipAddress(); | ||
| 265 | - break; | ||
| 266 | - } | ||
| 267 | - | ||
| 268 | - } | ||
| 269 | - if (bgpdAddress == null) { | ||
| 270 | - log.debug("There is no IP address for bgpPeer: {} on " | ||
| 271 | - + "interface port: {}", bgpPeer, | ||
| 272 | - bgpPeer.connectPoint()); | ||
| 273 | - continue; | ||
| 274 | - } | ||
| 275 | - | ||
| 276 | - IpAddress bgpdPeerAddress = bgpPeer.ipAddress(); | ||
| 277 | - ConnectPoint bgpdPeerConnectPoint = peerInterface.connectPoint(); | ||
| 278 | 206 | ||
| 279 | // install intent for ICMP path from BGPd to BGP peer | 207 | // install intent for ICMP path from BGPd to BGP peer |
| 280 | - TrafficSelector selector = DefaultTrafficSelector.builder() | 208 | + selector = buildSelector(IPv4.PROTOCOL_ICMP, |
| 281 | - .matchEthType(Ethernet.TYPE_IPV4) | 209 | + bgpdAddress, |
| 282 | - .matchIPProtocol(IPv4.PROTOCOL_ICMP) | 210 | + bgpdPeerAddress, |
| 283 | - .matchIPSrc(IpPrefix.valueOf(bgpdAddress, | 211 | + null, |
| 284 | - IpPrefix.MAX_INET_MASK_LENGTH)) | 212 | + null); |
| 285 | - .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress, | ||
| 286 | - IpPrefix.MAX_INET_MASK_LENGTH)) | ||
| 287 | - .build(); | ||
| 288 | 213 | ||
| 289 | - TrafficTreatment treatment = DefaultTrafficTreatment.builder() | 214 | + intents.add(new PointToPointIntent(appId, selector, treatment, |
| 290 | - .build(); | 215 | + bgpdConnectPoint, bgpdPeerConnectPoint)); |
| 291 | 216 | ||
| 292 | - PointToPointIntent intent = | 217 | + // install intent for reversed ICMP path from BGP peer to BGPd |
| 293 | - new PointToPointIntent(appId, selector, treatment, | 218 | + selector = buildSelector(IPv4.PROTOCOL_ICMP, |
| 294 | - bgpdConnectPoint, bgpdPeerConnectPoint); | 219 | + bgpdPeerAddress, |
| 220 | + bgpdAddress, | ||
| 221 | + null, | ||
| 222 | + null); | ||
| 223 | + | ||
| 224 | + intents.add(new PointToPointIntent(appId, selector, treatment, | ||
| 225 | + bgpdPeerConnectPoint, bgpdConnectPoint)); | ||
| 226 | + | ||
| 227 | + // Submit all the intents. | ||
| 228 | + // TODO submit as a batch | ||
| 229 | + for (Intent intent : intents) { | ||
| 295 | intentService.submit(intent); | 230 | intentService.submit(intent); |
| 296 | - log.debug("Submitted ICMP path intent from BGPd {} to peer {} :" | 231 | + } |
| 297 | - + " {}", bgpdAddress, bgpdPeerAddress, intent); | 232 | + } |
| 298 | 233 | ||
| 299 | - // install intent for reversed ICMP path from BGP peer to BGPd | 234 | + /** |
| 300 | - selector = DefaultTrafficSelector.builder() | 235 | + * Builds a traffic selector based on the set of input parameters. |
| 236 | + * | ||
| 237 | + * @param ipProto IP protocol | ||
| 238 | + * @param srcIp source IP address | ||
| 239 | + * @param dstIp destination IP address | ||
| 240 | + * @param srcTcpPort source TCP port, or null if shouldn't be set | ||
| 241 | + * @param dstTcpPort destination TCP port, or null if shouldn't be set | ||
| 242 | + * @return the new traffic selector | ||
| 243 | + */ | ||
| 244 | + private TrafficSelector buildSelector(byte ipProto, IpAddress srcIp, | ||
| 245 | + IpAddress dstIp, Short srcTcpPort, Short dstTcpPort) { | ||
| 246 | + TrafficSelector.Builder builder = DefaultTrafficSelector.builder() | ||
| 301 | .matchEthType(Ethernet.TYPE_IPV4) | 247 | .matchEthType(Ethernet.TYPE_IPV4) |
| 302 | - .matchIPProtocol(IPv4.PROTOCOL_ICMP) | 248 | + .matchIPProtocol(ipProto) |
| 303 | - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress, | 249 | + .matchIPSrc(IpPrefix.valueOf(srcIp, |
| 304 | - IpPrefix.MAX_INET_MASK_LENGTH)) | ||
| 305 | - .matchIPDst(IpPrefix.valueOf(bgpdAddress, | ||
| 306 | IpPrefix.MAX_INET_MASK_LENGTH)) | 250 | IpPrefix.MAX_INET_MASK_LENGTH)) |
| 307 | - .build(); | 251 | + .matchIPDst(IpPrefix.valueOf(dstIp, |
| 252 | + IpPrefix.MAX_INET_MASK_LENGTH)); | ||
| 308 | 253 | ||
| 309 | - PointToPointIntent reversedIntent = | 254 | + if (srcTcpPort != null) { |
| 310 | - new PointToPointIntent(appId, selector, treatment, | 255 | + builder.matchTcpSrc(srcTcpPort); |
| 311 | - bgpdPeerConnectPoint, bgpdConnectPoint); | ||
| 312 | - intentService.submit(reversedIntent); | ||
| 313 | - log.debug("Submitted ICMP path intent from BGP peer {} to BGPd" | ||
| 314 | - + " {} : {}", | ||
| 315 | - bgpdPeerAddress, bgpdAddress, reversedIntent); | ||
| 316 | } | 256 | } |
| 257 | + | ||
| 258 | + if (dstTcpPort != null) { | ||
| 259 | + builder.matchTcpDst(dstTcpPort); | ||
| 317 | } | 260 | } |
| 261 | + | ||
| 262 | + return builder.build(); | ||
| 318 | } | 263 | } |
| 319 | 264 | ||
| 320 | } | 265 | } | ... | ... |
-
Please register or login to post a comment