blob: a10ff5c8915b8dd11016a7300627984bd82aed29 [file] [log] [blame]
SureshBR25058b72015-08-13 13:05:06 +05301/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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 */
16
17package org.onosproject.pcep.controller.impl;
18
19import java.net.InetSocketAddress;
20import java.net.SocketAddress;
21import java.util.Collections;
22import java.util.List;
23import java.util.concurrent.RejectedExecutionException;
24
25import org.jboss.netty.channel.Channel;
26import org.onlab.packet.IpAddress;
27import org.onosproject.pcep.controller.PccId;
28import org.onosproject.pcep.controller.PcepPacketStats;
29import org.onosproject.pcep.controller.driver.PcepAgent;
30import org.onosproject.pcep.controller.driver.PcepClientDriver;
31import org.onosproject.pcepio.protocol.PcepFactories;
32import org.onosproject.pcepio.protocol.PcepFactory;
33import org.onosproject.pcepio.protocol.PcepMessage;
34import org.onosproject.pcepio.protocol.PcepVersion;
35import org.slf4j.Logger;
36import org.slf4j.LoggerFactory;
37
38import com.google.common.base.MoreObjects;
39
40/**
41 * An abstract representation of an OpenFlow switch. Can be extended by others
42 * to serve as a base for their vendor specific representation of a switch.
43 */
44public class PcepClientImpl implements PcepClientDriver {
45
46 protected final Logger log = LoggerFactory.getLogger(PcepClientImpl.class);
47
48 private static final String SHUTDOWN_MSG = "Worker has already been shutdown";
49
50 private Channel channel;
51 protected String channelId;
52
53 private boolean connected;
54 protected boolean startDriverHandshakeCalled = false;
55 protected boolean isHandShakeComplete = false;
56 protected boolean isSyncComplete = false;
57 private PccId pccId;
58 private PcepAgent agent;
59
60 private PcepVersion pcepVersion;
61 private byte keepAliveTime;
62 private byte deadTime;
63 private byte sessionId;
64 private PcepPacketStatsImpl pktStats;
65
66 @Override
67 public void init(PccId pccId, PcepVersion pcepVersion, PcepPacketStats pktStats) {
68 this.pccId = pccId;
69 this.pcepVersion = pcepVersion;
70 this.pktStats = (PcepPacketStatsImpl) pktStats;
71 }
72
73 @Override
74 public final void disconnectClient() {
75 this.channel.close();
76 }
77
78 @Override
79 public final void sendMessage(PcepMessage m) {
80 log.debug("Sending message to {}", channel.getRemoteAddress());
81 try {
82 channel.write(Collections.singletonList(m));
83 this.pktStats.addOutPacket();
84 } catch (RejectedExecutionException e) {
85 log.warn(e.getMessage());
86 if (!e.getMessage().contains(SHUTDOWN_MSG)) {
87 throw e;
88 }
89 }
90 }
91
92 @Override
93 public final void sendMessage(List<PcepMessage> msgs) {
94 try {
95 channel.write(msgs);
96 this.pktStats.addOutPacket(msgs.size());
97 } catch (RejectedExecutionException e) {
98 log.warn(e.getMessage());
99 if (!e.getMessage().contains(SHUTDOWN_MSG)) {
100 throw e;
101 }
102 }
103 }
104
105 @Override
106 public final boolean isConnected() {
107 return this.connected;
108 }
109
110 @Override
111 public final void setConnected(boolean connected) {
112 this.connected = connected;
113 };
114
115 @Override
116 public final void setChannel(Channel channel) {
117 this.channel = channel;
118 final SocketAddress address = channel.getRemoteAddress();
119 if (address instanceof InetSocketAddress) {
120 final InetSocketAddress inetAddress = (InetSocketAddress) address;
121 final IpAddress ipAddress = IpAddress.valueOf(inetAddress.getAddress());
122 if (ipAddress.isIp4()) {
123 channelId = ipAddress.toString() + ':' + inetAddress.getPort();
124 } else {
125 channelId = '[' + ipAddress.toString() + "]:" + inetAddress.getPort();
126 }
127 }
128 };
129
130 @Override
131 public String channelId() {
132 return channelId;
133 }
134
135 @Override
136 public final PccId getPccId() {
137 return this.pccId;
138 }
139
140 @Override
141 public final String getStringId() {
142 return this.pccId.toString();
143 }
144
145 @Override
146 public final void setPcVersion(PcepVersion pcepVersion) {
147 this.pcepVersion = pcepVersion;
148 }
149
150 @Override
151 public void setPcKeepAliveTime(byte keepAliveTime) {
152 this.keepAliveTime = keepAliveTime;
153 }
154
155 @Override
156 public void setPcDeadTime(byte deadTime) {
157 this.deadTime = deadTime;
158 }
159
160 @Override
161 public void setPcSessionId(byte sessionId) {
162 this.sessionId = sessionId;
163 }
164
165 @Override
166 public void setIsSyncComplete(boolean value) {
167 this.isSyncComplete = value;
168 }
169
170 @Override
171 public boolean isSyncComplete() {
172 return isSyncComplete;
173 }
174
175 @Override
176 public final void handleMessage(PcepMessage m) {
177 this.pktStats.addInPacket();
178 this.agent.processPcepMessage(pccId, m);
179 }
180
181 @Override
182 public final boolean connectClient() {
183 return this.agent.addConnectedClient(pccId, this);
184 }
185
186 @Override
187 public final void removeConnectedClient() {
188 this.agent.removeConnectedClient(pccId);
189 }
190
191 @Override
192 public PcepFactory factory() {
193 return PcepFactories.getFactory(pcepVersion);
194 }
195
196 @Override
197 public boolean isHandshakeComplete() {
198 return isHandShakeComplete;
199 }
200
201 @Override
202 public final void setAgent(PcepAgent ag) {
203 if (this.agent == null) {
204 this.agent = ag;
205 }
206 }
207
208 @Override
209 public boolean isOptical() {
210 return false;
211 }
212
213 @Override
214 public String toString() {
215 return MoreObjects.toStringHelper(getClass())
216 .add("channel", channelId())
217 .add("pccId", getPccId())
218 .toString();
219 }
220}