1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
\r
4 import io.netty.buffer.ByteBuf;
\r
6 import java.util.HashMap;
\r
7 import java.util.Map;
\r
9 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;
\r
10 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
\r
11 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchSerializer;
\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessage;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregate;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;
\r
22 * @author michal.polkorab
\r
25 public class OF10StatsRequestMessageFactory implements OFSerializer<MultipartRequestMessage> {
\r
27 private static final byte MESSAGE_TYPE = 18;
\r
28 private static final int MESSAGE_LENGTH = 16;
\r
30 private static OF10StatsRequestMessageFactory instance;
\r
32 private OF10StatsRequestMessageFactory() {
\r
37 * @return singleton factory
\r
39 public static synchronized OF10StatsRequestMessageFactory getInstance() {
\r
40 if (instance == null) {
\r
41 instance = new OF10StatsRequestMessageFactory();
\r
47 public void messageToBuffer(short version, ByteBuf out,
\r
48 MultipartRequestMessage message) {
\r
49 ByteBufUtils.writeOFHeader(instance, message, out);
\r
50 out.writeShort(message.getType().getIntValue());
\r
51 out.writeShort(createMultipartRequestFlagsBitmask(message.getFlags()));
\r
53 if (message.getMultipartRequestBody() instanceof MultipartRequestFlow) {
\r
54 encodeFlowBody(message.getMultipartRequestBody(), out);
\r
55 } else if (message.getMultipartRequestBody() instanceof MultipartRequestAggregate) {
\r
56 encodeAggregateBody(message.getMultipartRequestBody(), out);
\r
57 } else if (message.getMultipartRequestBody() instanceof MultipartRequestPortStats) {
\r
58 encodePortBody(message.getMultipartRequestBody(), out);
\r
59 } else if (message.getMultipartRequestBody() instanceof MultipartRequestQueue) {
\r
60 encodeQueueBody(message.getMultipartRequestBody(), out);
\r
61 } else if (message.getMultipartRequestBody() instanceof MultipartRequestExperimenter) {
\r
62 encodeExperimenterBody(message.getMultipartRequestBody(), out);
\r
67 public int computeLength(MultipartRequestMessage message) {
\r
69 return MESSAGE_LENGTH;
\r
72 public byte getMessageType() {
\r
73 return MESSAGE_TYPE;
\r
76 private static int createMultipartRequestFlagsBitmask(MultipartRequestFlags flags) {
\r
77 int multipartRequestFlagsBitmask = 0;
\r
78 Map<Integer, Boolean> multipartRequestFlagsMap = new HashMap<>();
\r
79 multipartRequestFlagsMap.put(0, flags.isOFPMPFREQMORE());
\r
80 multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap);
\r
81 return multipartRequestFlagsBitmask;
\r
84 private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
85 encodeFlowAndAggregateBody(multipartRequestBody, output);
\r
88 private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
89 encodeFlowAndAggregateBody(multipartRequestBody, output);
\r
92 private static void encodeFlowAndAggregateBody(
\r
93 MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
94 final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY = 1;
\r
95 MultipartRequestFlow flow = (MultipartRequestFlow) multipartRequestBody;
\r
96 OF10MatchSerializer.encodeMatchV10(output, flow.getMatchV10());
\r
97 output.writeByte(flow.getTableId().shortValue());
\r
98 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY, output);
\r
99 output.writeShort(flow.getOutPort().intValue());
\r
102 private static void encodePortBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
103 final byte PADDING_IN_MULTIPART_REQUEST_PORT_BODY = 6;
\r
104 MultipartRequestPortStats portstats = (MultipartRequestPortStats) multipartRequestBody;
\r
105 output.writeShort(portstats.getPortNo().intValue());
\r
106 ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_PORT_BODY, output);
\r
109 private static void encodeQueueBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
110 final byte PADING_IN_QUEUE_BODY = 2;
\r
111 MultipartRequestQueue queue = (MultipartRequestQueue) multipartRequestBody;
\r
112 output.writeShort(queue.getPortNo().intValue());
\r
113 ByteBufUtils.padBuffer(PADING_IN_QUEUE_BODY, output);
\r
114 output.writeInt(queue.getQueueId().intValue());
\r
117 private static void encodeExperimenterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
118 MultipartRequestExperimenter experimenter = (MultipartRequestExperimenter) multipartRequestBody;
\r
119 output.writeInt(experimenter.getExperimenter().intValue());
\r
120 output.writeBytes(experimenter.getData());
\r