import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConverter;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.session.IMessageDispatchService;
import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
@Override
public Future<RpcResult<AddMeterOutput>> addMeter(AddMeterInput input) {
// Convert the AddMeterInput to MeterModInput
- MeterModInput ofMeterModInput = MeterConverter.toMeterModInput(input) ;
+ MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input) ;
// For Meter provisioning, the SwitchConnectionDistinguisher is set to null so
public Future<RpcResult<RemoveMeterOutput>> removeMeter(
RemoveMeterInput input) {
// Convert the RemoveMeterInput to MeterModInput
- MeterModInput ofMeterModInput = MeterConverter.toMeterModInput(input) ;
+ MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input) ;
// For Meter provisioning, the SwitchConnectionDistinguisher is set to null so
public Future<RpcResult<UpdateMeterOutput>> updateMeter(
UpdateMeterInput input) {
// Convert the UpdateMeterInput to MeterModInput
- MeterModInput ofMeterModInput = MeterConverter.toMeterModInput(input.getUpdatedMeter()) ;
+ MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input.getUpdatedMeter()) ;
// For Meter provisioning, the SwitchConnectionDistinguisher is set to null so
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
import org.opendaylight.yangtools.yang.binding.Augmentation;
import org.openflow.protocol.OFPort;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
*
*/
public final class ActionConvertor {
-
+ private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
+ private static final String PREFIX_SEPARATOR = "/";
private ActionConvertor() {
// NOOP
}
actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
else if (action instanceof DecNwTtl)
actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
- // else if(action instanceof SetF) //TODO:SAL Class Missing //
- // actionsList.add(SalToOFSetField(action));
+ else if (action instanceof SetField)
+ actionsList.add(SalToOFSetField(action, actionBuilder, actionsListBuilder));
+
else if (action instanceof PushPbbAction)
actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
else if (action instanceof PopPbbAction)
}
+ private static ActionsList SalToOFSetField(Action action, ActionBuilder actionBuilder,
+ ActionsListBuilder actionsListBuilder) {
+
+ org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match = ((SetField) action)
+ .getMatch();
+
+ List<MatchEntries> matchEntries = FlowConvertor.toMatch(match);
+
+ OxmFieldsActionBuilder oxmFieldsActionBuilder = new OxmFieldsActionBuilder();
+
+ oxmFieldsActionBuilder.setMatchEntries(matchEntries);
+
+ actionBuilder
+ .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class);
+
+ actionBuilder.addAugmentation(OxmFieldsAction.class, oxmFieldsActionBuilder.build());
+ actionsListBuilder.setAction(actionBuilder.build());
+ return actionsListBuilder.build();
+
+ }
+
private static ActionsList SalToOFDecNwTtl(Action action, ActionBuilder actionBuilder,
ActionsListBuilder actionsListBuilder) {
actionBuilder.setType(DecNwTtl.class);
}
if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
- portAction.setPort(new PortNumber((long) OFPort.OFPP_CONTROLLER.getValue()));
+ //portAction.setPort(new PortNumber((long) OFPort.OFPP_CONTROLLER.getValue()));
}
actionBuilder
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActions;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTable;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.Meter;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActions;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActions;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadata;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowMod;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;
flowMod.setFlags(ofFlowModFlags);
if (flow.getMatch() != null) {
- flowMod.setMatch(toMatch(flow.getMatch()));
+ flowMod.setMatch((Match) toMatch(flow.getMatch()));
}
if (flow.getInstructions() != null) {
return flowMod.build();
}
- private static Match toMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match match) {
+ public static List<MatchEntries> toMatch(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match) {
MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();
MatchBuilder matchBuilder = new MatchBuilder();
}
matchBuilder.setMatchEntries(matchEntriesList);
- return matchBuilder.build();
+ return matchEntriesList;
}
private static List<Instructions> toInstructions(
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
-
/****
-*
-* This class is used for converting the data from SAL layer to OF Library Layer for Meter Mod Command.
-*
-*/
+ *
+ * This class is used for converting the data from SAL layer to OF Library Layer for Meter Mod Command.
+ *
+ */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
-
-
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags.Flags;
-
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeaders;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
-// import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
-
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
-
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
-
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropBuilder;
-
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkBuilder;
-
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
+//import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
-public final class MeterConverter {
-
- private MeterConverter(){
+public final class MeterConvertor {
+
+ private static List<Bands> bands;
+ private static MeterModInputBuilder meterModInputBuilder;
+ private static MeterFlags flags;
+ private MeterConvertor(){
}
* @return MeterModInput required by OF Library
*/
public static MeterModInput toMeterModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter source ) {
- List<Bands> bands = null;
- MeterModInputBuilder meterModInputBuilder = null;
- MeterFlags flags = null ;
meterModInputBuilder = new MeterModInputBuilder();
meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
- getFlagsFromSAL(source.getFlags(), flags);
+ getFlagsFromSAL(source.getFlags());
meterModInputBuilder.setFlags(flags);
- getBandsFromSAL(source.getMeterBandHeaders(), bands);
+ getBandsFromSAL(source.getMeterBandHeaders());
meterModInputBuilder.setBands(bands);
return meterModInputBuilder.build();
}
- private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
+ private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders) {
Iterator <MeterBandHeader> bandHeadersIterator = meterBandHeaders.getMeterBandHeader().iterator();
MeterBandHeader meterBandHeader;
meterBandHeader = bandHeadersIterator.next();
MeterBand meterBandItem = null;
//The band types :drop,DSCP_Remark or experimenter.
- // meterBandHeaderBuilder = new MeterBandHeaderBuilder();
+ //meterBandHeaderBuilder = new MeterBandHeaderBuilder();
if(meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()){
}
//get it from plugin(SAL) layer
- private static void getFlagsFromSAL(Flags flags2, MeterFlags flags) {
+ private static void getFlagsFromSAL(Flags flags2) {
boolean meterBurst_SAL = false;
boolean meterKbps_SAL = false;
boolean meterPktps_SAL = false;
}
-}
\ No newline at end of file
+
+}
--- /dev/null
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc.Ports;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc.PortsBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author esssuuu This convertor class is used for Port Mod,port status and
+ * port description messages,decodes SAL and encodes to OF Data
+ *
+ */
+public final class PortConvertor {
+ private static final Logger log = LoggerFactory.getLogger(PortConvertor.class);
+
+ private PortConvertor() {
+
+ }
+
+ /**
+ * This method is used by PORT_MOD_MESSAGE
+ *
+ * @param source
+ * @return
+ */
+ public static PortModInput toPortModInput(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port source) {
+
+ PortConfig config = null;
+
+ PortModInputBuilder portModInputBuilder = new PortModInputBuilder();
+ portModInputBuilder.setAdvertise(getPortFeatures(source.getAdvertisedFeatures()));
+ portModInputBuilder.setPortNo(new PortNumber(source.getPortNumber()));
+ maskPortConfigFields(source.getConfiguration(), config);
+ portModInputBuilder.setConfig(config);
+ portModInputBuilder.setHwAddress(new MacAddress(source.getHardwareAddress()));
+ config = null;
+ maskPortConfigFields(source.getMask(), config);
+ portModInputBuilder.setMask(config);
+
+ return portModInputBuilder.build();
+
+ }
+
+ private static void maskPortConfigFields(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig configData,
+ PortConfig config) {
+ Boolean portDown = false;
+ Boolean noRecv = false;
+ Boolean noFwd = false;
+ Boolean noPacketIn = false;
+ if (configData.isNOFWD())
+ noFwd = true;
+ if (configData.isNOPACKETIN())
+ noPacketIn = true;
+ if (configData.isNORECV())
+ noRecv = true;
+ if (configData.isPORTDOWN())
+ portDown = true;
+
+ config = new PortConfig(noFwd, noPacketIn, noRecv, portDown);
+
+ }
+
+ private static PortFeatures getPortFeatures(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures salPortFeatures) {
+
+ return new PortFeatures(salPortFeatures.is_100gbFd(), salPortFeatures.is_100mbFd(),
+ salPortFeatures.is_100mbHd(), salPortFeatures.is_10gbFd(), salPortFeatures.is_10mbFd(),
+ salPortFeatures.is_10mbHd(), salPortFeatures.is_1gbFd(), salPortFeatures.is_1gbHd(),
+ salPortFeatures.is_1tbFd(), salPortFeatures.is_40gbFd(), salPortFeatures.isAutoeng(),
+ salPortFeatures.isCopper(), salPortFeatures.isFiber(), salPortFeatures.isOther(),
+ salPortFeatures.isPause(), salPortFeatures.isPauseAsym());
+ }
+
+ /*
+ * This method is called as a reply to OFPMP_PORT_DESCRIPTION
+ * message(OF1.3.1)
+ */
+ /**
+ * @param source
+ * :SAL FlowCapablePort
+ * @return OF:Ports
+ */
+ public static Ports toPortDesc(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.FlowCapablePort source) {
+
+ PortConfig config = null;
+ PortState portState = null;
+
+ PortsBuilder OFPortDescDataBuilder = new PortsBuilder();
+ OFPortDescDataBuilder.setPortNo(source.getPortNumber()); // portNO
+
+ OFPortDescDataBuilder.setHwAddr(source.getHardwareAddress());
+ OFPortDescDataBuilder.setName(source.getName());
+
+ maskPortConfigFields(source.getConfiguration(), config);
+
+ OFPortDescDataBuilder.setConfig(config);
+
+ getPortState(source.getState(), portState);
+ OFPortDescDataBuilder.setState(portState);
+ OFPortDescDataBuilder.setCurrentFeatures(getPortFeatures(source.getCurrentFeature()));
+ OFPortDescDataBuilder.setAdvertisedFeatures(getPortFeatures(source.getAdvertisedFeatures()));
+ OFPortDescDataBuilder.setSupportedFeatures(getPortFeatures(source.getSupported()));
+ OFPortDescDataBuilder.setPeerFeatures(getPortFeatures(source.getPeerFeatures()));
+ OFPortDescDataBuilder.setCurrSpeed(source.getCurrentSpeed());
+ OFPortDescDataBuilder.setMaxSpeed(source.getMaximumSpeed());
+
+ return OFPortDescDataBuilder.build();
+
+ }
+
+ private static void getPortState(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortState state, PortState portState) {
+
+ boolean isLinkDown = false;// (0),
+ boolean isBlocked = false; // (1),
+ boolean isLive = false; // (2);
+
+ if (state.getIntValue() == 0) {
+ isLinkDown = true;
+ } else if (state.getIntValue() == 1) {
+ isBlocked = true;
+ } else if (state.getIntValue() == 2) {
+ isLive = true;
+ }
+ portState = new PortState(isLinkDown, isBlocked, isLive);
+
+ }
+
+ /**
+ * This method is used called when the ports are added, modi ed, and removed
+ * from the datapath, the controller needs to be informed with the
+ * OFPT_PORT_STATUS message
+ *
+ * @param source
+ * :SAL Layer input from say REST API
+ * @return OF Layer data required for constructing the OFPT_PORT_STATUS
+ * message
+ */
+ public static PortStatus toGetPortStatus(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.FlowPortStatus source) {
+
+ PortConfig config = null;
+ PortState portState = null;
+
+ PortStatusMessageBuilder portStatusMessageBuilder = new PortStatusMessageBuilder();
+
+ if (source.getReason().getIntValue() == 0)
+ portStatusMessageBuilder.setReason(PortReason.OFPPRADD);
+
+ else if (source.getReason().getIntValue() == 1)
+ portStatusMessageBuilder.setReason(PortReason.OFPPRDELETE);
+
+ else if (source.getReason().getIntValue() == 2)
+ portStatusMessageBuilder.setReason(PortReason.OFPPRMODIFY);
+
+ portStatusMessageBuilder.setPortNo(source.getPortNumber()); // portNO
+
+ portStatusMessageBuilder.setHwAddr(source.getHardwareAddress());
+ portStatusMessageBuilder.setName(source.getName());
+
+ maskPortConfigFields(source.getConfiguration(), config);
+
+ portStatusMessageBuilder.setConfig(config);
+
+ getPortState(source.getState(), portState);
+ portStatusMessageBuilder.setState(portState);
+ portStatusMessageBuilder.setCurrentFeatures(getPortFeatures(source.getCurrentFeature()));
+ portStatusMessageBuilder.setAdvertisedFeatures(getPortFeatures(source.getAdvertisedFeatures()));
+ portStatusMessageBuilder.setSupportedFeatures(getPortFeatures(source.getSupported()));
+ portStatusMessageBuilder.setPeerFeatures(getPortFeatures(source.getPeerFeatures()));
+ portStatusMessageBuilder.setCurrSpeed(source.getCurrentSpeed());
+ portStatusMessageBuilder.setMaxSpeed(source.getMaximumSpeed());
+
+ return portStatusMessageBuilder.build();
+
+ }
+
+}