2 * Copyright (c) 2013 Pantheon Technologies s.r.o. 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.openflowjava.protocol.impl.serialization.factories;
11 import io.netty.buffer.ByteBuf;
13 import java.util.HashMap;
16 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;
17 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
18 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchSerializer;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCase;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCase;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCase;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregate;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.experimenter._case.MultipartRequestExperimenter;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlow;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStats;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueue;
37 * Translates StatsRequest messages
38 * @author michal.polkorab
40 public class OF10StatsRequestInputFactory implements OFSerializer<MultipartRequestInput> {
42 private static final byte MESSAGE_TYPE = 16;
43 private static final int MESSAGE_LENGTH = 12;
44 private static final byte FLOW_BODY_LENGTH = 44;
45 private static final byte AGGREGATE_BODY_LENGTH = 44;
46 private static final byte PORT_STATS_BODY_LENGTH = 8;
47 private static final byte QUEUE_BODY_LENGTH = 8;
48 private static final byte EXPERIMENTER_BODY_LENGTH = 4;
49 private static final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY = 1;
50 private static final byte PADDING_IN_MULTIPART_REQUEST_PORT_BODY = 6;
51 private static final byte PADING_IN_QUEUE_BODY = 2;
53 private static OF10StatsRequestInputFactory instance;
55 private OF10StatsRequestInputFactory() {
60 * @return singleton factory
62 public static synchronized OF10StatsRequestInputFactory getInstance() {
63 if (instance == null) {
64 instance = new OF10StatsRequestInputFactory();
70 public void messageToBuffer(short version, ByteBuf out,
71 MultipartRequestInput message) {
72 ByteBufUtils.writeOFHeader(instance, message, out);
73 out.writeShort(message.getType().getIntValue());
74 out.writeShort(createMultipartRequestFlagsBitmask(message.getFlags()));
75 if (message.getMultipartRequestBody() instanceof MultipartRequestDescCase) {
76 encodeDescBody(message.getMultipartRequestBody(), out);
77 } else if (message.getMultipartRequestBody() instanceof MultipartRequestFlowCase) {
78 encodeFlowBody(message.getMultipartRequestBody(), out);
79 } else if (message.getMultipartRequestBody() instanceof MultipartRequestAggregateCase) {
80 encodeAggregateBody(message.getMultipartRequestBody(), out);
81 } else if (message.getMultipartRequestBody() instanceof MultipartRequestTableCase) {
82 encodeTableBody(message.getMultipartRequestBody(), out);
83 } else if (message.getMultipartRequestBody() instanceof MultipartRequestPortStatsCase) {
84 encodePortBody(message.getMultipartRequestBody(), out);
85 } else if (message.getMultipartRequestBody() instanceof MultipartRequestQueueCase) {
86 encodeQueueBody(message.getMultipartRequestBody(), out);
87 } else if (message.getMultipartRequestBody() instanceof MultipartRequestExperimenterCase) {
88 encodeExperimenterBody(message.getMultipartRequestBody(), out);
93 public int computeLength(MultipartRequestInput message) {
94 return MESSAGE_LENGTH + computeBodyLength(message);
97 public byte getMessageType() {
104 * @return length of MultipartRequestMessage
106 public int computeBodyLength(MultipartRequestInput message) {
108 MultipartType type = message.getType();
109 if (type.equals(MultipartType.OFPMPFLOW)) {
110 length += FLOW_BODY_LENGTH;
111 } else if (type.equals(MultipartType.OFPMPAGGREGATE)) {
112 length += AGGREGATE_BODY_LENGTH;
113 } else if (type.equals(MultipartType.OFPMPPORTSTATS)) {
114 length += PORT_STATS_BODY_LENGTH;
115 } else if (type.equals(MultipartType.OFPMPQUEUE)) {
116 length += QUEUE_BODY_LENGTH;
117 } else if (type.equals(MultipartType.OFPMPEXPERIMENTER)) {
118 MultipartRequestExperimenterCase bodyCase = (MultipartRequestExperimenterCase) message.getMultipartRequestBody();
119 MultipartRequestExperimenter body = bodyCase.getMultipartRequestExperimenter();
120 length += EXPERIMENTER_BODY_LENGTH;
121 if (body.getData() != null) {
122 length += body.getData().length;
128 private static int createMultipartRequestFlagsBitmask(MultipartRequestFlags flags) {
129 int multipartRequestFlagsBitmask = 0;
130 Map<Integer, Boolean> multipartRequestFlagsMap = new HashMap<>();
131 multipartRequestFlagsMap.put(0, flags.isOFPMPFREQMORE());
132 multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap);
133 return multipartRequestFlagsBitmask;
137 * @param multipartRequestBody
140 private void encodeDescBody(MultipartRequestBody multipartRequestBody,
142 // The body of MultiPartRequestDesc is empty
146 * @param multipartRequestBody
149 private void encodeTableBody(MultipartRequestBody multipartRequestBody,
151 // The body of MultiPartTable is empty
154 private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
155 MultipartRequestFlowCase flowCase = (MultipartRequestFlowCase) multipartRequestBody;
156 MultipartRequestFlow flow = flowCase.getMultipartRequestFlow();
157 OF10MatchSerializer.encodeMatchV10(output, flow.getMatchV10());
158 output.writeByte(flow.getTableId().shortValue());
159 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY, output);
160 output.writeShort(flow.getOutPort().intValue());
163 private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
164 final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY = 1;
165 MultipartRequestAggregateCase aggregateCase = (MultipartRequestAggregateCase) multipartRequestBody;
166 MultipartRequestAggregate aggregate = aggregateCase.getMultipartRequestAggregate();
167 OF10MatchSerializer.encodeMatchV10(output, aggregate.getMatchV10());
168 output.writeByte(aggregate.getTableId().shortValue());
169 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY, output);
170 output.writeShort(aggregate.getOutPort().intValue());
173 private static void encodePortBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
174 MultipartRequestPortStatsCase portstatsCase = (MultipartRequestPortStatsCase) multipartRequestBody;
175 MultipartRequestPortStats portstats = portstatsCase.getMultipartRequestPortStats();
176 output.writeShort(portstats.getPortNo().intValue());
177 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_PORT_BODY, output);
180 private static void encodeQueueBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
181 MultipartRequestQueueCase queueCase = (MultipartRequestQueueCase) multipartRequestBody;
182 MultipartRequestQueue queue = queueCase.getMultipartRequestQueue();
183 output.writeShort(queue.getPortNo().intValue());
184 ByteBufUtils.padBuffer(PADING_IN_QUEUE_BODY, output);
185 output.writeInt(queue.getQueueId().intValue());
188 private static void encodeExperimenterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
189 MultipartRequestExperimenterCase experimenterCase = (MultipartRequestExperimenterCase) multipartRequestBody;
190 MultipartRequestExperimenter experimenter = experimenterCase.getMultipartRequestExperimenter();
191 output.writeInt(experimenter.getExperimenter().intValue());
192 output.writeBytes(experimenter.getData());