blob: e6abf2d834509bec4a203a3f22816f7810779824 [file] [log] [blame]
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -08001/**
Ray Milkey269ffb92014-04-03 14:43:30 -07002 * Copyright 2011, Big Switch Networks, Inc.
3 * Originally created by David Erickson, Stanford University
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
6 * not use this file except in compliance with the License. You may obtain
7 * a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 * License for the specific language governing permissions and limitations
15 * under the License.
16 **/
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080017
18package net.floodlightcontroller.core.web;
19
Srikanth Vavilapallib7258512014-09-29 13:24:11 -070020import java.util.ArrayList;
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070021import java.util.List;
22import java.util.concurrent.Future;
23import java.util.concurrent.TimeUnit;
24
25import net.floodlightcontroller.core.IFloodlightProviderService;
26import net.floodlightcontroller.core.IOFSwitch;
27import net.floodlightcontroller.core.annotations.LogMessageDoc;
Fahad Naeem Khand563af62014-10-08 17:37:25 -070028import net.onrc.onos.core.drivermanager.OFSwitchImplCPqD13;
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070029
30import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
Fahad Naeem Khand89448d2014-10-06 18:40:45 -070031import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -070032import org.projectfloodlight.openflow.protocol.OFGroupDescStatsEntry;
33import org.projectfloodlight.openflow.protocol.OFGroupDescStatsReply;
Fahad Naeem Khan8a8daf22014-10-06 14:07:43 -070034import org.projectfloodlight.openflow.protocol.OFGroupStatsEntry;
35import org.projectfloodlight.openflow.protocol.OFGroupStatsReply;
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070036import org.projectfloodlight.openflow.protocol.OFMatchV3;
37import org.projectfloodlight.openflow.protocol.OFOxmList;
Srikanth Vavilapallib7258512014-09-29 13:24:11 -070038import org.projectfloodlight.openflow.protocol.OFPortStatsEntry;
Fahad Naeem Khand89448d2014-10-06 18:40:45 -070039import org.projectfloodlight.openflow.protocol.OFFlowStatsReply;
Srikanth Vavilapallib7258512014-09-29 13:24:11 -070040import org.projectfloodlight.openflow.protocol.OFPortStatsReply;
41import org.projectfloodlight.openflow.protocol.OFPortStatsRequest;
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070042import org.projectfloodlight.openflow.protocol.OFStatsReply;
43import org.projectfloodlight.openflow.protocol.OFStatsRequest;
44import org.projectfloodlight.openflow.protocol.OFStatsType;
45import org.projectfloodlight.openflow.types.OFPort;
46import org.projectfloodlight.openflow.types.TableId;
47import org.projectfloodlight.openflow.util.HexString;
48import org.restlet.resource.ResourceException;
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080049import org.restlet.resource.ServerResource;
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070050import org.slf4j.Logger;
51import org.slf4j.LoggerFactory;
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080052
53/**
54 * Base class for server resources related to switches
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -070055 *
Ray Milkey269ffb92014-04-03 14:43:30 -070056 * @author readams
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080057 */
Ray Milkeyff735142014-05-22 19:06:02 -070058
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080059public class SwitchResourceBase extends ServerResource {
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070060 protected final static Logger log = LoggerFactory.getLogger(SwitchResourceBase.class);
Ray Milkey269ffb92014-04-03 14:43:30 -070061
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080062 public enum REQUESTTYPE {
63 OFSTATS,
64 OFFEATURES
65 }
Ray Milkey269ffb92014-04-03 14:43:30 -070066
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080067 @Override
68 protected void doInit() throws ResourceException {
69 super.doInit();
Ray Milkey269ffb92014-04-03 14:43:30 -070070
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080071 }
Ray Milkey269ffb92014-04-03 14:43:30 -070072
73 @LogMessageDoc(level = "ERROR",
74 message = "Failure retrieving statistics from switch {switch}",
75 explanation = "An error occurred while retrieving statistics" +
76 "from the switch",
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -070077 recommendation = LogMessageDoc.CHECK_SWITCH + " " +
78 LogMessageDoc.GENERIC_ACTION)
79
80 protected List<?> getSwitchStatistics(long switchId,
Srikanth Vavilapallif25c7b02014-10-01 14:30:43 -070081 OFStatsType statType) {
Ray Milkey269ffb92014-04-03 14:43:30 -070082 IFloodlightProviderService floodlightProvider =
83 (IFloodlightProviderService) getContext().getAttributes().
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -070084 get(IFloodlightProviderService.class.getCanonicalName());
Ray Milkey269ffb92014-04-03 14:43:30 -070085
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080086 IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070087 Future<List<OFStatsReply>> future;
88 List<OFStatsReply> values = null;
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080089 if (sw != null) {
Srikanth Vavilapallif25c7b02014-10-01 14:30:43 -070090 OFStatsRequest<?> req = null;
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070091 if (statType == OFStatsType.FLOW) {
Srikanth Vavilapallif25c7b02014-10-01 14:30:43 -070092 log.debug("Switch Flow Stats req sent for switch {}",
93 sw.getStringId());
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -070094 OFMatchV3 match = sw.getFactory().buildMatchV3()
Srikanth Vavilapallif25c7b02014-10-01 14:30:43 -070095 .setOxmList(OFOxmList.EMPTY).build();
96 req = sw.getFactory()
97 .buildFlowStatsRequest()
98 .setMatch(match)
99 .setOutPort(OFPort.ANY)
100 .setTableId(TableId.ALL)
101 .setXid(sw.getNextTransactionId()).build();
Fahad Naeem Khand89448d2014-10-06 18:40:45 -0700102 List<OFFlowStatsEntryMod> flowStats = new ArrayList<OFFlowStatsEntryMod>();
103 try {
104 future = sw.getStatistics(req);
105 values = future.get(10, TimeUnit.SECONDS);
Fahad Naeem Khand89448d2014-10-06 18:40:45 -0700106 for (OFFlowStatsEntry entry : ((OFFlowStatsReply)values.get(0)).getEntries()) {
107 OFFlowStatsEntryMod entryMod = new OFFlowStatsEntryMod(entry);
108 flowStats.add(entryMod);
109 }
110 log.debug("Switch flow Stats Entries from switch {} are {}",
111 sw.getStringId(), flowStats);
112 } catch (Exception e) {
113 log.error("Failure retrieving statistics from switch " + sw, e);
114 }
115 return flowStats;
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -0700116 }
117 else if (statType == OFStatsType.PORT){
118 log.debug("Switch Port Stats: req sent for all "
119 + "ports in switch {}", sw.getStringId());
120 List<OFPortStatsEntryMod> portStats = null;
121 req = sw.getFactory()
122 .buildPortStatsRequest()
123 .setPortNo(OFPort.ANY).setXid
124 (sw.getNextTransactionId()).build();
125 try {
126 future = sw.getStatistics(req);
127 values = future.get(10, TimeUnit.SECONDS);
128 portStats = new ArrayList<OFPortStatsEntryMod>();
129 for (OFPortStatsEntry entry : ((OFPortStatsReply)values.get(0)).getEntries()) {
130 OFPortStatsEntryMod entryMod = new OFPortStatsEntryMod(entry);
131 portStats.add(entryMod);
132 }
133 log.debug("Switch Port Stats Entries from switch {} are {}",
134 sw.getStringId(), portStats);
135 } catch (Exception e) {
136 log.error("Failure retrieving statistics from switch " + sw, e);
137 }
138 return portStats;
139 }
140 else if (statType == OFStatsType.GROUP){
141 log.debug("Switch Group Stats: req sent for all "
142 + "ports in switch {}", sw.getStringId());
143 req = sw.getFactory().buildGroupStatsRequest().setXid
144 (sw.getNextTransactionId()).build();
Fahad Naeem Khan8a8daf22014-10-06 14:07:43 -0700145 List<OFGroupStatsEntryMod> groupStats = new ArrayList<OFGroupStatsEntryMod>();
146 try {
147 future = sw.getStatistics(req);
148 values = future.get(10, TimeUnit.SECONDS);
149 for (OFGroupStatsEntry entry : ((OFGroupStatsReply)values.get(0)).getEntries()) {
150 OFGroupStatsEntryMod entryMod = new OFGroupStatsEntryMod(entry);
151 groupStats.add(entryMod);
152 }
153 log.debug("Switch Group Stats Entries from switch {} are {}",
154 sw.getStringId(), groupStats);
155 } catch (Exception e) {
156 log.error("Failure retrieving statistics from switch " + sw, e);
157 }
158 return groupStats;
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -0700159 }
160 else if (statType == OFStatsType.GROUP_DESC){
161 log.debug("Switch Group Desc Stats: req sent for all "
162 + "ports in switch {}", sw.getStringId());
163 List<OFGroupDescStatsEntryMod> GroupDescStats= new ArrayList<OFGroupDescStatsEntryMod>();
164 req = sw.getFactory().buildGroupDescStatsRequest().setXid
165 (sw.getNextTransactionId()).build();
166 try {
167 future = sw.getStatistics(req);
168 values = future.get(10, TimeUnit.SECONDS);
169 for (OFGroupDescStatsEntry entry : ((OFGroupDescStatsReply)values.get(0)).getEntries()) {
170 OFGroupDescStatsEntryMod entryMod = new OFGroupDescStatsEntryMod(entry);
171 GroupDescStats.add(entryMod);
172 }
173 log.debug("Switch Group_Desc Stats Entries from switch {} are {}",
174 sw.getStringId(), GroupDescStats);
175 } catch (Exception e) {
176 log.error("Failure retrieving statistics from switch " + sw, e);
177 }
178 return GroupDescStats;
179 }
180 /*else if (statType == OFStatisticsType.AGGREGATE) {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800181 OFAggregateStatisticsRequest specificReq = new OFAggregateStatisticsRequest();
182 OFMatch match = new OFMatch();
183 match.setWildcards(0xffffffff);
184 specificReq.setMatch(match);
185 specificReq.setOutPort(OFPort.OFPP_NONE.getValue());
186 specificReq.setTableId((byte) 0xff);
Ray Milkey269ffb92014-04-03 14:43:30 -0700187 req.setStatistics(Collections.singletonList((OFStatistics) specificReq));
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800188 requestLength += specificReq.getLength();
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -0700189 } /*else if (statType == OFStatisticsType.QUEUE) {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800190 OFQueueStatisticsRequest specificReq = new OFQueueStatisticsRequest();
Ray Milkeyff735142014-05-22 19:06:02 -0700191 specificReq.setPortNumber(OFPort.OFPP_ALL.getValue());
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800192 // LOOK! openflowj does not define OFPQ_ALL! pulled this from openflow.h
193 // note that I haven't seen this work yet though...
194 specificReq.setQueueId(0xffffffff);
Ray Milkey269ffb92014-04-03 14:43:30 -0700195 req.setStatistics(Collections.singletonList((OFStatistics) specificReq));
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800196 requestLength += specificReq.getLength();
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -0700197 } else if (statType == OFStatisticsType.DESC ||
Ray Milkey269ffb92014-04-03 14:43:30 -0700198 statType == OFStatisticsType.TABLE) {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800199 // pass - nothing todo besides set the type above
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -0700200 }*/
Brian O'Connorc67f9fa2014-08-07 18:17:46 -0700201 // XXX S fix when we fix stats
Jonathan Hartc78b8f62014-08-07 22:31:09 -0700202 try {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800203 future = sw.getStatistics(req);
204 values = future.get(10, TimeUnit.SECONDS);
205 } catch (Exception e) {
206 log.error("Failure retrieving statistics from switch " + sw, e);
Jonathan Hartc78b8f62014-08-07 22:31:09 -0700207 }
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800208 }
209 return values;
210 }
211
Srikanth Vavilapallib7258512014-09-29 13:24:11 -0700212 protected Object getSwitchStatistics(String switchId, OFStatsType statType) {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800213 return getSwitchStatistics(HexString.toLong(switchId), statType);
214 }
Fahad Naeem Khand563af62014-10-08 17:37:25 -0700215 //TODO: Java doc
216 protected List<?> getSwitchStatisticsForTable(long switchId,
217 OFStatsType statType, String tableType) {
218 IFloodlightProviderService floodlightProvider =
219 (IFloodlightProviderService) getContext().getAttributes().
220 get(IFloodlightProviderService.class.getCanonicalName());
221 IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
222 Future<List<OFStatsReply>> future;
223 List<OFStatsReply> values = null;
224 //getting tableId from CPqD driver
225 TableId tableId;
226 if (sw != null) {
227 if((tableId = ((OFSwitchImplCPqD13) sw).getTableId(tableType)) == null){
228 log.error("Invalid tableType {} " + tableType);
229 return null;
230 }
231 OFStatsRequest<?> req = null;
232 if (statType == OFStatsType.FLOW) {
233 log.debug("Switch Flow Stats req for table {} sent to switch {}",
234 tableType,sw.getStringId());
235 OFMatchV3 match = sw.getFactory().buildMatchV3()
236 .setOxmList(OFOxmList.EMPTY).build();
237 req = sw.getFactory()
238 .buildFlowStatsRequest()
239 .setMatch(match)
240 .setOutPort(OFPort.ANY)
241 .setTableId(tableId)
242 .setXid(sw.getNextTransactionId()).build();
243 List<OFFlowStatsEntryMod> flowStats = new ArrayList<OFFlowStatsEntryMod>();
244 try {
245 future = sw.getStatistics(req);
246 values = future.get(10, TimeUnit.SECONDS);
247 for (OFFlowStatsEntry entry : ((OFFlowStatsReply)values.get(0)).getEntries()) {
248 OFFlowStatsEntryMod entryMod = new OFFlowStatsEntryMod(entry);
249 flowStats.add(entryMod);
250 }
251 log.debug("Switch flow Stats Entries for table {} from switch {} are {}",
252 tableType, sw.getStringId(), flowStats);
253 } catch (Exception e) {
254 log.error("Failure retrieving per table statistics from switch " + sw, e);
255 }
256 return flowStats;
257 }
258 }
259 //should never get to this point
260 log.error("Failure retrieving {} table statistics from switch {}",tableType, sw);
261 return null;
262 }
Ray Milkey269ffb92014-04-03 14:43:30 -0700263
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800264 protected OFFeaturesReply getSwitchFeaturesReply(long switchId) {
Ray Milkey269ffb92014-04-03 14:43:30 -0700265 IFloodlightProviderService floodlightProvider =
266 (IFloodlightProviderService) getContext().getAttributes().
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -0700267 get(IFloodlightProviderService.class.getCanonicalName());
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800268
269 IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -0700270 //uture<OFFeaturesReply> future;
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800271 OFFeaturesReply featuresReply = null;
272 if (sw != null) {
Srikanth Vavilapallif25c7b02014-10-01 14:30:43 -0700273 // XXX S fix when we fix stats
Jonathan Hartc78b8f62014-08-07 22:31:09 -0700274 try {
Fahad Naeem Khan9ae7fa12014-10-03 14:30:55 -0700275 //future = sw.getFeaturesReplyFromSwitch();
276 //featuresReply = future.get(10, TimeUnit.SECONDS);
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800277 } catch (Exception e) {
278 log.error("Failure getting features reply from switch" + sw, e);
Jonathan Hartc78b8f62014-08-07 22:31:09 -0700279 }
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800280 }
281
282 return featuresReply;
283 }
284
285 protected OFFeaturesReply getSwitchFeaturesReply(String switchId) {
286 return getSwitchFeaturesReply(HexString.toLong(switchId));
Srikanth Vavilapallia0e6d582014-09-28 22:42:34 -0700287 }
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800288
289}