blob: 400dba088a3797dc5f16e51eb3c30239c846b9c3 [file] [log] [blame]
Jonathan Hartdc711bd2014-10-15 11:24:23 -07001package org.onlab.onos.sdnip;
2
Thomas Vachuskab97cf282014-10-20 23:31:12 -07003import org.onlab.onos.ApplicationId;
Jonathan Hartdc711bd2014-10-15 11:24:23 -07004import org.onlab.onos.net.ConnectPoint;
5import org.onlab.onos.net.flow.DefaultTrafficSelector;
6import org.onlab.onos.net.flow.DefaultTrafficTreatment;
7import org.onlab.onos.net.flow.TrafficSelector;
8import org.onlab.onos.net.flow.TrafficTreatment;
Jonathan Hartdc711bd2014-10-15 11:24:23 -07009import org.onlab.onos.net.intent.IntentService;
10import org.onlab.onos.net.intent.PointToPointIntent;
11import org.onlab.onos.sdnip.config.BgpPeer;
12import org.onlab.onos.sdnip.config.BgpSpeaker;
13import org.onlab.onos.sdnip.config.Interface;
14import org.onlab.onos.sdnip.config.InterfaceAddress;
15import org.onlab.onos.sdnip.config.SdnIpConfigService;
16import org.onlab.packet.Ethernet;
17import org.onlab.packet.IPv4;
18import org.onlab.packet.IpAddress;
19import org.onlab.packet.IpPrefix;
20import org.slf4j.Logger;
21import org.slf4j.LoggerFactory;
22
Thomas Vachuskab97cf282014-10-20 23:31:12 -070023import java.util.List;
24
Jonathan Hartdc711bd2014-10-15 11:24:23 -070025/**
26 * Manages the connectivity requirements between peers.
27 */
Jonathan Hartce430a42014-10-16 20:44:29 -070028public class PeerConnectivityManager {
Jonathan Hartdc711bd2014-10-15 11:24:23 -070029
30 private static final Logger log = LoggerFactory.getLogger(
Jonathan Hartce430a42014-10-16 20:44:29 -070031 PeerConnectivityManager.class);
Jonathan Hartdc711bd2014-10-15 11:24:23 -070032
33 // TODO these shouldn't be defined here
34 private static final short BGP_PORT = 179;
35 private static final int IPV4_BIT_LENGTH = 32;
36
37 private final SdnIpConfigService configInfoService;
38 private final InterfaceService interfaceService;
39 private final IntentService intentService;
40
Thomas Vachuskab97cf282014-10-20 23:31:12 -070041 private final ApplicationId appId;
Jonathan Hartdc711bd2014-10-15 11:24:23 -070042
Thomas Vachuskab97cf282014-10-20 23:31:12 -070043 public PeerConnectivityManager(ApplicationId appId,
44 SdnIpConfigService configInfoService,
45 InterfaceService interfaceService,
46 IntentService intentService) {
47 this.appId = appId;
Jonathan Hartdc711bd2014-10-15 11:24:23 -070048 this.configInfoService = configInfoService;
49 this.interfaceService = interfaceService;
50 this.intentService = intentService;
51 }
52
53 public void start() {
54 // TODO are any of these errors?
55 if (interfaceService.getInterfaces().isEmpty()) {
56
57 log.warn("The interface in configuration file is empty. "
Thomas Vachuskab97cf282014-10-20 23:31:12 -070058 + "Thus, the SDN-IP application can not be started.");
Jonathan Hartdc711bd2014-10-15 11:24:23 -070059 } else if (configInfoService.getBgpPeers().isEmpty()) {
60
61 log.warn("The BGP peer in configuration file is empty."
Thomas Vachuskab97cf282014-10-20 23:31:12 -070062 + "Thus, the SDN-IP application can not be started.");
Jonathan Hartdc711bd2014-10-15 11:24:23 -070063 } else if (configInfoService.getBgpSpeakers() == null) {
64
65 log.error("The BGP speaker in configuration file is empty. "
Thomas Vachuskab97cf282014-10-20 23:31:12 -070066 + "Thus, the SDN-IP application can not be started.");
Jonathan Hartdc711bd2014-10-15 11:24:23 -070067 return;
68 }
69
70 setupBgpPaths();
71 setupIcmpPaths();
72 }
73
74 /**
75 * Sets up paths for all {@link BgpSpeaker}s and all external peers.
76 * <p/>
77 * Run a loop for all BGP speakers and a loop for all BGP peers outside.
78 * Push intents for paths from each BGP speaker to all peers. Push intents
79 * for paths from all peers to each BGP speaker.
80 */
81 private void setupBgpPaths() {
82 for (BgpSpeaker bgpSpeaker : configInfoService.getBgpSpeakers()
83 .values()) {
84 log.debug("Start to set up BGP paths for BGP speaker: {}",
Thomas Vachuskab97cf282014-10-20 23:31:12 -070085 bgpSpeaker);
Jonathan Hartdc711bd2014-10-15 11:24:23 -070086 ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint();
87
88 List<InterfaceAddress> interfaceAddresses =
89 bgpSpeaker.interfaceAddresses();
90
91 for (BgpPeer bgpPeer : configInfoService.getBgpPeers().values()) {
92
93 log.debug("Start to set up BGP paths between BGP speaker: {} "
Thomas Vachuskab97cf282014-10-20 23:31:12 -070094 + "to BGP peer: {}", bgpSpeaker, bgpPeer);
Jonathan Hartdc711bd2014-10-15 11:24:23 -070095
96 Interface peerInterface = interfaceService.getInterface(
97 bgpPeer.connectPoint());
98 if (peerInterface == null) {
99 log.error("Can not find the corresponding Interface from "
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700100 + "configuration for BGP peer {}",
101 bgpPeer.ipAddress());
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700102 continue;
103 }
104
105 IpAddress bgpdAddress = null;
106 for (InterfaceAddress interfaceAddress : interfaceAddresses) {
107 if (interfaceAddress.connectPoint().equals(
108 peerInterface.connectPoint())) {
109 bgpdAddress = interfaceAddress.ipAddress();
110 break;
111 }
112 }
113 if (bgpdAddress == null) {
114 log.debug("There is no interface IP address for bgpPeer: {}"
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700115 + " on interface {}", bgpPeer, bgpPeer.connectPoint());
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700116 return;
117 }
118
119 IpAddress bgpdPeerAddress = bgpPeer.ipAddress();
120 ConnectPoint bgpdPeerConnectPoint = peerInterface.connectPoint();
121
122 // install intent for BGP path from BGPd to BGP peer matching
123 // destination TCP port 179
124
125 // TODO: The usage of PacketMatchBuilder will be improved, then we
126 // only need to new the PacketMatchBuilder once.
127 // By then, the code here will be improved accordingly.
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700128 TrafficSelector selector = DefaultTrafficSelector.builder()
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700129 .matchEthType(Ethernet.TYPE_IPV4)
130 .matchIPProtocol(IPv4.PROTOCOL_TCP)
Jonathan Hartbcae7bd2014-10-16 10:24:41 -0700131 .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH))
132 .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH))
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700133 .matchTcpDst(BGP_PORT)
134 .build();
135
136 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
137 .build();
138
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700139 PointToPointIntent intentMatchDstTcpPort =
140 new PointToPointIntent(appId, selector, treatment,
141 bgpdConnectPoint, bgpdPeerConnectPoint);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700142 intentService.submit(intentMatchDstTcpPort);
143 log.debug("Submitted BGP path intent matching dst TCP port 179 "
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700144 + "from BGPd {} to peer {}: {}",
145 bgpdAddress, bgpdPeerAddress, intentMatchDstTcpPort);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700146
147 // install intent for BGP path from BGPd to BGP peer matching
148 // source TCP port 179
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700149 selector = DefaultTrafficSelector.builder()
150 .matchEthType(Ethernet.TYPE_IPV4)
151 .matchIPProtocol(IPv4.PROTOCOL_TCP)
Jonathan Hartbcae7bd2014-10-16 10:24:41 -0700152 .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH))
153 .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH))
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700154 .matchTcpSrc(BGP_PORT)
155 .build();
156
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700157 PointToPointIntent intentMatchSrcTcpPort =
158 new PointToPointIntent(appId, selector, treatment,
159 bgpdConnectPoint, bgpdPeerConnectPoint);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700160 intentService.submit(intentMatchSrcTcpPort);
161 log.debug("Submitted BGP path intent matching src TCP port 179"
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700162 + "from BGPd {} to peer {}: {}",
163 bgpdAddress, bgpdPeerAddress, intentMatchSrcTcpPort);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700164
165 // install intent for reversed BGP path from BGP peer to BGPd
166 // matching destination TCP port 179
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700167 selector = DefaultTrafficSelector.builder()
168 .matchEthType(Ethernet.TYPE_IPV4)
169 .matchIPProtocol(IPv4.PROTOCOL_TCP)
Jonathan Hartbcae7bd2014-10-16 10:24:41 -0700170 .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH))
171 .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH))
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700172 .matchTcpDst(BGP_PORT)
173 .build();
174
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700175 PointToPointIntent reversedIntentMatchDstTcpPort =
176 new PointToPointIntent(appId, selector, treatment,
177 bgpdPeerConnectPoint, bgpdConnectPoint);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700178 intentService.submit(reversedIntentMatchDstTcpPort);
179 log.debug("Submitted BGP path intent matching dst TCP port 179"
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700180 + "from BGP peer {} to BGPd {} : {}",
181 bgpdPeerAddress, bgpdAddress, reversedIntentMatchDstTcpPort);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700182
183 // install intent for reversed BGP path from BGP peer to BGPd
184 // matching source TCP port 179
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700185 selector = DefaultTrafficSelector.builder()
186 .matchEthType(Ethernet.TYPE_IPV4)
187 .matchIPProtocol(IPv4.PROTOCOL_TCP)
Jonathan Hartbcae7bd2014-10-16 10:24:41 -0700188 .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH))
189 .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH))
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700190 .matchTcpSrc(BGP_PORT)
191 .build();
192
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700193 PointToPointIntent reversedIntentMatchSrcTcpPort =
194 new PointToPointIntent(appId, selector, treatment,
195 bgpdPeerConnectPoint, bgpdConnectPoint);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700196 intentService.submit(reversedIntentMatchSrcTcpPort);
197 log.debug("Submitted BGP path intent matching src TCP port 179"
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700198 + "from BGP peer {} to BGPd {} : {}",
199 bgpdPeerAddress, bgpdAddress, reversedIntentMatchSrcTcpPort);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700200
201 }
202 }
203 }
204
205 /**
206 * Sets up ICMP paths between each {@link BgpSpeaker} and all BGP peers
207 * located in other external networks.
208 * <p/>
209 * Run a loop for all BGP speakers and a loop for all BGP Peers. Push
210 * intents for paths from each BGP speaker to all peers. Push intents
211 * for paths from all peers to each BGP speaker.
212 */
213 private void setupIcmpPaths() {
214 for (BgpSpeaker bgpSpeaker : configInfoService.getBgpSpeakers()
215 .values()) {
216 log.debug("Start to set up ICMP paths for BGP speaker: {}",
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700217 bgpSpeaker);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700218 ConnectPoint bgpdConnectPoint = bgpSpeaker.connectPoint();
219 List<InterfaceAddress> interfaceAddresses = bgpSpeaker
220 .interfaceAddresses();
221
222 for (BgpPeer bgpPeer : configInfoService.getBgpPeers().values()) {
223
224 Interface peerInterface = interfaceService.getInterface(
225 bgpPeer.connectPoint());
226
227 if (peerInterface == null) {
228 log.error("Can not find the corresponding Interface from "
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700229 + "configuration for BGP peer {}",
230 bgpPeer.ipAddress());
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700231 continue;
232 }
233 IpAddress bgpdAddress = null;
234 for (InterfaceAddress interfaceAddress : interfaceAddresses) {
235 if (interfaceAddress.connectPoint().equals(
236 peerInterface.connectPoint())) {
237 bgpdAddress = interfaceAddress.ipAddress();
238 break;
239 }
240
241 }
242 if (bgpdAddress == null) {
243 log.debug("There is no IP address for bgpPeer: {} on "
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700244 + "interface port: {}", bgpPeer,
245 bgpPeer.connectPoint());
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700246 return;
247 }
248
249 IpAddress bgpdPeerAddress = bgpPeer.ipAddress();
250 ConnectPoint bgpdPeerConnectPoint = peerInterface.connectPoint();
251
252 // install intent for ICMP path from BGPd to BGP peer
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700253 TrafficSelector selector = DefaultTrafficSelector.builder()
254 .matchEthType(Ethernet.TYPE_IPV4)
255 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
Jonathan Hartbcae7bd2014-10-16 10:24:41 -0700256 .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH))
257 .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH))
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700258 .build();
259
260 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
261 .build();
262
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700263 PointToPointIntent intent =
264 new PointToPointIntent(appId, selector, treatment,
265 bgpdConnectPoint, bgpdPeerConnectPoint);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700266 intentService.submit(intent);
267 log.debug("Submitted ICMP path intent from BGPd {} to peer {} :"
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700268 + " {}", bgpdAddress, bgpdPeerAddress, intent);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700269
270 // install intent for reversed ICMP path from BGP peer to BGPd
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700271 selector = DefaultTrafficSelector.builder()
272 .matchEthType(Ethernet.TYPE_IPV4)
273 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
Jonathan Hartbcae7bd2014-10-16 10:24:41 -0700274 .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), IPV4_BIT_LENGTH))
275 .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), IPV4_BIT_LENGTH))
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700276 .build();
277
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700278 PointToPointIntent reversedIntent =
279 new PointToPointIntent(appId, selector, treatment,
280 bgpdPeerConnectPoint, bgpdConnectPoint);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700281 intentService.submit(reversedIntent);
282 log.debug("Submitted ICMP path intent from BGP peer {} to BGPd"
Thomas Vachuskab97cf282014-10-20 23:31:12 -0700283 + " {} : {}",
284 bgpdPeerAddress, bgpdAddress, reversedIntent);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700285 }
286 }
287 }
288
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700289}