blob: 91a68fccdeffd7b81cad066a83388c451653f72d [file] [log] [blame]
Thomas Vachuska58de4162015-09-10 16:15:33 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Thomas Vachuska58de4162015-09-10 16:15:33 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Phanendra Manda972ee9e2015-08-21 19:08:20 +053016package org.onosproject.provider.pcep.tunnel.impl;
17
18import java.util.Collection;
19import java.util.Collections;
20import java.util.HashSet;
Priyanka Bd2b28882016-04-04 16:57:04 +053021import java.util.LinkedList;
Phanendra Manda972ee9e2015-08-21 19:08:20 +053022import java.util.Set;
23import java.util.concurrent.ConcurrentHashMap;
24
25import org.apache.felix.scr.annotations.Activate;
26import org.apache.felix.scr.annotations.Deactivate;
27import org.onlab.packet.IpAddress;
Priyanka Bd2b28882016-04-04 16:57:04 +053028import org.onosproject.pcep.controller.ClientCapability;
Phanendra Manda972ee9e2015-08-21 19:08:20 +053029import org.onosproject.pcep.controller.PccId;
30import org.onosproject.pcep.controller.PcepClient;
31import org.onosproject.pcep.controller.PcepClientController;
32import org.onosproject.pcep.controller.PcepClientListener;
33import org.onosproject.pcep.controller.PcepEventListener;
34import org.onosproject.pcep.controller.driver.PcepAgent;
Priyanka Bd2b28882016-04-04 16:57:04 +053035import org.onosproject.pcepio.protocol.PcepError;
36import org.onosproject.pcepio.protocol.PcepErrorInfo;
37import org.onosproject.pcepio.protocol.PcepErrorMsg;
38import org.onosproject.pcepio.protocol.PcepErrorObject;
39import org.onosproject.pcepio.protocol.PcepFactory;
Phanendra Manda972ee9e2015-08-21 19:08:20 +053040import org.onosproject.pcepio.protocol.PcepMessage;
41import org.onosproject.pcepio.protocol.PcepVersion;
42
43import com.google.common.collect.Sets;
44
Priyanka Bd2b28882016-04-04 16:57:04 +053045import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_TYPE_19;
46import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_VALUE_5;
47
48/**
49 * Representation of PCEP client controller adapter.
50 */
Phanendra Manda972ee9e2015-08-21 19:08:20 +053051public class PcepClientControllerAdapter implements PcepClientController {
52
53 protected ConcurrentHashMap<PccId, PcepClient> connectedClients =
54 new ConcurrentHashMap<PccId, PcepClient>();
55
56 protected PcepClientAgent agent = new PcepClientAgent();
57 protected Set<PcepClientListener> pcepClientListener = new HashSet<>();
58
59 protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet();
60
61 @Activate
62 public void activate() {
63 }
64
65 @Deactivate
66 public void deactivate() {
67 }
68
69 @Override
70 public Collection<PcepClient> getClients() {
71 return connectedClients.values();
72 }
73
74 @Override
75 public PcepClient getClient(PccId pccId) {
Phanendra Manda972ee9e2015-08-21 19:08:20 +053076 PcepClientAdapter pc = new PcepClientAdapter();
Priyanka Bd2b28882016-04-04 16:57:04 +053077 if (pccId.ipAddress().equals(IpAddress.valueOf(0xC010103))
78 || pccId.ipAddress().equals(IpAddress.valueOf(0xB6024E22))) {
79 pc.setCapability(new ClientCapability(true, false, false));
80 } else {
81 pc.setCapability(new ClientCapability(true, true, true));
82 }
83 pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1);
Phanendra Manda972ee9e2015-08-21 19:08:20 +053084 return pc;
85 }
86
87 @Override
88 public void addListener(PcepClientListener listener) {
89 if (!pcepClientListener.contains(listener)) {
90 this.pcepClientListener.add(listener);
91 }
92 }
93
94 @Override
95 public void removeListener(PcepClientListener listener) {
96 this.pcepClientListener.remove(listener);
97 }
98
99 @Override
100 public void addEventListener(PcepEventListener listener) {
101 pcepEventListener.add(listener);
102 }
103
104 @Override
105 public void removeEventListener(PcepEventListener listener) {
106 pcepEventListener.remove(listener);
107 }
108
109 @Override
110 public void writeMessage(PccId pccId, PcepMessage msg) {
111 this.getClient(pccId).sendMessage(msg);
112 }
113
114 @Override
115 public void processClientMessage(PccId pccId, PcepMessage msg) {
116
117 PcepClient pc = getClient(pccId);
118
119 switch (msg.getType()) {
120 case NONE:
121 break;
122 case OPEN:
123 break;
124 case KEEP_ALIVE:
125 //log.debug("Sending Keep Alive Message to {" + pccIpAddress.toString() + "}");
126 pc.sendMessage(Collections.singletonList(pc.factory().buildKeepaliveMsg().build()));
127 break;
128 case PATH_COMPUTATION_REQUEST:
129 break;
130 case PATH_COMPUTATION_REPLY:
131 break;
132 case NOTIFICATION:
133 break;
134 case ERROR:
135 break;
136 case CLOSE:
137 //log.debug("Sending Close Message to { }", pccIpAddress.toString());
138 pc.sendMessage(Collections.singletonList(pc.factory().buildCloseMsg().build()));
139 break;
Priyanka Bd2b28882016-04-04 16:57:04 +0530140 case INITIATE:
141 if (!pc.capability().pcInstantiationCapability()) {
142 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(),
143 ERROR_TYPE_19, ERROR_VALUE_5)));
144 }
145 break;
Phanendra Manda972ee9e2015-08-21 19:08:20 +0530146 case REPORT:
Priyanka Bd2b28882016-04-04 16:57:04 +0530147 //Only update the listener if respective capability is supported else send PCEP-ERR msg
148 if (pc.capability().statefulPceCapability()) {
149 for (PcepEventListener l : pcepEventListener) {
150 l.handleMessage(pccId, msg);
151 }
152 } else {
153 // Send PCEP-ERROR message.
154 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(),
155 ERROR_TYPE_19, ERROR_VALUE_5)));
Phanendra Manda972ee9e2015-08-21 19:08:20 +0530156 }
157 break;
158 case UPDATE:
Priyanka Bd2b28882016-04-04 16:57:04 +0530159 if (!pc.capability().statefulPceCapability()) {
160 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(),
161 ERROR_TYPE_19, ERROR_VALUE_5)));
Phanendra Manda972ee9e2015-08-21 19:08:20 +0530162 }
163 break;
164 case LABEL_UPDATE:
Priyanka Bd2b28882016-04-04 16:57:04 +0530165 if (!pc.capability().pceccCapability()) {
166 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(),
167 ERROR_TYPE_19, ERROR_VALUE_5)));
168 }
Phanendra Manda972ee9e2015-08-21 19:08:20 +0530169 break;
170 case MAX:
171 break;
172 case END:
173 break;
174 default:
175 break;
176 }
177 }
178
179 @Override
180 public void closeConnectedClients() {
181 PcepClient pc;
182 for (PccId id : connectedClients.keySet()) {
183 pc = getClient(id);
184 pc.disconnectClient();
185 }
186 }
187
Priyanka Bd2b28882016-04-04 16:57:04 +0530188 private PcepErrorMsg getErrMsg(PcepFactory factory, byte errorType, byte errorValue) {
189 LinkedList<PcepError> llPcepErr = new LinkedList<>();
190
191 LinkedList<PcepErrorObject> llerrObj = new LinkedList<>();
192 PcepErrorMsg errMsg;
193
194 PcepErrorObject errObj = factory.buildPcepErrorObject().setErrorValue(errorValue).setErrorType(errorType)
195 .build();
196
197 llerrObj.add(errObj);
198 PcepError pcepErr = factory.buildPcepError().setErrorObjList(llerrObj).build();
199
200 llPcepErr.add(pcepErr);
201
202 PcepErrorInfo errInfo = factory.buildPcepErrorInfo().setPcepErrorList(llPcepErr).build();
203
204 errMsg = factory.buildPcepErrorMsg().setPcepErrorInfo(errInfo).build();
205 return errMsg;
206 }
207
Phanendra Manda972ee9e2015-08-21 19:08:20 +0530208 /**
209 * Implementation of an Pcep Agent which is responsible for
210 * keeping track of connected clients and the state in which
211 * they are.
212 */
213 public class PcepClientAgent implements PcepAgent {
214
215 @Override
216 public boolean addConnectedClient(PccId pccId, PcepClient pc) {
217
218 if (connectedClients.get(pccId) != null) {
219 return false;
220 } else {
221 connectedClients.put(pccId, pc);
222 for (PcepClientListener l : pcepClientListener) {
223 l.clientConnected(pccId);
224 }
225 return true;
226 }
227 }
228
229 @Override
230 public boolean validActivation(PccId pccId) {
231 if (connectedClients.get(pccId) == null) {
232 //log.error("Trying to activate client but is not in "
233 // + "connected switches: pccIp {}. Aborting ..", pccIpAddress.toString());
234 return false;
235 }
236
237 return true;
238 }
239
240 @Override
241 public void removeConnectedClient(PccId pccId) {
242 connectedClients.remove(pccId);
243 for (PcepClientListener l : pcepClientListener) {
244 //log.warn("removal for {}", pccIpAddress.toString());
245 l.clientDisconnected(pccId);
246 }
247 }
248
249 @Override
250 public void processPcepMessage(PccId pccId, PcepMessage m) {
251 processClientMessage(pccId, m);
252 }
253 }
Phanendra Manda972ee9e2015-08-21 19:08:20 +0530254}