Jonathan Hart

Rafactored PeerConnectivityManager for code reuse between the two path types.

Change-Id: Ib05f676d071ef1c545e93244a9ed5ed89672113f
...@@ -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,231 +92,174 @@ public class PeerConnectivityManager { ...@@ -90,231 +92,174 @@ 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
119 - Interface peerInterface = interfaceService.getInterface( 113 + buildPeerIntents(bgpSpeaker, bgpPeer);
120 - bgpPeer.connectPoint());
121 - if (peerInterface == null) {
122 - log.error("Can not find the corresponding Interface from "
123 - + "configuration for BGP peer {}",
124 - bgpPeer.ipAddress());
125 - continue;
126 - }
127 -
128 - IpAddress bgpdAddress = null;
129 - for (InterfaceAddress interfaceAddress : interfaceAddresses) {
130 - if (interfaceAddress.connectPoint().equals(
131 - peerInterface.connectPoint())) {
132 - bgpdAddress = interfaceAddress.ipAddress();
133 - break;
134 - }
135 - }
136 - if (bgpdAddress == null) {
137 - log.debug("There is no interface IP address for bgpPeer: {}"
138 - + " on interface {}", bgpPeer, bgpPeer.connectPoint());
139 - continue;
140 - }
141 -
142 - IpAddress bgpdPeerAddress = bgpPeer.ipAddress();
143 - ConnectPoint bgpdPeerConnectPoint = peerInterface.connectPoint();
144 -
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 - .build();
159 -
160 - PointToPointIntent intentMatchDstTcpPort =
161 - new PointToPointIntent(appId, selector, treatment,
162 - bgpdConnectPoint, bgpdPeerConnectPoint);
163 - intentService.submit(intentMatchDstTcpPort);
164 - log.debug("Submitted BGP path intent matching dst TCP port 179 "
165 - + "from BGPd {} to peer {}: {}",
166 - bgpdAddress, bgpdPeerAddress, intentMatchDstTcpPort);
167 -
168 - // install intent for BGP path from BGPd to BGP peer matching
169 - // source TCP port 179
170 - selector = DefaultTrafficSelector.builder()
171 - .matchEthType(Ethernet.TYPE_IPV4)
172 - .matchIPProtocol(IPv4.PROTOCOL_TCP)
173 - .matchIPSrc(IpPrefix.valueOf(bgpdAddress,
174 - IpPrefix.MAX_INET_MASK_LENGTH))
175 - .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress,
176 - IpPrefix.MAX_INET_MASK_LENGTH))
177 - .matchTcpSrc((short) BgpConstants.BGP_PORT)
178 - .build();
179 -
180 - PointToPointIntent intentMatchSrcTcpPort =
181 - new PointToPointIntent(appId, selector, treatment,
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 -
188 - // install intent for reversed BGP path from BGP peer to BGPd
189 - // matching destination TCP port 179
190 - selector = DefaultTrafficSelector.builder()
191 - .matchEthType(Ethernet.TYPE_IPV4)
192 - .matchIPProtocol(IPv4.PROTOCOL_TCP)
193 - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress,
194 - IpPrefix.MAX_INET_MASK_LENGTH))
195 - .matchIPDst(IpPrefix.valueOf(bgpdAddress,
196 - IpPrefix.MAX_INET_MASK_LENGTH))
197 - .matchTcpDst((short) BgpConstants.BGP_PORT)
198 - .build();
199 -
200 - PointToPointIntent reversedIntentMatchDstTcpPort =
201 - new PointToPointIntent(appId, selector, treatment,
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 -
208 - // install intent for reversed BGP path from BGP peer to BGPd
209 - // matching source TCP port 179
210 - selector = DefaultTrafficSelector.builder()
211 - .matchEthType(Ethernet.TYPE_IPV4)
212 - .matchIPProtocol(IPv4.PROTOCOL_TCP)
213 - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress,
214 - IpPrefix.MAX_INET_MASK_LENGTH))
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 } 114 }
229 } 115 }
230 } 116 }
231 117
232 /** 118 /**
233 - * Sets up ICMP paths between each {@link BgpSpeaker} and all BGP peers 119 + * Builds the required intents between a given internal BGP speaker and
234 - * located in other external networks. 120 + * external BGP peer.
235 - * <p/> 121 + *
236 - * Run a loop for all BGP speakers and a loop for all BGP Peers. Push 122 + * @param bgpSpeaker the BGP speaker
237 - * intents for paths from each BGP speaker to all peers. Push intents 123 + * @param bgpPeer the BGP peer
238 - * for paths from all peers to each BGP speaker.
239 */ 124 */
240 - private void setupIcmpPaths() { 125 + private void buildPeerIntents(BgpSpeaker bgpSpeaker, BgpPeer bgpPeer) {
241 - for (BgpSpeaker bgpSpeaker : configService.getBgpSpeakers() 126 + List<Intent> intents = new ArrayList<Intent>();
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 127
249 - for (BgpPeer bgpPeer : configService.getBgpPeers().values()) { 128 + ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint();
250 129
251 - Interface peerInterface = interfaceService.getInterface( 130 + List<InterfaceAddress> interfaceAddresses =
252 - bgpPeer.connectPoint()); 131 + bgpSpeaker.interfaceAddresses();
253 - 132 +
254 - if (peerInterface == null) { 133 + Interface peerInterface = interfaceService.getInterface(
255 - log.error("Can not find the corresponding Interface from " 134 + bgpPeer.connectPoint());
256 - + "configuration for BGP peer {}", 135 +
257 - bgpPeer.ipAddress()); 136 + if (peerInterface == null) {
258 - continue; 137 + log.error("No interface found for peer {}", bgpPeer.ipAddress());
259 - } 138 + return;
260 - IpAddress bgpdAddress = null; 139 + }
261 - for (InterfaceAddress interfaceAddress : interfaceAddresses) { 140 +
262 - if (interfaceAddress.connectPoint().equals( 141 + IpAddress bgpdAddress = null;
263 - peerInterface.connectPoint())) { 142 + for (InterfaceAddress interfaceAddress : interfaceAddresses) {
264 - bgpdAddress = interfaceAddress.ipAddress(); 143 + if (interfaceAddress.connectPoint().equals(
265 - break; 144 + peerInterface.connectPoint())) {
266 - } 145 + bgpdAddress = interfaceAddress.ipAddress();
267 - 146 + break;
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 -
279 - // install intent for ICMP path from BGPd to BGP peer
280 - TrafficSelector selector = DefaultTrafficSelector.builder()
281 - .matchEthType(Ethernet.TYPE_IPV4)
282 - .matchIPProtocol(IPv4.PROTOCOL_ICMP)
283 - .matchIPSrc(IpPrefix.valueOf(bgpdAddress,
284 - IpPrefix.MAX_INET_MASK_LENGTH))
285 - .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress,
286 - IpPrefix.MAX_INET_MASK_LENGTH))
287 - .build();
288 -
289 - TrafficTreatment treatment = DefaultTrafficTreatment.builder()
290 - .build();
291 -
292 - PointToPointIntent intent =
293 - new PointToPointIntent(appId, selector, treatment,
294 - bgpdConnectPoint, bgpdPeerConnectPoint);
295 - intentService.submit(intent);
296 - log.debug("Submitted ICMP path intent from BGPd {} to peer {} :"
297 - + " {}", bgpdAddress, bgpdPeerAddress, intent);
298 -
299 - // install intent for reversed ICMP path from BGP peer to BGPd
300 - selector = DefaultTrafficSelector.builder()
301 - .matchEthType(Ethernet.TYPE_IPV4)
302 - .matchIPProtocol(IPv4.PROTOCOL_ICMP)
303 - .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress,
304 - IpPrefix.MAX_INET_MASK_LENGTH))
305 - .matchIPDst(IpPrefix.valueOf(bgpdAddress,
306 - IpPrefix.MAX_INET_MASK_LENGTH))
307 - .build();
308 -
309 - PointToPointIntent reversedIntent =
310 - new PointToPointIntent(appId, selector, treatment,
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 } 147 }
317 } 148 }
149 + if (bgpdAddress == null) {
150 + log.debug("No IP address found for peer {} on interface {}",
151 + bgpPeer, bgpPeer.connectPoint());
152 + return;
153 + }
154 +
155 + IpAddress bgpdPeerAddress = bgpPeer.ipAddress();
156 + ConnectPoint bgpdPeerConnectPoint = peerInterface.connectPoint();
157 +
158 + TrafficTreatment treatment = DefaultTrafficTreatment.builder()
159 + .build();
160 +
161 + TrafficSelector selector;
162 +
163 + // install intent for BGP path from BGPd to BGP peer matching
164 + // destination TCP port 179
165 + selector = buildSelector(IPv4.PROTOCOL_TCP,
166 + bgpdAddress,
167 + bgpdPeerAddress,
168 + null,
169 + (short) BgpConstants.BGP_PORT);
170 +
171 + intents.add(new PointToPointIntent(appId, selector, treatment,
172 + bgpdConnectPoint, bgpdPeerConnectPoint));
173 +
174 + // install intent for BGP path from BGPd to BGP peer matching
175 + // source TCP port 179
176 + selector = buildSelector(IPv4.PROTOCOL_TCP,
177 + bgpdAddress,
178 + bgpdPeerAddress,
179 + (short) BgpConstants.BGP_PORT,
180 + null);
181 +
182 + intents.add(new PointToPointIntent(appId, selector, treatment,
183 + bgpdConnectPoint, bgpdPeerConnectPoint));
184 +
185 + // install intent for reversed BGP path from BGP peer to BGPd
186 + // matching destination TCP port 179
187 + selector = buildSelector(IPv4.PROTOCOL_TCP,
188 + bgpdPeerAddress,
189 + bgpdAddress,
190 + null,
191 + (short) BgpConstants.BGP_PORT);
192 +
193 + intents.add(new PointToPointIntent(appId, selector, treatment,
194 + bgpdPeerConnectPoint, bgpdConnectPoint));
195 +
196 + // install intent for reversed BGP path from BGP peer to BGPd
197 + // matching source TCP port 179
198 + selector = buildSelector(IPv4.PROTOCOL_TCP,
199 + bgpdPeerAddress,
200 + bgpdAddress,
201 + (short) BgpConstants.BGP_PORT,
202 + null);
203 +
204 + intents.add(new PointToPointIntent(appId, selector, treatment,
205 + bgpdPeerConnectPoint, bgpdConnectPoint));
206 +
207 + // install intent for ICMP path from BGPd to BGP peer
208 + selector = buildSelector(IPv4.PROTOCOL_ICMP,
209 + bgpdAddress,
210 + bgpdPeerAddress,
211 + null,
212 + null);
213 +
214 + intents.add(new PointToPointIntent(appId, selector, treatment,
215 + bgpdConnectPoint, bgpdPeerConnectPoint));
216 +
217 + // install intent for reversed ICMP path from BGP peer to BGPd
218 + selector = buildSelector(IPv4.PROTOCOL_ICMP,
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) {
230 + intentService.submit(intent);
231 + }
232 + }
233 +
234 + /**
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()
247 + .matchEthType(Ethernet.TYPE_IPV4)
248 + .matchIPProtocol(ipProto)
249 + .matchIPSrc(IpPrefix.valueOf(srcIp,
250 + IpPrefix.MAX_INET_MASK_LENGTH))
251 + .matchIPDst(IpPrefix.valueOf(dstIp,
252 + IpPrefix.MAX_INET_MASK_LENGTH));
253 +
254 + if (srcTcpPort != null) {
255 + builder.matchTcpSrc(srcTcpPort);
256 + }
257 +
258 + if (dstTcpPort != null) {
259 + builder.matchTcpDst(dstTcpPort);
260 + }
261 +
262 + return builder.build();
318 } 263 }
319 264
320 } 265 }
......