Added support for OF 1.0
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / OF10StatsReuestMessageFactory.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.HashMap;\r
7 import java.util.Map;\r
8 \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
20 \r
21 /**\r
22  * @author michal.polkorab\r
23  *\r
24  */\r
25 public class OF10StatsReuestMessageFactory implements OFSerializer<MultipartRequestMessage> {\r
26 \r
27     private static final byte MESSAGE_TYPE = 18;\r
28     private static final int MESSAGE_LENGTH = 16;\r
29 \r
30     private static OF10StatsReuestMessageFactory instance; \r
31     \r
32     private OF10StatsReuestMessageFactory() {\r
33         // singleton\r
34     }\r
35     \r
36     /**\r
37      * @return singleton factory\r
38      */\r
39     public static synchronized OF10StatsReuestMessageFactory getInstance() {\r
40         if (instance == null) {\r
41             instance = new OF10StatsReuestMessageFactory();\r
42         }\r
43         return instance;\r
44     }\r
45     \r
46     @Override\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
52         \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
63         }\r
64     }\r
65     \r
66     @Override\r
67     public int computeLength(MultipartRequestMessage message) {\r
68         // TODO\r
69         return MESSAGE_LENGTH;\r
70     }\r
71     @Override\r
72     public byte getMessageType() {\r
73         return MESSAGE_TYPE;\r
74     }\r
75     \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
82     }\r
83     \r
84     private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
85         encodeFlowAndAggregateBody(multipartRequestBody, output);\r
86     }\r
87     \r
88     private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
89         encodeFlowAndAggregateBody(multipartRequestBody, output);\r
90     }\r
91 \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
100     }\r
101     \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
107     }\r
108     \r
109     private static void encodeExperimenterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
110         MultipartRequestExperimenter experimenter = (MultipartRequestExperimenter) multipartRequestBody;\r
111         output.writeInt(experimenter.getExperimenter().intValue());\r
112     }\r
113     \r
114 }\r