import org.opendaylight.openflowplugin.applications.reconciliation.ReconciliationNotificationListener;
/**
- * Implementation provider of this interface will implement reconciliation functionality for a newly connected node.
- * Implementation is not enforced to do reconciliation in any specific way, but the higher level intention is to
- * provide best effort reconciliation of all the configuration (flow/meter/group) present in configuration data store
- * for the given node.
+ * Implementation provider of this interface will implement reconciliation
+ * functionality for a newly connected node. Implementation is not enforced to
+ * do reconciliation in any specific way, but the higher level intention is to
+ * provide best effort reconciliation of all the configuration
+ * (flow/meter/group) present in configuration data store for the given node.
*
* @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
*/
public interface FlowNodeReconciliation extends ReconciliationNotificationListener, AutoCloseable {
-}
\ No newline at end of file
+}
private static final Logger LOG = LoggerFactory.getLogger(AbstractListeningCommiter.class);
ForwardingRulesManager provider;
- private final Class<T> clazz;
- public AbstractListeningCommiter(ForwardingRulesManager provider, Class<T> clazz) {
+ public AbstractListeningCommiter(ForwardingRulesManager provider) {
this.provider = Preconditions.checkNotNull(provider, "ForwardingRulesManager can not be null!");
- this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
}
@Override
// skip the flow/group/meter operational. This requires an addition check, where it reads
// node from operational data store and if it's present it calls flowNodeConnected to explicitly
// trigger the event of new node connected.
-
- if (!provider.isNodeOwner(nodeIdent)) {
- return false;
- }
-
- if (!provider.isNodeActive(nodeIdent)) {
- if (provider.checkNodeInOperationalDataStore(nodeIdent)) {
- return true;
- } else {
- return false;
- }
- }
- return true;
+ return provider.isNodeOwner(nodeIdent)
+ && (provider.isNodeActive(nodeIdent) || provider.checkNodeInOperationalDataStore(nodeIdent));
}
}
implements FlowCapableNodeConnectorCommitter<T> {
private final ForwardingRulesManager provider;
- private final Class<T> clazz;
-
- public AbstractNodeConnectorCommitter(ForwardingRulesManager provider, Class<T> clazz) {
+ public AbstractNodeConnectorCommitter(ForwardingRulesManager provider) {
this.provider = Preconditions.checkNotNull(provider, "ForwardingRulesManager can not be null!");
- this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
}
@Override
for (DataTreeModification<T> change : changes) {
final InstanceIdentifier<T> key = change.getRootPath().getRootIdentifier();
final DataObjectModification<T> mod = change.getRootNode();
- final InstanceIdentifier<FlowCapableNodeConnector> nodeConnIdent =
- key.firstIdentifierOf(FlowCapableNodeConnector.class);
+ final InstanceIdentifier<FlowCapableNodeConnector> nodeConnIdent = key
+ .firstIdentifierOf(FlowCapableNodeConnector.class);
if (preConfigurationCheck(nodeConnIdent)) {
switch (mod.getModificationType()) {
}
/**
- * Method return wildCardPath for Listener registration
- * and for identify the correct KeyInstanceIdentifier from data.
+ * Method return wildCardPath for Listener registration and for identify the
+ * correct KeyInstanceIdentifier from data.
*/
protected abstract InstanceIdentifier<T> getWildCardPath();
LOG.debug("Node removed: {}", nodeIdent.firstKeyOf(Node.class).getId().getValue());
}
- if (!nodeIdent.isWildcarded()) {
- if (activeNodes.contains(nodeIdent)) {
- synchronized (lockObj) {
- if (activeNodes.contains(nodeIdent)) {
- Set<InstanceIdentifier<FlowCapableNode>> set = Sets.newHashSet(activeNodes);
- set.remove(nodeIdent);
- activeNodes = Collections.unmodifiableSet(set);
- setNodeOperationalStatus(nodeIdent, false);
- }
+ if (!nodeIdent.isWildcarded() && activeNodes.contains(nodeIdent)) {
+ synchronized (lockObj) {
+ if (activeNodes.contains(nodeIdent)) {
+ Set<InstanceIdentifier<FlowCapableNode>> set = Sets.newHashSet(activeNodes);
+ set.remove(nodeIdent);
+ activeNodes = Collections.unmodifiableSet(set);
+ setNodeOperationalStatus(nodeIdent, false);
}
}
}
-
}
}
LOG.debug("Node added: {}", nodeIdent.firstKeyOf(Node.class).getId().getValue());
}
- if (!nodeIdent.isWildcarded()) {
- if (!activeNodes.contains(nodeIdent)) {
- synchronized (lockObj) {
- if (!activeNodes.contains(nodeIdent)) {
- Set<InstanceIdentifier<FlowCapableNode>> set = Sets.newHashSet(activeNodes);
- set.add(nodeIdent);
- activeNodes = Collections.unmodifiableSet(set);
- setNodeOperationalStatus(nodeIdent, true);
- }
+ if (!nodeIdent.isWildcarded() && !activeNodes.contains(nodeIdent)) {
+ synchronized (lockObj) {
+ if (!activeNodes.contains(nodeIdent)) {
+ Set<InstanceIdentifier<FlowCapableNode>> set = Sets.newHashSet(activeNodes);
+ set.add(nodeIdent);
+ activeNodes = Collections.unmodifiableSet(set);
+ setNodeOperationalStatus(nodeIdent, true);
}
}
}
private void setNodeOperationalStatus(InstanceIdentifier<FlowCapableNode> nodeIid, boolean status) {
NodeId nodeId = nodeIid.firstKeyOf(Node.class).getId();
- if (nodeId != null) {
- if (deviceMasterships.containsKey(nodeId)) {
- deviceMasterships.get(nodeId).setDeviceOperationalStatus(status);
- LOG.debug("Operational status of device {} is set to {}", nodeId, status);
- }
+ if (nodeId != null && deviceMasterships.containsKey(nodeId)) {
+ deviceMasterships.get(nodeId).setDeviceOperationalStatus(status);
+ LOG.debug("Operational status of device {} is set to {}", nodeId, status);
}
}
/**
- * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2014, 2017 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
private ListenerRegistration<FlowForwarder> listenerRegistration;
public FlowForwarder(final ForwardingRulesManager manager, final DataBroker db) {
- super(manager, Flow.class);
+ super(manager);
dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!");
registrationListener(db);
}
@SuppressWarnings("IllegalCatch")
public FlowNodeConnectorInventoryTranslatorImpl(final ForwardingRulesManager manager, final DataBroker dataBroker) {
- super(manager, FlowCapableNodeConnector.class);
+ super(manager);
Preconditions.checkNotNull(dataBroker, "DataBroker can not be null!");
final DataTreeIdentifier<FlowCapableNodeConnector> treeId =
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.FutureCallback;
}
return Futures.immediateFuture(null);
});
-
ListenableFuture<RpcResult<Void>> commitBundleFuture = Futures.transformAsync(addBundleMessagesFuture,
rpcResult -> {
if (rpcResult.isSuccessful()) {
/* Bundles not supported for meters */
List<Meter> meters = flowNode.get().getMeter() != null ? flowNode.get().getMeter()
: Collections.emptyList();
- ListenableFuture<RpcResult<Void>> meterFuture = Futures.transformAsync(commitBundleFuture,
+ Futures.transformAsync(commitBundleFuture,
rpcResult -> {
if (rpcResult.isSuccessful()) {
for (Meter meter : meters) {
if (flowNode.isPresent()) {
/* Tables - have to be pushed before groups */
- // CHECK if while pusing the update, updateTableInput can be null to emulate a
+ // CHECK if while pushing the update, updateTableInput can be null to emulate a
// table add
List<TableFeatures> tableList = flowNode.get().getTableFeatures() != null
? flowNode.get().getTableFeatures()
}
private void deleteDSStaleFlows(List<InstanceIdentifier<StaleFlow>> flowsForBulkDelete) {
- ImmutableList.Builder<InstanceIdentifier<StaleFlow>> builder = ImmutableList.builder();
-
WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
for (InstanceIdentifier<StaleFlow> staleFlowIId : flowsForBulkDelete) {
}
private void deleteDSStaleGroups(List<InstanceIdentifier<StaleGroup>> groupsForBulkDelete) {
- ImmutableList.Builder<InstanceIdentifier<StaleGroup>> builder = ImmutableList.builder();
-
WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
for (InstanceIdentifier<StaleGroup> staleGroupIId : groupsForBulkDelete) {
}
private void deleteDSStaleMeters(List<InstanceIdentifier<StaleMeter>> metersForBulkDelete) {
- ImmutableList.Builder<InstanceIdentifier<StaleMeter>> builder = ImmutableList.builder();
-
WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
for (InstanceIdentifier<StaleMeter> staleMeterIId : metersForBulkDelete) {
/**
- * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2014, 2017 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
@SuppressWarnings("IllegalCatch")
public GroupForwarder(final ForwardingRulesManager manager, final DataBroker db) {
- super(manager, Group.class);
+ super(manager);
dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!");
final DataTreeIdentifier<Group> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
getWildCardPath());
/**
- * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2014, 2017 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
@SuppressWarnings("IllegalCatch")
public MeterForwarder(final ForwardingRulesManager manager, final DataBroker db) {
- super(manager, Meter.class);
+ super(manager);
dataBroker = Preconditions.checkNotNull(db, "DataBroker can not be null!");
final DataTreeIdentifier<Meter> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
getWildCardPath());
public void createStaleMarkEntity(InstanceIdentifier<Meter> identifier, Meter del,
InstanceIdentifier<FlowCapableNode> nodeIdent) {
LOG.debug("Creating Stale-Mark entry for the switch {} for meter {} ", nodeIdent.toString(), del.toString());
- StaleMeter staleMeter = makeStaleMeter(identifier, del, nodeIdent);
+ StaleMeter staleMeter = makeStaleMeter(del);
persistStaleMeter(staleMeter, nodeIdent);
}
- private StaleMeter makeStaleMeter(InstanceIdentifier<Meter> identifier, Meter del,
- InstanceIdentifier<FlowCapableNode> nodeIdent) {
+ private StaleMeter makeStaleMeter(Meter del) {
StaleMeterBuilder staleMeterBuilder = new StaleMeterBuilder(del);
return staleMeterBuilder.setMeterId(del.getMeterId()).build();
-
}
private void persistStaleMeter(StaleMeter staleMeter, InstanceIdentifier<FlowCapableNode> nodeIdent) {
CheckedFuture<Void, TransactionCommitFailedException> submitFuture = writeTransaction.submit();
handleStaleMeterResultFuture(submitFuture);
-
}
private void handleStaleMeterResultFuture(CheckedFuture<Void, TransactionCommitFailedException> submitFuture) {
LOG.error("Stale Meter creation failed {}", throwable);
}
});
-
}
- private InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.flow
- .inventory.rev130819.meters.StaleMeter> getStaleMeterInstanceIdentifier(
+ private InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819
+ .meters.StaleMeter> getStaleMeterInstanceIdentifier(
StaleMeter staleMeter, InstanceIdentifier<FlowCapableNode> nodeIdent) {
return nodeIdent.child(StaleMeter.class, new StaleMeterKey(new MeterId(staleMeter.getMeterId())));
}
-
}
@SuppressWarnings("IllegalCatch")
public TableForwarder(final ForwardingRulesManager manager, final DataBroker db) {
- super(manager, TableFeatures.class);
+ super(manager);
Preconditions.checkNotNull(db, "DataBroker can not be null!");
final DataTreeIdentifier<TableFeatures> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
getWildCardPath());
/**
* txChainManager is trying to be closed - device disconnecting.
*/
- SHUTTING_DOWN;
+ SHUTTING_DOWN
}
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.rf.state.rev170713.ResultState;
import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
final DeviceInfo deviceInfo = connectionContext.getDeviceInfo();
final ContextChain contextChain = contextChainMap.get(deviceInfo);
- if (connectionContext.getFeatures().getAuxiliaryId() != 0) {
+ final FeaturesReply featuresReply = connectionContext.getFeatures();
+ final short auxiliaryId = featuresReply != null ? featuresReply.getAuxiliaryId() : 0;
+
+ if (auxiliaryId != 0) {
if (contextChain == null) {
LOG.warn("An auxiliary connection for device {}, but no primary connection. Refusing connection.",
deviceInfo);
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.Futures;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import org.opendaylight.openflowplugin.api.OFConstants;
import org.opendaylight.openflowplugin.impl.services.util.RequestInputUtils;
import org.opendaylight.openflowplugin.impl.services.util.ServiceException;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
private final TranslatorLibrary translatorLibrary;
private final ConvertorExecutor convertorExecutor;
+ private final VersionConvertorData data;
public MultiLayerAggregateFlowMultipartService(final RequestContextStack requestContextStack,
final DeviceContext deviceContext,
super(requestContextStack, deviceContext);
this.convertorExecutor = convertorExecutor;
this.translatorLibrary = translatorLibrary;
+ this.data = new VersionConvertorData(getVersion());
}
mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
}
- MatchReactor.getInstance().convert(input.getMatch(), version, mprAggregateRequestBuilder, convertorExecutor);
+ // convert and inject match
+ final Optional<Object> conversionMatch = convertorExecutor.convert(input.getMatch(), data);
+ MatchInjector.inject(conversionMatch, mprAggregateRequestBuilder, data.getVersion());
FlowCreatorUtil.setWildcardedFlowMatch(version, mprAggregateRequestBuilder);
}
public enum ConnectionStatus {
- CONNECTION_CREATED, CONNECTION_DISCONNECTED_BY_DEVICE, CONNECTION_DISCONNECTED_BY_OFP;
+ CONNECTION_CREATED, CONNECTION_DISCONNECTED_BY_DEVICE, CONNECTION_DISCONNECTED_BY_OFP
}
private static final class EventCounter {
message.setMoreReplies(Boolean.FALSE);
message.setTransactionId(emulatedTxId);
- message.setMeterConfigStats(new ArrayList<MeterConfigStats>());
+ message.setMeterConfigStats(new ArrayList<>());
for (MultipartReply mpReply : result) {
MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) mpReply.getMultipartReplyBody();
MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
final Optional<List<MeterConfigStats>> meterConfigStatsList =
convertorExecutor.convert(replyBody.getMeterConfig(), data);
- if (meterConfigStatsList.isPresent()) {
- message.getMeterConfigStats().addAll(meterConfigStatsList.get());
- }
+ meterConfigStatsList.ifPresent(meterConfigStats -> message.getMeterConfigStats().addAll(meterConfigStats));
}
return message.build();
package org.opendaylight.openflowplugin.impl.statistics.services;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;
import org.opendaylight.openflowplugin.api.OFConstants;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.AbstractCompatibleStatService;
import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.FlowStatisticsToNotificationTransformer;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowsStatisticsUpdate;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput;
GetFlowStatisticsFromFlowTableOutput, FlowsStatisticsUpdate> {
private final ConvertorExecutor convertorExecutor;
+ private final VersionConvertorData data;
public FlowsInTableService(final RequestContextStack requestContextStack,
final DeviceContext deviceContext,
ConvertorExecutor convertorExecutor) {
super(requestContextStack, deviceContext, compatibilityXidSeed);
this.convertorExecutor = convertorExecutor;
+ this.data = new VersionConvertorData(getVersion());
}
@Override
}
// convert and inject match
- final short version = getVersion();
- MatchReactor.getInstance().convert(input.getMatch(), version, mprFlowRequestBuilder, convertorExecutor);
+ final Optional<Object> conversionMatch = convertorExecutor.convert(input.getMatch(), data);
+ MatchInjector.inject(conversionMatch, mprFlowRequestBuilder, data.getVersion());
// Set request body to main multipart request
multipartRequestFlowCaseBuilder.setMultipartRequestFlow(mprFlowRequestBuilder.build());
final MultipartRequestInputBuilder mprInput = RequestInputUtils.createMultipartHeader(
- MultipartType.OFPMPFLOW, xid.getValue(), version);
+ MultipartType.OFPMPFLOW, xid.getValue(), getVersion());
mprInput.setMultipartRequestBody(multipartRequestFlowCaseBuilder.build());
return mprInput.build();
notification.setMoreReplies(Boolean.FALSE);
notification.setTransactionId(emulatedTxId);
- notification.setGroupDescStats(new ArrayList<GroupDescStats>());
+ notification.setGroupDescStats(new ArrayList<>());
final VersionConvertorData data = new VersionConvertorData(getVersion());
for (MultipartReply mpReply : result) {
final Optional<List<GroupDescStats>> groupDescStatsList = convertorExecutor.convert(
replyBody.getGroupDesc(), data);
- if (groupDescStatsList.isPresent()) {
- notification.getGroupDescStats().addAll(groupDescStatsList.get());
- }
+ groupDescStatsList.ifPresent(groupDescStats -> notification.getGroupDescStats().addAll(groupDescStats));
}
return notification.build();
convertorExecutor.convert(replyBody.getFlowStats(), data);
- if (outStatsItem.isPresent()) {
- statsList.addAll(outStatsItem.get());
- }
+ outStatsItem.ifPresent(statsList::addAll);
}
return notification.build();
notification.setMoreReplies(Boolean.FALSE);
notification.setTransactionId(emulatedTxId);
- notification.setGroupStats(new ArrayList<GroupStats>());
+ notification.setGroupStats(new ArrayList<>());
for (MultipartReply mpReply : mpReplyList) {
MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
final Optional<List<GroupStats>> groupStatsList = convertorExecutor.convert(
replyBody.getGroupStats(), data);
- if (groupStatsList.isPresent()) {
- notification.getGroupStats().addAll(groupStatsList.get());
- }
+ groupStatsList.ifPresent(groupStats -> notification.getGroupStats().addAll(groupStats));
}
return notification.build();
}
notification.setMoreReplies(Boolean.FALSE);
notification.setTransactionId(emulatedTxId);
- notification.setMeterStats(new ArrayList<MeterStats>());
+ notification.setMeterStats(new ArrayList<>());
for (MultipartReply mpReply : mpReplyList) {
MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
final Optional<List<MeterStats>> meterStatsList =
convertorExecutor.convert(replyBody.getMeterStats(), data);
- if (meterStatsList.isPresent()) {
- notification.getMeterStats().addAll(meterStatsList.get());
- }
+ meterStatsList.ifPresent(meterStats -> notification.getMeterStats().addAll(meterStats));
}
return notification.build();
notification.setTransactionId(emulatedTxId);
notification
- .setNodeConnectorStatisticsAndPortNumberMap(new ArrayList<NodeConnectorStatisticsAndPortNumberMap>());
+ .setNodeConnectorStatisticsAndPortNumberMap(new ArrayList<>());
for (MultipartReply mpReply : mpReplyList) {
MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
notification.setMoreReplies(Boolean.FALSE);
notification.setTransactionId(emulatedTxId);
- notification.setQueueIdAndStatisticsMap(new ArrayList<QueueIdAndStatisticsMap>());
+ notification.setQueueIdAndStatisticsMap(new ArrayList<>());
for (MultipartReply mpReply : mpReplyList) {
MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) mpReply.getMultipartReplyBody();
import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractFlowDirectStatisticsService;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.FlowStatsResponseConvertorData;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetFlowStatisticsOutputBuilder;
final Optional<List<FlowAndStatisticsMapList>> statsListPart = getConvertorExecutor().convert(
replyBody.getFlowStats(), data);
- if (statsListPart.isPresent()) {
- for (final FlowAndStatisticsMapList part : statsListPart.get()) {
+ statsListPart.ifPresent(flowAndStatisticsMapLists -> {
+ for (final FlowAndStatisticsMapList part : flowAndStatisticsMapLists) {
final FlowId flowId = new FlowId(generateFlowId(part).getValue());
statsList.add(new FlowAndStatisticsMapListBuilder(part)
- .setKey(new FlowAndStatisticsMapListKey(flowId))
- .setFlowId(flowId)
- .build());
+ .setKey(new FlowAndStatisticsMapListKey(flowId))
+ .setFlowId(flowId)
+ .build());
}
- }
+ });
}
}
mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
}
- MatchReactor.getInstance().convert(input.getMatch(),
- getVersion(),
- mprFlowRequestBuilder,
- getConvertorExecutor());
+ // convert and inject match
+ final Optional<Object> conversionMatch = getConvertorExecutor().convert(input.getMatch(), data);
+ MatchInjector.inject(conversionMatch, mprFlowRequestBuilder, data.getVersion());
return RequestInputUtils.createMultipartHeader(getMultipartType(), xid.getValue(), getVersion())
.setMultipartRequestBody(new MultipartRequestFlowCaseBuilder()
final Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder>
matchOptional = convertorExecutor.convert(input.getMatch(), datapathIdConvertorData);
- final MatchBuilder matchBuilder = matchOptional.isPresent()
- ? new MatchBuilder(matchOptional.get().build())
- : new MatchBuilder();
+ final MatchBuilder matchBuilder = matchOptional.map(matchBuilder1 -> new MatchBuilder(matchBuilder1.build())).orElseGet(MatchBuilder::new);
final AugmentTuple<org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match>
matchExtensionWrap = MatchExtensionHelper.processAllExtensions(
}
public TranslatorKey createTranslatorKey(final Class<?> messageClass) {
- return new TranslatorKey(version, messageClass.getName().toString());
+ return new TranslatorKey(version, messageClass.getName());
}
}
@Test
public void testCreateBarrierRequest() {
final BarrierInput barrierRequest = outboundQueueProvider.createBarrierRequest(DUMMY_XID);
- assertNotNull(barrierRequest);;
+ assertNotNull(barrierRequest);
assertEquals((short)OFConstants.OFP_VERSION_1_3, (short)barrierRequest.getVersion());
assertEquals(DUMMY_XID, barrierRequest.getXid());
}
public void testProcessPacketInMessageFutureSuccess() {
final PacketInMessage mockedPacketInMessage = mock(PacketInMessage.class);
final NotificationPublishService mockedNotificationPublishService = mock(NotificationPublishService.class);
- final ListenableFuture stringListenableFuture = Futures.immediateFuture(new String("dummy value"));
+ final ListenableFuture stringListenableFuture = Futures.immediateFuture("dummy value");
when(mockedNotificationPublishService.offerNotification(any(PacketReceived.class)))
.thenReturn(stringListenableFuture);
import io.netty.buffer.ByteBuf;
import io.netty.buffer.UnpooledByteBufAllocator;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.opendaylight.openflowjava.util.ByteBufUtils;
public class MultipartReplyMeterFeaturesDeserializerTest extends AbstractMultipartDeserializerTest {
private static final int MAX_METER = 3;
- private static final List BANDS_SUPPORTED = Arrays.asList(MeterBandDrop.class);
+ private static final List BANDS_SUPPORTED = Collections.singletonList(MeterBandDrop.class);
private static final List CAPABILITIES_SUPPORTED = Arrays.asList(MeterKbps.class, MeterBurst.class);
private static final byte MAX_BANDS = 56;
private static final byte MAX_COLOR = 48;
buffer.writeZero(EncodeConstants.MAX_PORT_NAME_LENGTH);
Map<Integer, Boolean> portMap = new HashMap<>();
- portMap.put(new Integer(0), PORT_CONFIG.isPORTDOWN());
- portMap.put(new Integer(2), PORT_CONFIG.isNORECV());
- portMap.put(new Integer(5), PORT_CONFIG.isNOFWD());
- portMap.put(new Integer(6), PORT_CONFIG.isNOPACKETIN());
+ portMap.put(0, PORT_CONFIG.isPORTDOWN());
+ portMap.put(2, PORT_CONFIG.isNORECV());
+ portMap.put(5, PORT_CONFIG.isNOFWD());
+ portMap.put(6, PORT_CONFIG.isNOPACKETIN());
buffer.writeInt(ByteBufUtils.fillBitMaskFromMap(portMap));
buffer.writeInt(ByteBufUtils.fillBitMask(0, PS_BLOCKED, PS_LINK_DOWN, PS_LIVE));
UpdatedFlow mockedUpdateFlow1 = new UpdatedFlowBuilder()
.setMatch(match)
.setTableId((short)1)
- .setPriority(Integer.valueOf(1))
+ .setPriority(1)
.build();
when(mockedUpdateFlowInput.getUpdatedFlow()).thenReturn(mockedUpdateFlow);
OriginalFlow mockedOriginalFlow1 = new OriginalFlowBuilder()
.setMatch(match)
.setTableId((short)1)
- .setPriority(Integer.valueOf(2))
+ .setPriority(2)
.build();
when(mockedUpdateFlowInput.getOriginalFlow()).thenReturn(mockedOriginalFlow);
when(mockedDeviceContext.getDeviceState()).thenReturn(mockedDeviceState);
final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
- final StatisticsContextImpl<MultipartReply> statisticsContext = new StatisticsContextImpl<MultipartReply>(
- mockedDeviceContext ,convertorManager,
+ final StatisticsContextImpl<MultipartReply> statisticsContext = new StatisticsContextImpl<>(
+ mockedDeviceContext, convertorManager,
MultipartWriterProviderFactory.createDefaultProvider(mockedDeviceContext),
true, false, 3000, 50000);
}
private void initStatisticsContext() {
- statisticsContext = new StatisticsContextImpl<MultipartReply>(
+ statisticsContext = new StatisticsContextImpl<>(
mockedDeviceContext, convertorManager,
MultipartWriterProviderFactory.createDefaultProvider(mockedDeviceContext),
true,
*/
@Test
public void testClose() throws Exception {
- final StatisticsContextImpl<MultipartReply> statisticsContext = new StatisticsContextImpl<MultipartReply>(
+ final StatisticsContextImpl<MultipartReply> statisticsContext = new StatisticsContextImpl<>(
mockedDeviceContext, convertorManager,
MultipartWriterProviderFactory.createDefaultProvider(mockedDeviceContext),
true, false, 3000, 50000);
when(stat.getTableId()).thenReturn(TABLE_NO);
when(stat.getMatch()).thenReturn(new MatchBuilder().build());
- final List<FlowAndStatisticsMapList> stats = Arrays.asList(stat);
+ final List<FlowAndStatisticsMapList> stats = Collections.singletonList(stat);
final GetFlowStatisticsOutput output = mock(GetFlowStatisticsOutput.class);
when(output.getFlowAndStatisticsMapList()).thenReturn(stats);
when(stat.getGroupId()).thenReturn(new GroupId(GROUP_NO));
final List<org.opendaylight.yang.gen.v1.urn
- .opendaylight.group.types.rev131018.group.statistics.reply.GroupStats> stats = Arrays.asList(stat);
+ .opendaylight.group.types.rev131018.group.statistics.reply.GroupStats> stats = Collections.singletonList(stat);
final GetGroupStatisticsOutput output = mock(GetGroupStatisticsOutput.class);
when(output.getGroupStats()).thenReturn(stats);
when(stat.getMeterId()).thenReturn(new MeterId(METER_NO));
final List<org.opendaylight.yang.gen.v1.urn
- .opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats> stats = Arrays.asList(stat);
+ .opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats> stats = Collections.singletonList(stat);
final GetMeterStatisticsOutput output = mock(GetMeterStatisticsOutput.class);
when(output.getMeterStats()).thenReturn(stats);
import java.math.BigInteger;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
final MultipartReplyPortStatsCase nodeConnectorCase = mock(MultipartReplyPortStatsCase.class);
final MultipartReplyPortStats nodeConnector = mock(MultipartReplyPortStats.class);
final PortStats nodeConnectorStat = mock(PortStats.class);
- final List<PortStats> nodeConnectorStats = Arrays.asList(nodeConnectorStat);
- final List<MultipartReply> input = Arrays.asList(reply);
+ final List<PortStats> nodeConnectorStats = Collections.singletonList(nodeConnectorStat);
+ final List<MultipartReply> input = Collections.singletonList(reply);
when(nodeConnector.getPortStats()).thenReturn(nodeConnectorStats);
when(nodeConnectorCase.getMultipartReplyPortStats()).thenReturn(nodeConnector);
final NodeConnectorStatisticsAndPortNumberMap stat = mock(NodeConnectorStatisticsAndPortNumberMap.class);
when(stat.getNodeConnectorId()).thenReturn(nodeConnectorId);
- final List<NodeConnectorStatisticsAndPortNumberMap> stats = Arrays.asList(stat);
+ final List<NodeConnectorStatisticsAndPortNumberMap> stats = Collections.singletonList(stat);
final GetNodeConnectorStatisticsOutput output = mock(GetNodeConnectorStatisticsOutput.class);
when(output.getNodeConnectorStatisticsAndPortNumberMap()).thenReturn(stats);
import java.math.BigInteger;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.openflowplugin.api.openflow.device.Xid;
final MultipartReplyQueueCase queueCase = mock(MultipartReplyQueueCase.class);
final MultipartReplyQueue queue = mock(MultipartReplyQueue.class);
final QueueStats queueStat = mock(QueueStats.class);
- final List<QueueStats> queueStats = Arrays.asList(queueStat);
- final List<MultipartReply> input = Arrays.asList(reply);
+ final List<QueueStats> queueStats = Collections.singletonList(queueStat);
+ final List<MultipartReply> input = Collections.singletonList(reply);
when(queue.getQueueStats()).thenReturn(queueStats);
when(queueCase.getMultipartReplyQueue()).thenReturn(queue);
final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class);
when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
- final List<QueueIdAndStatisticsMap> maps = Arrays.asList(map);
+ final List<QueueIdAndStatisticsMap> maps = Collections.singletonList(map);
final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
when(output.getQueueIdAndStatisticsMap()).thenReturn(maps);
when(stat.getTableId()).thenReturn(TABLE_NO);
when(stat.getMatch()).thenReturn(new MatchBuilder().build());
- final List<FlowAndStatisticsMapList> stats = Arrays.asList(stat);
+ final List<FlowAndStatisticsMapList> stats = Collections.singletonList(stat);
final GetFlowStatisticsOutput output = mock(GetFlowStatisticsOutput.class);
when(output.getFlowAndStatisticsMapList()).thenReturn(stats);
when(stat.getGroupId()).thenReturn(new GroupId(GROUP_NO));
final List<org.opendaylight.yang.gen.v1.urn
- .opendaylight.group.types.rev131018.group.statistics.reply.GroupStats> stats = Arrays.asList(stat);
+ .opendaylight.group.types.rev131018.group.statistics.reply.GroupStats> stats = Collections.singletonList(stat);
final GetGroupStatisticsOutput output = mock(GetGroupStatisticsOutput.class);
when(output.getGroupStats()).thenReturn(stats);
when(stat.getMeterId()).thenReturn(new MeterId(METER_NO));
final List<org.opendaylight.yang.gen.v1.urn
- .opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats> stats = Arrays.asList(stat);
+ .opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats> stats = Collections.singletonList(stat);
final GetMeterStatisticsOutput output = mock(GetMeterStatisticsOutput.class);
when(output.getMeterStats()).thenReturn(stats);
final NodeConnectorStatisticsAndPortNumberMap stat = mock(NodeConnectorStatisticsAndPortNumberMap.class);
when(stat.getNodeConnectorId()).thenReturn(nodeConnectorId);
- final List<NodeConnectorStatisticsAndPortNumberMap> stats = Arrays.asList(stat);
+ final List<NodeConnectorStatisticsAndPortNumberMap> stats = Collections.singletonList(stat);
final GetNodeConnectorStatisticsOutput output = mock(GetNodeConnectorStatisticsOutput.class);
when(output.getNodeConnectorStatisticsAndPortNumberMap()).thenReturn(stats);
final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class);
when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO));
- final List<QueueIdAndStatisticsMap> maps = Arrays.asList(map);
+ final List<QueueIdAndStatisticsMap> maps = Collections.singletonList(map);
final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
when(output.getQueueIdAndStatisticsMap()).thenReturn(maps);
import com.google.common.collect.Lists;
import java.math.BigInteger;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
@Before
public void setUp() throws Exception {
- final List<PhyPort> phyPorts = Arrays.asList(phyPort);
+ final List<PhyPort> phyPorts = Collections.singletonList(phyPort);
convertorManager = ConvertorManagerFactory.createDefaultManager();
Mockito.when(deviceContext.getPrimaryConnectionContext()).thenReturn(connectionContext);
private MatchV10Builder expectedV10Match() {
Short zeroShort = Short.valueOf("0");
- Integer zeroInteger = Integer.valueOf(0);
+ Integer zeroInteger = 0;
MatchV10Builder matchV10Builder = new MatchV10Builder();
matchV10Builder.setDlDst(ZERO_MAC_ADDRESS);
matchV10Builder.setDlSrc(ZERO_MAC_ADDRESS);
import java.util.Collection;
import java.util.Optional;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorData;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
public interface ConvertorExecutor {
/**
* @param data convertor data
* @return the result (can be empty, if no convertor was found)
*/
- <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data);
+ <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data);
/**
* Lookup and use convertor by specified type, then converts source collection and returns converted result
* @param data convertor data
* @return the result (can be empty, if no convertor was found)
*/
- <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data);
+ <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data);
}
\ No newline at end of file
// Cache, that holds all registered convertors, but they can have multiple keys,
// based on instanceof checks in the convert method
- private Map<Short, Map<Class<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
+ private Map<Short, Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
/**
* Create new instance of Convertor Manager
@Override
public ConvertorManager registerConvertor(final short version, final Convertor<?, ?, ? extends ConvertorData> convertor) {
- final Map<Class<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
+ final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
convertors.get(version);
if (Objects.nonNull(convertorsForVersion)) {
- for (final Class<? extends DataContainer> type : convertor.getTypes()) {
+ for (final Class<?> type : convertor.getTypes()) {
final Convertor<?, ?, ? extends ConvertorData> result = convertorsForVersion.get(type);
if (Objects.isNull(result)) {
@Override
@SuppressWarnings("unchecked")
- public <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data) {
+ public <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data) {
Optional<TO> result = Optional.empty();
if (Objects.isNull(source)) {
return result;
}
- final Class<? extends DataContainer> type = source.getImplementedInterface();
+ final Class<?> type = source instanceof DataContainer ?
+ ((DataContainer)source).getImplementedInterface()
+ : source.getClass();
if (Objects.isNull(type)) {
LOG.warn("Cannot extract type from {}, because getImplementedInterface() returns null", source);
@Override
@SuppressWarnings("unchecked")
- public <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data) {
+ public <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data) {
Optional<TO> result = Optional.empty();
if (Objects.isNull(source)) {
return result;
}
- final Optional<FROM> first = source.stream().findFirst();
+ final Optional<FROM> firstOptional = source.stream().findFirst();
- if (!first.isPresent()) {
+ if (!firstOptional.isPresent()) {
LOG.trace("Cannot extract type from empty collection");
return result;
}
- final Class<? extends DataContainer> type = first.get().getImplementedInterface();
+ final FROM first = firstOptional.get();
+
+ final Class<?> type = first instanceof DataContainer ?
+ ((DataContainer)first).getImplementedInterface()
+ : first.getClass();
if (Objects.isNull(type)) {
LOG.warn("Cannot extract type from {}, because getImplementedInterface() returns null", source);
* @return found convertor
*/
@VisibleForTesting
- Optional<Convertor> findConvertor(final short version, final Class<? extends DataContainer> type) {
- final Map<Class<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
+ Optional<Convertor> findConvertor(final short version, final Class<?> type) {
+ final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
convertors.get(version);
Optional<Convertor> convertor = Optional.empty();
convertor = Optional.ofNullable(convertorsForVersion.get(type));
if (!convertor.isPresent()) {
- for (final Class<? extends DataContainer> convertorType : convertorsForVersion.keySet()) {
+ for (final Class<?> convertorType : convertorsForVersion.keySet()) {
if (type.isAssignableFrom(convertorType)) {
final Convertor<?, ?, ? extends ConvertorData> foundConvertor = convertorsForVersion.get(convertorType);
convertor = Optional.ofNullable(foundConvertor);
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionResponseConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowFlagsConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowFlagsV10Convertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowInstructionResponseConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10Convertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchV10ResponseConvertor;
/**
final MeterStatsResponseConvertor meterStatsResponseConvertor = new MeterStatsResponseConvertor();
final MeterConfigStatsResponseConvertor meterConfigStatsResponseConvertor = new MeterConfigStatsResponseConvertor();
final PortConvertor portConvertor = new PortConvertor();
+ final MatchConvertor matchConvertor = new MatchConvertor();
+ final MatchV10Convertor matchV10Convertor = new MatchV10Convertor();
final MatchResponseConvertor matchResponseConvertor = new MatchResponseConvertor();
final MatchV10ResponseConvertor matchV10ResponseConvertor = new MatchV10ResponseConvertor();
final ActionConvertor actionConvertor = new ActionConvertor();
final FlowConvertor flowConvertor = new FlowConvertor();
final FlowInstructionResponseConvertor flowInstructionResponseConvertor = new FlowInstructionResponseConvertor();
final FlowStatsResponseConvertor flowStatsResponseConvertor = new FlowStatsResponseConvertor();
+ final FlowFlagsConvertor flowFlagsConvertor = new FlowFlagsConvertor();
+ final FlowFlagsV10Convertor flowFlagsV10Convertor = new FlowFlagsV10Convertor();
return new ConvertorManager(OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3)
.registerConvertor(OFConstants.OFP_VERSION_1_0, tableFeaturesConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_3, meterConfigStatsResponseConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_0, portConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_3, portConvertor)
- // TODO: Add MatchConvertorImpl and MatchConvertorV10Impl
+ .registerConvertor(OFConstants.OFP_VERSION_1_0, matchV10Convertor)
+ .registerConvertor(OFConstants.OFP_VERSION_1_3, matchConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_3, matchResponseConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_0, matchV10ResponseConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_0, actionConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_0, flowInstructionResponseConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_3, flowInstructionResponseConvertor)
.registerConvertor(OFConstants.OFP_VERSION_1_0, flowStatsResponseConvertor)
- .registerConvertor(OFConstants.OFP_VERSION_1_3, flowStatsResponseConvertor);
+ .registerConvertor(OFConstants.OFP_VERSION_1_3, flowStatsResponseConvertor)
+ .registerConvertor(OFConstants.OFP_VERSION_1_0, flowFlagsV10Convertor)
+ .registerConvertor(OFConstants.OFP_VERSION_1_3, flowFlagsConvertor);
}
-}
+}
\ No newline at end of file
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* </pre>
*/
public class GroupConvertor extends Convertor<Group, GroupModInputBuilder, VersionDatapathIdConvertorData> {
- private static final List<Class<? extends DataContainer>> TYPES = Arrays.asList(Group.class, AddGroupInput.class, RemoveGroupInput.class, UpdatedGroup.class);
+ private static final List<Class<?>> TYPES = Arrays.asList(Group.class, AddGroupInput.class, RemoveGroupInput.class, UpdatedGroup.class);
/**
* Create default empty group mod input builder
* Use this method, if result from convertor is empty.
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
*/
public class GroupDescStatsResponseConvertor extends Convertor<List<GroupDesc>, List<GroupDescStats>, VersionConvertorData> {
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(GroupDesc.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(GroupDesc.class);
private org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(List<BucketsList> bucketDescStats, short version) {
final ActionResponseConvertorData data = new ActionResponseConvertorData(version);
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
import java.util.Collections;
import java.util.List;
import java.util.Set;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.Buckets;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
/**
* Converts group related statistics messages coming from switch to MD-SAL messages.
List<GroupStats>,
VersionConvertorData> {
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats.class);
private Buckets toSALBuckets(List<BucketStats> bucketStats) {
BucketsBuilder salBuckets = new BucketsBuilder();
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
*/
public class MeterConfigStatsResponseConvertor extends Convertor<List<MeterConfig>, List<MeterConfigStats>, VersionConvertorData> {
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(MeterConfig.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(MeterConfig.class);
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
*/
public class MeterConvertor extends Convertor<Meter, MeterModInputBuilder, VersionConvertorData> {
private static final Logger LOG = LoggerFactory.getLogger(MeterConvertor.class);
- private static final List<Class<? extends DataContainer>> TYPES = Arrays.asList(Meter.class, AddMeterInput.class, RemoveMeterInput.class, UpdatedMeter.class);
+ private static final List<Class<?>> TYPES = Arrays.asList(Meter.class, AddMeterInput.class, RemoveMeterInput.class, UpdatedMeter.class);
/**
* Create default empty meter mot input builder.
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
List<MeterStats>,
VersionConvertorData> {
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStats.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStats.class);
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
*/
public class PacketOutConvertor extends Convertor<TransmitPacketInput, PacketOutInput, PacketOutConvertorData> {
private static final Logger LOG = LoggerFactory.getLogger(PacketOutConvertor.class);
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(TransmitPacketInput.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(TransmitPacketInput.class);
/**
* Create default empty meter mot input builder.
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.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._case.multipart.reply.port.desc.PortsBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
/**
* Converts port mod, port status and port description MD-SAL messages to OF library data
*/
public class PortConvertor extends Convertor<Port, PortModInput, VersionConvertorData> {
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(Port.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(Port.class);
/**
* Create default empty port mod input
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.multipart.request.table.features.TableFeaturesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeaturePropertiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTable;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.TableFeaturePropType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActions;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActionsMiss;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.match.MatchSetfield;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.next.table.miss.TablesMiss;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.wildcards.WildcardSetfield;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTable;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Ordering<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeatureProperties> TABLE_FEATURE_PROPS_ORDERING =
Ordering.from(OrderComparator.<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeatureProperties>build());
private static final Map<Class<?>, Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField>> SAL_TO_OF_TABLE_FEATURES;
- private static final List<Class<? extends DataContainer>> TYPES = Arrays.asList(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures.class, UpdatedTable.class);
+ private static final List<Class<?>> TYPES = Arrays.asList(org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures.class, UpdatedTable.class);
static {
Builder<Class<?>, Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField>> builder = ImmutableMap.builder();
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
private static final Map<TableFeaturesPropType, ActionExecutor> TABLE_FEATURE_PROPERTY_TYPE_TO_ACTION;
private static final Map<Class<?>, org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> OF_TO_SAL_ACTION;
private static final Map<Class<? extends MatchField>, Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MatchField>> OF_TO_SAL_TABLE_FEATURE_PROPERTIES;
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(MultipartReplyTableFeatures.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(MultipartReplyTableFeatures.class);
static {
final Builder<TableFeaturesPropType, ActionExecutor> builder = ImmutableMap.builder();
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
.addCase(new SalToOfSetNwTosActionV10Case())
// Try to convert action grouping using converters from openflowplugin-extension
.addCase(new SalToOfGeneralExtensionGroupingCase());
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action.class);
private static final Ordering<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> ACTION_ORDERING =
Ordering.from(OrderComparator.<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>build());
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
.addCase(new OfToSalSetVlanPcpCase())
.addCase(new OfToSalSetVlanIdCase())
.addCase(new OfToSalStripVlanCase());
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(Action.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(Action.class);
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder;
final short version = data.getVersion();
final SetFieldActionBuilder setFieldBuilder = new SetFieldActionBuilder();
- MatchReactor.getInstance().convert(source.getSetField(), version, setFieldBuilder, convertorExecutor);
+ // convert and inject match
+ final Optional<Object> conversionMatch = convertorExecutor.convert(source.getSetField(), data);
+ MatchInjector.inject(conversionMatch, setFieldBuilder, version);
return Optional.of(new ActionBuilder()
.setActionChoice(new SetFieldCaseBuilder()
import java.util.Collection;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
/**
* Converts OpenflowJava to MDSal model and vice versa
*
* @return the type of convertor
*/
- public abstract Collection<Class<? extends DataContainer>> getTypes();
+ public abstract Collection<Class<?>> getTypes();
/**
* Converts source to result
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.cases.MeterCase;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.cases.WriteActionsCase;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.cases.WriteMetadataCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag.FlowFlagReactor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchInjector;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.VlanCfi;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
/**
* Converts the SAL Flow to OF Flow. It checks if there is a set-vlan-id (1.0) action made on OF1.3.
.addCase(new MeterCase())
.addCase(new WriteActionsCase())
.addCase(new WriteMetadataCase());
- private static final List<Class<? extends DataContainer>> TYPES = Arrays.asList(Flow.class, AddFlowInput.class, RemoveFlowInput.class, UpdatedFlow.class);
+ private static final List<Class<?>> TYPES = Arrays.asList(Flow.class, AddFlowInput.class, RemoveFlowInput.class, UpdatedFlow.class);
static {
final VlanId zeroVlan = new VlanId(0);
VLAN_MATCH_TRUE = vlanMatchBuilder2.build();
}
- private FlowModInputBuilder toFlowModInput(Flow flow, short version, BigInteger datapathid) {
+ private FlowModInputBuilder toFlowModInput(Flow flow, VersionDatapathIdConvertorData versionConverterData) {
FlowModInputBuilder flowMod = new FlowModInputBuilder();
salToOFFlowCookie(flow, flowMod);
salToOFFlowOutGroup(flow, flowMod);
// convert and inject flowFlags
- FlowFlagReactor.getInstance().convert(flow.getFlags(), version, flowMod, getConvertorExecutor());
+ final Optional<Object> conversion = getConvertorExecutor().convert(flow.getFlags(), versionConverterData);
+ FlowFlagsInjector.inject(conversion, flowMod, versionConverterData.getVersion());
// convert and inject match
- MatchReactor.getInstance().convert(flow.getMatch(), version, flowMod, getConvertorExecutor());
+ final Optional<Object> conversionMatch = getConvertorExecutor().convert(flow.getMatch(), versionConverterData);
+ MatchInjector.inject(conversionMatch, flowMod, versionConverterData.getVersion());
if (flow.getInstructions() != null) {
- flowMod.setInstruction(toInstructions(flow, version, datapathid));
- flowMod.setAction(getActions(version, datapathid, flow));
+ flowMod.setInstruction(toInstructions(flow, versionConverterData.getVersion(), versionConverterData.getDatapathId()));
+ flowMod.setAction(getActions(versionConverterData.getVersion(), versionConverterData.getDatapathId(), flow));
}
- flowMod.setVersion(version);
-
- return flowMod;
+ flowMod.setVersion(versionConverterData.getVersion()); return flowMod;
}
private static void salToOFFlowOutGroup(Flow flow, FlowModInputBuilder flowMod) {
* Â Â 1) Match on (OFPVID_NONEÂ ) without mask + action [push vlan tag + set_field]
* Â Â 2) Match on (OFPVID_PRESENT) with mask (OFPVID_PRESENT ) + action [ set_field]
*/
- private List<FlowModInputBuilder> handleSetVlanIdForOF13(Flow srcFlow, short version, BigInteger datapathId) {
+ private List<FlowModInputBuilder> handleSetVlanIdForOF13(Flow srcFlow, VersionDatapathIdConvertorData versionDatapathIdConverterData) {
List<FlowModInputBuilder> list = new ArrayList<>(2);
final Match srcMatch = Preconditions.checkNotNull(srcFlow.getMatch());
Optional<? extends Flow> optional = injectMatchToFlow(srcFlow, match);
if (optional.isPresent()) {
- list.add(toFlowModInput(optional.get(), version, datapathId));
+ list.add(toFlowModInput(optional.get(), versionDatapathIdConverterData));
}
} else {
// create 2 flows
Optional<? extends Flow> optional1 = injectMatchAndAction(srcFlow, match1);
if (optional1.isPresent()) {
- list.add(toFlowModInput(optional1.get(), version, datapathId));
+ list.add(toFlowModInput(optional1.get(), versionDatapathIdConverterData));
}
//flow2
Match match2 = new MatchBuilder(srcMatch).setVlanMatch(VLAN_MATCH_TRUE).build();
Optional<? extends Flow> optional2 = injectMatchToFlow(srcFlow, match2);
if (optional2.isPresent()) {
- list.add(toFlowModInput(optional2.get(), version, datapathId));
+ list.add(toFlowModInput(optional2.get(), versionDatapathIdConverterData));
}
}
return list;
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
@Override
public List<FlowModInputBuilder> convert(Flow source, VersionDatapathIdConvertorData data) {
if (data.getVersion() >= OFConstants.OFP_VERSION_1_3 && isSetVlanIdActionCasePresent(source)) {
- return handleSetVlanIdForOF13(source, data.getVersion(), data.getDatapathId());
+ return handleSetVlanIdForOF13(source, data);
} else {
- return Collections.singletonList(toFlowModInput(source, data.getVersion(), data.getDatapathId()));
+ return Collections.singletonList(toFlowModInput(source, data));
}
}
}
--- /dev/null
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
+
+public class FlowFlagsConvertor extends Convertor<
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags,
+ FlowModFlags,
+ VersionConvertorData> {
+
+ private static final List<Class<?>> TYPES = Collections.singletonList(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags.class);
+
+
+ /**
+ * Create default empty flow flags
+ * Use this method, if result from converter is empty.
+ */
+ public static FlowModFlags defaultResult() {
+ return new FlowModFlags(
+ FlowConvertor.DEFAULT_OFPFF_CHECK_OVERLAP,
+ FlowConvertor.DEFAULT_OFPFF_NO_BYT_COUNTS,
+ FlowConvertor.DEFAULT_OFPFF_NO_PKT_COUNTS,
+ FlowConvertor.DEFAULT_OFPFF_RESET_COUNTS,
+ FlowConvertor.DEFAULT_OFPFF_FLOW_REM);
+ }
+
+ @Override
+ public Collection<Class<?>> getTypes() {
+ return TYPES;
+ }
+
+ @Override
+ public FlowModFlags convert(final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags source,
+ final VersionConvertorData data) {
+ return new FlowModFlags(
+ source.isCHECKOVERLAP(), source.isNOBYTCOUNTS(), source.isNOPKTCOUNTS(),
+ source.isRESETCOUNTS(), source.isSENDFLOWREM());
+ }
+}
\ No newline at end of file
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
+import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlagsV10;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
-/**
- * add prepared convertors and injectors into given mappings
- *
- * @see FlowFlagReactor
- */
-public class FlowFlagReactorMappingFactory {
-
- /**
- * @param conversionMapping conversion mapping
- */
- public static void addFlowFlagsConvertors(final Map<Short, ConvertReactorConvertor<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags, ?>> conversionMapping) {
- conversionMapping.put(OFConstants.OFP_VERSION_1_3, new FlowFlagsConvertorImpl());
- conversionMapping.put(OFConstants.OFP_VERSION_1_0, new FlowFlagsConvertorV10Impl());
+public class FlowFlagsInjector {
+ @SuppressWarnings("unchecked")
+ public static <FROM, TO> void inject(Optional<FROM> source, TO target, short version) {
+ FROM sourceResult;
+ if (source.isPresent()) {
+ sourceResult = source.get();
+ } else if (version == EncodeConstants.OF10_VERSION_ID) {
+ sourceResult = (FROM) FlowFlagsV10Convertor.defaultResult();
+ } else {
+ sourceResult = (FROM) FlowFlagsConvertor.defaultResult();
+ }
+
+ final Map<ConvertorKey, ResultInjector<?, ?>> injectorMap = new HashMap<>();
+ addInjectors(injectorMap);
+
+ final ResultInjector<FROM, TO> injection = (ResultInjector<FROM, TO>) injectorMap
+ .get(new ConvertorKey(version, target.getClass()));
+
+ injection.inject(sourceResult, target);
}
- /**
- * @param injectionMapping injection mapping
- */
- public static void addFlowFlagsIjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
+ private static void addInjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
// OF-1.3|FlowModFlags --> FlowModInputBuilder
injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, FlowModInputBuilder.class),
new ResultInjector<FlowModFlags, FlowModInputBuilder>() {
target.setFlagsV10(value);
}
});
-
}
-
-}
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlagsV10;
+
+public class FlowFlagsV10Convertor extends Convertor<FlowModFlags, FlowModFlagsV10, VersionConvertorData> {
+ private static final List<Class<?>> TYPES = Collections.singletonList(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags.class);
+ /**
+ * Create default empty flow flags
+ * Use this method, if result from converter is empty.
+ */
+ public static FlowModFlagsV10 defaultResult() {
+ return new FlowModFlagsV10(
+ FlowConvertor.DEFAULT_OFPFF_CHECK_OVERLAP,
+ FlowConvertor.DEFAULT_OFPFF_EMERGENCY,
+ FlowConvertor.DEFAULT_OFPFF_FLOW_REM);
+ }
+
+ @Override
+ public Collection<Class<?>> getTypes() {
+ return TYPES;
+ }
+
+ @Override
+ public FlowModFlagsV10 convert(final FlowModFlags source, final VersionConvertorData data) {
+ return new FlowModFlagsV10(
+ source.isCHECKOVERLAP(), FlowConvertor.DEFAULT_OFPFF_EMERGENCY, source.isSENDFLOWREM());
+ }
+}
\ No newline at end of file
Instructions,
VersionConvertorData> {
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction.class);
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
*/
public class FlowStatsResponseConvertor extends Convertor<List<FlowStats>, List<FlowAndStatisticsMapList>, FlowStatsResponseConvertorData> {
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(FlowStats.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(FlowStats.class);
/**
* Method wraps openflow 1.0 actions list to Apply Action Instructions
}
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
+++ /dev/null
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-
-/**
- * converting from MD-SAL match model into appropriate OF-API match model
- *
- * @param <E> type of converted match
- */
-public interface FlowFlagConvertor<E> extends ConvertReactorConvertor<FlowModFlags, E> {
- /**
- * @param source flow mode flags
- * @param convertorExecutor
- * @return converted match (into OF-API model)
- */
- E convert(FlowModFlags source, ConvertorExecutor convertorExecutor);
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import java.util.Map;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-
-/**
- *
- */
-public class FlowFlagReactor extends ConvertReactor<FlowModFlags> {
-
- private static FlowFlagReactor INSTANCE = new FlowFlagReactor();
-
- private FlowFlagReactor() {
- //NOOP
- }
-
- /**
- * @return singleton
- */
- public static FlowFlagReactor getInstance() {
- return INSTANCE;
- }
-
- @Override
- protected void initMappings(final Map<Short, ConvertReactorConvertor<FlowModFlags, ?>> conversions,
- final Map<ConvertorKey, ResultInjector<?, ?>> injections) {
- FlowFlagReactorMappingFactory.addFlowFlagsConvertors(conversions);
- FlowFlagReactorMappingFactory.addFlowFlagsIjectors(injections);
- }
-
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
-
-/**
- *
- */
-public class FlowFlagsConvertorImpl implements FlowFlagConvertor<FlowModFlags> {
-
- @Override
- public FlowModFlags convert(
- org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags source, ConvertorExecutor convertorExecutor) {
-
- FlowModFlags ofFlowModFlags;
- if (source != null) {
- ofFlowModFlags = new FlowModFlags(
- source.isCHECKOVERLAP(), source.isNOBYTCOUNTS(), source.isNOPKTCOUNTS(),
- source.isRESETCOUNTS(), source.isSENDFLOWREM());
- } else {
- ofFlowModFlags = new FlowModFlags(
- FlowConvertor.DEFAULT_OFPFF_CHECK_OVERLAP,
- FlowConvertor.DEFAULT_OFPFF_NO_BYT_COUNTS,
- FlowConvertor.DEFAULT_OFPFF_NO_PKT_COUNTS,
- FlowConvertor.DEFAULT_OFPFF_RESET_COUNTS,
- FlowConvertor.DEFAULT_OFPFF_FLOW_REM);
- }
-
- return ofFlowModFlags;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlagsV10;
-
-/**
- *
- */
-public class FlowFlagsConvertorV10Impl implements FlowFlagConvertor<FlowModFlagsV10> {
-
- @Override
- public FlowModFlagsV10 convert(
- FlowModFlags source, ConvertorExecutor convertorExecutor) {
-
- FlowModFlagsV10 ofFlowModFlags;
- if (source != null) {
- ofFlowModFlags = new FlowModFlagsV10(
- source.isCHECKOVERLAP(), FlowConvertor.DEFAULT_OFPFF_EMERGENCY, source.isSENDFLOWREM());
- } else {
- ofFlowModFlags = new FlowModFlagsV10(
- FlowConvertor.DEFAULT_OFPFF_CHECK_OVERLAP,
- FlowConvertor.DEFAULT_OFPFF_EMERGENCY,
- FlowConvertor.DEFAULT_OFPFF_FLOW_REM);
- }
-
- return ofFlowModFlags;
- }
-}
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
+import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
+import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
+import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider;
+import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionResolvers;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OFApprovedExperimenterIds;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfArpMatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchArbitraryBitMaskCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchArbitraryBitMaskCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfSctpMatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTcpMatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTunnelIpv4MatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfUdpMatchCase;
+import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.Pbb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainerBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.oxm.container.match.entry.value.experimenter.id._case.TcpFlagsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.experimenter.id._case.ExperimenterBuilder;
+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.ExperimenterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDstBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrcBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4CodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4TypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6CodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.port._case.InPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProtoBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBosBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabelBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTcBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;
/**
- * converting from MD-SAL match model into appropriate OF-API match model
- *
- * @param <E> type of converted match
+ * Utility class for converting a MD-SAL Flow into the OF flow mod
*/
-public interface MatchConvertor<E> extends ConvertReactorConvertor<Match, E> {
+public class MatchConvertor extends Convertor<Match, List<MatchEntry>, VersionConvertorData> {
+ private static final List<Class<?>> TYPES = Arrays.asList(
+ Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.mod.removed.Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.in.message.Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match.class,
+ SetField.class);
+
+ private static final ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData> LAYER3_PROCESSOR = new ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData>()
+ .addCase(new SalToOfIpv4MatchArbitraryBitMaskCase())
+ .addCase(new SalToOfIpv4MatchCase())
+ .addCase(new SalToOfTunnelIpv4MatchCase())
+ .addCase(new SalToOfArpMatchCase())
+ .addCase(new SalToOfIpv6MatchArbitraryBitMaskCase())
+ .addCase(new SalToOfIpv6MatchCase());
+
+ private static final ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData> LAYER4_PROCESSOR = new ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData>()
+ .addCase(new SalToOfTcpMatchCase())
+ .addCase(new SalToOfUdpMatchCase())
+ .addCase(new SalToOfSctpMatchCase());
+
+ private static final byte[] VLAN_VID_MASK = new byte[]{16, 0};
+
+ private static void layer3Match(final List<MatchEntry> matchEntryList, final Layer3Match layer3Match,
+ ConvertorExecutor converterExecutor,
+ final ExtensionConverterProvider extensionConvertorProvider) {
+ java.util.Optional<List<MatchEntry>> result = LAYER3_PROCESSOR.process(layer3Match, converterExecutor
+ );
+
+ if (result.isPresent()) {
+ matchEntryList.addAll(result.get());
+ }
+ }
+
+ private static void layer4Match(final List<MatchEntry> matchEntryList, final Layer4Match layer4Match,
+ ConvertorExecutor converterExecutor, final ExtensionConverterProvider extensionConvertorProvider) {
+ java.util.Optional<List<MatchEntry>> result = LAYER4_PROCESSOR.process(layer4Match, converterExecutor
+ );
+
+ if (result.isPresent()) {
+ matchEntryList.addAll(result.get());
+ }
+ }
+
+ private static void inPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPort) {
+ if (inPort == null) {
+ return;
+ }
+
+ //TODO: currently this matchconverter is mapped to OF1.3 in MatchInjector. Will need to revisit during 1.4+
+ final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPort);
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(InPort.class);
+ InPortCaseBuilder caseBuilder = new InPortCaseBuilder();
+ InPortBuilder portBuilder = new InPortBuilder();
+ portBuilder.setPortNumber(new PortNumber(portNumber));
+ caseBuilder.setInPort(portBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+
+ private static void inPhyPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPhyPort) {
+ if (inPhyPort == null) {
+ return;
+ }
+
+ //TODO: currently this matchconverter is mapped to OF1.3 in MatchInjector. Will need to revisit during 1.4+
+ final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPhyPort);
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(InPhyPort.class);
+ InPhyPortCaseBuilder caseBuilder = new InPhyPortCaseBuilder();
+ InPhyPortBuilder portBuilder = new InPhyPortBuilder();
+ portBuilder.setPortNumber(new PortNumber(portNumber));
+ caseBuilder.setInPhyPort(portBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+
+ private static void metadataMatch(final List<MatchEntry> matchEntryList,
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata) {
+ if (metadata == null) {
+ return;
+ }
+
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ boolean hasmask = metadata.getMetadataMask() != null;
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setOxmMatchField(Metadata.class);
+ MetadataCaseBuilder metadataCaseBuilder = new MetadataCaseBuilder();
+ org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder();
+ metadataBuilder.setMetadata(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadata(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+
+ if (hasmask) {
+ metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadataMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+ }
+
+ metadataCaseBuilder.setMetadata(metadataBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(metadataCaseBuilder.build());
+ matchEntryBuilder.setHasMask(hasmask);
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+
+ private static void tunnelMatch(final List<MatchEntry> matchEntryList,
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel) {
+ if (tunnel == null) {
+ return;
+ }
+
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder();
+ TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder();
+ boolean hasMask = tunnel.getTunnelMask() != null;
+
+ if (hasMask) {
+ tunnelIdBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+ }
+
+ tunnelIdBuilder.setTunnelId(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelId(), OFConstants.SIZE_OF_LONG_IN_BYTES));
+ tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build());
+ matchEntryBuilder.setHasMask(hasMask);
+ matchEntryBuilder.setOxmMatchField(TunnelId.class);
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+
+ private static void protocolMatchFields(final List<MatchEntry> matchEntryList,
+ final ProtocolMatchFields protocolMatchFields) {
+ if (protocolMatchFields == null) {
+ return;
+ }
+
+ if (protocolMatchFields.getMplsLabel() != null) {
+ matchEntryList.add(toOfMplsLabel(protocolMatchFields.getMplsLabel()));
+ }
+
+ if (protocolMatchFields.getMplsBos() != null) {
+ matchEntryList.add(toOfMplsBos(protocolMatchFields.getMplsBos()));
+ }
+
+ if (protocolMatchFields.getMplsTc() != null) {
+ matchEntryList.add(toOfMplsTc(protocolMatchFields.getMplsTc()));
+ }
+
+ if (protocolMatchFields.getPbb() != null) {
+ matchEntryList.add(toOfMplsPbb(protocolMatchFields.getPbb()));
+ }
+ }
+
+ private static void icmpv6Match(final List<MatchEntry> matchEntryList, final Icmpv6Match icmpv6Match) {
+ if (icmpv6Match == null) {
+ return;
+ }
+
+ if (icmpv6Match.getIcmpv6Type() != null) {
+ matchEntryList.add(toOfIcmpv6Type(icmpv6Match.getIcmpv6Type()));
+ }
+
+ if (icmpv6Match.getIcmpv6Code() != null) {
+ matchEntryList.add(toOfIcmpv6Code(icmpv6Match.getIcmpv6Code()));
+ }
+ }
+
+ private static void icmpv4Match(final List<MatchEntry> matchEntryList, final Icmpv4Match icmpv4Match) {
+ if (icmpv4Match == null) {
+ return;
+ }
+
+ if (icmpv4Match.getIcmpv4Type() != null) {
+ matchEntryList.add(toOfIcmpv4Type(icmpv4Match.getIcmpv4Type()));
+ }
+
+ if (icmpv4Match.getIcmpv4Code() != null) {
+ matchEntryList.add(toOfIcmpv4Code(icmpv4Match.getIcmpv4Code()));
+ }
+ }
+
+ private static void ipMatch(final List<MatchEntry> matchEntryList, final IpMatch ipMatch) {
+ if (ipMatch == null) {
+ return;
+ }
+
+ if (ipMatch.getIpDscp() != null) {
+ matchEntryList.add(MatchConvertorUtil.toOfIpDscp(ipMatch.getIpDscp()));
+ }
+
+ if (ipMatch.getIpEcn() != null) {
+ matchEntryList.add(toOfIpEcn(ipMatch.getIpEcn()));
+ }
+
+ if (ipMatch.getIpProtocol() != null) {
+ matchEntryList.add(toOfIpProto(ipMatch.getIpProtocol()));
+ }
+ }
+
+ private static void vlanMatch(final List<MatchEntry> matchEntryList, final VlanMatch vlanMatch) {
+ if (vlanMatch == null) {
+ return;
+ }
+
+ if (vlanMatch.getVlanId() != null) {
+ VlanId vlanId = vlanMatch.getVlanId();
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setOxmMatchField(VlanVid.class);
+ VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
+ VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
+ boolean setCfiBit = false;
+ Integer vidEntryValue = 0;
+ boolean hasmask = false;
+
+ if (Boolean.TRUE.equals(vlanId.isVlanIdPresent())) {
+ setCfiBit = true;
+ if (vlanId.getVlanId() != null) {
+ vidEntryValue = vlanId.getVlanId().getValue();
+ }
+
+ hasmask = vidEntryValue == 0;
+ if (hasmask) {
+ vlanVidBuilder.setMask(VLAN_VID_MASK);
+ }
+ }
+
+ vlanVidBuilder.setCfiBit(setCfiBit);
+ vlanVidBuilder.setVlanVid(vidEntryValue);
+ vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
+ matchEntryBuilder.setHasMask(hasmask);
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+
+ if (vlanMatch.getVlanPcp() != null) {
+ matchEntryList.add(MatchConvertorUtil.toOfVlanPcp(vlanMatch.getVlanPcp()));
+ }
+ }
+
+ private static void ethernetMatch(final List<MatchEntry> matchEntryList, final EthernetMatch ethernetMatch) {
+ if (ethernetMatch == null) {
+ return;
+ }
+
+ EthernetDestination ethernetDestination = ethernetMatch.getEthernetDestination();
+ if (ethernetDestination != null) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setOxmMatchField(EthDst.class);
+ EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder();
+ EthDstBuilder ethDstBuilder = new EthDstBuilder();
+ ethDstBuilder.setMacAddress(ethernetDestination.getAddress());
+ boolean hasMask = ethernetDestination.getMask() != null;
+
+ if (hasMask) {
+ ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetDestination.getMask().getValue()));
+ }
+
+ ethDstCaseBuilder.setEthDst(ethDstBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(ethDstCaseBuilder.build());
+ matchEntryBuilder.setHasMask(hasMask);
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+
+ EthernetSource ethernetSource = ethernetMatch.getEthernetSource();
+ if (ethernetSource != null) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setOxmMatchField(EthSrc.class);
+ EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder();
+ EthSrcBuilder ethDstBuilder = new EthSrcBuilder();
+ ethDstBuilder.setMacAddress(ethernetSource.getAddress());
+ boolean hasMask = ethernetSource.getMask() != null;
+
+ if (hasMask) {
+ ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetSource.getMask().getValue()));
+ }
+
+ ethSrcCaseBuilder.setEthSrc(ethDstBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build());
+ matchEntryBuilder.setHasMask(hasMask);
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+
+ if (ethernetMatch.getEthernetType() != null) {
+ matchEntryList.add(toOfEthernetType(ethernetMatch.getEthernetType()));
+ }
+ }
+
+ private static void tcpFlagsMatch(List<MatchEntry> matchEntryList, TcpFlagsMatch tcpFlagsMatch) {
+ ExperimenterIdCaseBuilder expIdCaseBuilder = new ExperimenterIdCaseBuilder();
+ if (tcpFlagsMatch != null) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(ExperimenterClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(TcpFlags.class);
+
+ TcpFlagsContainerBuilder tcpFlagsContainerBuilder = new TcpFlagsContainerBuilder();
+ TcpFlagsBuilder tcpFlagsBuilder = new TcpFlagsBuilder();
+ tcpFlagsBuilder.setFlags(tcpFlagsMatch.getTcpFlags());
+ if(tcpFlagsMatch.getTcpFlagsMask() != null) {
+ matchEntryBuilder.setHasMask(true);
+ tcpFlagsBuilder.setMask(ByteUtil.unsignedShortToBytes(tcpFlagsMatch.getTcpFlagsMask()));
+ }
+ tcpFlagsContainerBuilder.setTcpFlags(tcpFlagsBuilder.build());
+
+ //Set experimenter ID.
+ ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
+ experimenterBuilder.setExperimenter(new ExperimenterId(OFApprovedExperimenterIds.MATCH_TCP_FLAGS_EXP_ID));
+ expIdCaseBuilder.setExperimenter(experimenterBuilder.build());
+
+ expIdCaseBuilder.addAugmentation(TcpFlagsContainer.class, tcpFlagsContainerBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(expIdCaseBuilder.build());
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+ }
+
+ private static MatchEntry toOfMplsPbb(final Pbb pbb) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ boolean hasmask = pbb.getPbbMask() != null;
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setOxmMatchField(PbbIsid.class);
+ PbbIsidCaseBuilder pbbIsidCaseBuilder = new PbbIsidCaseBuilder();
+ PbbIsidBuilder pbbIsidBuilder = new PbbIsidBuilder();
+ pbbIsidBuilder.setIsid(pbb.getPbbIsid());
+
+ if (hasmask) {
+ pbbIsidBuilder.setMask(ByteUtil.unsignedMediumToBytes(pbb.getPbbMask()));
+ }
+
+ pbbIsidCaseBuilder.setPbbIsid(pbbIsidBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(pbbIsidCaseBuilder.build());
+ matchEntryBuilder.setHasMask(hasmask);
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfMplsTc(final Short mplsTc) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(MplsTc.class);
+ MplsTcCaseBuilder mplsTcCaseBuilder = new MplsTcCaseBuilder();
+ MplsTcBuilder mplsTcBuilder = new MplsTcBuilder();
+ mplsTcBuilder.setTc(mplsTc);
+ mplsTcCaseBuilder.setMplsTc(mplsTcBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(mplsTcCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfMplsBos(final Short mplsBos) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(MplsBos.class);
+ MplsBosCaseBuilder mplsBosCaseBuilder = new MplsBosCaseBuilder();
+ MplsBosBuilder mplsBosBuilder = new MplsBosBuilder();
+ mplsBosBuilder.setBos(mplsBos != 0);
+ mplsBosCaseBuilder.setMplsBos(mplsBosBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(mplsBosCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfMplsLabel(final Long mplsLabel) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(MplsLabel.class);
+ MplsLabelCaseBuilder mplsLabelCaseBuilder = new MplsLabelCaseBuilder();
+ MplsLabelBuilder mplsLabelBuilder = new MplsLabelBuilder();
+ mplsLabelBuilder.setMplsLabel(mplsLabel);
+ mplsLabelCaseBuilder.setMplsLabel(mplsLabelBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(mplsLabelCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfEthernetType(final EthernetType ethernetType) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(EthType.class);
+ EthTypeCaseBuilder ethTypeCaseBuilder = new EthTypeCaseBuilder();
+ EthTypeBuilder ethTypeBuilder = new EthTypeBuilder();
+ EtherType etherType = new EtherType(ethernetType.getType().getValue().intValue());
+ ethTypeBuilder.setEthType(etherType);
+ ethTypeCaseBuilder.setEthType(ethTypeBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(ethTypeCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfIcmpv4Type(final Short icmpv4Type) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(Icmpv4Type.class);
+ Icmpv4TypeCaseBuilder icmpv4TypeCaseBuilder = new Icmpv4TypeCaseBuilder();
+ Icmpv4TypeBuilder icmpv4TypeBuilder = new Icmpv4TypeBuilder();
+ icmpv4TypeBuilder.setIcmpv4Type(icmpv4Type);
+ icmpv4TypeCaseBuilder.setIcmpv4Type(icmpv4TypeBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(icmpv4TypeCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfIcmpv4Code(final Short icmpv4Code) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(Icmpv4Code.class);
+ Icmpv4CodeCaseBuilder icmpv4CodeCaseBuilder = new Icmpv4CodeCaseBuilder();
+ Icmpv4CodeBuilder icmpv4CodeBuilder = new Icmpv4CodeBuilder();
+ icmpv4CodeBuilder.setIcmpv4Code(icmpv4Code);
+ icmpv4CodeCaseBuilder.setIcmpv4Code(icmpv4CodeBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(icmpv4CodeCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfIcmpv6Type(final Short icmpv6Type) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(Icmpv6Type.class);
+ Icmpv6TypeCaseBuilder icmpv6TypeCaseBuilder = new Icmpv6TypeCaseBuilder();
+ Icmpv6TypeBuilder icmpv6TypeBuilder = new Icmpv6TypeBuilder();
+ icmpv6TypeBuilder.setIcmpv6Type(icmpv6Type);
+ icmpv6TypeCaseBuilder.setIcmpv6Type(icmpv6TypeBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(icmpv6TypeCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfIcmpv6Code(final Short icmpv6Code) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(Icmpv6Code.class);
+ Icmpv6CodeCaseBuilder icmpv6CodeCaseBuilder = new Icmpv6CodeCaseBuilder();
+ Icmpv6CodeBuilder icmpv6CodeBuilder = new Icmpv6CodeBuilder();
+ icmpv6CodeBuilder.setIcmpv6Code(icmpv6Code);
+ icmpv6CodeCaseBuilder.setIcmpv6Code(icmpv6CodeBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(icmpv6CodeCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfIpProto(final Short ipProtocol) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(IpProto.class);
+ IpProtoCaseBuilder ipProtoCaseBuilder = new IpProtoCaseBuilder();
+ IpProtoBuilder ipProtoBuilder = new IpProtoBuilder();
+ ipProtoBuilder.setProtocolNumber(ipProtocol);
+ ipProtoCaseBuilder.setIpProto(ipProtoBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(ipProtoCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
+ private static MatchEntry toOfIpEcn(final Short ipEcn) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setHasMask(false);
+ matchEntryBuilder.setOxmMatchField(IpEcn.class);
+ IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
+ IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
+ ipEcnBuilder.setEcn(ipEcn);
+ ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
+ return matchEntryBuilder.build();
+ }
+
/**
- * @param source match input
- * @param convertorExecutor
- * @return converted match (into OF-API model)
+ * Create default empty match entries
+ * Use this method, if result from converter is empty.
*/
- E convert(Match source, ConvertorExecutor convertorExecutor);
+ public static List<MatchEntry> defaultResult() {
+ return FlowConvertor.DEFAULT_MATCH_ENTRIES;
+ }
+
+ @Override
+ public Collection<Class<?>> getTypes() {
+ return TYPES;
+ }
+
+ @Override
+ public List<MatchEntry> convert(final Match source, final VersionConvertorData data) {
+ List<MatchEntry> result = new ArrayList<>();
+
+ if (source == null) {
+ return result;
+ }
+
+ final ExtensionConverterProvider extensionConvertorProvider = OFSessionUtil.getExtensionConvertorProvider();
+
+ inPortMatch(result, source.getInPort());
+ inPhyPortMatch(result, source.getInPhyPort());
+ metadataMatch(result, source.getMetadata());
+ ethernetMatch(result, source.getEthernetMatch());
+ vlanMatch(result, source.getVlanMatch());
+ ipMatch(result, source.getIpMatch());
+ layer4Match(result, source.getLayer4Match(), getConvertorExecutor(), extensionConvertorProvider);
+ icmpv4Match(result, source.getIcmpv4Match());
+ icmpv6Match(result, source.getIcmpv6Match());
+ layer3Match(result, source.getLayer3Match(), getConvertorExecutor(), extensionConvertorProvider);
+ protocolMatchFields(result, source.getProtocolMatchFields());
+ tunnelMatch(result, source.getTunnel());
+ tcpFlagsMatch(result, source.getTcpFlagsMatch());
+
+ /**
+ * TODO: EXTENSION PROPOSAL (source, MD-SAL to OFJava)
+ * - we might need version for conversion and for key
+ */
+ Optional<GeneralExtensionListGrouping> extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(source);
+ if (extensionListOpt.isPresent()) {
+ List<ExtensionList> extensionListList = extensionListOpt.get().getExtensionList();
+ for (ExtensionList extensionItem : extensionListList) {
+ // TODO: get real version
+ ConverterExtensionKey<? extends ExtensionKey> key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3);
+ ConvertorToOFJava<MatchEntry> convertor = extensionConvertorProvider.getConverter(key);
+ if (convertor == null) {
+ throw new IllegalStateException("No converter found for key: " + key.toString());
+ }
+ MatchEntry ofMatch = convertor.convert(extensionItem.getExtension());
+ result.add(ofMatch);
+ }
+ }
+
+ return result;
+ }
}
+
+++ /dev/null
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import org.opendaylight.openflowjava.util.ByteBufUtils;
-import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
-import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
-import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
-import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionResolvers;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OFApprovedExperimenterIds;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorProcessor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfArpMatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchArbitraryBitMaskCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv4MatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchArbitraryBitMaskCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfIpv6MatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfSctpMatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTcpMatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfTunnelIpv4MatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases.SalToOfUdpMatchCase;
-import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
-import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
-import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.Pbb;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainerBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.oxm.container.match.entry.value.experimenter.id._case.TcpFlagsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.experimenter.id._case.ExperimenterBuilder;
-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.ExperimenterId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDstBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrcBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthTypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4CodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4TypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6CodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.port._case.InPortBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProtoBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBosBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabelBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTcBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsidBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelIdBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;
-
-/**
- * Utility class for converting a MD-SAL Flow into the OF flow mod
- */
-public class MatchConvertorImpl implements MatchConvertor<List<MatchEntry>> {
- private static final ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData> LAYER3_PROCESSOR = new ConvertorProcessor<Layer3Match, List<MatchEntry>, VersionConvertorData>()
- .addCase(new SalToOfIpv4MatchArbitraryBitMaskCase())
- .addCase(new SalToOfIpv4MatchCase())
- .addCase(new SalToOfTunnelIpv4MatchCase())
- .addCase(new SalToOfArpMatchCase())
- .addCase(new SalToOfIpv6MatchArbitraryBitMaskCase())
- .addCase(new SalToOfIpv6MatchCase());
-
- private static final ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData> LAYER4_PROCESSOR = new ConvertorProcessor<Layer4Match, List<MatchEntry>, VersionConvertorData>()
- .addCase(new SalToOfTcpMatchCase())
- .addCase(new SalToOfUdpMatchCase())
- .addCase(new SalToOfSctpMatchCase());
-
- private static final byte[] VLAN_VID_MASK = new byte[]{16, 0};
-
- private static void layer3Match(final List<MatchEntry> matchEntryList, final Layer3Match layer3Match, ConvertorExecutor convertorExecutor) {
- java.util.Optional<List<MatchEntry>> result = LAYER3_PROCESSOR.process(layer3Match, convertorExecutor);
-
- if (result.isPresent()) {
- matchEntryList.addAll(result.get());
- }
- }
-
- private static void layer4Match(final List<MatchEntry> matchEntryList, final Layer4Match layer4Match, ConvertorExecutor convertorExecutor) {
- java.util.Optional<List<MatchEntry>> result = LAYER4_PROCESSOR.process(layer4Match, convertorExecutor);
-
- if (result.isPresent()) {
- matchEntryList.addAll(result.get());
- }
- }
-
- private static void inPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPort) {
- if (inPort == null) {
- return;
- }
-
- //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+
- final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPort);
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(InPort.class);
- InPortCaseBuilder caseBuilder = new InPortCaseBuilder();
- InPortBuilder portBuilder = new InPortBuilder();
- portBuilder.setPortNumber(new PortNumber(portNumber));
- caseBuilder.setInPort(portBuilder.build());
- matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
- matchEntryList.add(matchEntryBuilder.build());
- }
-
- private static void inPhyPortMatch(final List<MatchEntry> matchEntryList, NodeConnectorId inPhyPort) {
- if (inPhyPort == null) {
- return;
- }
-
- //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+
- final long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, inPhyPort);
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(InPhyPort.class);
- InPhyPortCaseBuilder caseBuilder = new InPhyPortCaseBuilder();
- InPhyPortBuilder portBuilder = new InPhyPortBuilder();
- portBuilder.setPortNumber(new PortNumber(portNumber));
- caseBuilder.setInPhyPort(portBuilder.build());
- matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
- matchEntryList.add(matchEntryBuilder.build());
- }
-
- private static void metadataMatch(final List<MatchEntry> matchEntryList,
- final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata) {
- if (metadata == null) {
- return;
- }
-
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- boolean hasmask = metadata.getMetadataMask() != null;
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setOxmMatchField(Metadata.class);
- MetadataCaseBuilder metadataCaseBuilder = new MetadataCaseBuilder();
- org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder();
- metadataBuilder.setMetadata(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadata(), OFConstants.SIZE_OF_LONG_IN_BYTES));
-
- if (hasmask) {
- metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadata.getMetadataMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
- }
-
- metadataCaseBuilder.setMetadata(metadataBuilder.build());
- matchEntryBuilder.setMatchEntryValue(metadataCaseBuilder.build());
- matchEntryBuilder.setHasMask(hasmask);
- matchEntryList.add(matchEntryBuilder.build());
- }
-
- private static void tunnelMatch(final List<MatchEntry> matchEntryList,
- final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel) {
- if (tunnel == null) {
- return;
- }
-
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder();
- TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder();
- boolean hasMask = tunnel.getTunnelMask() != null;
-
- if (hasMask) {
- tunnelIdBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
- }
-
- tunnelIdBuilder.setTunnelId(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelId(), OFConstants.SIZE_OF_LONG_IN_BYTES));
- tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build());
- matchEntryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build());
- matchEntryBuilder.setHasMask(hasMask);
- matchEntryBuilder.setOxmMatchField(TunnelId.class);
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryList.add(matchEntryBuilder.build());
- }
-
- private static void protocolMatchFields(final List<MatchEntry> matchEntryList,
- final ProtocolMatchFields protocolMatchFields) {
- if (protocolMatchFields == null) {
- return;
- }
-
- if (protocolMatchFields.getMplsLabel() != null) {
- matchEntryList.add(toOfMplsLabel(protocolMatchFields.getMplsLabel()));
- }
-
- if (protocolMatchFields.getMplsBos() != null) {
- matchEntryList.add(toOfMplsBos(protocolMatchFields.getMplsBos()));
- }
-
- if (protocolMatchFields.getMplsTc() != null) {
- matchEntryList.add(toOfMplsTc(protocolMatchFields.getMplsTc()));
- }
-
- if (protocolMatchFields.getPbb() != null) {
- matchEntryList.add(toOfMplsPbb(protocolMatchFields.getPbb()));
- }
- }
-
- private static void icmpv6Match(final List<MatchEntry> matchEntryList, final Icmpv6Match icmpv6Match) {
- if (icmpv6Match == null) {
- return;
- }
-
- if (icmpv6Match.getIcmpv6Type() != null) {
- matchEntryList.add(toOfIcmpv6Type(icmpv6Match.getIcmpv6Type()));
- }
-
- if (icmpv6Match.getIcmpv6Code() != null) {
- matchEntryList.add(toOfIcmpv6Code(icmpv6Match.getIcmpv6Code()));
- }
- }
-
- private static void icmpv4Match(final List<MatchEntry> matchEntryList, final Icmpv4Match icmpv4Match) {
- if (icmpv4Match == null) {
- return;
- }
-
- if (icmpv4Match.getIcmpv4Type() != null) {
- matchEntryList.add(toOfIcmpv4Type(icmpv4Match.getIcmpv4Type()));
- }
-
- if (icmpv4Match.getIcmpv4Code() != null) {
- matchEntryList.add(toOfIcmpv4Code(icmpv4Match.getIcmpv4Code()));
- }
- }
-
- private static void ipMatch(final List<MatchEntry> matchEntryList, final IpMatch ipMatch) {
- if (ipMatch == null) {
- return;
- }
-
- if (ipMatch.getIpDscp() != null) {
- matchEntryList.add(MatchConvertorUtil.toOfIpDscp(ipMatch.getIpDscp()));
- }
-
- if (ipMatch.getIpEcn() != null) {
- matchEntryList.add(toOfIpEcn(ipMatch.getIpEcn()));
- }
-
- if (ipMatch.getIpProtocol() != null) {
- matchEntryList.add(toOfIpProto(ipMatch.getIpProtocol()));
- }
- }
-
- private static void vlanMatch(final List<MatchEntry> matchEntryList, final VlanMatch vlanMatch) {
- if (vlanMatch == null) {
- return;
- }
-
- if (vlanMatch.getVlanId() != null) {
- VlanId vlanId = vlanMatch.getVlanId();
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setOxmMatchField(VlanVid.class);
- VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
- VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
- boolean setCfiBit = false;
- Integer vidEntryValue = 0;
- boolean hasmask = false;
-
- if (Boolean.TRUE.equals(vlanId.isVlanIdPresent())) {
- setCfiBit = true;
- if (vlanId.getVlanId() != null) {
- vidEntryValue = vlanId.getVlanId().getValue();
- }
-
- hasmask = vidEntryValue == 0;
- if (hasmask) {
- vlanVidBuilder.setMask(VLAN_VID_MASK);
- }
- }
-
- vlanVidBuilder.setCfiBit(setCfiBit);
- vlanVidBuilder.setVlanVid(vidEntryValue);
- vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
- matchEntryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
- matchEntryBuilder.setHasMask(hasmask);
- matchEntryList.add(matchEntryBuilder.build());
- }
-
- if (vlanMatch.getVlanPcp() != null) {
- matchEntryList.add(MatchConvertorUtil.toOfVlanPcp(vlanMatch.getVlanPcp()));
- }
- }
-
- private static void ethernetMatch(final List<MatchEntry> matchEntryList, final EthernetMatch ethernetMatch) {
- if (ethernetMatch == null) {
- return;
- }
-
- EthernetDestination ethernetDestination = ethernetMatch.getEthernetDestination();
- if (ethernetDestination != null) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setOxmMatchField(EthDst.class);
- EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder();
- EthDstBuilder ethDstBuilder = new EthDstBuilder();
- ethDstBuilder.setMacAddress(ethernetDestination.getAddress());
- boolean hasMask = ethernetDestination.getMask() != null;
-
- if (hasMask) {
- ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetDestination.getMask().getValue()));
- }
-
- ethDstCaseBuilder.setEthDst(ethDstBuilder.build());
- matchEntryBuilder.setMatchEntryValue(ethDstCaseBuilder.build());
- matchEntryBuilder.setHasMask(hasMask);
- matchEntryList.add(matchEntryBuilder.build());
- }
-
- EthernetSource ethernetSource = ethernetMatch.getEthernetSource();
- if (ethernetSource != null) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setOxmMatchField(EthSrc.class);
- EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder();
- EthSrcBuilder ethDstBuilder = new EthSrcBuilder();
- ethDstBuilder.setMacAddress(ethernetSource.getAddress());
- boolean hasMask = ethernetSource.getMask() != null;
-
- if (hasMask) {
- ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetSource.getMask().getValue()));
- }
-
- ethSrcCaseBuilder.setEthSrc(ethDstBuilder.build());
- matchEntryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build());
- matchEntryBuilder.setHasMask(hasMask);
- matchEntryList.add(matchEntryBuilder.build());
- }
-
- if (ethernetMatch.getEthernetType() != null) {
- matchEntryList.add(toOfEthernetType(ethernetMatch.getEthernetType()));
- }
- }
-
- private static void tcpFlagsMatch(List<MatchEntry> matchEntryList, TcpFlagsMatch tcpFlagsMatch) {
- ExperimenterIdCaseBuilder expIdCaseBuilder = new ExperimenterIdCaseBuilder();
- if (tcpFlagsMatch != null) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(ExperimenterClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(TcpFlags.class);
-
- TcpFlagsContainerBuilder tcpFlagsContainerBuilder = new TcpFlagsContainerBuilder();
- TcpFlagsBuilder tcpFlagsBuilder = new TcpFlagsBuilder();
- tcpFlagsBuilder.setFlags(tcpFlagsMatch.getTcpFlags());
- if(tcpFlagsMatch.getTcpFlagsMask() != null) {
- matchEntryBuilder.setHasMask(true);
- tcpFlagsBuilder.setMask(ByteUtil.unsignedShortToBytes(tcpFlagsMatch.getTcpFlagsMask()));
- }
- tcpFlagsContainerBuilder.setTcpFlags(tcpFlagsBuilder.build());
-
- //Set experimenter ID.
- ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
- experimenterBuilder.setExperimenter(new ExperimenterId(OFApprovedExperimenterIds.MATCH_TCP_FLAGS_EXP_ID));
- expIdCaseBuilder.setExperimenter(experimenterBuilder.build());
-
- expIdCaseBuilder.addAugmentation(TcpFlagsContainer.class, tcpFlagsContainerBuilder.build());
- matchEntryBuilder.setMatchEntryValue(expIdCaseBuilder.build());
- matchEntryList.add(matchEntryBuilder.build());
- }
- }
-
- private static MatchEntry toOfMplsPbb(final Pbb pbb) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- boolean hasmask = pbb.getPbbMask() != null;
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setOxmMatchField(PbbIsid.class);
- PbbIsidCaseBuilder pbbIsidCaseBuilder = new PbbIsidCaseBuilder();
- PbbIsidBuilder pbbIsidBuilder = new PbbIsidBuilder();
- pbbIsidBuilder.setIsid(pbb.getPbbIsid());
-
- if (hasmask) {
- pbbIsidBuilder.setMask(ByteUtil.unsignedMediumToBytes(pbb.getPbbMask()));
- }
-
- pbbIsidCaseBuilder.setPbbIsid(pbbIsidBuilder.build());
- matchEntryBuilder.setMatchEntryValue(pbbIsidCaseBuilder.build());
- matchEntryBuilder.setHasMask(hasmask);
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfMplsTc(final Short mplsTc) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(MplsTc.class);
- MplsTcCaseBuilder mplsTcCaseBuilder = new MplsTcCaseBuilder();
- MplsTcBuilder mplsTcBuilder = new MplsTcBuilder();
- mplsTcBuilder.setTc(mplsTc);
- mplsTcCaseBuilder.setMplsTc(mplsTcBuilder.build());
- matchEntryBuilder.setMatchEntryValue(mplsTcCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfMplsBos(final Short mplsBos) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(MplsBos.class);
- MplsBosCaseBuilder mplsBosCaseBuilder = new MplsBosCaseBuilder();
- MplsBosBuilder mplsBosBuilder = new MplsBosBuilder();
- mplsBosBuilder.setBos(mplsBos != 0);
- mplsBosCaseBuilder.setMplsBos(mplsBosBuilder.build());
- matchEntryBuilder.setMatchEntryValue(mplsBosCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfMplsLabel(final Long mplsLabel) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(MplsLabel.class);
- MplsLabelCaseBuilder mplsLabelCaseBuilder = new MplsLabelCaseBuilder();
- MplsLabelBuilder mplsLabelBuilder = new MplsLabelBuilder();
- mplsLabelBuilder.setMplsLabel(mplsLabel);
- mplsLabelCaseBuilder.setMplsLabel(mplsLabelBuilder.build());
- matchEntryBuilder.setMatchEntryValue(mplsLabelCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfEthernetType(final EthernetType ethernetType) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(EthType.class);
- EthTypeCaseBuilder ethTypeCaseBuilder = new EthTypeCaseBuilder();
- EthTypeBuilder ethTypeBuilder = new EthTypeBuilder();
- EtherType etherType = new EtherType(ethernetType.getType().getValue().intValue());
- ethTypeBuilder.setEthType(etherType);
- ethTypeCaseBuilder.setEthType(ethTypeBuilder.build());
- matchEntryBuilder.setMatchEntryValue(ethTypeCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfIcmpv4Type(final Short icmpv4Type) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(Icmpv4Type.class);
- Icmpv4TypeCaseBuilder icmpv4TypeCaseBuilder = new Icmpv4TypeCaseBuilder();
- Icmpv4TypeBuilder icmpv4TypeBuilder = new Icmpv4TypeBuilder();
- icmpv4TypeBuilder.setIcmpv4Type(icmpv4Type);
- icmpv4TypeCaseBuilder.setIcmpv4Type(icmpv4TypeBuilder.build());
- matchEntryBuilder.setMatchEntryValue(icmpv4TypeCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfIcmpv4Code(final Short icmpv4Code) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(Icmpv4Code.class);
- Icmpv4CodeCaseBuilder icmpv4CodeCaseBuilder = new Icmpv4CodeCaseBuilder();
- Icmpv4CodeBuilder icmpv4CodeBuilder = new Icmpv4CodeBuilder();
- icmpv4CodeBuilder.setIcmpv4Code(icmpv4Code);
- icmpv4CodeCaseBuilder.setIcmpv4Code(icmpv4CodeBuilder.build());
- matchEntryBuilder.setMatchEntryValue(icmpv4CodeCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfIcmpv6Type(final Short icmpv6Type) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(Icmpv6Type.class);
- Icmpv6TypeCaseBuilder icmpv6TypeCaseBuilder = new Icmpv6TypeCaseBuilder();
- Icmpv6TypeBuilder icmpv6TypeBuilder = new Icmpv6TypeBuilder();
- icmpv6TypeBuilder.setIcmpv6Type(icmpv6Type);
- icmpv6TypeCaseBuilder.setIcmpv6Type(icmpv6TypeBuilder.build());
- matchEntryBuilder.setMatchEntryValue(icmpv6TypeCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfIcmpv6Code(final Short icmpv6Code) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(Icmpv6Code.class);
- Icmpv6CodeCaseBuilder icmpv6CodeCaseBuilder = new Icmpv6CodeCaseBuilder();
- Icmpv6CodeBuilder icmpv6CodeBuilder = new Icmpv6CodeBuilder();
- icmpv6CodeBuilder.setIcmpv6Code(icmpv6Code);
- icmpv6CodeCaseBuilder.setIcmpv6Code(icmpv6CodeBuilder.build());
- matchEntryBuilder.setMatchEntryValue(icmpv6CodeCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfIpProto(final Short ipProtocol) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(IpProto.class);
- IpProtoCaseBuilder ipProtoCaseBuilder = new IpProtoCaseBuilder();
- IpProtoBuilder ipProtoBuilder = new IpProtoBuilder();
- ipProtoBuilder.setProtocolNumber(ipProtocol);
- ipProtoCaseBuilder.setIpProto(ipProtoBuilder.build());
- matchEntryBuilder.setMatchEntryValue(ipProtoCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- private static MatchEntry toOfIpEcn(final Short ipEcn) {
- MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
- matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
- matchEntryBuilder.setHasMask(false);
- matchEntryBuilder.setOxmMatchField(IpEcn.class);
- IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
- IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
- ipEcnBuilder.setEcn(ipEcn);
- ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
- matchEntryBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
- return matchEntryBuilder.build();
- }
-
- @Override
- public List<MatchEntry> convert(final Match match, ConvertorExecutor convertorExecutor) {
- List<MatchEntry> result = new ArrayList<>();
-
- if (match == null) {
- return result;
- }
-
- inPortMatch(result, match.getInPort());
- inPhyPortMatch(result, match.getInPhyPort());
- metadataMatch(result, match.getMetadata());
- ethernetMatch(result, match.getEthernetMatch());
- vlanMatch(result, match.getVlanMatch());
- ipMatch(result, match.getIpMatch());
- layer4Match(result, match.getLayer4Match(), convertorExecutor);
- icmpv4Match(result, match.getIcmpv4Match());
- icmpv6Match(result, match.getIcmpv6Match());
- layer3Match(result, match.getLayer3Match(), convertorExecutor);
- protocolMatchFields(result, match.getProtocolMatchFields());
- tunnelMatch(result, match.getTunnel());
- tcpFlagsMatch(result, match.getTcpFlagsMatch());
-
- /**
- * TODO: EXTENSION PROPOSAL (match, MD-SAL to OFJava)
- * - we might need version for conversion and for key
- */
- Optional<GeneralExtensionListGrouping> extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(match);
- if (extensionListOpt.isPresent()) {
- List<ExtensionList> extensionListList = extensionListOpt.get().getExtensionList();
- for (ExtensionList extensionItem : extensionListList) {
- // TODO: get real version
- ConverterExtensionKey<? extends ExtensionKey> key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3);
- ConvertorToOFJava<MatchEntry> convertor = OFSessionUtil.getExtensionConvertorProvider().getConverter(key);
- if (convertor == null) {
- throw new IllegalStateException("No converter found for key: " + key.toString());
- }
- MatchEntry ofMatch = convertor.convert(extensionItem.getExtension());
- result.add(ofMatch);
- }
- }
-
- return result;
- }
-}
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
-/**
- * add prepared convertors and injectors into given mappings
- *
- * @see MatchReactor
- */
-public class MatchReactorMappingFactory {
+public class MatchInjector {
+ @SuppressWarnings("unchecked")
+ public static <FROM, TO> void inject(Optional<FROM> source, TO target, short version) {
+ FROM sourceResult;
+ if (source.isPresent()) {
+ sourceResult = source.get();
+ } else if (version == EncodeConstants.OF10_VERSION_ID) {
+ sourceResult = (FROM) MatchV10Convertor.defaultResult();
+ } else {
+ sourceResult = (FROM) MatchConvertor.defaultResult();
+ }
+
+ final Map<ConvertorKey, ResultInjector<?, ?>> injectorMap = new HashMap<>();
+ addInjectors(injectorMap);
+
+ final ResultInjector<FROM, TO> injection = (ResultInjector<FROM, TO>) injectorMap
+ .get(new ConvertorKey(version, target.getClass()));
- /**
- * @param conversionMapping conversion mapping
- */
- public static void addMatchConvertors(final Map<Short, ConvertReactorConvertor<Match, ?>> conversionMapping) {
- conversionMapping.put(OFConstants.OFP_VERSION_1_3, new MatchConvertorImpl());
- conversionMapping.put(OFConstants.OFP_VERSION_1_0, new MatchConvertorV10Impl());
+ injection.inject(sourceResult, target);
}
- /**
- * @param injectionMapping injection mapping
- */
- public static void addMatchIjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
+ private static void addInjectors(final Map<ConvertorKey, ResultInjector<?, ?>> injectionMapping) {
// OF-1.3|List<MatchEntries> --> FlowModInputBuilder
injectionMapping.put(new ConvertorKey(OFConstants.OFP_VERSION_1_3, FlowModInputBuilder.class),
new ResultInjector<List<MatchEntry>, FlowModInputBuilder>() {
});
}
- /**
- * @param value pure match
- * @return wrapped match
- */
- public static MatchBuilder wrapMatchV13(final List<MatchEntry> value) {
+ private static MatchBuilder wrapMatchV13(final List<MatchEntry> value) {
MatchBuilder matchBuilder = new MatchBuilder();
matchBuilder.setType(FlowConvertor.DEFAULT_MATCH_TYPE);
if (value == null) {
+++ /dev/null
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
-
-import java.util.Map;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorKey;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ResultInjector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
-
-/**
- *
- */
-public class MatchReactor extends ConvertReactor<Match> {
-
- private static final MatchReactor INSTANCE = new MatchReactor();
-
- private MatchReactor() {
- //NOOP
- }
-
- /**
- * @return singleton
- */
- public static MatchReactor getInstance() {
- return INSTANCE;
- }
-
- @Override
- protected void initMappings(final Map<Short, ConvertReactorConvertor<Match, ?>> conversions,
- final Map<ConvertorKey, ResultInjector<?, ?>> injections) {
- MatchReactorMappingFactory.addMatchConvertors(conversions);
- MatchReactorMappingFactory.addMatchIjectors(injections);
- }
-}
private static final ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData> OF_TO_SAL_TUNNEL_PROCESSOR = new ConvertorProcessor<MatchEntryValue, MatchBuilder, MatchResponseConvertorData>()
.addCase(new OfToSalTunnelIpv4SrcCase())
.addCase(new OfToSalTunnelIpv4DstCase());
- private static final java.util.List<Class<? extends DataContainer>> TYPES = Arrays.asList(Match.class, SetFieldAction.class);
+ private static final java.util.List<Class<?>> TYPES = Arrays.asList(Match.class, SetFieldAction.class);
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Iterator;
+import java.util.List;
import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
import org.opendaylight.openflowplugin.openflow.md.util.ActionUtil;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetField;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10Builder;
/**
- * The type Match convertor v 10.
+ * The type Match converter v 10.
*/
-public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
+public class MatchV10Convertor extends Convertor<Match, MatchV10, VersionConvertorData> {
+
+ private static final List<Class<?>> TYPES = Arrays.asList(
+ Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.mod.removed.Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.in.message.Match.class,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match.class,
+ SetField.class);
/**
* default MAC
}
/**
- * Method builds openflow 1.0 specific match (MatchV10) from MD-SAL match.
- *
- * @param match MD-SAL match
- * @param convertorExecutor
- * @return OF-API match
+ * Create default empty match v10
+ * Use this method, if result from converter is empty.
*/
+ public static MatchV10 defaultResult() {
+ return new MatchV10Builder().build();
+ }
+
+ @Override
+ public Collection<Class<?>> getTypes() {
+ return TYPES;
+ }
+
@Override
- public MatchV10 convert(final Match match, ConvertorExecutor convertorExecutor) {
+ public MatchV10 convert(final Match source, final VersionConvertorData data) {
MatchV10Builder matchBuilder = new MatchV10Builder();
boolean _dLDST = true;
boolean _dLSRC = true;
matchBuilder.setTpSrc(0);
matchBuilder.setTpDst(0);
- if (match != null) {
- EthernetMatch ethernetMatch = match.getEthernetMatch();
+ if (source != null) {
+ EthernetMatch ethernetMatch = source.getEthernetMatch();
if (ethernetMatch != null) {
_dLDST = convertEthernetDlDst(matchBuilder, ethernetMatch);
_dLSRC = convertEthernetDlSrc(matchBuilder, ethernetMatch);
_dLTYPE = convertEthernetDlType(matchBuilder, ethernetMatch);
}
- VlanMatch vlanMatch = match.getVlanMatch();
+ VlanMatch vlanMatch = source.getVlanMatch();
if (vlanMatch != null) {
_dLVLAN = convertDlVlan(matchBuilder, vlanMatch);
_dLVLANPCP = convertDlVlanPcp(matchBuilder, vlanMatch);
}
- NodeConnectorId inPort = match.getInPort();
+ NodeConnectorId inPort = source.getInPort();
if (inPort != null) {
_iNPORT = convertInPortMatch(matchBuilder, inPort);
}
- Layer3Match l3Match = match.getLayer3Match();
+ Layer3Match l3Match = source.getLayer3Match();
if (l3Match != null) {
if (l3Match instanceof Ipv4Match) {
Ipv4Match ipv4 = (Ipv4Match) l3Match;
convertL3Ipv4DstMatch(matchBuilder, ipv4);
}
}
- IpMatch ipMatch = match.getIpMatch();
+ IpMatch ipMatch = source.getIpMatch();
if (ipMatch != null) {
_nWPROTO = convertNwProto(matchBuilder, ipMatch);
_nWTOS = convertNwTos(matchBuilder, ipMatch);
}
- Layer4Match layer4Match = match.getLayer4Match();
+ Layer4Match layer4Match = source.getLayer4Match();
if (layer4Match != null) {
if (layer4Match instanceof TcpMatch) {
TcpMatch tcpMatch = (TcpMatch) layer4Match;
_tPDST = convertL4UdpDstMatch(matchBuilder, udpMatch);
}
} else {
- Icmpv4Match icmpv4Match = match.getIcmpv4Match();
+ Icmpv4Match icmpv4Match = source.getIcmpv4Match();
if (icmpv4Match != null) {
Short type = icmpv4Match.getIcmpv4Type();
if (type != null) {
return matchBuilder.build();
}
-}
+}
\ No newline at end of file
private static final short PROTO_UDP = 17;
private static final short PROTO_ICMPV4 = 1;
private static final String NO_IP = "0.0.0.0/0";
- private static final Set<Class<? extends DataContainer>> TYPES = Collections.singleton(MatchV10.class);
+ private static final Set<Class<?>> TYPES = Collections.singleton(MatchV10.class);
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return TYPES;
}
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
/**
* Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager}
*/
@RunWith(MockitoJUnitRunner.class)
public class ConvertorManagerTest {
- /**
- * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager#registerConvertor(short, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor)}
- * @throws Exception
- */
@Test
public void testRegisterConvertor() throws Exception {
final ConvertorManager convertorManager = new ConvertorManager(OFConstants.OFP_VERSION_1_3)
.registerConvertor(OFConstants.OFP_VERSION_1_3, new Convertor<Action, String, VersionConvertorData>() {
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return Collections.singleton(Action.class);
}
assertTrue("Failed to find convertor for action", convertor.isPresent());
}
- /**
- * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager#convert(org.opendaylight.yangtools.yang.binding.DataContainer, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorData)}
- * @throws Exception
- */
@Test
public void testConvert() throws Exception {
final ConvertorManager convertorManager = new ConvertorManager(OFConstants.OFP_VERSION_1_3)
.registerConvertor(OFConstants.OFP_VERSION_1_3, new Convertor<Action, String, VersionConvertorData>() {
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return Collections.singleton(Action.class);
}
final ConvertorManager convertorManager = new ConvertorManager(OFConstants.OFP_VERSION_1_3)
.registerConvertor(OFConstants.OFP_VERSION_1_3, new Convertor<List<Action>, String, VersionConvertorData>() {
@Override
- public Collection<Class<? extends DataContainer>> getTypes() {
+ public Collection<Class<?>> getTypes() {
return Collections.singleton(Action.class);
}
+++ /dev/null
-/**
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.flowflag;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
-
-/**
- * match conversion and injection test
- */
-public class FlowFlagReactorTest {
-
- private FlowModFlags[] flowFlags;
- private ConvertorManager convertorManager;
-
- /**
- * prepare input match
- */
- @Before
- public void setUp() {
- flowFlags = new FlowModFlags[] {
- new FlowModFlags(true, true, true, true, true),
- new FlowModFlags(false, false, false, false, false),
- new FlowModFlags(true, false, true, false, true)
- };
- convertorManager = ConvertorManagerFactory.createDefaultManager();
- }
-
- /**
- * convert for OF-1.3, inject into {@link FlowModInputBuilder}
- */
- @Test
- public void testMatchConvertorV13_flow() {
- FlowModInputBuilder target = new FlowModInputBuilder();
- for (FlowModFlags fFlag : flowFlags) {
- target.setFlags(null);
- FlowFlagReactor.getInstance().convert(fFlag,
- OFConstants.OFP_VERSION_1_3, target, convertorManager);
- Assert.assertNotNull(target.getFlags());
- }
- }
-
- /**
- * convert for OF-1.0, inject into {@link FlowModInputBuilder}
- */
- @Test
- public void testMatchConvertorV10_flow() {
- FlowModInputBuilder target = new FlowModInputBuilder();
- for (FlowModFlags fFlag : flowFlags) {
- target.setFlagsV10(null);
- FlowFlagReactor.getInstance().convert(fFlag,
- OFConstants.OFP_VERSION_1_0, target, convertorManager);
- Assert.assertNotNull(target.getFlagsV10());
- }
- }
-}
\ No newline at end of file
-/*\r
- * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;\r
-\r
-import java.math.BigInteger;\r
-import java.util.List;\r
-import org.junit.Assert;\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;\r
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase;\r
-\r
-/**\r
- * @author michal.polkorab\r
- */\r
-public class MatchConvertorImpl2Test {\r
-\r
- private static final MatchConvertorImpl convertor = new MatchConvertorImpl();\r
- private ConvertorManager convertorManager;\r
-\r
- /**\r
- * Initializes OpenflowPortsUtil\r
- */\r
- @Before\r
- public void startUp() {\r
- convertorManager = ConvertorManagerFactory.createDefaultManager();\r
- }\r
-\r
- @Test\r
- public void testEmptyAndNullInput() {\r
- MatchBuilder builder = new MatchBuilder();\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(null, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 0, entries.size());\r
-\r
- entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 0, entries.size());\r
- }\r
-\r
- @Test\r
- public void testConversion() {\r
- MatchBuilder builder = new MatchBuilder();\r
- builder.setInPort(new NodeConnectorId("openflow:42:1"));\r
- builder.setInPhyPort(new NodeConnectorId("openflow:42:2"));\r
- MetadataBuilder metadataBuilder = new MetadataBuilder();\r
- metadataBuilder.setMetadata(new BigInteger("3"));\r
- builder.setMetadata(metadataBuilder.build());\r
- EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();\r
- EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();\r
- ethTypeBuilder.setType(new EtherType(4L));\r
- ethernetBuilder.setEthernetType(ethTypeBuilder.build());\r
- EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();\r
- ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
- ethernetBuilder.setEthernetSource(ethSrcBuilder.build());\r
- EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();\r
- ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
- ethernetBuilder.setEthernetDestination(ethDstBuilder.build());\r
- builder.setEthernetMatch(ethernetBuilder.build());\r
- VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();\r
- VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();\r
- vlanIdBuilder.setVlanId(new VlanId(7));\r
- vlanIdBuilder.setVlanIdPresent(true);\r
- vlanBuilder.setVlanId(vlanIdBuilder.build());\r
- vlanBuilder.setVlanPcp(new VlanPcp((short) 7));\r
- builder.setVlanMatch(vlanBuilder.build());\r
- IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();\r
- ipMatchBuilder.setIpDscp(new Dscp((short) 8));\r
- ipMatchBuilder.setIpEcn((short) 9);\r
- ipMatchBuilder.setIpProtocol((short) 10);\r
- builder.setIpMatch(ipMatchBuilder.build());\r
- TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();\r
- tcpMatchBuilder.setTcpSourcePort(new PortNumber(11));\r
- tcpMatchBuilder.setTcpDestinationPort(new PortNumber(12));\r
- builder.setLayer4Match(tcpMatchBuilder.build());\r
- Icmpv4MatchBuilder icmpv4Builder = new Icmpv4MatchBuilder();\r
- icmpv4Builder.setIcmpv4Type((short) 13);\r
- icmpv4Builder.setIcmpv4Code((short) 14);\r
- builder.setIcmpv4Match(icmpv4Builder.build());\r
- Icmpv6MatchBuilder icmpv6Builder = new Icmpv6MatchBuilder();\r
- icmpv6Builder.setIcmpv6Type((short) 15);\r
- icmpv6Builder.setIcmpv6Code((short) 16);\r
- builder.setIcmpv6Match(icmpv6Builder.build());\r
- ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();\r
- protoBuilder.setMplsLabel(17L);\r
- protoBuilder.setMplsTc((short) 18);\r
- protoBuilder.setMplsBos((short) 19);\r
- PbbBuilder pbbBuilder = new PbbBuilder();\r
- pbbBuilder.setPbbIsid(20L);\r
- protoBuilder.setPbb(pbbBuilder.build());\r
- builder.setProtocolMatchFields(protoBuilder.build());\r
- TunnelBuilder tunnelBuilder = new TunnelBuilder();\r
- tunnelBuilder.setTunnelId(new BigInteger("21"));\r
- builder.setTunnel(tunnelBuilder.build());\r
- Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();\r
- ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.1/32"));\r
- ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));\r
- builder.setLayer3Match(ipv4MatchBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 24, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry, InPort.class, false);\r
- Assert.assertEquals("Wrong in port", 1, ((InPortCase) entry.getMatchEntryValue()).getInPort()\r
- .getPortNumber().getValue().intValue());\r
-\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, InPhyPort.class, false);\r
- Assert.assertEquals("Wrong in phy port", 2, ((InPhyPortCase) entry.getMatchEntryValue()).\r
- getInPhyPort().getPortNumber().getValue().intValue());\r
-\r
- entry = entries.get(2);\r
- checkEntryHeader(entry, Metadata.class, false);\r
- Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},\r
- ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());\r
- entry = entries.get(3);\r
- checkEntryHeader(entry, EthDst.class, false);\r
- Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),\r
- ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());\r
- entry = entries.get(4);\r
- checkEntryHeader(entry, EthSrc.class, false);\r
- Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),\r
- ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());\r
- entry = entries.get(5);\r
- checkEntryHeader(entry, EthType.class, false);\r
- Assert.assertEquals("Wrong eth type", 4, ((EthTypeCase) entry.getMatchEntryValue())\r
- .getEthType().getEthType().getValue().intValue());\r
- entry = entries.get(6);\r
- checkEntryHeader(entry, VlanVid.class, false);\r
- Assert.assertEquals("Wrong vlan id", 7, ((VlanVidCase) entry.getMatchEntryValue())\r
- .getVlanVid().getVlanVid().intValue());\r
- Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue())\r
- .getVlanVid().isCfiBit());\r
- entry = entries.get(7);\r
- checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp.class, false);\r
- Assert.assertEquals("Wrong vlan pcp", 7, ((VlanPcpCase) entry.getMatchEntryValue())\r
- .getVlanPcp().getVlanPcp().intValue());\r
- entry = entries.get(8);\r
- checkEntryHeader(entry, IpDscp.class, false);\r
- Assert.assertEquals("Wrong ip dscp", 8, ((IpDscpCase) entry.getMatchEntryValue())\r
- .getIpDscp().getDscp().getValue().intValue());\r
- entry = entries.get(9);\r
- checkEntryHeader(entry, IpEcn.class, false);\r
- Assert.assertEquals("Wrong ip ecn", 9, ((IpEcnCase) entry.getMatchEntryValue())\r
- .getIpEcn().getEcn().intValue());\r
- entry = entries.get(10);\r
- checkEntryHeader(entry, IpProto.class, false);\r
- Assert.assertEquals("Wrong ip proto", 10, ((IpProtoCase) entry.getMatchEntryValue())\r
- .getIpProto().getProtocolNumber().intValue());\r
- entry = entries.get(11);\r
- checkEntryHeader(entry, TcpSrc.class, false);\r
- Assert.assertEquals("Wrong tcp src", 11, ((TcpSrcCase) entry.getMatchEntryValue())\r
- .getTcpSrc().getPort().getValue().intValue());\r
- entry = entries.get(12);\r
- checkEntryHeader(entry, TcpDst.class, false);\r
- Assert.assertEquals("Wrong tcp dst", 12, ((TcpDstCase) entry.getMatchEntryValue())\r
- .getTcpDst().getPort().getValue().intValue());\r
- entry = entries.get(13);\r
- checkEntryHeader(entry, Icmpv4Type.class, false);\r
- Assert.assertEquals("Wrong icmpv4 type", 13, ((Icmpv4TypeCase) entry.getMatchEntryValue())\r
- .getIcmpv4Type().getIcmpv4Type().intValue());\r
- entry = entries.get(14);\r
- checkEntryHeader(entry, Icmpv4Code.class, false);\r
- Assert.assertEquals("Wrong icmpv4 code", 14, ((Icmpv4CodeCase) entry.getMatchEntryValue())\r
- .getIcmpv4Code().getIcmpv4Code().intValue());\r
- entry = entries.get(15);\r
- checkEntryHeader(entry, Icmpv6Type.class, false);\r
- Assert.assertEquals("Wrong icmpv6 type", 15, ((Icmpv6TypeCase) entry.getMatchEntryValue())\r
- .getIcmpv6Type().getIcmpv6Type().intValue());\r
- entry = entries.get(16);\r
- checkEntryHeader(entry, Icmpv6Code.class, false);\r
- Assert.assertEquals("Wrong icmpv6 code", 16, ((Icmpv6CodeCase) entry.getMatchEntryValue())\r
- .getIcmpv6Code().getIcmpv6Code().intValue());\r
- entry = entries.get(17);\r
- checkEntryHeader(entry, Ipv4Src.class, false);\r
- Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue())\r
- .getIpv4Src().getIpv4Address().getValue());\r
- entry = entries.get(18);\r
- checkEntryHeader(entry, Ipv4Dst.class, false);\r
- Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue())\r
- .getIpv4Dst().getIpv4Address().getValue());\r
- entry = entries.get(19);\r
- checkEntryHeader(entry, MplsLabel.class, false);\r
- Assert.assertEquals("Wrong mpls label", 17, ((MplsLabelCase) entry.getMatchEntryValue())\r
- .getMplsLabel().getMplsLabel().intValue());\r
- entry = entries.get(20);\r
- checkEntryHeader(entry, MplsBos.class, false);\r
- Assert.assertEquals("Wrong mpls bos", true, ((MplsBosCase) entry.getMatchEntryValue()).getMplsBos().isBos());\r
- entry = entries.get(21);\r
- checkEntryHeader(entry, MplsTc.class, false);\r
- Assert.assertEquals("Wrong mpls tc", 18, ((MplsTcCase) entry.getMatchEntryValue())\r
- .getMplsTc().getTc().intValue());\r
- entry = entries.get(22);\r
- checkEntryHeader(entry, PbbIsid.class, false);\r
- Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())\r
- .getPbbIsid().getIsid().intValue());\r
- entry = entries.get(23);\r
- checkEntryHeader(entry, TunnelId.class, false);\r
- Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},\r
- ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());\r
- }\r
-\r
- private static void checkEntryHeader(MatchEntry entry, Class<? extends MatchField> field, boolean hasMask) {\r
- Assert.assertEquals("Wrong oxm class", OpenflowBasicClass.class, entry.getOxmClass());\r
- Assert.assertEquals("Wrong oxm field", field, entry.getOxmMatchField());\r
- Assert.assertEquals("Wrong hasMask", hasMask, entry.isHasMask());\r
- }\r
-\r
- @Test\r
- public void testIpv4MatchArbitraryBitMaskwithNoMask(){\r
- MatchBuilder builder = new MatchBuilder();\r
- Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();\r
- ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));\r
- ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));\r
- builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry,Ipv4Src.class,false);\r
- Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry,Ipv4Dst.class,false);\r
- Assert.assertEquals("wrong Ipv4Address destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());\r
- }\r
-\r
- @Test\r
- public void testIpv4MatchArbitraryBitMaskwithMask(){\r
- MatchBuilder builder = new MatchBuilder();\r
- Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();\r
- ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));\r
- ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("0.0.255.0"));\r
- ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));\r
- ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("0.240.0.0"));\r
- builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry,Ipv4Src.class,true);\r
- Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry,Ipv4Dst.class,true);\r
- Assert.assertEquals("wrong Ipv4Adress destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());\r
- }\r
-\r
- @Test\r
- public void testUdpMatchConversion() {\r
- MatchBuilder builder = new MatchBuilder();\r
- UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();\r
- udpMatchBuilder.setUdpSourcePort(new PortNumber(11));\r
- udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));\r
- builder.setLayer4Match(udpMatchBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 2, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry, UdpSrc.class, false);\r
- Assert.assertEquals("Wrong udp src", 11, ((UdpSrcCase) entry.getMatchEntryValue()).getUdpSrc()\r
- .getPort().getValue().intValue());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, UdpDst.class, false);\r
- Assert.assertEquals("Wrong udp dst", 12, ((UdpDstCase) entry.getMatchEntryValue())\r
- .getUdpDst().getPort().getValue().intValue());\r
- }\r
-\r
- @Test\r
- public void testTunnelIpv4MatchConversion() {\r
- MatchBuilder builder = new MatchBuilder();\r
- TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder();\r
- tunnelIpv4MatchBuilder.setTunnelIpv4Source(new Ipv4Prefix("10.0.0.1/32"));\r
- tunnelIpv4MatchBuilder.setTunnelIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));\r
- builder.setLayer3Match(tunnelIpv4MatchBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 2, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry, Ipv4Src.class, false);\r
- Assert.assertEquals("Wrong ipv4 tunnel src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src()\r
- .getIpv4Address().getValue());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, Ipv4Dst.class, false);\r
- Assert.assertEquals("Wrong ipv4 tunnel dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst()\r
- .getIpv4Address().getValue());\r
- }\r
-\r
- @Test\r
- public void testSctpMatchConversion() {\r
- MatchBuilder builder = new MatchBuilder();\r
- SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();\r
- sctpMatchBuilder.setSctpSourcePort(new PortNumber(11));\r
- sctpMatchBuilder.setSctpDestinationPort(new PortNumber(12));\r
- builder.setLayer4Match(sctpMatchBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 2, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry, SctpSrc.class, false);\r
- Assert.assertEquals("Wrong sctp src", 11, ((SctpSrcCase) entry.getMatchEntryValue()).getSctpSrc()\r
- .getPort().getValue().intValue());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, SctpDst.class, false);\r
- Assert.assertEquals("Wrong sctp dst", 12, ((SctpDstCase) entry.getMatchEntryValue())\r
- .getSctpDst().getPort().getValue().intValue());\r
- }\r
-\r
- @Test\r
- public void testArpMatchConversion() {\r
- MatchBuilder builder = new MatchBuilder();\r
- ArpMatchBuilder arpBuilder = new ArpMatchBuilder();\r
- arpBuilder.setArpOp(5);\r
- arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.3/32"));\r
- arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/32"));\r
- ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();\r
- srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
- arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());\r
- ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();\r
- dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
- arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());\r
- builder.setLayer3Match(arpBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 5, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry, ArpOp.class, false);\r
- Assert.assertEquals("Wrong arp op", 5, ((ArpOpCase) entry.getMatchEntryValue())\r
- .getArpOp().getOpCode().intValue());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, ArpSpa.class, false);\r
- Assert.assertEquals("Wrong arp spa", "10.0.0.3", ((ArpSpaCase) entry.getMatchEntryValue())\r
- .getArpSpa().getIpv4Address().getValue());\r
- entry = entries.get(2);\r
- checkEntryHeader(entry, ArpTpa.class, false);\r
- Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue())\r
- .getArpTpa().getIpv4Address().getValue());\r
- entry = entries.get(3);\r
- checkEntryHeader(entry, ArpSha.class, false);\r
- Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())\r
- .getArpSha().getMacAddress().getValue());\r
- entry = entries.get(4);\r
- checkEntryHeader(entry, ArpTha.class, false);\r
- Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue())\r
- .getArpTha().getMacAddress().getValue());\r
- }\r
-\r
- @Test\r
- public void testArpMatchConversionWithMasks() {\r
- MatchBuilder builder = new MatchBuilder();\r
- ArpMatchBuilder arpBuilder = new ArpMatchBuilder();\r
- /* Use canonnical prefixes !!! */\r
- arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.0/8"));\r
- arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/31"));\r
- ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();\r
- srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
- srcHwBuilder.setMask(new MacAddress("00:00:00:00:00:08"));\r
- arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());\r
- ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();\r
- dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
- dstHwBuilder.setMask(new MacAddress("00:00:00:00:00:09"));\r
- arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());\r
- builder.setLayer3Match(arpBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 4, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- entry = entries.get(0);\r
- checkEntryHeader(entry, ArpSpa.class, true);\r
- Assert.assertEquals("Wrong arp spa", "10.0.0.0", ((ArpSpaCase) entry.getMatchEntryValue())\r
- .getArpSpa().getIpv4Address().getValue());\r
- Assert.assertArrayEquals("Wrong arp spa mask", new byte[]{(byte) 255, 0, 0, 0},\r
- ((ArpSpaCase) entry.getMatchEntryValue()).getArpSpa().getMask());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, ArpTpa.class, true);\r
- Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa()\r
- .getIpv4Address().getValue());\r
- Assert.assertArrayEquals("Wrong arp tpa mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 254},\r
- ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa().getMask());\r
- entry = entries.get(2);\r
- checkEntryHeader(entry, ArpSha.class, true);\r
- Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())\r
- .getArpSha().getMacAddress().getValue());\r
- Assert.assertArrayEquals("Wrong arp sha mask", new byte[]{0, 0, 0, 0, 0, 8},\r
- ((ArpShaCase) entry.getMatchEntryValue()).getArpSha().getMask());\r
- entry = entries.get(3);\r
- checkEntryHeader(entry, ArpTha.class, true);\r
- Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue()).getArpTha()\r
- .getMacAddress().getValue());\r
- Assert.assertArrayEquals("Wrong arp tha mask", new byte[]{0, 0, 0, 0, 0, 9},\r
- ((ArpThaCase) entry.getMatchEntryValue()).getArpTha().getMask());\r
- }\r
-\r
- @Test\r
- public void testIpv6MatchConversion() {\r
- MatchBuilder builder = new MatchBuilder();\r
- Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
- ipv6Builder.setIpv6Source(new Ipv6Prefix("::1/128"));\r
- ipv6Builder.setIpv6Destination(new Ipv6Prefix("::2/128"));\r
- Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();\r
- ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(3L));\r
- ipv6Builder.setIpv6Label(ipv6LabelBuilder.build());\r
- ipv6Builder.setIpv6NdTarget(new Ipv6Address("::4"));\r
- ipv6Builder.setIpv6NdSll(new MacAddress("00:00:00:00:00:05"));\r
- ipv6Builder.setIpv6NdTll(new MacAddress("00:00:00:00:00:06"));\r
- Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();\r
- extHdrBuilder.setIpv6Exthdr(153);\r
- ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());\r
- builder.setLayer3Match(ipv6Builder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 7, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- /* Due to conversion ambiguities, we always get "has mask" because \r
- * an ip with no mask and prefix with /128 (or 32 in v4) cannot \r
- * be distinguished */\r
- checkEntryHeader(entry, Ipv6Src.class, true);\r
- Assert.assertEquals("Wrong ipv6 src", "::1",\r
- ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, Ipv6Dst.class, true);\r
- Assert.assertEquals("Wrong ipv6 dst", "::2",\r
- ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());\r
- entry = entries.get(2);\r
- checkEntryHeader(entry, Ipv6Flabel.class, false);\r
- Assert.assertEquals("Wrong ipv6 flabel", 3,\r
- ((Ipv6FlabelCase) entry.getMatchEntryValue()).getIpv6Flabel().getIpv6Flabel().getValue().intValue());\r
- entry = entries.get(3);\r
- checkEntryHeader(entry, Ipv6NdTarget.class, false);\r
- Assert.assertEquals("Wrong ipv6 nd target", "::4",\r
- ((Ipv6NdTargetCase) entry.getMatchEntryValue()).getIpv6NdTarget().getIpv6Address().getValue());\r
- entry = entries.get(4);\r
- checkEntryHeader(entry, Ipv6NdSll.class, false);\r
- Assert.assertEquals("Wrong ipv6 nd sll", "00:00:00:00:00:05",\r
- ((Ipv6NdSllCase) entry.getMatchEntryValue()).getIpv6NdSll().getMacAddress().getValue());\r
- entry = entries.get(5);\r
- checkEntryHeader(entry, Ipv6NdTll.class, false);\r
- Assert.assertEquals("Wrong ipv6 nd tll", "00:00:00:00:00:06",\r
- ((Ipv6NdTllCase) entry.getMatchEntryValue()).getIpv6NdTll().getMacAddress().getValue());\r
- entry = entries.get(6);\r
- checkEntryHeader(entry, Ipv6Exthdr.class, false);\r
- Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(false, true, false, true, false,\r
- true, false, true, false), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());\r
- }\r
-\r
- @Test\r
- public void testIpv6MatchConversionWithMasks() {\r
- MatchBuilder builder = new MatchBuilder();\r
- Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
- ipv6Builder.setIpv6Source(new Ipv6Prefix("::/24"));\r
- ipv6Builder.setIpv6Destination(new Ipv6Prefix("::/64"));\r
- builder.setLayer3Match(ipv6Builder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 2, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry, Ipv6Src.class, true);\r
- Assert.assertEquals("Wrong ipv6 src", "::",\r
- ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());\r
- Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0, 0}, ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getMask());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, Ipv6Dst.class, true);\r
- Assert.assertEquals("Wrong ipv6 dst", "::",\r
- ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());\r
- Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255,\r
- (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0, 0, 0, 0, 0},\r
- ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getMask());\r
- }\r
-\r
- @Test\r
- public void testIpv6ExtHeaderConversion() {\r
- MatchBuilder builder = new MatchBuilder();\r
- Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
- Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();\r
- extHdrBuilder.setIpv6Exthdr(358);\r
- extHdrBuilder.setIpv6ExthdrMask(258);\r
- ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());\r
- builder.setLayer3Match(ipv6Builder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 1, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry, Ipv6Exthdr.class, true);\r
- Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(true, false, true, false, true, false,\r
- true, false, true), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());\r
- Assert.assertArrayEquals("Wrong ipv6 ext hdr mask", new byte[]{1, 2},\r
- ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getMask());\r
- }\r
-\r
- @Test\r
- public void testConversionWithMasks() {\r
- MatchBuilder builder = new MatchBuilder();\r
- MetadataBuilder metadataBuilder = new MetadataBuilder();\r
- metadataBuilder.setMetadata(new BigInteger("3"));\r
- metadataBuilder.setMetadataMask(new BigInteger("15"));\r
- builder.setMetadata(metadataBuilder.build());\r
- EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();\r
- EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();\r
- ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
- ethSrcBuilder.setMask(new MacAddress("00:00:00:00:00:08"));\r
- ethernetBuilder.setEthernetSource(ethSrcBuilder.build());\r
- EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();\r
- ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
- ethDstBuilder.setMask(new MacAddress("00:00:00:00:00:09"));\r
- ethernetBuilder.setEthernetDestination(ethDstBuilder.build());\r
- builder.setEthernetMatch(ethernetBuilder.build());\r
- VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();\r
- VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();\r
- vlanIdBuilder.setVlanId(new VlanId(0));\r
- vlanIdBuilder.setVlanIdPresent(true);\r
- vlanBuilder.setVlanId(vlanIdBuilder.build());\r
- builder.setVlanMatch(vlanBuilder.build());\r
- ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();\r
- PbbBuilder pbbBuilder = new PbbBuilder();\r
- pbbBuilder.setPbbIsid(20L);\r
- pbbBuilder.setPbbMask(8L);\r
- protoBuilder.setPbb(pbbBuilder.build());\r
- builder.setProtocolMatchFields(protoBuilder.build());\r
- TunnelBuilder tunnelBuilder = new TunnelBuilder();\r
- tunnelBuilder.setTunnelId(new BigInteger("21"));\r
- tunnelBuilder.setTunnelMask(new BigInteger("14"));\r
- builder.setTunnel(tunnelBuilder.build());\r
- Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();\r
- ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.0/24"));\r
- ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.0/8"));\r
- builder.setLayer3Match(ipv4MatchBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 8, entries.size());\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry, Metadata.class, true);\r
- Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},\r
- ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());\r
- Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 15},\r
- ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMask());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry, EthDst.class, true);\r
- Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),\r
- ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());\r
- Assert.assertArrayEquals("Wrong eth dst mask", new byte[]{0, 0, 0, 0, 0, 9},\r
- ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMask());\r
- entry = entries.get(2);\r
- checkEntryHeader(entry, EthSrc.class, true);\r
- Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),\r
- ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());\r
- Assert.assertArrayEquals("Wrong eth src mask", new byte[]{0, 0, 0, 0, 0, 8},\r
- ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMask());\r
- entry = entries.get(3);\r
- checkEntryHeader(entry, VlanVid.class, true);\r
- Assert.assertEquals("Wrong vlan id", 0, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()\r
- .getVlanVid().intValue());\r
- Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()\r
- .isCfiBit());\r
- Assert.assertArrayEquals("Wrong vlanId mask", new byte[]{16, 0},\r
- ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid().getMask());\r
- entry = entries.get(4);\r
- checkEntryHeader(entry, Ipv4Src.class, true);\r
- Assert.assertEquals("Wrong ipv4 src", "10.0.0.0", ((Ipv4SrcCase) entry.getMatchEntryValue())\r
- .getIpv4Src().getIpv4Address().getValue());\r
- Assert.assertArrayEquals("Wrong ipv4 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0},\r
- ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getMask());\r
- entry = entries.get(5);\r
- checkEntryHeader(entry, Ipv4Dst.class, true);\r
- Assert.assertEquals("Wrong ipv4 dst", "10.0.0.0", ((Ipv4DstCase) entry.getMatchEntryValue())\r
- .getIpv4Dst().getIpv4Address().getValue());\r
- Assert.assertArrayEquals("Wrong ipv4 dst mask", new byte[]{(byte) 255, 0, 0, 0},\r
- ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getMask());\r
- entry = entries.get(6);\r
- checkEntryHeader(entry, PbbIsid.class, true);\r
- Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())\r
- .getPbbIsid().getIsid().intValue());\r
- Assert.assertArrayEquals("Wrong pbb isid mask", new byte[]{0, 0, 8},\r
- ((PbbIsidCase) entry.getMatchEntryValue()).getPbbIsid().getMask());\r
- entry = entries.get(7);\r
- checkEntryHeader(entry, TunnelId.class, true);\r
- Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},\r
- ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());\r
- Assert.assertArrayEquals("Wrong tunnel id mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 14},\r
- ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getMask());\r
- }\r
-\r
- @Test\r
- public void testIpv6MatchArbitraryBitMask(){\r
- MatchBuilder builder = new MatchBuilder();\r
- Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder= new Ipv6MatchArbitraryBitMaskBuilder();\r
- ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));\r
- ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));\r
- ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));\r
- ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));\r
- builder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());\r
- Match match = builder.build();\r
-\r
- List<MatchEntry> entries = convertor.convert(match, convertorManager);\r
- Assert.assertEquals("Wrong entries size", 2, entries.size());\r
-\r
- MatchEntry entry = entries.get(0);\r
- checkEntryHeader(entry,Ipv6Src.class,true);\r
- Assert.assertEquals("wrong Ipv6Adress source", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());\r
- entry = entries.get(1);\r
- checkEntryHeader(entry,Ipv6Dst.class,true);\r
- Assert.assertEquals("wrong Ipv6Adress destination", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());\r
- }\r
-}\r
+/*
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Optional;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase;
+
+/**
+ * @author michal.polkorab
+ */
+public class MatchConvertorTest {
+
+ private ConvertorManager converterManager;
+
+ /**
+ * Initializes OpenflowPortsUtil
+ */
+ @Before
+ public void startUp() {
+ converterManager = ConvertorManagerFactory.createDefaultManager();
+ }
+
+ @Test
+ public void testConversion() {
+ MatchBuilder builder = new MatchBuilder();
+ builder.setInPort(new NodeConnectorId("openflow:42:1"));
+ builder.setInPhyPort(new NodeConnectorId("openflow:42:2"));
+ MetadataBuilder metadataBuilder = new MetadataBuilder();
+ metadataBuilder.setMetadata(new BigInteger("3"));
+ builder.setMetadata(metadataBuilder.build());
+ EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(4L));
+ ethernetBuilder.setEthernetType(ethTypeBuilder.build());
+ EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
+ ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
+ ethernetBuilder.setEthernetSource(ethSrcBuilder.build());
+ EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
+ ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
+ ethernetBuilder.setEthernetDestination(ethDstBuilder.build());
+ builder.setEthernetMatch(ethernetBuilder.build());
+ VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
+ VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
+ vlanIdBuilder.setVlanId(new VlanId(7));
+ vlanIdBuilder.setVlanIdPresent(true);
+ vlanBuilder.setVlanId(vlanIdBuilder.build());
+ vlanBuilder.setVlanPcp(new VlanPcp((short) 7));
+ builder.setVlanMatch(vlanBuilder.build());
+ IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
+ ipMatchBuilder.setIpDscp(new Dscp((short) 8));
+ ipMatchBuilder.setIpEcn((short) 9);
+ ipMatchBuilder.setIpProtocol((short) 10);
+ builder.setIpMatch(ipMatchBuilder.build());
+ TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
+ tcpMatchBuilder.setTcpSourcePort(new PortNumber(11));
+ tcpMatchBuilder.setTcpDestinationPort(new PortNumber(12));
+ builder.setLayer4Match(tcpMatchBuilder.build());
+ Icmpv4MatchBuilder icmpv4Builder = new Icmpv4MatchBuilder();
+ icmpv4Builder.setIcmpv4Type((short) 13);
+ icmpv4Builder.setIcmpv4Code((short) 14);
+ builder.setIcmpv4Match(icmpv4Builder.build());
+ Icmpv6MatchBuilder icmpv6Builder = new Icmpv6MatchBuilder();
+ icmpv6Builder.setIcmpv6Type((short) 15);
+ icmpv6Builder.setIcmpv6Code((short) 16);
+ builder.setIcmpv6Match(icmpv6Builder.build());
+ ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();
+ protoBuilder.setMplsLabel(17L);
+ protoBuilder.setMplsTc((short) 18);
+ protoBuilder.setMplsBos((short) 19);
+ PbbBuilder pbbBuilder = new PbbBuilder();
+ pbbBuilder.setPbbIsid(20L);
+ protoBuilder.setPbb(pbbBuilder.build());
+ builder.setProtocolMatchFields(protoBuilder.build());
+ TunnelBuilder tunnelBuilder = new TunnelBuilder();
+ tunnelBuilder.setTunnelId(new BigInteger("21"));
+ builder.setTunnel(tunnelBuilder.build());
+ Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
+ ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.1/32"));
+ ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));
+ builder.setLayer3Match(ipv4MatchBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 24, entries.size());
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry, InPort.class, false);
+ Assert.assertEquals("Wrong in port", 1, ((InPortCase) entry.getMatchEntryValue()).getInPort()
+ .getPortNumber().getValue().intValue());
+
+ entry = entries.get(1);
+ checkEntryHeader(entry, InPhyPort.class, false);
+ Assert.assertEquals("Wrong in phy port", 2, ((InPhyPortCase) entry.getMatchEntryValue()).
+ getInPhyPort().getPortNumber().getValue().intValue());
+
+ entry = entries.get(2);
+ checkEntryHeader(entry, Metadata.class, false);
+ Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
+ ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());
+ entry = entries.get(3);
+ checkEntryHeader(entry, EthDst.class, false);
+ Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),
+ ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());
+ entry = entries.get(4);
+ checkEntryHeader(entry, EthSrc.class, false);
+ Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),
+ ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());
+ entry = entries.get(5);
+ checkEntryHeader(entry, EthType.class, false);
+ Assert.assertEquals("Wrong eth type", 4, ((EthTypeCase) entry.getMatchEntryValue())
+ .getEthType().getEthType().getValue().intValue());
+ entry = entries.get(6);
+ checkEntryHeader(entry, VlanVid.class, false);
+ Assert.assertEquals("Wrong vlan id", 7, ((VlanVidCase) entry.getMatchEntryValue())
+ .getVlanVid().getVlanVid().intValue());
+ Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue())
+ .getVlanVid().isCfiBit());
+ entry = entries.get(7);
+ checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp.class, false);
+ Assert.assertEquals("Wrong vlan pcp", 7, ((VlanPcpCase) entry.getMatchEntryValue())
+ .getVlanPcp().getVlanPcp().intValue());
+ entry = entries.get(8);
+ checkEntryHeader(entry, IpDscp.class, false);
+ Assert.assertEquals("Wrong ip dscp", 8, ((IpDscpCase) entry.getMatchEntryValue())
+ .getIpDscp().getDscp().getValue().intValue());
+ entry = entries.get(9);
+ checkEntryHeader(entry, IpEcn.class, false);
+ Assert.assertEquals("Wrong ip ecn", 9, ((IpEcnCase) entry.getMatchEntryValue())
+ .getIpEcn().getEcn().intValue());
+ entry = entries.get(10);
+ checkEntryHeader(entry, IpProto.class, false);
+ Assert.assertEquals("Wrong ip proto", 10, ((IpProtoCase) entry.getMatchEntryValue())
+ .getIpProto().getProtocolNumber().intValue());
+ entry = entries.get(11);
+ checkEntryHeader(entry, TcpSrc.class, false);
+ Assert.assertEquals("Wrong tcp src", 11, ((TcpSrcCase) entry.getMatchEntryValue())
+ .getTcpSrc().getPort().getValue().intValue());
+ entry = entries.get(12);
+ checkEntryHeader(entry, TcpDst.class, false);
+ Assert.assertEquals("Wrong tcp dst", 12, ((TcpDstCase) entry.getMatchEntryValue())
+ .getTcpDst().getPort().getValue().intValue());
+ entry = entries.get(13);
+ checkEntryHeader(entry, Icmpv4Type.class, false);
+ Assert.assertEquals("Wrong icmpv4 type", 13, ((Icmpv4TypeCase) entry.getMatchEntryValue())
+ .getIcmpv4Type().getIcmpv4Type().intValue());
+ entry = entries.get(14);
+ checkEntryHeader(entry, Icmpv4Code.class, false);
+ Assert.assertEquals("Wrong icmpv4 code", 14, ((Icmpv4CodeCase) entry.getMatchEntryValue())
+ .getIcmpv4Code().getIcmpv4Code().intValue());
+ entry = entries.get(15);
+ checkEntryHeader(entry, Icmpv6Type.class, false);
+ Assert.assertEquals("Wrong icmpv6 type", 15, ((Icmpv6TypeCase) entry.getMatchEntryValue())
+ .getIcmpv6Type().getIcmpv6Type().intValue());
+ entry = entries.get(16);
+ checkEntryHeader(entry, Icmpv6Code.class, false);
+ Assert.assertEquals("Wrong icmpv6 code", 16, ((Icmpv6CodeCase) entry.getMatchEntryValue())
+ .getIcmpv6Code().getIcmpv6Code().intValue());
+ entry = entries.get(17);
+ checkEntryHeader(entry, Ipv4Src.class, false);
+ Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue())
+ .getIpv4Src().getIpv4Address().getValue());
+ entry = entries.get(18);
+ checkEntryHeader(entry, Ipv4Dst.class, false);
+ Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue())
+ .getIpv4Dst().getIpv4Address().getValue());
+ entry = entries.get(19);
+ checkEntryHeader(entry, MplsLabel.class, false);
+ Assert.assertEquals("Wrong mpls label", 17, ((MplsLabelCase) entry.getMatchEntryValue())
+ .getMplsLabel().getMplsLabel().intValue());
+ entry = entries.get(20);
+ checkEntryHeader(entry, MplsBos.class, false);
+ Assert.assertEquals("Wrong mpls bos", true, ((MplsBosCase) entry.getMatchEntryValue()).getMplsBos().isBos());
+ entry = entries.get(21);
+ checkEntryHeader(entry, MplsTc.class, false);
+ Assert.assertEquals("Wrong mpls tc", 18, ((MplsTcCase) entry.getMatchEntryValue())
+ .getMplsTc().getTc().intValue());
+ entry = entries.get(22);
+ checkEntryHeader(entry, PbbIsid.class, false);
+ Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())
+ .getPbbIsid().getIsid().intValue());
+ entry = entries.get(23);
+ checkEntryHeader(entry, TunnelId.class, false);
+ Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},
+ ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());
+ }
+
+ private static void checkEntryHeader(MatchEntry entry, Class<? extends MatchField> field, boolean hasMask) {
+ Assert.assertEquals("Wrong oxm class", OpenflowBasicClass.class, entry.getOxmClass());
+ Assert.assertEquals("Wrong oxm field", field, entry.getOxmMatchField());
+ Assert.assertEquals("Wrong hasMask", hasMask, entry.isHasMask());
+ }
+
+ @Test
+ public void testIpv4MatchArbitraryBitMaskwithNoMask(){
+ MatchBuilder builder = new MatchBuilder();
+ Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();
+ ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));
+ ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));
+ builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 2, entries.size());
+
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry,Ipv4Src.class,false);
+ Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());
+ entry = entries.get(1);
+ checkEntryHeader(entry,Ipv4Dst.class,false);
+ Assert.assertEquals("wrong Ipv4Address destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());
+ }
+
+ @Test
+ public void testIpv4MatchArbitraryBitMaskwithMask(){
+ MatchBuilder builder = new MatchBuilder();
+ Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();
+ ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));
+ ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("0.0.255.0"));
+ ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));
+ ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("0.240.0.0"));
+ builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 2, entries.size());
+
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry,Ipv4Src.class,true);
+ Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());
+ entry = entries.get(1);
+ checkEntryHeader(entry,Ipv4Dst.class,true);
+ Assert.assertEquals("wrong Ipv4Adress destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());
+ }
+
+ @Test
+ public void testUdpMatchConversion() {
+ MatchBuilder builder = new MatchBuilder();
+ UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
+ udpMatchBuilder.setUdpSourcePort(new PortNumber(11));
+ udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));
+ builder.setLayer4Match(udpMatchBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 2, entries.size());
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry, UdpSrc.class, false);
+ Assert.assertEquals("Wrong udp src", 11, ((UdpSrcCase) entry.getMatchEntryValue()).getUdpSrc()
+ .getPort().getValue().intValue());
+ entry = entries.get(1);
+ checkEntryHeader(entry, UdpDst.class, false);
+ Assert.assertEquals("Wrong udp dst", 12, ((UdpDstCase) entry.getMatchEntryValue())
+ .getUdpDst().getPort().getValue().intValue());
+ }
+
+ @Test
+ public void testTunnelIpv4MatchConversion() {
+ MatchBuilder builder = new MatchBuilder();
+ TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder();
+ tunnelIpv4MatchBuilder.setTunnelIpv4Source(new Ipv4Prefix("10.0.0.1/32"));
+ tunnelIpv4MatchBuilder.setTunnelIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));
+ builder.setLayer3Match(tunnelIpv4MatchBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 2, entries.size());
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry, Ipv4Src.class, false);
+ Assert.assertEquals("Wrong ipv4 tunnel src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src()
+ .getIpv4Address().getValue());
+ entry = entries.get(1);
+ checkEntryHeader(entry, Ipv4Dst.class, false);
+ Assert.assertEquals("Wrong ipv4 tunnel dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst()
+ .getIpv4Address().getValue());
+ }
+
+ @Test
+ public void testSctpMatchConversion() {
+ MatchBuilder builder = new MatchBuilder();
+ SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
+ sctpMatchBuilder.setSctpSourcePort(new PortNumber(11));
+ sctpMatchBuilder.setSctpDestinationPort(new PortNumber(12));
+ builder.setLayer4Match(sctpMatchBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 2, entries.size());
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry, SctpSrc.class, false);
+ Assert.assertEquals("Wrong sctp src", 11, ((SctpSrcCase) entry.getMatchEntryValue()).getSctpSrc()
+ .getPort().getValue().intValue());
+ entry = entries.get(1);
+ checkEntryHeader(entry, SctpDst.class, false);
+ Assert.assertEquals("Wrong sctp dst", 12, ((SctpDstCase) entry.getMatchEntryValue())
+ .getSctpDst().getPort().getValue().intValue());
+ }
+
+ @Test
+ public void testArpMatchConversion() {
+ MatchBuilder builder = new MatchBuilder();
+ ArpMatchBuilder arpBuilder = new ArpMatchBuilder();
+ arpBuilder.setArpOp(5);
+ arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.3/32"));
+ arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/32"));
+ ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();
+ srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
+ arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());
+ ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();
+ dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
+ arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());
+ builder.setLayer3Match(arpBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 5, entries.size());
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry, ArpOp.class, false);
+ Assert.assertEquals("Wrong arp op", 5, ((ArpOpCase) entry.getMatchEntryValue())
+ .getArpOp().getOpCode().intValue());
+ entry = entries.get(1);
+ checkEntryHeader(entry, ArpSpa.class, false);
+ Assert.assertEquals("Wrong arp spa", "10.0.0.3", ((ArpSpaCase) entry.getMatchEntryValue())
+ .getArpSpa().getIpv4Address().getValue());
+ entry = entries.get(2);
+ checkEntryHeader(entry, ArpTpa.class, false);
+ Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue())
+ .getArpTpa().getIpv4Address().getValue());
+ entry = entries.get(3);
+ checkEntryHeader(entry, ArpSha.class, false);
+ Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())
+ .getArpSha().getMacAddress().getValue());
+ entry = entries.get(4);
+ checkEntryHeader(entry, ArpTha.class, false);
+ Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue())
+ .getArpTha().getMacAddress().getValue());
+ }
+
+ @Test
+ public void testArpMatchConversionWithMasks() {
+ MatchBuilder builder = new MatchBuilder();
+ ArpMatchBuilder arpBuilder = new ArpMatchBuilder();
+ /* Use canonnical prefixes !!! */
+ arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.0/8"));
+ arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/31"));
+ ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();
+ srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
+ srcHwBuilder.setMask(new MacAddress("00:00:00:00:00:08"));
+ arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());
+ ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();
+ dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
+ dstHwBuilder.setMask(new MacAddress("00:00:00:00:00:09"));
+ arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());
+ builder.setLayer3Match(arpBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 4, entries.size());
+ MatchEntry entry = entries.get(0);
+ entry = entries.get(0);
+ checkEntryHeader(entry, ArpSpa.class, true);
+ Assert.assertEquals("Wrong arp spa", "10.0.0.0", ((ArpSpaCase) entry.getMatchEntryValue())
+ .getArpSpa().getIpv4Address().getValue());
+ Assert.assertArrayEquals("Wrong arp spa mask", new byte[]{(byte) 255, 0, 0, 0},
+ ((ArpSpaCase) entry.getMatchEntryValue()).getArpSpa().getMask());
+ entry = entries.get(1);
+ checkEntryHeader(entry, ArpTpa.class, true);
+ Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa()
+ .getIpv4Address().getValue());
+ Assert.assertArrayEquals("Wrong arp tpa mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 254},
+ ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa().getMask());
+ entry = entries.get(2);
+ checkEntryHeader(entry, ArpSha.class, true);
+ Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())
+ .getArpSha().getMacAddress().getValue());
+ Assert.assertArrayEquals("Wrong arp sha mask", new byte[]{0, 0, 0, 0, 0, 8},
+ ((ArpShaCase) entry.getMatchEntryValue()).getArpSha().getMask());
+ entry = entries.get(3);
+ checkEntryHeader(entry, ArpTha.class, true);
+ Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue()).getArpTha()
+ .getMacAddress().getValue());
+ Assert.assertArrayEquals("Wrong arp tha mask", new byte[]{0, 0, 0, 0, 0, 9},
+ ((ArpThaCase) entry.getMatchEntryValue()).getArpTha().getMask());
+ }
+
+ @Test
+ public void testIpv6MatchConversion() {
+ MatchBuilder builder = new MatchBuilder();
+ Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
+ ipv6Builder.setIpv6Source(new Ipv6Prefix("::1/128"));
+ ipv6Builder.setIpv6Destination(new Ipv6Prefix("::2/128"));
+ Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();
+ ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(3L));
+ ipv6Builder.setIpv6Label(ipv6LabelBuilder.build());
+ ipv6Builder.setIpv6NdTarget(new Ipv6Address("::4"));
+ ipv6Builder.setIpv6NdSll(new MacAddress("00:00:00:00:00:05"));
+ ipv6Builder.setIpv6NdTll(new MacAddress("00:00:00:00:00:06"));
+ Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();
+ extHdrBuilder.setIpv6Exthdr(153);
+ ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());
+ builder.setLayer3Match(ipv6Builder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 7, entries.size());
+ MatchEntry entry = entries.get(0);
+ /* Due to conversion ambiguities, we always get "has mask" because
+ * an ip with no mask and prefix with /128 (or 32 in v4) cannot
+ * be distinguished */
+ checkEntryHeader(entry, Ipv6Src.class, true);
+ Assert.assertEquals("Wrong ipv6 src", "::1",
+ ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
+ entry = entries.get(1);
+ checkEntryHeader(entry, Ipv6Dst.class, true);
+ Assert.assertEquals("Wrong ipv6 dst", "::2",
+ ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
+ entry = entries.get(2);
+ checkEntryHeader(entry, Ipv6Flabel.class, false);
+ Assert.assertEquals("Wrong ipv6 flabel", 3,
+ ((Ipv6FlabelCase) entry.getMatchEntryValue()).getIpv6Flabel().getIpv6Flabel().getValue().intValue());
+ entry = entries.get(3);
+ checkEntryHeader(entry, Ipv6NdTarget.class, false);
+ Assert.assertEquals("Wrong ipv6 nd target", "::4",
+ ((Ipv6NdTargetCase) entry.getMatchEntryValue()).getIpv6NdTarget().getIpv6Address().getValue());
+ entry = entries.get(4);
+ checkEntryHeader(entry, Ipv6NdSll.class, false);
+ Assert.assertEquals("Wrong ipv6 nd sll", "00:00:00:00:00:05",
+ ((Ipv6NdSllCase) entry.getMatchEntryValue()).getIpv6NdSll().getMacAddress().getValue());
+ entry = entries.get(5);
+ checkEntryHeader(entry, Ipv6NdTll.class, false);
+ Assert.assertEquals("Wrong ipv6 nd tll", "00:00:00:00:00:06",
+ ((Ipv6NdTllCase) entry.getMatchEntryValue()).getIpv6NdTll().getMacAddress().getValue());
+ entry = entries.get(6);
+ checkEntryHeader(entry, Ipv6Exthdr.class, false);
+ Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(false, true, false, true, false,
+ true, false, true, false), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());
+ }
+
+ @Test
+ public void testIpv6MatchConversionWithMasks() {
+ MatchBuilder builder = new MatchBuilder();
+ Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
+ ipv6Builder.setIpv6Source(new Ipv6Prefix("::/24"));
+ ipv6Builder.setIpv6Destination(new Ipv6Prefix("::/64"));
+ builder.setLayer3Match(ipv6Builder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 2, entries.size());
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry, Ipv6Src.class, true);
+ Assert.assertEquals("Wrong ipv6 src", "::",
+ ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
+ Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0}, ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getMask());
+ entry = entries.get(1);
+ checkEntryHeader(entry, Ipv6Dst.class, true);
+ Assert.assertEquals("Wrong ipv6 dst", "::",
+ ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
+ Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255,
+ (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0, 0, 0, 0, 0},
+ ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getMask());
+ }
+
+ @Test
+ public void testIpv6ExtHeaderConversion() {
+ MatchBuilder builder = new MatchBuilder();
+ Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
+ Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();
+ extHdrBuilder.setIpv6Exthdr(358);
+ extHdrBuilder.setIpv6ExthdrMask(258);
+ ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());
+ builder.setLayer3Match(ipv6Builder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 1, entries.size());
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry, Ipv6Exthdr.class, true);
+ Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(true, false, true, false, true, false,
+ true, false, true), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());
+ Assert.assertArrayEquals("Wrong ipv6 ext hdr mask", new byte[]{1, 2},
+ ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getMask());
+ }
+
+ @Test
+ public void testConversionWithMasks() {
+ MatchBuilder builder = new MatchBuilder();
+ MetadataBuilder metadataBuilder = new MetadataBuilder();
+ metadataBuilder.setMetadata(new BigInteger("3"));
+ metadataBuilder.setMetadataMask(new BigInteger("15"));
+ builder.setMetadata(metadataBuilder.build());
+ EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();
+ EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
+ ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
+ ethSrcBuilder.setMask(new MacAddress("00:00:00:00:00:08"));
+ ethernetBuilder.setEthernetSource(ethSrcBuilder.build());
+ EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
+ ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
+ ethDstBuilder.setMask(new MacAddress("00:00:00:00:00:09"));
+ ethernetBuilder.setEthernetDestination(ethDstBuilder.build());
+ builder.setEthernetMatch(ethernetBuilder.build());
+ VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
+ VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
+ vlanIdBuilder.setVlanId(new VlanId(0));
+ vlanIdBuilder.setVlanIdPresent(true);
+ vlanBuilder.setVlanId(vlanIdBuilder.build());
+ builder.setVlanMatch(vlanBuilder.build());
+ ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();
+ PbbBuilder pbbBuilder = new PbbBuilder();
+ pbbBuilder.setPbbIsid(20L);
+ pbbBuilder.setPbbMask(8L);
+ protoBuilder.setPbb(pbbBuilder.build());
+ builder.setProtocolMatchFields(protoBuilder.build());
+ TunnelBuilder tunnelBuilder = new TunnelBuilder();
+ tunnelBuilder.setTunnelId(new BigInteger("21"));
+ tunnelBuilder.setTunnelMask(new BigInteger("14"));
+ builder.setTunnel(tunnelBuilder.build());
+ Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
+ ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.0/24"));
+ ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.0/8"));
+ builder.setLayer3Match(ipv4MatchBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 8, entries.size());
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry, Metadata.class, true);
+ Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
+ ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());
+ Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 15},
+ ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMask());
+ entry = entries.get(1);
+ checkEntryHeader(entry, EthDst.class, true);
+ Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),
+ ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());
+ Assert.assertArrayEquals("Wrong eth dst mask", new byte[]{0, 0, 0, 0, 0, 9},
+ ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMask());
+ entry = entries.get(2);
+ checkEntryHeader(entry, EthSrc.class, true);
+ Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),
+ ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());
+ Assert.assertArrayEquals("Wrong eth src mask", new byte[]{0, 0, 0, 0, 0, 8},
+ ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMask());
+ entry = entries.get(3);
+ checkEntryHeader(entry, VlanVid.class, true);
+ Assert.assertEquals("Wrong vlan id", 0, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()
+ .getVlanVid().intValue());
+ Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()
+ .isCfiBit());
+ Assert.assertArrayEquals("Wrong vlanId mask", new byte[]{16, 0},
+ ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid().getMask());
+ entry = entries.get(4);
+ checkEntryHeader(entry, Ipv4Src.class, true);
+ Assert.assertEquals("Wrong ipv4 src", "10.0.0.0", ((Ipv4SrcCase) entry.getMatchEntryValue())
+ .getIpv4Src().getIpv4Address().getValue());
+ Assert.assertArrayEquals("Wrong ipv4 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0},
+ ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getMask());
+ entry = entries.get(5);
+ checkEntryHeader(entry, Ipv4Dst.class, true);
+ Assert.assertEquals("Wrong ipv4 dst", "10.0.0.0", ((Ipv4DstCase) entry.getMatchEntryValue())
+ .getIpv4Dst().getIpv4Address().getValue());
+ Assert.assertArrayEquals("Wrong ipv4 dst mask", new byte[]{(byte) 255, 0, 0, 0},
+ ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getMask());
+ entry = entries.get(6);
+ checkEntryHeader(entry, PbbIsid.class, true);
+ Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())
+ .getPbbIsid().getIsid().intValue());
+ Assert.assertArrayEquals("Wrong pbb isid mask", new byte[]{0, 0, 8},
+ ((PbbIsidCase) entry.getMatchEntryValue()).getPbbIsid().getMask());
+ entry = entries.get(7);
+ checkEntryHeader(entry, TunnelId.class, true);
+ Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},
+ ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());
+ Assert.assertArrayEquals("Wrong tunnel id mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 14},
+ ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getMask());
+ }
+
+ @Test
+ public void testIpv6MatchArbitraryBitMask(){
+ MatchBuilder builder = new MatchBuilder();
+ Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder= new Ipv6MatchArbitraryBitMaskBuilder();
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));
+ builder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
+ Match match = builder.build();
+
+ Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
+ List<MatchEntry> entries = entriesOptional.get();
+ Assert.assertEquals("Wrong entries size", 2, entries.size());
+
+ MatchEntry entry = entries.get(0);
+ checkEntryHeader(entry,Ipv6Src.class,true);
+ Assert.assertEquals("wrong Ipv6Adress source", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
+ entry = entries.get(1);
+ checkEntryHeader(entry,Ipv6Dst.class,true);
+ Assert.assertEquals("wrong Ipv6Adress destination", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
+ }
+}
+
import static org.junit.Assert.assertEquals;
import java.math.BigInteger;
+import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
+import org.opendaylight.openflowplugin.api.OFConstants;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpVersion;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
/**
* Created by Martin Bobak mbobak@cisco.com on 8/30/14.
*/
-public class MatchConvertorV10ImplTest {
+public class MatchConvertorV10Test {
- private static final MatchConvertorV10Impl matchConvertorV10 = new MatchConvertorV10Impl();
+ private static final MatchV10Convertor matchConvertorV10 = new MatchV10Convertor();
private static final BigInteger dataPathId = BigInteger.TEN;
private static final long ETH_TYPE_802_3 = 0x0000;
private static final MacAddress ZERO_MAC = MacAddress.getDefaultInstance("00:00:00:00:00:00");
private static final VlanId DEFAULT_VLAN_ID = new VlanId(42);
private static final Ipv4Address DEFAULT_IPV4_ADDRESS = new Ipv4Address("10.0.0.1");
private static final short DEFAULT_MASK = 24;
- private ConvertorManager convertorManager;
+ private ConvertorManager converterManager;
@Before
public void setup() {
- convertorManager = ConvertorManagerFactory.createDefaultManager();
+ converterManager = ConvertorManagerFactory.createDefaultManager();
}
@Test
- /**
- * Test method for {@link MatchConvertorV10Impl#convert(Match,BigInteger)}
- */
public void testConvert() {
- MatchV10 matchV10 = matchConvertorV10.convert(createL4UdpMatch().build(), null);
+
+ Optional<MatchV10> matchV10Optional = converterManager.convert(createL4UdpMatch().build(),
+ new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+ MatchV10 matchV10 = matchV10Optional.get();
assertEquals(ZERO_MAC, matchV10.getDlDst());
assertEquals(FF_MAC, matchV10.getDlSrc());
assertEquals(DEFAULT_PORT.getValue().intValue(), matchV10.getTpSrc().intValue());
assertEquals(DEFAULT_PORT.getValue().intValue(), matchV10.getTpDst().intValue());
- matchV10 = matchConvertorV10.convert(createL4TcpMatch().build(), null);
+ matchV10Optional = converterManager.convert(createL4TcpMatch().build(),
+ new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+ matchV10 = matchV10Optional.get();
assertEquals(DEFAULT_PORT.getValue().intValue(), matchV10.getTpSrc().intValue());
assertEquals(DEFAULT_PORT.getValue().intValue(), matchV10.getTpDst().intValue());
- matchV10 = matchConvertorV10.convert(createVlanTcpMatch().build(), null);
+ matchV10Optional = converterManager.convert(createVlanTcpMatch().build(),
+ new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+ matchV10 = matchV10Optional.get();
assertEquals(DEFAULT_VLAN_ID.getValue().intValue(), matchV10.getDlVlan().intValue());
}
- /**
- * ICMPv4 match test for
- * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertReactorConvertor#convert(Object, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor)}.
- */
@Test
public void testConvertIcmpv4() {
MatchBuilder matchBuilder = createMatchBuilderWithDefaults();
Match match = matchBuilder.build();
- MatchV10 matchV10 = matchConvertorV10.convert(match, convertorManager);
+ Optional<MatchV10> matchV10Optional = converterManager.convert(match,
+ new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+ MatchV10 matchV10 = matchV10Optional.get();
Integer zero = 0;
boolean wcTpSrc = true;
boolean wcTpDst = true;
wcTpDst, wcTpSrc);
match = matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()).
build();
- matchV10 = matchConvertorV10.convert(match, convertorManager);
+ matchV10Optional = converterManager.convert(match,
+ new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+ matchV10 = matchV10Optional.get();
assertEquals(ZERO_MAC, matchV10.getDlDst());
assertEquals(FF_MAC, matchV10.getDlSrc());
assertEquals(0, matchV10.getDlType().intValue());
wcTpDst, wcTpSrc);
match = matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()).
build();
- matchV10 = matchConvertorV10.convert(match, convertorManager);
+ matchV10Optional = converterManager.convert(match,
+ new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+ matchV10 = matchV10Optional.get();
assertEquals(ZERO_MAC, matchV10.getDlDst());
assertEquals(FF_MAC, matchV10.getDlSrc());
assertEquals(0, matchV10.getDlType().intValue());
wcTpDst, wcTpSrc);
match = matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build()).
build();
- matchV10 = matchConvertorV10.convert(match, convertorManager);
+ matchV10Optional = converterManager.convert(match,
+ new VersionConvertorData(OFConstants.OFP_VERSION_1_0));
+ matchV10 = matchV10Optional.get();
assertEquals(ZERO_MAC, matchV10.getDlDst());
assertEquals(FF_MAC, matchV10.getDlSrc());
assertEquals(0, matchV10.getDlType().intValue());
+++ /dev/null
-/**
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.openflowplugin.api.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
-
-/**
- * match conversion and injection test
- */
-public class MatchReactorTest {
- private MatchBuilder matchBuilder;
- private ConvertorManager convertorManager;
-
- /**
- * prepare input match
- */
- @Before
- public void setUp() {
- matchBuilder = new MatchBuilder();
- EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder();
- EthernetTypeBuilder ethernetTypeBuilder = new EthernetTypeBuilder();
- ethernetTypeBuilder.setType(new EtherType(42L));
- ethernetMatchBuilder.setEthernetType(ethernetTypeBuilder.build());
- matchBuilder.setEthernetMatch(ethernetMatchBuilder.build());
- convertorManager = ConvertorManagerFactory.createDefaultManager();
- }
-
- /**
- * convert for OF-1.3, inject into {@link FlowModInputBuilder}
- */
- @Test
- public void testMatchConvertorV13_flow() {
- FlowModInputBuilder target = new FlowModInputBuilder();
- MatchReactor.getInstance().convert(matchBuilder.build(),
- OFConstants.OFP_VERSION_1_3, target, convertorManager);
- Assert.assertNotNull(target.getMatch());
- }
-
- /**
- * convert for OF-1.0, inject into {@link FlowModInputBuilder}
- */
- @Test
- public void testMatchConvertorV10_flow() {
- FlowModInputBuilder target = new FlowModInputBuilder();
- MatchReactor.getInstance().convert(matchBuilder.build(),
- OFConstants.OFP_VERSION_1_0, target, convertorManager);
- Assert.assertNotNull(target.getMatchV10());
- }
-
-
- /**
- * convert for OF-1.3, inject into {@link MultipartRequestFlowBuilder}
- */
- @Test
- public void testMatchConvertorV13_mpRequestFlow() {
- MultipartRequestFlowBuilder target = new MultipartRequestFlowBuilder();
- MatchReactor.getInstance().convert(matchBuilder.build(),
- OFConstants.OFP_VERSION_1_3, target, convertorManager);
- Assert.assertNotNull(target.getMatch());
- }
-
- /**
- * convert for OF-1.0, inject into {@link MultipartRequestFlowBuilder}
- */
- @Test
- public void testMatchConvertorV10_mpRequestFlow() {
- MultipartRequestFlowBuilder target = new MultipartRequestFlowBuilder();
- MatchReactor.getInstance().convert(matchBuilder.build(),
- OFConstants.OFP_VERSION_1_0, target, convertorManager);
- Assert.assertNotNull(target.getMatchV10());
- }
-
- @Test
- public void testMatchConvertorV10_null() {
- MultipartRequestAggregateBuilder target = new MultipartRequestAggregateBuilder();
- MatchReactor.getInstance().convert(null,
- OFConstants.OFP_VERSION_1_0, target, convertorManager);
- Assert.assertNotNull(target.getMatchV10());
- }
-
- /**
- * convert for OF-1.3, inject into {@link MultipartRequestAggregateBuilder}
- */
- @Test
- public void testMatchConvertorV13_mpRequestAggregate() {
- MultipartRequestAggregateBuilder target = new MultipartRequestAggregateBuilder();
- MatchReactor.getInstance().convert(matchBuilder.build(),
- OFConstants.OFP_VERSION_1_3, target, convertorManager);
- Assert.assertNotNull(target.getMatch());
- }
-
- @Test
- public void testMatchConvertorV13_null() {
- MultipartRequestAggregateBuilder target = new MultipartRequestAggregateBuilder();
- MatchReactor.getInstance().convert(null,
- OFConstants.OFP_VERSION_1_3, target, convertorManager);
- Assert.assertNotNull(target.getMatch());
- Assert.assertEquals(0, target.getMatch().getMatchEntry().size());
- }
-
- /**
- * convert for OF-1.0, inject into {@link MultipartRequestAggregateBuilder}
- */
- @Test
- public void testMatchConvertorV10_mpRequestAggregate() {
- MultipartRequestAggregateBuilder target = new MultipartRequestAggregateBuilder();
- MatchReactor.getInstance().convert(matchBuilder.build(),
- OFConstants.OFP_VERSION_1_0, target, convertorManager);
- Assert.assertNotNull(target.getMatchV10());
- }
-
-
-}
\ No newline at end of file