Skip to content
Snippets Groups Projects
Commit 70a1426d authored by Ryan Izard's avatar Ryan Izard
Browse files

Added support for features request message via the REST API. Changed the case...

Added support for features request message via the REST API. Changed the case of some JSON keys to camel.
parent 44fa180a
No related branches found
No related tags found
No related merge requests found
/** /**
* Copyright 2011, Big Switch Networks, Inc. * Copyright 2011, Big Switch Networks, Inc.
* Originally created by David Erickson, Stanford University * Originally created by David Erickson, Stanford University
* *
* Licensed under the Apache License, Version 2.0 (the "License"); you may * Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain * not use this file except in compliance with the License. You may obtain
* a copy of the License at * a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations * License for the specific language governing permissions and limitations
* under the License. * under the License.
**/ **/
package net.floodlightcontroller.core.web; package net.floodlightcontroller.core.web;
...@@ -39,165 +39,173 @@ import org.slf4j.LoggerFactory; ...@@ -39,165 +39,173 @@ import org.slf4j.LoggerFactory;
* @author readams * @author readams
*/ */
public class AllSwitchStatisticsResource extends SwitchResourceBase { public class AllSwitchStatisticsResource extends SwitchResourceBase {
protected static Logger log = protected static Logger log =
LoggerFactory.getLogger(AllSwitchStatisticsResource.class); LoggerFactory.getLogger(AllSwitchStatisticsResource.class);
@Get("json") @Get("json")
public Map<String, StatsReply> retrieve() { public Map<String, StatsReply> retrieve() {
String statType = (String) getRequestAttributes().get(CoreWebRoutable.STR_STAT_TYPE); String statType = (String) getRequestAttributes().get(CoreWebRoutable.STR_STAT_TYPE);
return retrieveInternal(statType); return retrieveInternal(statType);
} }
private Map<String, StatsReply> retrieveInternal(String statType) { private Map<String, StatsReply> retrieveInternal(String statType) {
HashMap<String, StatsReply> model = new HashMap<String, StatsReply>(); HashMap<String, StatsReply> model = new HashMap<String, StatsReply>();
OFStatsType type = null; OFStatsType type = null;
REQUESTTYPE rType = null; REQUESTTYPE rType = null;
switch (statType) { switch (statType) {
case OFStatsTypeStrings.PORT: case OFStatsTypeStrings.PORT:
type = OFStatsType.PORT; type = OFStatsType.PORT;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.QUEUE: case OFStatsTypeStrings.PORT_DESC:
type = OFStatsType.QUEUE; type = OFStatsType.PORT_DESC;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.FLOW: case OFStatsTypeStrings.QUEUE:
type = OFStatsType.FLOW; type = OFStatsType.QUEUE;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.AGGREGATE: case OFStatsTypeStrings.FLOW:
type = OFStatsType.AGGREGATE; type = OFStatsType.FLOW;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.DESC: case OFStatsTypeStrings.AGGREGATE:
type = OFStatsType.DESC; type = OFStatsType.AGGREGATE;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.TABLE: case OFStatsTypeStrings.DESC:
type = OFStatsType.TABLE; type = OFStatsType.DESC;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.TABLE:
case OFStatsTypeStrings.GROUP: type = OFStatsType.TABLE;
type = OFStatsType.GROUP; rType = REQUESTTYPE.OFSTATS;
rType = REQUESTTYPE.OFSTATS; break;
break; case OFStatsTypeStrings.TABLE_FEATURES:
case OFStatsTypeStrings.GROUP_DESC: type = OFStatsType.TABLE_FEATURES;
type = OFStatsType.GROUP_DESC; rType = REQUESTTYPE.OFSTATS;
rType = REQUESTTYPE.OFSTATS; break;
break;
case OFStatsTypeStrings.GROUP_FEATURES: case OFStatsTypeStrings.GROUP:
type = OFStatsType.GROUP_FEATURES; type = OFStatsType.GROUP;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.METER: case OFStatsTypeStrings.GROUP_DESC:
type = OFStatsType.METER; type = OFStatsType.GROUP_DESC;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.METER_CONFIG: case OFStatsTypeStrings.GROUP_FEATURES:
type = OFStatsType.METER_CONFIG; type = OFStatsType.GROUP_FEATURES;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.METER_FEATURES: case OFStatsTypeStrings.METER:
type = OFStatsType.METER_FEATURES; type = OFStatsType.METER;
rType = REQUESTTYPE.OFSTATS; rType = REQUESTTYPE.OFSTATS;
break; break;
case OFStatsTypeStrings.FEATURES: case OFStatsTypeStrings.METER_CONFIG:
rType = REQUESTTYPE.OFFEATURES; type = OFStatsType.METER_CONFIG;
break; rType = REQUESTTYPE.OFSTATS;
default: break;
return model; case OFStatsTypeStrings.METER_FEATURES:
} type = OFStatsType.METER_FEATURES;
rType = REQUESTTYPE.OFSTATS;
IOFSwitchService switchService = (IOFSwitchService) getContext().getAttributes(). break;
get(IOFSwitchService.class.getCanonicalName()); case OFStatsTypeStrings.FEATURES:
rType = REQUESTTYPE.OFFEATURES;
Set<DatapathId> switchDpids = switchService.getAllSwitchDpids(); break;
List<GetConcurrentStatsThread> activeThreads = new ArrayList<GetConcurrentStatsThread>(switchDpids.size()); default:
List<GetConcurrentStatsThread> pendingRemovalThreads = new ArrayList<GetConcurrentStatsThread>(); return model;
GetConcurrentStatsThread t; }
for (DatapathId l : switchDpids) {
t = new GetConcurrentStatsThread(l, rType, type); IOFSwitchService switchService = (IOFSwitchService) getContext().getAttributes().
activeThreads.add(t); get(IOFSwitchService.class.getCanonicalName());
t.start();
} Set<DatapathId> switchDpids = switchService.getAllSwitchDpids();
List<GetConcurrentStatsThread> activeThreads = new ArrayList<GetConcurrentStatsThread>(switchDpids.size());
// Join all the threads after the timeout. Set a hard timeout List<GetConcurrentStatsThread> pendingRemovalThreads = new ArrayList<GetConcurrentStatsThread>();
// of 12 seconds for the threads to finish. If the thread has not GetConcurrentStatsThread t;
// finished the switch has not replied yet and therefore we won't for (DatapathId l : switchDpids) {
// add the switch's stats to the reply. t = new GetConcurrentStatsThread(l, rType, type);
for (int iSleepCycles = 0; iSleepCycles < 12; iSleepCycles++) { activeThreads.add(t);
for (GetConcurrentStatsThread curThread : activeThreads) { t.start();
if (curThread.getState() == State.TERMINATED) { }
if (rType == REQUESTTYPE.OFSTATS) {
model.put(curThread.getSwitchId().toString(), new StatsReply(curThread.getSwitchId(), curThread.getStatisticsReply(), type)); // Join all the threads after the timeout. Set a hard timeout
} else if (rType == REQUESTTYPE.OFFEATURES) { // of 12 seconds for the threads to finish. If the thread has not
model.put(curThread.getSwitchId().toString(), new StatsReply(curThread.getSwitchId(), curThread.getFeaturesReply(), type)); // finished the switch has not replied yet and therefore we won't
} // add the switch's stats to the reply.
pendingRemovalThreads.add(curThread); for (int iSleepCycles = 0; iSleepCycles < 12; iSleepCycles++) {
} for (GetConcurrentStatsThread curThread : activeThreads) {
} if (curThread.getState() == State.TERMINATED) {
if (rType == REQUESTTYPE.OFSTATS) {
// remove the threads that have completed the queries to the switches model.put(curThread.getSwitchId().toString(), new StatsReply(curThread.getSwitchId(), curThread.getStatisticsReply(), type));
for (GetConcurrentStatsThread curThread : pendingRemovalThreads) { } else if (rType == REQUESTTYPE.OFFEATURES) {
activeThreads.remove(curThread); model.put(curThread.getSwitchId().toString(), new StatsReply(curThread.getSwitchId(), curThread.getFeaturesReply(), type));
} }
// clear the list so we don't try to double remove them pendingRemovalThreads.add(curThread);
pendingRemovalThreads.clear(); }
}
// if we are done finish early so we don't always get the worst case
if (activeThreads.isEmpty()) { // remove the threads that have completed the queries to the switches
break; for (GetConcurrentStatsThread curThread : pendingRemovalThreads) {
} activeThreads.remove(curThread);
}
// sleep for 1 s here // clear the list so we don't try to double remove them
try { pendingRemovalThreads.clear();
Thread.sleep(1000);
} catch (InterruptedException e) { // if we are done finish early so we don't always get the worst case
log.error("Interrupted while waiting for statistics", e); if (activeThreads.isEmpty()) {
} break;
} }
return model; // sleep for 1 s here
} try {
Thread.sleep(1000);
protected class GetConcurrentStatsThread extends Thread { } catch (InterruptedException e) {
private List<OFStatsReply> switchReply; log.error("Interrupted while waiting for statistics", e);
private DatapathId switchId; }
private OFStatsType statType; }
private REQUESTTYPE requestType;
private OFFeaturesReply featuresReply; return model;
}
public GetConcurrentStatsThread(DatapathId switchId, REQUESTTYPE requestType, OFStatsType statType) {
this.switchId = switchId; protected class GetConcurrentStatsThread extends Thread {
this.requestType = requestType; private List<OFStatsReply> switchReply;
this.statType = statType; private DatapathId switchId;
this.switchReply = null; private OFStatsType statType;
this.featuresReply = null; private REQUESTTYPE requestType;
} private OFFeaturesReply featuresReply;
public List<OFStatsReply> getStatisticsReply() { public GetConcurrentStatsThread(DatapathId switchId, REQUESTTYPE requestType, OFStatsType statType) {
return switchReply; this.switchId = switchId;
} this.requestType = requestType;
this.statType = statType;
public OFFeaturesReply getFeaturesReply() { this.switchReply = null;
return featuresReply; this.featuresReply = null;
} }
public DatapathId getSwitchId() { public List<OFStatsReply> getStatisticsReply() {
return switchId; return switchReply;
} }
@Override public OFFeaturesReply getFeaturesReply() {
public void run() { return featuresReply;
if ((requestType == REQUESTTYPE.OFSTATS) && (statType != null)) { }
switchReply = getSwitchStatistics(switchId, statType);
} else if (requestType == REQUESTTYPE.OFFEATURES) { public DatapathId getSwitchId() {
featuresReply = getSwitchFeaturesReply(switchId); return switchId;
} }
}
} @Override
public void run() {
if ((requestType == REQUESTTYPE.OFSTATS) && (statType != null)) {
switchReply = getSwitchStatistics(switchId, statType);
} else if (requestType == REQUESTTYPE.OFFEATURES) {
featuresReply = getSwitchFeaturesReply(switchId);
}
}
}
} }
...@@ -54,9 +54,7 @@ public class SwitchStatisticsResource extends SwitchResourceBase { ...@@ -54,9 +54,7 @@ public class SwitchStatisticsResource extends SwitchResourceBase {
} }
// stop if the DPID is invalid or is not presently connected // stop if the DPID is invalid or is not presently connected
if (!switchId.equals(DatapathId.NONE) && switchService.getSwitch(switchId) != null) { if (!switchId.equals(DatapathId.NONE) && switchService.getSwitch(switchId) != null) {
// TODO these strings should be defined someplace. StatsReply.java?
// at this point, the switch DPID is valid AND exists; what about the OFStatsType? // at this point, the switch DPID is valid AND exists; what about the OFStatsType?
switch (statType) { switch (statType) {
case OFStatsTypeStrings.PORT: case OFStatsTypeStrings.PORT:
...@@ -119,6 +117,9 @@ public class SwitchStatisticsResource extends SwitchResourceBase { ...@@ -119,6 +117,9 @@ public class SwitchStatisticsResource extends SwitchResourceBase {
values = getSwitchFeaturesReply(switchId); values = getSwitchFeaturesReply(switchId);
result.setStatType(OFStatsType.EXPERIMENTER); result.setStatType(OFStatsType.EXPERIMENTER);
break; break;
case OFStatsTypeStrings.FEATURES:
values = getSwitchFeaturesReply(switchId);
result.setStatType(null); // we will assume anything in "values" with a null stattype is "features"
default: default:
log.error("Invalid or unimplemented stat request type {}", statType); log.error("Invalid or unimplemented stat request type {}", statType);
break; break;
......
...@@ -29,8 +29,10 @@ import com.fasterxml.jackson.databind.SerializerProvider; ...@@ -29,8 +29,10 @@ import com.fasterxml.jackson.databind.SerializerProvider;
import net.floodlightcontroller.core.web.OFStatsTypeStrings; import net.floodlightcontroller.core.web.OFStatsTypeStrings;
import net.floodlightcontroller.core.web.StatsReply; import net.floodlightcontroller.core.web.StatsReply;
import org.projectfloodlight.openflow.protocol.OFActionType;
import org.projectfloodlight.openflow.protocol.OFBucket; import org.projectfloodlight.openflow.protocol.OFBucket;
import org.projectfloodlight.openflow.protocol.OFBucketCounter; import org.projectfloodlight.openflow.protocol.OFBucketCounter;
import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
import org.projectfloodlight.openflow.protocol.OFFlowStatsReply; import org.projectfloodlight.openflow.protocol.OFFlowStatsReply;
import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
import org.projectfloodlight.openflow.protocol.OFDescStatsReply; import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
...@@ -80,21 +82,26 @@ import org.projectfloodlight.openflow.protocol.ver13.OFFlowModFlagsSerializerVer ...@@ -80,21 +82,26 @@ import org.projectfloodlight.openflow.protocol.ver13.OFFlowModFlagsSerializerVer
import org.projectfloodlight.openflow.protocol.ver13.OFMeterBandTypeSerializerVer13; import org.projectfloodlight.openflow.protocol.ver13.OFMeterBandTypeSerializerVer13;
// Use Loxigen's serializer // Use Loxigen's serializer
import org.projectfloodlight.openflow.protocol.ver13.OFPortFeaturesSerializerVer13; import org.projectfloodlight.openflow.protocol.ver13.OFPortFeaturesSerializerVer13;
import org.projectfloodlight.openflow.protocol.ver13.OFStatsReplyFlagsSerializerVer13;
import org.projectfloodlight.openflow.protocol.ver13.OFTableFeaturePropTypeSerializerVer13; import org.projectfloodlight.openflow.protocol.ver13.OFTableFeaturePropTypeSerializerVer13;
import org.projectfloodlight.openflow.protocol.ver12.OFFlowModFlagsSerializerVer12; import org.projectfloodlight.openflow.protocol.ver12.OFFlowModFlagsSerializerVer12;
import org.projectfloodlight.openflow.protocol.ver12.OFPortConfigSerializerVer12;
import org.projectfloodlight.openflow.protocol.ver12.OFPortFeaturesSerializerVer12; import org.projectfloodlight.openflow.protocol.ver12.OFPortFeaturesSerializerVer12;
import org.projectfloodlight.openflow.protocol.ver12.OFPortStateSerializerVer12;
import org.projectfloodlight.openflow.protocol.ver12.OFStatsReplyFlagsSerializerVer12;
import org.projectfloodlight.openflow.protocol.ver11.OFFlowModFlagsSerializerVer11; import org.projectfloodlight.openflow.protocol.ver11.OFFlowModFlagsSerializerVer11;
import org.projectfloodlight.openflow.protocol.ver11.OFPortConfigSerializerVer11;
import org.projectfloodlight.openflow.protocol.ver11.OFPortFeaturesSerializerVer11; import org.projectfloodlight.openflow.protocol.ver11.OFPortFeaturesSerializerVer11;
import org.projectfloodlight.openflow.protocol.ver10.OFPortFeaturesSerializerVer10;
import org.projectfloodlight.openflow.protocol.ver13.OFPortStateSerializerVer13;
import org.projectfloodlight.openflow.protocol.ver12.OFPortStateSerializerVer12;
import org.projectfloodlight.openflow.protocol.ver11.OFPortStateSerializerVer11; import org.projectfloodlight.openflow.protocol.ver11.OFPortStateSerializerVer11;
import org.projectfloodlight.openflow.protocol.ver11.OFStatsReplyFlagsSerializerVer11;
import org.projectfloodlight.openflow.protocol.ver10.OFPortConfigSerializerVer10;
import org.projectfloodlight.openflow.protocol.ver10.OFPortFeaturesSerializerVer10;
import org.projectfloodlight.openflow.protocol.ver10.OFPortStateSerializerVer10; import org.projectfloodlight.openflow.protocol.ver10.OFPortStateSerializerVer10;
import org.projectfloodlight.openflow.protocol.ver10.OFStatsReplyFlagsSerializerVer10;
import org.projectfloodlight.openflow.protocol.ver13.OFPortStateSerializerVer13;
import org.projectfloodlight.openflow.protocol.ver13.OFPortConfigSerializerVer13; import org.projectfloodlight.openflow.protocol.ver13.OFPortConfigSerializerVer13;
import org.projectfloodlight.openflow.protocol.ver14.OFFlowModFlagsSerializerVer14; import org.projectfloodlight.openflow.protocol.ver14.OFFlowModFlagsSerializerVer14;
import org.projectfloodlight.openflow.protocol.ver12.OFPortConfigSerializerVer12; import org.projectfloodlight.openflow.protocol.ver14.OFStatsReplyFlagsSerializerVer14;
import org.projectfloodlight.openflow.protocol.ver11.OFPortConfigSerializerVer11;
import org.projectfloodlight.openflow.protocol.ver10.OFPortConfigSerializerVer10;
import org.projectfloodlight.openflow.protocol.OFAggregateStatsReply; import org.projectfloodlight.openflow.protocol.OFAggregateStatsReply;
import org.projectfloodlight.openflow.protocol.OFVersion; import org.projectfloodlight.openflow.protocol.OFVersion;
import org.projectfloodlight.openflow.types.U32; import org.projectfloodlight.openflow.types.U32;
...@@ -113,744 +120,785 @@ import org.slf4j.LoggerFactory; ...@@ -113,744 +120,785 @@ import org.slf4j.LoggerFactory;
* @author Ryan Izard, ryan.izard@bigswitch.com, rizard@g.clemson.edu * @author Ryan Izard, ryan.izard@bigswitch.com, rizard@g.clemson.edu
*/ */
public class StatsReplySerializer extends JsonSerializer<StatsReply> { public class StatsReplySerializer extends JsonSerializer<StatsReply> {
protected static Logger logger = LoggerFactory.getLogger(StatsReplySerializer.class); protected static Logger logger = LoggerFactory.getLogger(StatsReplySerializer.class);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void serialize(StatsReply reply, JsonGenerator jGen, SerializerProvider serializer) throws IOException, JsonProcessingException { public void serialize(StatsReply reply, JsonGenerator jGen, SerializerProvider serializer) throws IOException, JsonProcessingException {
// Return a nice error to user if the request we're about to serialize was bad // Return a nice error to user if the request we're about to serialize was bad
if (reply.getValues() == null) { if (reply.getValues() == null) {
jGen.writeStartObject(); jGen.writeStartObject();
jGen.writeObjectFieldStart("ERROR"); jGen.writeObjectFieldStart("ERROR");
jGen.writeStringField("1)", "Invalid DPID and/or stats/features request, or"); jGen.writeStringField(" ", "An error has occurred while proccesing your request,");
jGen.writeStringField("2)", "The switch might also be disconncted from the controller"); jGen.writeStringField(" *", "which might be due to one or more of the following:");
jGen.writeEndObject(); jGen.writeStringField(" * ", "-- An invalid DPID and/or stats/features request.");
jGen.writeObjectFieldStart("Valid OFStatsTypes are"); jGen.writeStringField(" **", "-- The switch is not connected to the controller.");
jGen.writeStringField("1)", OFStatsTypeStrings.AGGREGATE); jGen.writeStringField("* ", "-- The request specified is not supported by the switch's OpenFlow version.");
jGen.writeStringField("2)", OFStatsTypeStrings.DESC); jGen.writeEndObject();
jGen.writeStringField("3)", OFStatsTypeStrings.EXPERIMENTER); jGen.writeObjectFieldStart("Valid statistics and features strings are:");
jGen.writeStringField("4)", OFStatsTypeStrings.FEATURES); jGen.writeStringField("1)", OFStatsTypeStrings.AGGREGATE);
jGen.writeStringField("5)", OFStatsTypeStrings.FLOW); jGen.writeStringField("2)", OFStatsTypeStrings.DESC);
jGen.writeStringField("6)", OFStatsTypeStrings.GROUP); jGen.writeStringField("3)", OFStatsTypeStrings.EXPERIMENTER);
jGen.writeStringField("7)", OFStatsTypeStrings.GROUP_DESC); jGen.writeStringField("4)", OFStatsTypeStrings.FEATURES);
jGen.writeStringField("8)", OFStatsTypeStrings.GROUP_FEATURES); jGen.writeStringField("5)", OFStatsTypeStrings.FLOW);
jGen.writeStringField("9)", OFStatsTypeStrings.METER); jGen.writeStringField("6)", OFStatsTypeStrings.GROUP);
jGen.writeStringField("A)", OFStatsTypeStrings.METER_CONFIG); jGen.writeStringField("7)", OFStatsTypeStrings.GROUP_DESC);
jGen.writeStringField("B)", OFStatsTypeStrings.PORT); jGen.writeStringField("8)", OFStatsTypeStrings.GROUP_FEATURES);
jGen.writeStringField("C)", OFStatsTypeStrings.PORT_DESC); jGen.writeStringField("9)", OFStatsTypeStrings.METER);
jGen.writeStringField("D)", OFStatsTypeStrings.QUEUE); jGen.writeStringField("A)", OFStatsTypeStrings.METER_CONFIG);
jGen.writeStringField("E)", OFStatsTypeStrings.TABLE); jGen.writeStringField("B)", OFStatsTypeStrings.METER_FEATURES);
jGen.writeStringField("F)", OFStatsTypeStrings.TABLE_FEATURES); jGen.writeStringField("C)", OFStatsTypeStrings.PORT);
jGen.writeEndObject(); jGen.writeStringField("D)", OFStatsTypeStrings.PORT_DESC);
jGen.writeEndObject(); jGen.writeStringField("E)", OFStatsTypeStrings.QUEUE);
return; jGen.writeStringField("F)", OFStatsTypeStrings.TABLE);
} jGen.writeStringField("G)", OFStatsTypeStrings.TABLE_FEATURES);
jGen.writeEndObject();
jGen.configure(Feature.WRITE_NUMBERS_AS_STRINGS, true); // IMHO this just looks nicer and is easier to read if everything is quoted jGen.writeEndObject();
jGen.writeStartObject(); return;
//jGen.writeStringField("dpid", reply.getDatapathId().toString()); }
switch (reply.getStatType()) {
case PORT: jGen.configure(Feature.WRITE_NUMBERS_AS_STRINGS, true); // IMHO this just looks nicer and is easier to read if everything is quoted
// handle port jGen.writeStartObject();
serializePortReply((List<OFPortStatsReply>) reply.getValues(), jGen);
break; if (reply.getStatType() == null) { // must be an OFFeaturesReply. getValues() was already checked for null above.
case QUEUE: serializeFeaturesReply((OFFeaturesReply) reply.getValues(), jGen);
// handle queue } else {
break; switch (reply.getStatType()) {
case FLOW: case PORT:
// handle flow. Can safely cast to List<OFFlowStatsReply>. serializePortReply((List<OFPortStatsReply>) reply.getValues(), jGen);
serializeFlowReply((List<OFFlowStatsReply>) reply.getValues(), jGen); break;
break; case QUEUE:
case AGGREGATE: // handle queue
// handle aggregate break;
serializeAggregateReply((List<OFAggregateStatsReply>) reply.getValues(), jGen); case FLOW:
break; serializeFlowReply((List<OFFlowStatsReply>) reply.getValues(), jGen);
case DESC: break;
// handle desc case AGGREGATE:
serializeDescReply((List<OFDescStatsReply>) reply.getValues(), jGen); serializeAggregateReply((List<OFAggregateStatsReply>) reply.getValues(), jGen);
break; break;
case GROUP: case DESC:
// handle group stats serializeDescReply((List<OFDescStatsReply>) reply.getValues(), jGen);
serializeGroupReply((List<OFGroupStatsReply>) reply.getValues(), jGen); break;
break; case GROUP:
case GROUP_DESC: serializeGroupReply((List<OFGroupStatsReply>) reply.getValues(), jGen);
// handle group desc break;
serializeGroupDescReply((List<OFGroupDescStatsReply>) reply.getValues(), jGen); case GROUP_DESC:
break; serializeGroupDescReply((List<OFGroupDescStatsReply>) reply.getValues(), jGen);
case GROUP_FEATURES: break;
// handle group features case GROUP_FEATURES:
serializeGroupFeaturesReply((List<OFGroupFeaturesStatsReply>) reply.getValues(), jGen); serializeGroupFeaturesReply((List<OFGroupFeaturesStatsReply>) reply.getValues(), jGen);
break; break;
case METER: case METER:
// handle meter stats serializeMeterReply((List<OFMeterStatsReply>) reply.getValues(), jGen);
serializeMeterReply((List<OFMeterStatsReply>) reply.getValues(), jGen); break;
break; case METER_CONFIG:
case METER_CONFIG: serializeMeterConfigReply((List<OFMeterConfigStatsReply>) reply.getValues(), jGen);
// handle meter config break;
serializeMeterConfigReply((List<OFMeterConfigStatsReply>) reply.getValues(), jGen); case METER_FEATURES:
break; serializeMeterFeaturesReply((List<OFMeterFeaturesStatsReply>) reply.getValues(), jGen);
case METER_FEATURES: break;
// handle meter features case TABLE:
serializeMeterFeaturesReply((List<OFMeterFeaturesStatsReply>) reply.getValues(), jGen); serializeTableReply((List<OFTableStatsReply>) reply.getValues(), jGen);
break; break;
case TABLE: case TABLE_FEATURES:
// handle table serializeTableFeaturesReply((List<OFTableFeaturesStatsReply>) reply.getValues(), jGen);
serializeTableReply((List<OFTableStatsReply>) reply.getValues(), jGen); break;
break; case PORT_DESC:
case TABLE_FEATURES: serializePortDescReply((List<OFPortDescStatsReply>) reply.getValues(), jGen);
//handle table features break;
serializeTableFeaturesReply((List<OFTableFeaturesStatsReply>) reply.getValues(), jGen); case EXPERIMENTER:
break; break;
case PORT_DESC: default:
serializePortDescReply((List<OFPortDescStatsReply>) reply.getValues(), jGen); break;
break; }
case EXPERIMENTER: }
break; jGen.writeEndObject();
default: }
break;
} public static void serializeFeaturesReply(OFFeaturesReply fr, JsonGenerator jGen) throws IOException, JsonProcessingException {
jGen.writeEndObject(); /* Common to All OF Versions */
} jGen.writeStringField("capabilities", fr.getCapabilities().toString());
jGen.writeStringField("dpid", fr.getDatapathId().toString());
/*** jGen.writeNumberField("buffers", fr.getNBuffers());
* Serializes the Group Statistics Reply jGen.writeNumberField("tables", fr.getNTables());
* @author Naveen jGen.writeStringField("version", fr.getVersion().toString());
* @param groupReplies
* @param jGen if (fr.getVersion().compareTo(OFVersion.OF_13) < 0) { // OF1.3+ break this out into port_config
* @throws IOException serializePortDesc(fr.getPorts(), jGen);
* @throws JsonProcessingException }
*/ if (fr.getVersion().compareTo(OFVersion.OF_10) == 0) {
public void serializeGroupReply(List<OFGroupStatsReply> groupReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ String actions = "[";
for (OFActionType action : fr.getActions()) {
OFGroupStatsReply groupReply = groupReplies.get(0); // we will get only one GroupReply and it will contains many OFGroupStatsEntry ? actions = actions + action.toString() + ", ";
jGen.writeStringField("version", groupReply.getVersion().toString()); //return the enum name }
jGen.writeFieldName("group"); actions = actions.substring(0, actions.length() - 2); // remove ending space+comma
jGen.writeStartArray(); actions = actions + "]";
for(OFGroupStatsEntry entry : groupReply.getEntries()) { jGen.writeStringField("actions", actions);
jGen.writeStartObject(); }
jGen.writeStringField("groupNumber",entry.getGroup().toString()); }
jGen.writeNumberField("refCount", entry.getRefCount());
jGen.writeNumberField("packetCount", entry.getPacketCount().getValue()); /***
jGen.writeNumberField("byteCount", entry.getByteCount().getValue()); * Serializes the Group Statistics Reply
jGen.writeFieldName("BucketCounters"); * @author Naveen
jGen.writeStartArray(); * @param groupReplies
for(OFBucketCounter bCounter : entry.getBucketStats()) { * @param jGen
jGen.writeStartObject(); * @throws IOException
jGen.writeNumberField("packetCount", bCounter.getPacketCount().getValue()); * @throws JsonProcessingException
jGen.writeNumberField("byteCount", bCounter.getByteCount().getValue()); */
jGen.writeEndObject(); public static void serializeGroupReply(List<OFGroupStatsReply> groupReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
}//end of for loop - BucketCounter
jGen.writeEndArray(); OFGroupStatsReply groupReply = groupReplies.get(0); // we will get only one GroupReply and it will contains many OFGroupStatsEntry
if (OFVersion.OF_13 == entry.getVersion()) { jGen.writeStringField("version", groupReply.getVersion().toString()); //return the enum name
jGen.writeNumberField("durationSec", entry.getDurationSec()); jGen.writeFieldName("group");
jGen.writeNumberField("durationNsec", entry.getDurationNsec()); jGen.writeStartArray();
} for(OFGroupStatsEntry entry : groupReply.getEntries()) {
jGen.writeEndObject(); jGen.writeStartObject();
}//end of for loop - groupStats jGen.writeStringField("groupNumber",entry.getGroup().toString());
jGen.writeEndArray(); jGen.writeNumberField("refCount", entry.getRefCount());
} jGen.writeNumberField("packetCount", entry.getPacketCount().getValue());
jGen.writeNumberField("byteCount", entry.getByteCount().getValue());
/*** jGen.writeFieldName("bucketCounters");
* Serializes Group Desc Reply jGen.writeStartArray();
* @author Naveen for(OFBucketCounter bCounter : entry.getBucketStats()) {
* @param groupDescReplies jGen.writeStartObject();
* @param jGen jGen.writeNumberField("packetCount", bCounter.getPacketCount().getValue());
* @throws IOException jGen.writeNumberField("byteCount", bCounter.getByteCount().getValue());
* @throws JsonProcessingException jGen.writeEndObject();
*/ }//end of for loop - BucketCounter
public void serializeGroupDescReply(List<OFGroupDescStatsReply> groupDescReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ jGen.writeEndArray();
OFGroupDescStatsReply groupDescReply = groupDescReplies.get(0); if (OFVersion.OF_13 == entry.getVersion()) {
jGen.writeStringField("version", groupDescReply.getVersion().toString()); //return the enum name jGen.writeNumberField("durationSec", entry.getDurationSec());
jGen.writeFieldName("groupDesc"); jGen.writeNumberField("durationNsec", entry.getDurationNsec());
jGen.writeStartArray(); }
for(OFGroupDescStatsEntry entry : groupDescReply.getEntries()) { jGen.writeEndObject();
jGen.writeStartObject(); }//end of for loop - groupStats
jGen.writeStringField("groupType",entry.getGroupType().toString()); jGen.writeEndArray();
jGen.writeStringField("groupNumber",entry.getGroup().toString()); }
jGen.writeFieldName("Buckets");
jGen.writeStartArray(); /***
for(OFBucket buckets : entry.getBuckets()) { * Serializes Group Desc Reply
jGen.writeStartObject(); * @author Naveen
jGen.writeNumberField("weight", buckets.getWeight()); * @param groupDescReplies
jGen.writeNumberField("watchPortNumber", buckets.getWatchPort().getPortNumber()); * @param jGen
jGen.writeStringField("watchGroup", buckets.getWatchGroup().toString()); * @throws IOException
OFActionListSerializer.serializeActions(jGen, buckets.getActions()); * @throws JsonProcessingException
jGen.writeEndObject(); */
}//End of for loop - buckets public static void serializeGroupDescReply(List<OFGroupDescStatsReply> groupDescReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
jGen.writeEndArray();//end of buckets OFGroupDescStatsReply groupDescReply = groupDescReplies.get(0);
jGen.writeEndObject();//end of group Desc iteration jGen.writeStringField("version", groupDescReply.getVersion().toString()); //return the enum name
}//End of for loop - GroupDescStats jGen.writeFieldName("groupDesc");
jGen.writeEndArray();//end of group Desc jGen.writeStartArray();
} for(OFGroupDescStatsEntry entry : groupDescReply.getEntries()) {
jGen.writeStartObject();
/*** jGen.writeStringField("groupType",entry.getGroupType().toString());
* Serializes Group Feature Reply jGen.writeStringField("groupNumber",entry.getGroup().toString());
* @author Naveen jGen.writeFieldName("buckets");
* @param groupFeaturesReplies jGen.writeStartArray();
* @param jGen for(OFBucket buckets : entry.getBuckets()) {
* @throws IOException jGen.writeStartObject();
* @throws JsonProcessingException jGen.writeNumberField("weight", buckets.getWeight());
*/ jGen.writeNumberField("watchPortNumber", buckets.getWatchPort().getPortNumber());
public void serializeGroupFeaturesReply(List<OFGroupFeaturesStatsReply> groupFeaturesReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ jGen.writeStringField("watchGroup", buckets.getWatchGroup().toString());
OFActionListSerializer.serializeActions(jGen, buckets.getActions());
OFGroupFeaturesStatsReply groupFeaturesReply = groupFeaturesReplies.get(0); jGen.writeEndObject();
jGen.writeStringField("version", groupFeaturesReply.getVersion().toString()); //return the enum name }//End of for loop - buckets
jGen.writeEndArray();//end of buckets
jGen.writeFieldName("groupFeatures"); jGen.writeEndObject();//end of group Desc iteration
jGen.writeStartObject(); }//End of for loop - GroupDescStats
jGen.writeNumberField("capabilities",groupFeaturesReply.getCapabilities()); jGen.writeEndArray();//end of group Desc
jGen.writeNumberField("maxGroupsAll",groupFeaturesReply.getMaxGroupsAll()); }
jGen.writeNumberField("maxGroupsSelect",groupFeaturesReply.getMaxGroupsSelect());
jGen.writeNumberField("maxGroupsIndirect",groupFeaturesReply.getMaxGroupsIndirect()); /***
jGen.writeNumberField("maxGroupsFf",groupFeaturesReply.getMaxGroupsFf()); * Serializes Group Feature Reply
jGen.writeNumberField("actionsAll",groupFeaturesReply.getActionsAll()); * @author Naveen
jGen.writeNumberField("actionsSelect",groupFeaturesReply.getActionsSelect()); * @param groupFeaturesReplies
jGen.writeNumberField("actionsIndirect",groupFeaturesReply.getActionsIndirect()); * @param jGen
jGen.writeNumberField("actionsFf",groupFeaturesReply.getActionsFf()); * @throws IOException
* @throws JsonProcessingException
jGen.writeEndObject();//end of group Feature */
} public static void serializeGroupFeaturesReply(List<OFGroupFeaturesStatsReply> groupFeaturesReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
/*** OFGroupFeaturesStatsReply groupFeaturesReply = groupFeaturesReplies.get(0);
* Serializes the Meter Statistics Reply jGen.writeStringField("version", groupFeaturesReply.getVersion().toString()); //return the enum name
* @author Naveen
* @param meterReplies jGen.writeFieldName("groupFeatures");
* @param jGen jGen.writeStartObject();
* @throws IOException jGen.writeNumberField("capabilities",groupFeaturesReply.getCapabilities());
* @throws JsonProcessingException jGen.writeNumberField("maxGroupsAll",groupFeaturesReply.getMaxGroupsAll());
*/ jGen.writeNumberField("maxGroupsSelect",groupFeaturesReply.getMaxGroupsSelect());
public void serializeMeterReply(List<OFMeterStatsReply> meterReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ jGen.writeNumberField("maxGroupsIndirect",groupFeaturesReply.getMaxGroupsIndirect());
OFMeterStatsReply meterReply = meterReplies.get(0); // we will get only one meterReply and it will contains many OFMeterStatsEntry ? jGen.writeNumberField("maxGroupsFf",groupFeaturesReply.getMaxGroupsFf());
jGen.writeStringField("version", meterReply.getVersion().toString()); //return the enum name jGen.writeNumberField("actionsAll",groupFeaturesReply.getActionsAll());
jGen.writeFieldName("meter"); jGen.writeNumberField("actionsSelect",groupFeaturesReply.getActionsSelect());
jGen.writeStartArray(); jGen.writeNumberField("actionsIndirect",groupFeaturesReply.getActionsIndirect());
for(OFMeterStats entry : meterReply.getEntries()) { jGen.writeNumberField("actionsFf",groupFeaturesReply.getActionsFf());
jGen.writeStartObject();
jGen.writeNumberField("meterId",entry.getMeterId()); jGen.writeEndObject();//end of group Feature
jGen.writeNumberField("flowCount", entry.getFlowCount()); }
jGen.writeNumberField("packetInCount", entry.getPacketInCount().getValue());
jGen.writeNumberField("byteInCount", entry.getByteInCount().getValue()); /***
jGen.writeFieldName("MeterBandStats"); * Serializes the Meter Statistics Reply
jGen.writeStartArray(); * @author Naveen
for(OFMeterBandStats bandStats : entry.getBandStats()) { * @param meterReplies
jGen.writeStartObject(); * @param jGen
jGen.writeNumberField("packetBandCount", bandStats.getPacketBandCount().getValue()); * @throws IOException
jGen.writeNumberField("byteBandCount", bandStats.getByteBandCount().getValue()); * @throws JsonProcessingException
jGen.writeEndObject(); */
}//End of for loop - bandStats public static void serializeMeterReply(List<OFMeterStatsReply> meterReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
jGen.writeEndArray(); OFMeterStatsReply meterReply = meterReplies.get(0); // we will get only one meterReply and it will contains many OFMeterStatsEntry ?
jGen.writeStringField("version", meterReply.getVersion().toString()); //return the enum name
jGen.writeNumberField("durationSec", entry.getDurationSec()); jGen.writeFieldName("meter");
jGen.writeNumberField("durationNsec", entry.getDurationNsec()); jGen.writeStartArray();
jGen.writeEndObject(); for(OFMeterStats entry : meterReply.getEntries()) {
}//End of for loop - MeterStats jGen.writeStartObject();
jGen.writeEndArray(); jGen.writeNumberField("meterId",entry.getMeterId());
} jGen.writeNumberField("flowCount", entry.getFlowCount());
jGen.writeNumberField("packetInCount", entry.getPacketInCount().getValue());
/*** jGen.writeNumberField("byteInCount", entry.getByteInCount().getValue());
* Serializes Meter Feature Reply jGen.writeFieldName("meterBandStats");
* @author Naveen jGen.writeStartArray();
* @param meterFeaturesReplies for(OFMeterBandStats bandStats : entry.getBandStats()) {
* @param jGen jGen.writeStartObject();
* @throws IOException jGen.writeNumberField("packetBandCount", bandStats.getPacketBandCount().getValue());
* @throws JsonProcessingException jGen.writeNumberField("byteBandCount", bandStats.getByteBandCount().getValue());
*/ jGen.writeEndObject();
public void serializeMeterFeaturesReply(List<OFMeterFeaturesStatsReply> meterFeaturesReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ }//End of for loop - bandStats
OFMeterFeaturesStatsReply meterFeaturesReply = meterFeaturesReplies.get(0); jGen.writeEndArray();
jGen.writeStringField("version", meterFeaturesReply.getVersion().toString()); //return the enum name
jGen.writeNumberField("durationSec", entry.getDurationSec());
OFMeterFeatures meterFeatures = meterFeaturesReply.getFeatures(); jGen.writeNumberField("durationNsec", entry.getDurationNsec());
jGen.writeFieldName("meterFeatures"); jGen.writeEndObject();
jGen.writeStartObject(); }//End of for loop - MeterStats
jGen.writeEndArray();
jGen.writeNumberField("maxGroupsAll",meterFeatures.getMaxMeter()); }
jGen.writeNumberField("maxGroupsSelect",meterFeatures.getBandTypes());
jGen.writeNumberField("capabilities",meterFeatures.getCapabilities()); /***
jGen.writeNumberField("maxGroupsIndirect",meterFeatures.getMaxBands()); * Serializes Meter Feature Reply
jGen.writeNumberField("maxGroupsFf",meterFeatures.getMaxColor()); * @author Naveen
* @param meterFeaturesReplies
jGen.writeEndObject();//end of group Feature * @param jGen
} * @throws IOException
* @throws JsonProcessingException
/*** */
* Serializes Meter Config Reply public static void serializeMeterFeaturesReply(List<OFMeterFeaturesStatsReply> meterFeaturesReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
* @author Naveen OFMeterFeaturesStatsReply meterFeaturesReply = meterFeaturesReplies.get(0);
* @param meterConfigReplies jGen.writeStringField("version", meterFeaturesReply.getVersion().toString()); //return the enum name
* @param jGen
* @throws IOException OFMeterFeatures meterFeatures = meterFeaturesReply.getFeatures();
* @throws JsonProcessingException jGen.writeFieldName("meterFeatures");
*/ jGen.writeStartObject();
public void serializeMeterConfigReply(List<OFMeterConfigStatsReply> meterConfigReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
OFMeterConfigStatsReply meterConfigReply = meterConfigReplies.get(0); jGen.writeNumberField("maxGroupsAll",meterFeatures.getMaxMeter());
jGen.writeStringField("version", meterConfigReply.getVersion().toString()); //return the enum name jGen.writeNumberField("maxGroupsSelect",meterFeatures.getBandTypes());
jGen.writeFieldName("meterConfig"); jGen.writeNumberField("capabilities",meterFeatures.getCapabilities());
jGen.writeStartArray(); jGen.writeNumberField("maxGroupsIndirect",meterFeatures.getMaxBands());
for(OFMeterBand band : meterConfigReply.getEntries()) { jGen.writeNumberField("maxGroupsFf",meterFeatures.getMaxColor());
jGen.writeStartObject();
short type = (short)band.getType(); jGen.writeEndObject();//end of group Feature
jGen.writeNumberField("bandType",type); }
switch (type) { /***
case OFMeterBandTypeSerializerVer13.DROP_VAL: * Serializes Meter Config Reply
OFMeterBandDrop bandDrop = (OFMeterBandDrop) band; * @author Naveen
jGen.writeNumberField("rate", bandDrop.getRate()); * @param meterConfigReplies
jGen.writeNumberField("burstSize", bandDrop.getBurstSize()); * @param jGen
break; * @throws IOException
* @throws JsonProcessingException
case OFMeterBandTypeSerializerVer13.DSCP_REMARK_VAL: */
OFMeterBandDscpRemark bandDscp = (OFMeterBandDscpRemark) band; public static void serializeMeterConfigReply(List<OFMeterConfigStatsReply> meterConfigReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
jGen.writeNumberField("rate", bandDscp.getRate()); OFMeterConfigStatsReply meterConfigReply = meterConfigReplies.get(0);
jGen.writeNumberField("burstSize", bandDscp.getBurstSize()); jGen.writeStringField("version", meterConfigReply.getVersion().toString()); //return the enum name
jGen.writeNumberField("precLevel", bandDscp.getPrecLevel()); jGen.writeFieldName("meterConfig");
break; jGen.writeStartArray();
for(OFMeterBand band : meterConfigReply.getEntries()) {
case OFMeterBandTypeSerializerVer13.EXPERIMENTER_VAL: jGen.writeStartObject();
OFMeterBandExperimenter bandExp = (OFMeterBandExperimenter) band; short type = (short)band.getType();
jGen.writeNumberField("rate", bandExp.getRate()); jGen.writeNumberField("bandType",type);
jGen.writeNumberField("burstSize", bandExp.getBurstSize());
jGen.writeNumberField("experimenter", bandExp.getExperimenter()); switch (type) {
break; case OFMeterBandTypeSerializerVer13.DROP_VAL:
OFMeterBandDrop bandDrop = (OFMeterBandDrop) band;
default: jGen.writeNumberField("rate", bandDrop.getRate());
// shouldn't ever get here jGen.writeNumberField("burstSize", bandDrop.getBurstSize());
break; break;
}//end of Switch Case
case OFMeterBandTypeSerializerVer13.DSCP_REMARK_VAL:
jGen.writeEndObject(); OFMeterBandDscpRemark bandDscp = (OFMeterBandDscpRemark) band;
}//end of for loop jGen.writeNumberField("rate", bandDscp.getRate());
jGen.writeEndArray(); jGen.writeNumberField("burstSize", bandDscp.getBurstSize());
} jGen.writeNumberField("precLevel", bandDscp.getPrecLevel());
break;
/***
* Serializes Table Statistics case OFMeterBandTypeSerializerVer13.EXPERIMENTER_VAL:
* @author Naveen OFMeterBandExperimenter bandExp = (OFMeterBandExperimenter) band;
* @param tableReplies jGen.writeNumberField("rate", bandExp.getRate());
* @param jGen jGen.writeNumberField("burstSize", bandExp.getBurstSize());
* @throws IOException jGen.writeNumberField("experimenter", bandExp.getExperimenter());
* @throws JsonProcessingException break;
*/
public void serializeTableReply(List<OFTableStatsReply> tableReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ default:
// shouldn't ever get here
OFTableStatsReply tableReply = tableReplies.get(0); // we will get only one tableReply and it will contains many OFTableStatsEntry ? break;
jGen.writeStringField("version", tableReply.getVersion().toString()); //return the enum name }//end of Switch Case
jGen.writeFieldName("table");
jGen.writeStartArray(); jGen.writeEndObject();
for(OFTableStatsEntry entry : tableReply.getEntries()) { }//end of for loop
jGen.writeStartObject(); jGen.writeEndArray();
}
//Fields common to all OF versions
//For OF 1.3, only these fields are applicable /***
jGen.writeStringField("tableId",entry.getTableId().toString()); * Serializes Table Statistics
jGen.writeNumberField("activeCount", entry.getActiveCount()); * @author Naveen
jGen.writeNumberField("lookUpCount", entry.getLookupCount().getValue()); * @param tableReplies
jGen.writeNumberField("matchCount", entry.getMatchedCount().getValue()); * @param jGen
* @throws IOException
//Fields Applicable only for specific Versions * @throws JsonProcessingException
switch (entry.getVersion()) { */
case OF_12: public static void serializeTableReply(List<OFTableStatsReply> tableReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
//Fields applicable only to OF 1.2
jGen.writeNumberField("writeSetFields", entry.getWriteSetfields().getValue()); OFTableStatsReply tableReply = tableReplies.get(0); // we will get only one tableReply and it will contains many OFTableStatsEntry ?
jGen.writeNumberField("applySetFields", entry.getApplySetfields().getValue()); jGen.writeStringField("version", tableReply.getVersion().toString()); //return the enum name
jGen.writeNumberField("metaDataMatch", entry.getMetadataMatch().getValue()); jGen.writeFieldName("table");
jGen.writeNumberField("metaDataWrite", entry.getMetadataWrite().getValue()); jGen.writeStartArray();
case OF_11: for(OFTableStatsEntry entry : tableReply.getEntries()) {
//Fields applicable to OF 1.1 & 1.2 jGen.writeStartObject();
jGen.writeStringField("match", entry.getMatch().toString());
jGen.writeNumberField("instructions", entry.getInstructions()); //Fields common to all OF versions
jGen.writeNumberField("writeActions", entry.getWriteActions()); //For OF 1.3, only these fields are applicable
jGen.writeNumberField("applyActions", entry.getApplyActions()); jGen.writeStringField("tableId",entry.getTableId().toString());
jGen.writeNumberField("config", entry.getConfig()); jGen.writeNumberField("activeCount", entry.getActiveCount());
case OF_10: jGen.writeNumberField("lookUpCount", entry.getLookupCount().getValue());
//Fields applicable to OF 1.0, 1.1 & 1.2 jGen.writeNumberField("matchCount", entry.getMatchedCount().getValue());
jGen.writeStringField("name",entry.getName());
jGen.writeNumberField("wildcards", entry.getWildcards()); //Fields Applicable only for specific Versions
jGen.writeNumberField("maxEntries", entry.getMaxEntries()); switch (entry.getVersion()) {
break; case OF_12:
default: //Fields applicable only to OF 1.2
//no extra fields for OF_13 jGen.writeNumberField("writeSetFields", entry.getWriteSetfields().getValue());
break; jGen.writeNumberField("applySetFields", entry.getApplySetfields().getValue());
}//End of switch case jGen.writeNumberField("metaDataMatch", entry.getMetadataMatch().getValue());
jGen.writeEndObject(); jGen.writeNumberField("metaDataWrite", entry.getMetadataWrite().getValue());
}//End of for loop case OF_11:
jGen.writeEndArray(); //Fields applicable to OF 1.1 & 1.2
} jGen.writeStringField("match", entry.getMatch().toString());
jGen.writeNumberField("instructions", entry.getInstructions());
/*** jGen.writeNumberField("writeActions", entry.getWriteActions());
* Serializes Table Features Reply jGen.writeNumberField("applyActions", entry.getApplyActions());
* @author Naveen jGen.writeNumberField("config", entry.getConfig());
* @param tableFeaturesReplies case OF_10:
* @param jGen //Fields applicable to OF 1.0, 1.1 & 1.2
* @throws IOException jGen.writeStringField("name",entry.getName());
* @throws JsonProcessingException jGen.writeNumberField("wildcards", entry.getWildcards());
*/ jGen.writeNumberField("maxEntries", entry.getMaxEntries());
public void serializeTableFeaturesReply(List<OFTableFeaturesStatsReply> tableFeaturesReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ break;
default:
OFTableFeaturesStatsReply tableFeaturesReply = tableFeaturesReplies.get(0); //no extra fields for OF_13
jGen.writeStringField("version", tableFeaturesReply.getVersion().toString()); //return the enum name break;
}//End of switch case
jGen.writeFieldName("tableFeatures"); jGen.writeEndObject();
jGen.writeStartArray(); }//End of for loop
for(OFTableFeatures tableFeature : tableFeaturesReply.getEntries()) { jGen.writeEndArray();
jGen.writeStartObject(); }
jGen.writeNumberField("tableId", tableFeature.getTableId().getValue());
jGen.writeStringField("name", tableFeature.getName()); /***
jGen.writeNumberField("metadataMatch", tableFeature.getMetadataMatch().getValue()); * Serializes Table Features Reply
jGen.writeNumberField("metadataWrite", tableFeature.getMetadataWrite().getValue()); * @author Naveen
jGen.writeNumberField("config", tableFeature.getConfig()); * @param tableFeaturesReplies
jGen.writeNumberField("maxEntries", tableFeature.getMaxEntries()); * @param jGen
* @throws IOException
jGen.writeFieldName("properties"); * @throws JsonProcessingException
jGen.writeStartArray(); */
for (OFTableFeatureProp properties : tableFeature.getProperties()) { public static void serializeTableFeaturesReply(List<OFTableFeaturesStatsReply> tableFeaturesReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
jGen.writeStartObject();
short type = (short)properties.getType(); OFTableFeaturesStatsReply tableFeaturesReply = tableFeaturesReplies.get(0);
jGen.writeNumberField("tableFeaturePropType",type); jGen.writeStringField("version", tableFeaturesReply.getVersion().toString()); //return the enum name
switch (type) { jGen.writeFieldName("tableFeatures");
case OFTableFeaturePropTypeSerializerVer13.INSTRUCTIONS_VAL: jGen.writeStartArray();
OFTableFeaturePropInstructions propInstruct = (OFTableFeaturePropInstructions) properties; for(OFTableFeatures tableFeature : tableFeaturesReply.getEntries()) {
jGen.writeFieldName("instructions"); jGen.writeStartObject();
jGen.writeStartArray(); jGen.writeNumberField("tableId", tableFeature.getTableId().getValue());
for (OFInstructionId id : propInstruct.getInstructionIds()) { jGen.writeStringField("name", tableFeature.getName());
jGen.writeStartObject(); jGen.writeNumberField("metadataMatch", tableFeature.getMetadataMatch().getValue());
jGen.writeString(id.getType().toString()); jGen.writeNumberField("metadataWrite", tableFeature.getMetadataWrite().getValue());
jGen.writeEndObject(); jGen.writeNumberField("config", tableFeature.getConfig());
} jGen.writeNumberField("maxEntries", tableFeature.getMaxEntries());
jGen.writeEndArray();
break; jGen.writeFieldName("properties");
case OFTableFeaturePropTypeSerializerVer13.INSTRUCTIONS_MISS_VAL: jGen.writeStartArray();
OFTableFeaturePropInstructionsMiss propInstructMiss = (OFTableFeaturePropInstructionsMiss) properties; for (OFTableFeatureProp properties : tableFeature.getProperties()) {
jGen.writeFieldName("instructionsMiss"); jGen.writeStartObject();
jGen.writeStartArray(); short type = (short)properties.getType();
for (OFInstructionId id : propInstructMiss.getInstructionIds()) { jGen.writeNumberField("tableFeaturePropType",type);
jGen.writeStartObject();
jGen.writeString(id.getType().toString()); switch (type) {
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.INSTRUCTIONS_VAL:
} OFTableFeaturePropInstructions propInstruct = (OFTableFeaturePropInstructions) properties;
jGen.writeEndArray(); jGen.writeFieldName("instructions");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.NEXT_TABLES_VAL: for (OFInstructionId id : propInstruct.getInstructionIds()) {
OFTableFeaturePropNextTables propNxtTables = (OFTableFeaturePropNextTables) properties; jGen.writeStartObject();
jGen.writeFieldName("nextTables"); jGen.writeString(id.getType().toString());
jGen.writeStartArray(); jGen.writeEndObject();
for (U8 id : propNxtTables.getNextTableIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeNumber(id.getValue()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.INSTRUCTIONS_MISS_VAL:
} OFTableFeaturePropInstructionsMiss propInstructMiss = (OFTableFeaturePropInstructionsMiss) properties;
jGen.writeEndArray(); jGen.writeFieldName("instructionsMiss");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.NEXT_TABLES_MISS_VAL: for (OFInstructionId id : propInstructMiss.getInstructionIds()) {
OFTableFeaturePropNextTablesMiss propNxtTablesMiss = (OFTableFeaturePropNextTablesMiss) properties; jGen.writeStartObject();
jGen.writeFieldName("nextTablesMiss"); jGen.writeString(id.getType().toString());
jGen.writeStartArray(); jGen.writeEndObject();
for (U8 id : propNxtTablesMiss.getNextTableIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeNumber(id.getValue()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.NEXT_TABLES_VAL:
} OFTableFeaturePropNextTables propNxtTables = (OFTableFeaturePropNextTables) properties;
jGen.writeEndArray(); jGen.writeFieldName("nextTables");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.WRITE_ACTIONS_VAL: for (U8 id : propNxtTables.getNextTableIds()) {
OFTableFeaturePropWriteActions propWrAct = (OFTableFeaturePropWriteActions) properties; jGen.writeStartObject();
jGen.writeFieldName("writeActions"); jGen.writeNumber(id.getValue());
jGen.writeStartArray(); jGen.writeEndObject();
for (OFActionId id : propWrAct.getActionIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeString(id.getType().toString()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.NEXT_TABLES_MISS_VAL:
} OFTableFeaturePropNextTablesMiss propNxtTablesMiss = (OFTableFeaturePropNextTablesMiss) properties;
jGen.writeEndArray(); jGen.writeFieldName("nextTablesMiss");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.WRITE_ACTIONS_MISS_VAL: for (U8 id : propNxtTablesMiss.getNextTableIds()) {
OFTableFeaturePropWriteActionsMiss propWrActMiss = (OFTableFeaturePropWriteActionsMiss) properties; jGen.writeStartObject();
jGen.writeFieldName("writeActionsMiss"); jGen.writeNumber(id.getValue());
jGen.writeStartArray(); jGen.writeEndObject();
for (OFActionId id : propWrActMiss.getActionIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeString(id.getType().toString()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.WRITE_ACTIONS_VAL:
} OFTableFeaturePropWriteActions propWrAct = (OFTableFeaturePropWriteActions) properties;
jGen.writeEndArray(); jGen.writeFieldName("writeActions");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.APPLY_ACTIONS_VAL: for (OFActionId id : propWrAct.getActionIds()) {
OFTableFeaturePropApplyActions propAppAct = (OFTableFeaturePropApplyActions) properties; jGen.writeStartObject();
jGen.writeFieldName("applyActions"); jGen.writeString(id.getType().toString());
jGen.writeStartArray(); jGen.writeEndObject();
for (OFActionId id : propAppAct.getActionIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeString(id.getType().toString()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.WRITE_ACTIONS_MISS_VAL:
} OFTableFeaturePropWriteActionsMiss propWrActMiss = (OFTableFeaturePropWriteActionsMiss) properties;
jGen.writeEndArray(); jGen.writeFieldName("writeActionsMiss");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.APPLY_ACTIONS_MISS_VAL: for (OFActionId id : propWrActMiss.getActionIds()) {
OFTableFeaturePropApplyActionsMiss propAppActMiss = (OFTableFeaturePropApplyActionsMiss) properties; jGen.writeStartObject();
jGen.writeFieldName("applyActionsMiss"); jGen.writeString(id.getType().toString());
jGen.writeStartArray(); jGen.writeEndObject();
for (OFActionId id : propAppActMiss.getActionIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeString(id.getType().toString()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.APPLY_ACTIONS_VAL:
} OFTableFeaturePropApplyActions propAppAct = (OFTableFeaturePropApplyActions) properties;
jGen.writeEndArray(); jGen.writeFieldName("applyActions");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.MATCH_VAL: for (OFActionId id : propAppAct.getActionIds()) {
OFTableFeaturePropMatch propMatch = (OFTableFeaturePropMatch) properties; jGen.writeStartObject();
jGen.writeFieldName("match"); jGen.writeString(id.getType().toString());
jGen.writeStartArray(); jGen.writeEndObject();
for (U32 id : propMatch.getOxmIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeNumber(id.getValue()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.APPLY_ACTIONS_MISS_VAL:
} OFTableFeaturePropApplyActionsMiss propAppActMiss = (OFTableFeaturePropApplyActionsMiss) properties;
jGen.writeEndArray(); jGen.writeFieldName("applyActionsMiss");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.WILDCARDS_VAL: for (OFActionId id : propAppActMiss.getActionIds()) {
OFTableFeaturePropWildcards propWildcards = (OFTableFeaturePropWildcards) properties; jGen.writeStartObject();
jGen.writeFieldName("wildcards"); jGen.writeString(id.getType().toString());
jGen.writeStartArray(); jGen.writeEndObject();
for (U32 id : propWildcards.getOxmIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeNumber(id.getValue()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.MATCH_VAL:
} OFTableFeaturePropMatch propMatch = (OFTableFeaturePropMatch) properties;
jGen.writeEndArray(); jGen.writeFieldName("match");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.WRITE_SETFIELD_VAL: for (U32 id : propMatch.getOxmIds()) {
OFTableFeaturePropWriteSetfield propWrSetfield = (OFTableFeaturePropWriteSetfield) properties; jGen.writeStartObject();
jGen.writeFieldName("writeSetfield"); jGen.writeNumber(id.getValue());
jGen.writeStartArray(); jGen.writeEndObject();
for (U32 id : propWrSetfield.getOxmIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeNumber(id.getValue()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.WILDCARDS_VAL:
} OFTableFeaturePropWildcards propWildcards = (OFTableFeaturePropWildcards) properties;
jGen.writeEndArray(); jGen.writeFieldName("wildcards");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.WRITE_SETFIELD_MISS_VAL: for (U32 id : propWildcards.getOxmIds()) {
OFTableFeaturePropWriteSetfieldMiss propWrSetfieldMiss = (OFTableFeaturePropWriteSetfieldMiss) properties; jGen.writeStartObject();
jGen.writeFieldName("writeSetfieldMiss"); jGen.writeNumber(id.getValue());
jGen.writeStartArray(); jGen.writeEndObject();
for (U32 id : propWrSetfieldMiss.getOxmIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeNumber(id.getValue()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.WRITE_SETFIELD_VAL:
} OFTableFeaturePropWriteSetfield propWrSetfield = (OFTableFeaturePropWriteSetfield) properties;
jGen.writeEndArray(); jGen.writeFieldName("writeSetfield");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.APPLY_SETFIELD_VAL: for (U32 id : propWrSetfield.getOxmIds()) {
OFTableFeaturePropApplySetfield propAppSetfield = (OFTableFeaturePropApplySetfield) properties; jGen.writeStartObject();
jGen.writeFieldName("applySetfield"); jGen.writeNumber(id.getValue());
jGen.writeStartArray(); jGen.writeEndObject();
for (U32 id : propAppSetfield.getOxmIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeNumber(id.getValue()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.WRITE_SETFIELD_MISS_VAL:
} OFTableFeaturePropWriteSetfieldMiss propWrSetfieldMiss = (OFTableFeaturePropWriteSetfieldMiss) properties;
jGen.writeEndArray(); jGen.writeFieldName("writeSetfieldMiss");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.APPLY_SETFIELD_MISS_VAL: for (U32 id : propWrSetfieldMiss.getOxmIds()) {
OFTableFeaturePropApplySetfieldMiss propAppSetfieldMiss = (OFTableFeaturePropApplySetfieldMiss) properties; jGen.writeStartObject();
jGen.writeFieldName("applySetfieldMiss"); jGen.writeNumber(id.getValue());
jGen.writeStartArray(); jGen.writeEndObject();
for (U32 id : propAppSetfieldMiss.getOxmIds()) { }
jGen.writeStartObject(); jGen.writeEndArray();
jGen.writeNumber(id.getValue()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.APPLY_SETFIELD_VAL:
} OFTableFeaturePropApplySetfield propAppSetfield = (OFTableFeaturePropApplySetfield) properties;
jGen.writeEndArray(); jGen.writeFieldName("applySetfield");
break; jGen.writeStartArray();
case OFTableFeaturePropTypeSerializerVer13.EXPERIMENTER_VAL: for (U32 id : propAppSetfield.getOxmIds()) {
OFTableFeaturePropExperimenter propExp = (OFTableFeaturePropExperimenter) properties; jGen.writeStartObject();
jGen.writeFieldName("experimenter"); jGen.writeNumber(id.getValue());
jGen.writeStartObject(); jGen.writeEndObject();
jGen.writeNumberField("subType", propExp.getSubtype()); }
jGen.writeNumberField("experimenter", propExp.getExperimenter()); jGen.writeEndArray();
jGen.writeStringField("subType", propExp.getExperimenterData().toString()); break;
jGen.writeEndObject(); case OFTableFeaturePropTypeSerializerVer13.APPLY_SETFIELD_MISS_VAL:
break; OFTableFeaturePropApplySetfieldMiss propAppSetfieldMiss = (OFTableFeaturePropApplySetfieldMiss) properties;
case OFTableFeaturePropTypeSerializerVer13.EXPERIMENTER_MISS_VAL: jGen.writeFieldName("applySetfieldMiss");
OFTableFeaturePropExperimenterMiss propExpMiss = (OFTableFeaturePropExperimenterMiss) properties; jGen.writeStartArray();
jGen.writeFieldName("experimenterMiss"); for (U32 id : propAppSetfieldMiss.getOxmIds()) {
jGen.writeStartObject(); jGen.writeStartObject();
jGen.writeNumberField("subType", propExpMiss.getSubtype()); jGen.writeNumber(id.getValue());
jGen.writeNumberField("experimenter", propExpMiss.getExperimenter()); jGen.writeEndObject();
jGen.writeStringField("subType", propExpMiss.getExperimenterData().toString()); }
jGen.writeEndObject(); jGen.writeEndArray();
break; break;
default: case OFTableFeaturePropTypeSerializerVer13.EXPERIMENTER_VAL:
// shouldn't ever get here OFTableFeaturePropExperimenter propExp = (OFTableFeaturePropExperimenter) properties;
break; jGen.writeFieldName("experimenter");
}//end of Switch Case jGen.writeStartObject();
jGen.writeEndObject(); jGen.writeNumberField("subType", propExp.getSubtype());
}//end of for loop - properties jGen.writeNumberField("experimenter", propExp.getExperimenter());
jGen.writeEndObject(); jGen.writeStringField("subType", propExp.getExperimenterData().toString());
}//end of for loop - features jGen.writeEndObject();
jGen.writeEndArray(); break;
} case OFTableFeaturePropTypeSerializerVer13.EXPERIMENTER_MISS_VAL:
OFTableFeaturePropExperimenterMiss propExpMiss = (OFTableFeaturePropExperimenterMiss) properties;
jGen.writeFieldName("experimenterMiss");
public static void serializePortReply(List<OFPortStatsReply> portReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ jGen.writeStartObject();
OFPortStatsReply portReply = portReplies.get(0); // we will get only one PortReply and it will contains many OFPortStatsEntry ? jGen.writeNumberField("subType", propExpMiss.getSubtype());
jGen.writeStringField("version", portReply.getVersion().toString()); //return the enum name jGen.writeNumberField("experimenter", propExpMiss.getExperimenter());
jGen.writeFieldName("port"); jGen.writeStringField("subType", propExpMiss.getExperimenterData().toString());
jGen.writeStartArray(); jGen.writeEndObject();
for(OFPortStatsEntry entry : portReply.getEntries()) { break;
jGen.writeStartObject(); default:
jGen.writeStringField("portNumber",entry.getPortNo().toString()); // shouldn't ever get here
jGen.writeNumberField("receivePackets", entry.getRxPackets().getValue()); break;
jGen.writeNumberField("transmitPackets", entry.getTxPackets().getValue()); }//end of Switch Case
jGen.writeNumberField("receiveBytes", entry.getRxBytes().getValue()); jGen.writeEndObject();
jGen.writeNumberField("transmitBytes", entry.getTxBytes().getValue()); }//end of for loop - properties
jGen.writeNumberField("receiveDropped", entry.getRxDropped().getValue()); jGen.writeEndObject();
jGen.writeNumberField("transmitDropped", entry.getTxDropped().getValue()); }//end of for loop - features
jGen.writeNumberField("receiveErrors", entry.getRxErrors().getValue()); jGen.writeEndArray();
jGen.writeNumberField("transmitErrors", entry.getTxErrors().getValue()); }
jGen.writeNumberField("receiveFrameErrors", entry.getRxFrameErr().getValue());
jGen.writeNumberField("receiveOverrunErrors", entry.getRxOverErr().getValue());
jGen.writeNumberField("receiveCRCErrors", entry.getRxCrcErr().getValue()); public static void serializePortReply(List<OFPortStatsReply> portReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
jGen.writeNumberField("collisions", entry.getCollisions().getValue()); OFPortStatsReply portReply = portReplies.get(0); // we will get only one PortReply and it will contains many OFPortStatsEntry ?
if (OFVersion.OF_13 == entry.getVersion()) { jGen.writeStringField("version", portReply.getVersion().toString()); //return the enum name
jGen.writeNumberField("durationSec", entry.getDurationSec()); jGen.writeFieldName("port");
jGen.writeNumberField("durationNsec", entry.getDurationNsec()); jGen.writeStartArray();
} for(OFPortStatsEntry entry : portReply.getEntries()) {
jGen.writeEndObject(); jGen.writeStartObject();
} jGen.writeStringField("portNumber",entry.getPortNo().toString());
jGen.writeEndArray(); jGen.writeNumberField("receivePackets", entry.getRxPackets().getValue());
} jGen.writeNumberField("transmitPackets", entry.getTxPackets().getValue());
jGen.writeNumberField("receiveBytes", entry.getRxBytes().getValue());
public static void serializeFlowReply(List<OFFlowStatsReply> flowReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ jGen.writeNumberField("transmitBytes", entry.getTxBytes().getValue());
for (OFFlowStatsReply flowReply : flowReplies) { // for each flow stats reply jGen.writeNumberField("receiveDropped", entry.getRxDropped().getValue());
//Dose the switch will reply multiple OFFlowStatsReply ? jGen.writeNumberField("transmitDropped", entry.getTxDropped().getValue());
//Or we juse need to use the first item of the list. jGen.writeNumberField("receiveErrors", entry.getRxErrors().getValue());
List<OFFlowStatsEntry> entries = flowReply.getEntries(); jGen.writeNumberField("transmitErrors", entry.getTxErrors().getValue());
jGen.writeFieldName("flows"); jGen.writeNumberField("receiveFrameErrors", entry.getRxFrameErr().getValue());
jGen.writeStartArray(); jGen.writeNumberField("receiveOverrunErrors", entry.getRxOverErr().getValue());
for (OFFlowStatsEntry entry : entries) { // for each flow jGen.writeNumberField("receiveCRCErrors", entry.getRxCrcErr().getValue());
jGen.writeStartObject(); jGen.writeNumberField("collisions", entry.getCollisions().getValue());
// list flow stats/info if (OFVersion.OF_13 == entry.getVersion()) {
jGen.writeStringField("version", entry.getVersion().toString()); // return the enum name jGen.writeNumberField("durationSec", entry.getDurationSec());
jGen.writeNumberField("cookie", entry.getCookie().getValue()); jGen.writeNumberField("durationNsec", entry.getDurationNsec());
jGen.writeStringField("tableId", entry.getTableId().toString()); }
jGen.writeNumberField("packetCount", entry.getPacketCount().getValue()); jGen.writeEndObject();
jGen.writeNumberField("byteCount", entry.getByteCount().getValue()); }
jGen.writeNumberField("durationSeconds", entry.getDurationSec()); jGen.writeEndArray();
jGen.writeNumberField("priority", entry.getPriority()); }
jGen.writeNumberField("idleTimeoutSec", entry.getIdleTimeout());
jGen.writeNumberField("hardTimeoutSec", entry.getHardTimeout()); public static void serializeFlowReply(List<OFFlowStatsReply> flowReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
switch (entry.getVersion()) { for (OFFlowStatsReply flowReply : flowReplies) { // for each flow stats reply
case OF_10: //Dose the switch will reply multiple OFFlowStatsReply ?
// flags not supported //Or we juse need to use the first item of the list.
break; List<OFFlowStatsEntry> entries = flowReply.getEntries();
case OF_11: jGen.writeFieldName("flows");
jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer11.toWireValue(entry.getFlags())); jGen.writeStartArray();
break; for (OFFlowStatsEntry entry : entries) { // for each flow
case OF_12: jGen.writeStartObject();
jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer12.toWireValue(entry.getFlags())); // list flow stats/info
break; jGen.writeStringField("version", entry.getVersion().toString()); // return the enum name
case OF_13: jGen.writeNumberField("cookie", entry.getCookie().getValue());
jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer13.toWireValue(entry.getFlags())); jGen.writeStringField("tableId", entry.getTableId().toString());
break; jGen.writeNumberField("packetCount", entry.getPacketCount().getValue());
case OF_14: jGen.writeNumberField("byteCount", entry.getByteCount().getValue());
jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer14.toWireValue(entry.getFlags())); jGen.writeNumberField("durationSeconds", entry.getDurationSec());
break; jGen.writeNumberField("priority", entry.getPriority());
default: jGen.writeNumberField("idleTimeoutSec", entry.getIdleTimeout());
logger.error("Could not decode OFVersion {}", entry.getVersion()); jGen.writeNumberField("hardTimeoutSec", entry.getHardTimeout());
break; switch (entry.getVersion()) {
} case OF_10:
// flags not supported
MatchSerializer.serializeMatch(jGen, entry.getMatch()); break;
case OF_11:
// handle OF1.1+ instructions with actions within jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer11.toWireValue(entry.getFlags()));
if (entry.getVersion() == OFVersion.OF_10) { break;
jGen.writeObjectFieldStart("actions"); case OF_12:
OFActionListSerializer.serializeActions(jGen, entry.getActions()); jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer12.toWireValue(entry.getFlags()));
jGen.writeEndObject(); break;
} else { case OF_13:
OFInstructionListSerializer.serializeInstructionList(jGen, entry.getInstructions()); jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer13.toWireValue(entry.getFlags()));
} break;
case OF_14:
jGen.writeEndObject(); jGen.writeNumberField("flags", OFFlowModFlagsSerializerVer14.toWireValue(entry.getFlags()));
} // end for each OFFlowStatsReply entry break;
jGen.writeEndArray(); default:
} // end for each OFStatsReply logger.error("Could not decode OFVersion {}", entry.getVersion());
} // end method break;
}
public static void serializeDescReply(List<OFDescStatsReply> descReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
OFDescStatsReply descReply = descReplies.get(0); // There is only one descReply from the switch MatchSerializer.serializeMatch(jGen, entry.getMatch());
jGen.writeObjectFieldStart("desc");
jGen.writeStringField("version", descReply.getVersion().toString()); //return the enum name // handle OF1.1+ instructions with actions within
jGen.writeStringField("manufacturerDescription", descReply.getMfrDesc()); if (entry.getVersion() == OFVersion.OF_10) {
jGen.writeStringField("hardwareDescription", descReply.getHwDesc()); jGen.writeObjectFieldStart("actions");
jGen.writeStringField("softwareDescription", descReply.getSwDesc()); OFActionListSerializer.serializeActions(jGen, entry.getActions());
jGen.writeStringField("serialNumber", descReply.getSerialNum()); jGen.writeEndObject();
jGen.writeStringField("datapathDescription", descReply.getDpDesc()); } else {
jGen.writeEndObject(); // end match OFInstructionListSerializer.serializeInstructionList(jGen, entry.getInstructions());
} }
public static void serializeAggregateReply(List<OFAggregateStatsReply> aggregateReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ jGen.writeEndObject();
OFAggregateStatsReply aggregateReply = aggregateReplies.get(0); // There are only one aggregateReply from the switch } // end for each OFFlowStatsReply entry
jGen.writeObjectFieldStart("aggregate"); jGen.writeEndArray();
jGen.writeStringField("version", aggregateReply.getVersion().toString()); //return the enum name } // end for each OFStatsReply
jGen.writeNumberField("flowCount", aggregateReply.getFlowCount()); } // end method
jGen.writeNumberField("packetCount", aggregateReply.getPacketCount().getValue());
jGen.writeNumberField("byteCount", aggregateReply.getByteCount().getValue()); public static void serializeDescReply(List<OFDescStatsReply> descReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
jGen.writeEndObject(); // end match OFDescStatsReply descReply = descReplies.get(0); // There is only one descReply from the switch
} jGen.writeObjectFieldStart("desc");
jGen.writeStringField("version", descReply.getVersion().toString()); //return the enum name
public static void serializePortDescReply(List<OFPortDescStatsReply> portDescReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{ jGen.writeStringField("manufacturerDescription", descReply.getMfrDesc());
OFPortDescStatsReply portDescReply = portDescReplies.get(0); // we will get only one PortDescReply and it will contains many OFPortDescStatsEntry ? jGen.writeStringField("hardwareDescription", descReply.getHwDesc());
jGen.writeStringField("version", portDescReply.getVersion().toString()); //return the enum name jGen.writeStringField("softwareDescription", descReply.getSwDesc());
jGen.writeFieldName("portDesc"); jGen.writeStringField("serialNumber", descReply.getSerialNum());
jGen.writeStartArray(); jGen.writeStringField("datapathDescription", descReply.getDpDesc());
for(OFPortDesc entry : portDescReply.getEntries()) { jGen.writeEndObject(); // end match
jGen.writeStartObject(); }
jGen.writeStringField("portNumber",entry.getPortNo().toString());
jGen.writeStringField("hardwareAddress", entry.getHwAddr().toString()); public static void serializeAggregateReply(List<OFAggregateStatsReply> aggregateReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
jGen.writeStringField("name", entry.getName()); OFAggregateStatsReply aggregateReply = aggregateReplies.get(0); // There are only one aggregateReply from the switch
switch(entry.getVersion()) { jGen.writeObjectFieldStart("aggregate");
case OF_10: jGen.writeStringField("version", aggregateReply.getVersion().toString()); //return the enum name
jGen.writeNumberField("config", OFPortConfigSerializerVer10.toWireValue(entry.getConfig())); jGen.writeNumberField("flowCount", aggregateReply.getFlowCount());
jGen.writeNumberField("state", OFPortStateSerializerVer10.toWireValue(entry.getState())); jGen.writeNumberField("packetCount", aggregateReply.getPacketCount().getValue());
jGen.writeNumberField("currentFeatures", OFPortFeaturesSerializerVer10.toWireValue(entry.getCurr())); jGen.writeNumberField("byteCount", aggregateReply.getByteCount().getValue());
jGen.writeNumberField("advertisedFeatures", OFPortFeaturesSerializerVer10.toWireValue(entry.getAdvertised())); switch (aggregateReply.getVersion()) {
jGen.writeNumberField("supportedFeatures", OFPortFeaturesSerializerVer10.toWireValue(entry.getSupported())); case OF_10:
jGen.writeNumberField("peerFeatures", OFPortFeaturesSerializerVer10.toWireValue(entry.getPeer())); jGen.writeNumberField("flags", OFStatsReplyFlagsSerializerVer10.toWireValue(aggregateReply.getFlags()));
break; break;
case OF_11: case OF_11:
jGen.writeNumberField("config", OFPortConfigSerializerVer11.toWireValue(entry.getConfig())); jGen.writeNumberField("flags", OFStatsReplyFlagsSerializerVer11.toWireValue(aggregateReply.getFlags()));
jGen.writeNumberField("state", OFPortStateSerializerVer11.toWireValue(entry.getState())); break;
jGen.writeNumberField("currentFeatures", OFPortFeaturesSerializerVer11.toWireValue(entry.getCurr())); case OF_12:
jGen.writeNumberField("advertisedFeatures", OFPortFeaturesSerializerVer11.toWireValue(entry.getAdvertised())); jGen.writeNumberField("flags", OFStatsReplyFlagsSerializerVer12.toWireValue(aggregateReply.getFlags()));
jGen.writeNumberField("supportedFeatures", OFPortFeaturesSerializerVer11.toWireValue(entry.getSupported())); break;
jGen.writeNumberField("peerFeatures", OFPortFeaturesSerializerVer11.toWireValue(entry.getPeer())); case OF_13:
break; jGen.writeNumberField("flags", OFStatsReplyFlagsSerializerVer13.toWireValue(aggregateReply.getFlags()));
case OF_12: break;
jGen.writeNumberField("config", OFPortConfigSerializerVer12.toWireValue(entry.getConfig())); case OF_14:
jGen.writeNumberField("state", OFPortStateSerializerVer12.toWireValue(entry.getState())); jGen.writeNumberField("flags", OFStatsReplyFlagsSerializerVer14.toWireValue(aggregateReply.getFlags()));
jGen.writeNumberField("currentFeatures", OFPortFeaturesSerializerVer12.toWireValue(entry.getCurr())); break;
jGen.writeNumberField("advertisedFeatures", OFPortFeaturesSerializerVer12.toWireValue(entry.getAdvertised())); default:
jGen.writeNumberField("supportedFeatures", OFPortFeaturesSerializerVer12.toWireValue(entry.getSupported())); break;
jGen.writeNumberField("peerFeatures", OFPortFeaturesSerializerVer12.toWireValue(entry.getPeer())); }
break; jGen.writeEndObject(); // end match
case OF_13: }
jGen.writeNumberField("config", OFPortConfigSerializerVer13.toWireValue(entry.getConfig()));
jGen.writeNumberField("state", OFPortStateSerializerVer13.toWireValue(entry.getState())); public static void serializePortDescReply(List<OFPortDescStatsReply> portDescReplies, JsonGenerator jGen) throws IOException, JsonProcessingException{
jGen.writeNumberField("currentFeatures", OFPortFeaturesSerializerVer13.toWireValue(entry.getCurr())); OFPortDescStatsReply portDescReply = portDescReplies.get(0); // we will get only one PortDescReply and it will contains many OFPortDescStatsEntry ?
jGen.writeNumberField("advertisedFeatures", OFPortFeaturesSerializerVer13.toWireValue(entry.getAdvertised())); jGen.writeStringField("version", portDescReply.getVersion().toString()); //return the enum name
jGen.writeNumberField("supportedFeatures", OFPortFeaturesSerializerVer13.toWireValue(entry.getSupported())); serializePortDesc(portDescReply.getEntries(), jGen);
jGen.writeNumberField("peerFeatures", OFPortFeaturesSerializerVer13.toWireValue(entry.getPeer())); }
break;
case OF_14: public static void serializePortDesc(List<OFPortDesc> portDescList, JsonGenerator jGen) throws IOException, JsonProcessingException {
// TODO jGen.writeFieldName("portDesc");
logger.error("OF1.4 OFPortDesc serializer not implemented"); jGen.writeStartArray();
} for(OFPortDesc entry : portDescList) {
if (OFVersion.OF_10 != entry.getVersion()) { jGen.writeStartObject();
jGen.writeNumberField("currSpeed",entry.getCurrSpeed()); jGen.writeStringField("portNumber",entry.getPortNo().toString());
jGen.writeNumberField("maxSpeed",entry.getMaxSpeed()); jGen.writeStringField("hardwareAddress", entry.getHwAddr().toString());
} jGen.writeStringField("name", entry.getName());
jGen.writeEndObject(); switch(entry.getVersion()) {
} case OF_10:
jGen.writeEndArray(); jGen.writeNumberField("config", OFPortConfigSerializerVer10.toWireValue(entry.getConfig()));
} jGen.writeNumberField("state", OFPortStateSerializerVer10.toWireValue(entry.getState()));
jGen.writeNumberField("currentFeatures", OFPortFeaturesSerializerVer10.toWireValue(entry.getCurr()));
jGen.writeNumberField("advertisedFeatures", OFPortFeaturesSerializerVer10.toWireValue(entry.getAdvertised()));
jGen.writeNumberField("supportedFeatures", OFPortFeaturesSerializerVer10.toWireValue(entry.getSupported()));
jGen.writeNumberField("peerFeatures", OFPortFeaturesSerializerVer10.toWireValue(entry.getPeer()));
break;
case OF_11:
jGen.writeNumberField("config", OFPortConfigSerializerVer11.toWireValue(entry.getConfig()));
jGen.writeNumberField("state", OFPortStateSerializerVer11.toWireValue(entry.getState()));
jGen.writeNumberField("currentFeatures", OFPortFeaturesSerializerVer11.toWireValue(entry.getCurr()));
jGen.writeNumberField("advertisedFeatures", OFPortFeaturesSerializerVer11.toWireValue(entry.getAdvertised()));
jGen.writeNumberField("supportedFeatures", OFPortFeaturesSerializerVer11.toWireValue(entry.getSupported()));
jGen.writeNumberField("peerFeatures", OFPortFeaturesSerializerVer11.toWireValue(entry.getPeer()));
break;
case OF_12:
jGen.writeNumberField("config", OFPortConfigSerializerVer12.toWireValue(entry.getConfig()));
jGen.writeNumberField("state", OFPortStateSerializerVer12.toWireValue(entry.getState()));
jGen.writeNumberField("currentFeatures", OFPortFeaturesSerializerVer12.toWireValue(entry.getCurr()));
jGen.writeNumberField("advertisedFeatures", OFPortFeaturesSerializerVer12.toWireValue(entry.getAdvertised()));
jGen.writeNumberField("supportedFeatures", OFPortFeaturesSerializerVer12.toWireValue(entry.getSupported()));
jGen.writeNumberField("peerFeatures", OFPortFeaturesSerializerVer12.toWireValue(entry.getPeer()));
break;
case OF_13:
jGen.writeNumberField("config", OFPortConfigSerializerVer13.toWireValue(entry.getConfig()));
jGen.writeNumberField("state", OFPortStateSerializerVer13.toWireValue(entry.getState()));
jGen.writeNumberField("currentFeatures", OFPortFeaturesSerializerVer13.toWireValue(entry.getCurr()));
jGen.writeNumberField("advertisedFeatures", OFPortFeaturesSerializerVer13.toWireValue(entry.getAdvertised()));
jGen.writeNumberField("supportedFeatures", OFPortFeaturesSerializerVer13.toWireValue(entry.getSupported()));
jGen.writeNumberField("peerFeatures", OFPortFeaturesSerializerVer13.toWireValue(entry.getPeer()));
break;
case OF_14:
// TODO
logger.error("OF1.4 OFPortDesc serializer not implemented");
}
if (OFVersion.OF_10 != entry.getVersion()) {
jGen.writeNumberField("currSpeed",entry.getCurrSpeed());
jGen.writeNumberField("maxSpeed",entry.getMaxSpeed());
}
jGen.writeEndObject();
}
jGen.writeEndArray();
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment