Copyright update
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / OF10StatsRequestInputFactory.java
1 /*
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
10
11 import io.netty.buffer.ByteBuf;
12
13 import java.util.HashMap;
14 import java.util.Map;
15
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;
30
31 /**
32  * Translates StatsRequest messages
33  * @author michal.polkorab
34  */
35 public class OF10StatsRequestInputFactory implements OFSerializer<MultipartRequestInput> {
36
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;
47
48     private static OF10StatsRequestInputFactory instance; 
49     
50     private OF10StatsRequestInputFactory() {
51         // singleton
52     }
53     
54     /**
55      * @return singleton factory
56      */
57     public static synchronized OF10StatsRequestInputFactory getInstance() {
58         if (instance == null) {
59             instance = new OF10StatsRequestInputFactory();
60         }
61         return instance;
62     }
63     
64     @Override
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);
84         }
85     }
86     
87     @Override
88     public int computeLength(MultipartRequestInput message) {
89         return MESSAGE_LENGTH + computeBodyLength(message);
90     }
91     @Override
92     public byte getMessageType() {
93         return MESSAGE_TYPE;
94     }
95     
96     /**
97      * 
98      * @param message
99      * @return length of MultipartRequestMessage
100      */
101     public int computeBodyLength(MultipartRequestInput message) {
102         int length = 0;
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;
117             }
118         }
119         return length;
120     }
121     
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;
128     }
129     
130     /**
131      * @param multipartRequestBody  
132      * @param output 
133      */
134     private void encodeDescBody(MultipartRequestBody multipartRequestBody,
135             ByteBuf output) {
136         // The body of MultiPartRequestDesc is empty
137     }
138
139     /**
140      * @param multipartRequestBody
141      * @param out
142      */
143     private void encodeTableBody(MultipartRequestBody multipartRequestBody,
144             ByteBuf out) {
145      // The body of MultiPartTable is empty
146     }
147     
148     private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
149         encodeFlowAndAggregateBody(multipartRequestBody, output);
150     }
151     
152     private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
153         encodeFlowAndAggregateBody(multipartRequestBody, output);
154     }
155
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());
163     }
164     
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);
169     }
170     
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());
176     }
177     
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());
182     }
183     
184 }