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.MultipartRequestAggregate;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDesc;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTable;
32 * Translates StatsRequest messages
33 * @author michal.polkorab
35 public class OF10StatsRequestInputFactory implements OFSerializer<MultipartRequestInput> {
37 private static final byte MESSAGE_TYPE = 16;
38 private static final int MESSAGE_LENGTH = 12;
39 private static final byte FLOW_BODY_LENGTH = 44;
40 private static final byte AGGREGATE_BODY_LENGTH = 44;
41 private static final byte PORT_STATS_BODY_LENGTH = 8;
42 private static final byte QUEUE_BODY_LENGTH = 8;
43 private static final byte EXPERIMENTER_BODY_LENGTH = 4;
44 private static final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY = 1;
45 private static final byte PADDING_IN_MULTIPART_REQUEST_PORT_BODY = 6;
46 private static final byte PADING_IN_QUEUE_BODY = 2;
48 private static OF10StatsRequestInputFactory instance;
50 private OF10StatsRequestInputFactory() {
55 * @return singleton factory
57 public static synchronized OF10StatsRequestInputFactory getInstance() {
58 if (instance == null) {
59 instance = new OF10StatsRequestInputFactory();
65 public void messageToBuffer(short version, ByteBuf out,
66 MultipartRequestInput message) {
67 ByteBufUtils.writeOFHeader(instance, message, out);
68 out.writeShort(message.getType().getIntValue());
69 out.writeShort(createMultipartRequestFlagsBitmask(message.getFlags()));
70 if (message.getMultipartRequestBody() instanceof MultipartRequestDesc) {
71 encodeDescBody(message.getMultipartRequestBody(), out);
72 } else if (message.getMultipartRequestBody() instanceof MultipartRequestFlow) {
73 encodeFlowBody(message.getMultipartRequestBody(), out);
74 } else if (message.getMultipartRequestBody() instanceof MultipartRequestAggregate) {
75 encodeAggregateBody(message.getMultipartRequestBody(), out);
76 } else if (message.getMultipartRequestBody() instanceof MultipartRequestTable) {
77 encodeTableBody(message.getMultipartRequestBody(), out);
78 } else if (message.getMultipartRequestBody() instanceof MultipartRequestPortStats) {
79 encodePortBody(message.getMultipartRequestBody(), out);
80 } else if (message.getMultipartRequestBody() instanceof MultipartRequestQueue) {
81 encodeQueueBody(message.getMultipartRequestBody(), out);
82 } else if (message.getMultipartRequestBody() instanceof MultipartRequestExperimenter) {
83 encodeExperimenterBody(message.getMultipartRequestBody(), out);
88 public int computeLength(MultipartRequestInput message) {
89 return MESSAGE_LENGTH + computeBodyLength(message);
92 public byte getMessageType() {
99 * @return length of MultipartRequestMessage
101 public int computeBodyLength(MultipartRequestInput message) {
103 MultipartType type = message.getType();
104 if (type.equals(MultipartType.OFPMPFLOW)) {
105 length += FLOW_BODY_LENGTH;
106 } else if (type.equals(MultipartType.OFPMPAGGREGATE)) {
107 length += AGGREGATE_BODY_LENGTH;
108 } else if (type.equals(MultipartType.OFPMPPORTSTATS)) {
109 length += PORT_STATS_BODY_LENGTH;
110 } else if (type.equals(MultipartType.OFPMPQUEUE)) {
111 length += QUEUE_BODY_LENGTH;
112 } else if (type.equals(MultipartType.OFPMPEXPERIMENTER)) {
113 MultipartRequestExperimenter body = (MultipartRequestExperimenter) message.getMultipartRequestBody();
114 length += EXPERIMENTER_BODY_LENGTH;
115 if (body.getData() != null) {
116 length += body.getData().length;
122 private static int createMultipartRequestFlagsBitmask(MultipartRequestFlags flags) {
123 int multipartRequestFlagsBitmask = 0;
124 Map<Integer, Boolean> multipartRequestFlagsMap = new HashMap<>();
125 multipartRequestFlagsMap.put(0, flags.isOFPMPFREQMORE());
126 multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap);
127 return multipartRequestFlagsBitmask;
131 * @param multipartRequestBody
134 private void encodeDescBody(MultipartRequestBody multipartRequestBody,
136 // The body of MultiPartRequestDesc is empty
140 * @param multipartRequestBody
143 private void encodeTableBody(MultipartRequestBody multipartRequestBody,
145 // The body of MultiPartTable is empty
148 private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
149 encodeFlowAndAggregateBody(multipartRequestBody, output);
152 private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
153 encodeFlowAndAggregateBody(multipartRequestBody, output);
156 private static void encodeFlowAndAggregateBody(
157 MultipartRequestBody multipartRequestBody, ByteBuf output) {
158 MultipartRequestFlow flow = (MultipartRequestFlow) multipartRequestBody;
159 OF10MatchSerializer.encodeMatchV10(output, flow.getMatchV10());
160 output.writeByte(flow.getTableId().shortValue());
161 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY, output);
162 output.writeShort(flow.getOutPort().intValue());
165 private static void encodePortBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
166 MultipartRequestPortStats portstats = (MultipartRequestPortStats) multipartRequestBody;
167 output.writeShort(portstats.getPortNo().intValue());
168 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_PORT_BODY, output);
171 private static void encodeQueueBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
172 MultipartRequestQueue queue = (MultipartRequestQueue) multipartRequestBody;
173 output.writeShort(queue.getPortNo().intValue());
174 ByteBufUtils.padBuffer(PADING_IN_QUEUE_BODY, output);
175 output.writeInt(queue.getQueueId().intValue());
178 private static void encodeExperimenterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
179 MultipartRequestExperimenter experimenter = (MultipartRequestExperimenter) multipartRequestBody;
180 output.writeInt(experimenter.getExperimenter().intValue());
181 output.writeBytes(experimenter.getData());