2 * Copyright (c) 2013, 2015 IBM Corporation and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.Collections;
14 import java.util.List;
15 import java.util.Objects;
16 import java.util.Optional;
18 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
19 import org.opendaylight.openflowplugin.extension.api.AugmentTuple;
20 import org.opendaylight.openflowplugin.extension.api.path.ActionPath;
21 import org.opendaylight.openflowplugin.openflow.md.core.extension.MatchExtensionHelper;
22 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionResponseConvertorData;
23 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
24 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.FlowStatsResponseConvertorData;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapListBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;
45 * Converts flow related statistics messages coming from openflow switch to MD-SAL messages.
51 * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
52 * data.setDatapathId(datapathId);
53 * Optional<List<FlowAndStatisticsMapList>> salFlowStats = convertorManager.convert(ofFlowStats, data);
57 public class FlowStatsResponseConvertor extends Convertor<List<FlowStats>, List<FlowAndStatisticsMapList>,
58 FlowStatsResponseConvertorData> {
60 private static final Set<Class<?>> TYPES = Collections.singleton(FlowStats.class);
63 * Method wraps openflow 1.0 actions list to Apply Action Instructions.
65 * @param actionsList list of action
66 * @param ipProtocol ip protocol
67 * @return OF10 actions as an instructions
69 private Instructions wrapOF10ActionsToInstruction(
70 List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions
71 .grouping.Action> actionsList,
72 final short version, final Short ipProtocol) {
73 ActionResponseConvertorData actionResponseConvertorData = new ActionResponseConvertorData(version);
74 actionResponseConvertorData.setActionPath(ActionPath.FLOWS_STATISTICS_UPDATE_WRITE_ACTIONS);
75 actionResponseConvertorData.setIpProtocol(ipProtocol);
77 ApplyActionsCaseBuilder applyActionsCaseBuilder = new ApplyActionsCaseBuilder();
78 ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder();
80 final Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>>
81 actions = getConvertorExecutor().convert(actionsList, actionResponseConvertorData);
83 applyActionsBuilder.setAction(FlowConvertorUtil.wrapActionList(actions.orElse(Collections.emptyList())));
84 applyActionsCaseBuilder.setApplyActions(applyActionsBuilder.build());
86 InstructionBuilder instBuilder = new InstructionBuilder();
87 instBuilder.setInstruction(applyActionsCaseBuilder.build());
88 instBuilder.withKey(new InstructionKey(0));
89 instBuilder.setOrder(0);
90 List<Instruction> salInstructionList = new ArrayList<>();
91 salInstructionList.add(instBuilder.build());
93 InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
94 instructionsBuilder.setInstruction(salInstructionList);
95 return instructionsBuilder.build();
99 public Collection<Class<?>> getTypes() {
104 public List<FlowAndStatisticsMapList> convert(List<FlowStats> source, FlowStatsResponseConvertorData data) {
105 final List<FlowAndStatisticsMapList> result = new ArrayList<>();
107 for (FlowStats flowStats : source) {
108 // Convert Openflow switch specific flow statistics to the MD-SAL format flow statistics
109 FlowAndStatisticsMapListBuilder salFlowStatsBuilder = new FlowAndStatisticsMapListBuilder();
110 salFlowStatsBuilder.setByteCount(new Counter64(flowStats.getByteCount()));
112 if (flowStats.getCookie() != null) {
113 salFlowStatsBuilder.setCookie(new FlowCookie(flowStats.getCookie()));
116 DurationBuilder time = new DurationBuilder();
117 time.setSecond(new Counter32(flowStats.getDurationSec()));
118 time.setNanosecond(new Counter32(flowStats.getDurationNsec()));
119 salFlowStatsBuilder.setDuration(time.build());
121 salFlowStatsBuilder.setHardTimeout(flowStats.getHardTimeout());
122 salFlowStatsBuilder.setIdleTimeout(flowStats.getIdleTimeout());
123 salFlowStatsBuilder.setPacketCount(new Counter64(flowStats.getPacketCount()));
124 salFlowStatsBuilder.setPriority(flowStats.getPriority());
125 salFlowStatsBuilder.setTableId(flowStats.getTableId());
127 Short ipProtocol = null;
129 if (flowStats.getMatchV10() != null) {
130 final Optional<MatchBuilder> matchBuilderOptional = getConvertorExecutor().convert(
131 flowStats.getMatchV10(), data);
133 if (matchBuilderOptional.isPresent()) {
134 if (Objects.nonNull(matchBuilderOptional.get().getIpMatch())) {
135 ipProtocol = matchBuilderOptional.get().getIpMatch().getIpProtocol();
138 salFlowStatsBuilder.setMatch(matchBuilderOptional.get().build());
141 if (flowStats.getAction() != null && flowStats.getAction().size() != 0) {
142 salFlowStatsBuilder.setInstructions(wrapOF10ActionsToInstruction(flowStats.getAction(),
143 data.getVersion(), ipProtocol));
147 if (flowStats.getMatch() != null) {
148 final Optional<MatchBuilder> matchBuilderOptional = getConvertorExecutor().convert(
149 flowStats.getMatch(), data);
151 if (matchBuilderOptional.isPresent()) {
152 final MatchBuilder matchBuilder = matchBuilderOptional.get();
154 final AugmentTuple<Match> matchExtensionWrap =
155 MatchExtensionHelper.processAllExtensions(
156 flowStats.getMatch().getMatchEntry(),
157 OpenflowVersion.get(data.getVersion()),
158 data.getMatchPath());
160 if (matchExtensionWrap != null) {
161 matchBuilder.addAugmentation(matchExtensionWrap.getAugmentationClass(),
162 matchExtensionWrap.getAugmentationObject());
165 salFlowStatsBuilder.setMatch(matchBuilder.build());
169 salFlowStatsBuilder.setFlags(
170 new FlowModFlags(flowStats.getFlags().isOFPFFCHECKOVERLAP(),
171 flowStats.getFlags().isOFPFFRESETCOUNTS(),
172 flowStats.getFlags().isOFPFFNOPKTCOUNTS(),
173 flowStats.getFlags().isOFPFFNOBYTCOUNTS(),
174 flowStats.getFlags().isOFPFFSENDFLOWREM()));
177 if (flowStats.getInstruction() != null) {
178 final VersionConvertorData simpleConvertorData = new VersionConvertorData(data.getVersion());
179 final Optional<Instructions> instructions = getConvertorExecutor().convert(
180 flowStats.getInstruction(), simpleConvertorData);
182 salFlowStatsBuilder.setInstructions(instructions.orElse(new InstructionsBuilder()
183 .setInstruction(Collections.emptyList()).build()));
186 result.add(salFlowStatsBuilder.build());