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
8 package org.opendaylight.openflowplugin.impl.common;
10 import org.eclipse.jdt.annotation.NonNull;
11 import org.opendaylight.openflowplugin.api.OFConstants;
12 import org.opendaylight.openflowplugin.impl.util.MatchUtil;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.request.multipart.request.body.MultipartRequestDescBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.request.multipart.request.body.MultipartRequestFlowTableStatsBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.request.multipart.request.body.MultipartRequestPortDescBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowAggregateStatsBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowStatsBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.multipart.request.flow.stats.FlowStatsBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupDescBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupStatsBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterStatsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequestBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.request.multipart.request.body.MultipartRequestQueueStatsBuilder;
59 import org.opendaylight.yangtools.yang.common.Uint32;
60 import org.opendaylight.yangtools.yang.common.Uint8;
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 {
70 private MultipartRequestInputFactory() {
75 * Method validate input and makes
76 * {@link org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader}
77 * from input values. Method set a moreRequest marker to false and it creates default empty multipart request body
78 * by {@link MultipartType}
81 * @param version OpenFlow version
82 * @param type multipart type
83 * @param canUseSingleLayer can use single layer serialization
84 * @return multipart request
86 public static OfHeader makeMultipartRequest(final Uint32 xid,
88 @NonNull final MultipartType type,
89 final boolean canUseSingleLayer) {
90 return canUseSingleLayer
91 ? new MultipartRequestBuilder()
92 .setRequestMore(false)
95 .setMultipartRequestBody(makeDefaultSingleLayerBody(type))
97 : new MultipartRequestInputBuilder()
98 .setFlags(new MultipartRequestFlags(false))
99 .setMultipartRequestBody(makeDefaultMultiLayerBody(type, version))
106 private static org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.request
107 .MultipartRequestBody makeDefaultSingleLayerBody(final MultipartType type) {
109 case OFPMPDESC: return new MultipartRequestDescBuilder().build();
110 case OFPMPFLOW: return new MultipartRequestFlowStatsBuilder().setFlowStats(new FlowStatsBuilder()
111 .setMatch(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow
112 .MatchBuilder().build()).build()).build();
113 case OFPMPAGGREGATE: return new MultipartRequestFlowAggregateStatsBuilder().build();
114 case OFPMPTABLE: return new MultipartRequestFlowTableStatsBuilder().build();
115 case OFPMPPORTSTATS: return new org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics
116 .rev131214.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder().build();
117 case OFPMPQUEUE: return new MultipartRequestQueueStatsBuilder().build();
118 case OFPMPGROUP: return new MultipartRequestGroupStatsBuilder().build();
119 case OFPMPGROUPDESC: return new MultipartRequestGroupDescBuilder().build();
120 case OFPMPGROUPFEATURES: return new MultipartRequestGroupFeaturesBuilder().build();
121 case OFPMPMETER: return new MultipartRequestMeterStatsBuilder().build();
122 case OFPMPMETERCONFIG: return new org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics
123 .rev131111.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder().build();
124 case OFPMPMETERFEATURES: return new MultipartRequestMeterFeaturesBuilder().build();
125 case OFPMPTABLEFEATURES: return new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types
126 .rev131026.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder().build();
127 case OFPMPPORTDESC: return new MultipartRequestPortDescBuilder().build();
128 case OFPMPEXPERIMENTER: return new MultipartRequestExperimenterBuilder().build();
129 default:throw new IllegalArgumentException("Unknown MultipartType " + type);
133 private static MultipartRequestBody makeDefaultMultiLayerBody(final @NonNull MultipartType type,
134 final Uint8 version) {
137 return new MultipartRequestDescCaseBuilder().build();
139 final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder
140 = new MultipartRequestFlowCaseBuilder();
141 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
142 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
143 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
144 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
145 multipartRequestFlowBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
146 multipartRequestFlowBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
148 if (OFConstants.OFP_VERSION_1_0.equals(version)) {
149 multipartRequestFlowBuilder.setMatchV10(MatchUtil.createEmptyV10Match().build());
150 } else if (OFConstants.OFP_VERSION_1_3.equals(version)) {
151 multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
153 throw new IllegalArgumentException("Unknown version " + version);
156 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
157 return multipartRequestFlowCaseBuilder.build();
159 return new MultipartRequestAggregateCaseBuilder().build();
161 return new MultipartRequestTableCaseBuilder().build();
163 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder
164 = new MultipartRequestPortStatsCaseBuilder();
165 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder
166 = new MultipartRequestPortStatsBuilder();
167 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
168 multipartRequestPortStatsCaseBuilder
169 .setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
170 return multipartRequestPortStatsCaseBuilder.build();
172 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder
173 = new MultipartRequestQueueCaseBuilder();
174 MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
175 multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
176 multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
177 multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
178 return multipartRequestQueueCaseBuilder.build();
180 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder
181 = new MultipartRequestGroupCaseBuilder();
182 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
183 GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
184 multipartRequestGroupBuilder.setGroupId(groupId);
185 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
186 return multipartRequestGroupCaseBuilder.build();
188 return new MultipartRequestGroupDescCaseBuilder().build();
189 case OFPMPGROUPFEATURES:
190 return new MultipartRequestGroupFeaturesCaseBuilder().build();
192 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder
193 = new MultipartRequestMeterCaseBuilder();
194 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
195 MeterId meterId = new MeterId(OFConstants.OFPM_ALL);
196 multipartRequestMeterBuilder.setMeterId(meterId);
197 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
198 return multipartRequestMeterCaseBuilder.build();
199 case OFPMPMETERCONFIG:
200 MultipartRequestMeterConfigCaseBuilder multipartRequestMeterConfigCaseBuilder
201 = new MultipartRequestMeterConfigCaseBuilder();
202 MultipartRequestMeterConfigBuilder multipartRequestMeterConfigBuilder
203 = new MultipartRequestMeterConfigBuilder();
204 MeterId configMeterId = new MeterId(OFConstants.OFPM_ALL);
205 multipartRequestMeterConfigBuilder.setMeterId(configMeterId);
206 multipartRequestMeterConfigCaseBuilder
207 .setMultipartRequestMeterConfig(multipartRequestMeterConfigBuilder.build());
208 return multipartRequestMeterConfigCaseBuilder.build();
209 case OFPMPMETERFEATURES:
210 return new MultipartRequestMeterFeaturesCaseBuilder().build();
211 case OFPMPTABLEFEATURES:
212 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder
213 = new MultipartRequestTableFeaturesCaseBuilder();
214 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(
215 new MultipartRequestTableFeaturesBuilder().build()
217 return tableFeaturesCaseBuilder.build();
219 return new MultipartRequestPortDescCaseBuilder().build();
220 case OFPMPEXPERIMENTER:
221 return new MultipartRequestExperimenterCaseBuilder().build();
223 throw new IllegalArgumentException("Unknown MultipartType " + type);