2 * Copyright (c) 2015 Cisco Systems, Inc. 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.impl.common;
11 import javax.annotation.Nonnull;
12 import org.opendaylight.openflowplugin.api.OFConstants;
13 import org.opendaylight.openflowplugin.impl.util.MatchUtil;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.request.multipart.request.body.MultipartRequestDescBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.request.multipart.request.body.MultipartRequestFlowTableStatsBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.request.multipart.request.body.MultipartRequestPortDescBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowAggregateStatsBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowStatsBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.multipart.request.flow.stats.FlowStatsBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupDescBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupStatsBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterStatsBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequestBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10Builder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.request.multipart.request.body.MultipartRequestQueueStatsBuilder;
64 * org.opendaylight.openflowplugin.impl.common
65 * Factory class is designed for easy producing a MultipartRequestInput. Class should help
66 * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
67 * without touch OF specification 1.3.2 - a section 7.3.5. Multipart Messages
69 public final class MultipartRequestInputFactory {
71 private MultipartRequestInputFactory() {
72 throw new UnsupportedOperationException("Factory class");
76 * Method validate input and makes
77 * {@link org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader}
78 * from input values. Method set a moreRequest marker to false and it creates default empty multipart request body
79 * by {@link MultipartType}
82 * @param version OpenFlow version
83 * @param type multipart type
84 * @param canUseSingleLayer can use single layer serialization
85 * @return multipart request
87 public static OfHeader makeMultipartRequest(final long xid,
89 @Nonnull final MultipartType type,
90 final boolean canUseSingleLayer) {
91 return canUseSingleLayer
92 ? new MultipartRequestBuilder()
93 .setRequestMore(false)
96 .setMultipartRequestBody(makeDefaultSingleLayerBody(type))
98 : new MultipartRequestInputBuilder()
99 .setFlags(new MultipartRequestFlags(false))
100 .setMultipartRequestBody(makeDefaultMultiLayerBody(type, version))
107 private static org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.request
108 .MultipartRequestBody makeDefaultSingleLayerBody(final MultipartType type) {
110 case OFPMPDESC: return new MultipartRequestDescBuilder().build();
111 case OFPMPFLOW: return new MultipartRequestFlowStatsBuilder().setFlowStats(new FlowStatsBuilder()
112 .setMatch(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow
113 .MatchBuilder().build()).build()).build();
114 case OFPMPAGGREGATE: return new MultipartRequestFlowAggregateStatsBuilder().build();
115 case OFPMPTABLE: return new MultipartRequestFlowTableStatsBuilder().build();
116 case OFPMPPORTSTATS: return new org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics
117 .rev131214.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder().build();
118 case OFPMPQUEUE: return new MultipartRequestQueueStatsBuilder().build();
119 case OFPMPGROUP: return new MultipartRequestGroupStatsBuilder().build();
120 case OFPMPGROUPDESC: return new MultipartRequestGroupDescBuilder().build();
121 case OFPMPGROUPFEATURES: return new MultipartRequestGroupFeaturesBuilder().build();
122 case OFPMPMETER: return new MultipartRequestMeterStatsBuilder().build();
123 case OFPMPMETERCONFIG: return new org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics
124 .rev131111.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder().build();
125 case OFPMPMETERFEATURES: return new MultipartRequestMeterFeaturesBuilder().build();
126 case OFPMPTABLEFEATURES: return new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types
127 .rev131026.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder().build();
128 case OFPMPPORTDESC: return new MultipartRequestPortDescBuilder().build();
129 case OFPMPEXPERIMENTER: return new MultipartRequestExperimenterBuilder().build();
130 default:throw new IllegalArgumentException("Unknown MultipartType " + type);
134 private static MultipartRequestBody makeDefaultMultiLayerBody(@Nonnull final MultipartType type,
135 final short version) {
138 return new MultipartRequestDescCaseBuilder().build();
140 final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder
141 = new MultipartRequestFlowCaseBuilder();
142 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
143 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
144 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
145 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
146 multipartRequestFlowBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
147 multipartRequestFlowBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
150 case OFConstants.OFP_VERSION_1_0:
151 MatchV10Builder matchV10Builder = MatchUtil.createEmptyV10Match();
152 multipartRequestFlowBuilder.setMatchV10(matchV10Builder.build());
154 case OFConstants.OFP_VERSION_1_3:
155 multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
158 throw new IllegalArgumentException("Unknown version " + version);
161 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
162 return multipartRequestFlowCaseBuilder.build();
164 return new MultipartRequestAggregateCaseBuilder().build();
166 return new MultipartRequestTableCaseBuilder().build();
168 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder
169 = new MultipartRequestPortStatsCaseBuilder();
170 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder
171 = new MultipartRequestPortStatsBuilder();
172 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
173 multipartRequestPortStatsCaseBuilder
174 .setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
175 return multipartRequestPortStatsCaseBuilder.build();
177 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder
178 = new MultipartRequestQueueCaseBuilder();
179 MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
180 multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
181 multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
182 multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
183 return multipartRequestQueueCaseBuilder.build();
185 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder
186 = new MultipartRequestGroupCaseBuilder();
187 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
188 GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
189 multipartRequestGroupBuilder.setGroupId(groupId);
190 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
191 return multipartRequestGroupCaseBuilder.build();
193 return new MultipartRequestGroupDescCaseBuilder().build();
194 case OFPMPGROUPFEATURES:
195 return new MultipartRequestGroupFeaturesCaseBuilder().build();
197 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder
198 = new MultipartRequestMeterCaseBuilder();
199 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
200 MeterId meterId = new MeterId(OFConstants.OFPM_ALL);
201 multipartRequestMeterBuilder.setMeterId(meterId);
202 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
203 return multipartRequestMeterCaseBuilder.build();
204 case OFPMPMETERCONFIG:
205 MultipartRequestMeterConfigCaseBuilder multipartRequestMeterConfigCaseBuilder
206 = new MultipartRequestMeterConfigCaseBuilder();
207 MultipartRequestMeterConfigBuilder multipartRequestMeterConfigBuilder
208 = new MultipartRequestMeterConfigBuilder();
209 MeterId configMeterId = new MeterId(OFConstants.OFPM_ALL);
210 multipartRequestMeterConfigBuilder.setMeterId(configMeterId);
211 multipartRequestMeterConfigCaseBuilder
212 .setMultipartRequestMeterConfig(multipartRequestMeterConfigBuilder.build());
213 return multipartRequestMeterConfigCaseBuilder.build();
214 case OFPMPMETERFEATURES:
215 return new MultipartRequestMeterFeaturesCaseBuilder().build();
216 case OFPMPTABLEFEATURES:
217 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder
218 = new MultipartRequestTableFeaturesCaseBuilder();
219 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(
220 new MultipartRequestTableFeaturesBuilder().build()
222 return tableFeaturesCaseBuilder.build();
224 return new MultipartRequestPortDescCaseBuilder().build();
225 case OFPMPEXPERIMENTER:
226 return new MultipartRequestExperimenterCaseBuilder().build();
228 throw new IllegalArgumentException("Unknown MultipartType " + type);