Javadoc update
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / OF10FeaturesReplyMessageFactory.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.math.BigInteger;\r
7 \r
8 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
9 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionTypeV10;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.CapabilitiesV10;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfigV10;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeaturesV10;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortStateV10;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder;\r
17 \r
18 /**\r
19  * Translates FeaturesReply messages (OpenFlow v1.0)\r
20  * @author michal.polkorab\r
21  */\r
22 public class OF10FeaturesReplyMessageFactory implements OFDeserializer<GetFeaturesOutput> {\r
23     \r
24     private static final byte MAC_ADDRESS_LENGTH = 6;\r
25     private static final byte MAX_PORT_NAME_LENGTH = 16;\r
26     \r
27     private static final byte PADDING_IN_FEATURES_REPLY_HEADER = 3;\r
28     \r
29     private static OF10FeaturesReplyMessageFactory instance;\r
30 \r
31     private OF10FeaturesReplyMessageFactory() {\r
32         // do nothing, just singleton\r
33     }\r
34     \r
35     /**\r
36      * @return singleton factory\r
37      */\r
38     public static synchronized OF10FeaturesReplyMessageFactory getInstance() {\r
39         if (instance == null) {\r
40             instance = new OF10FeaturesReplyMessageFactory();\r
41         }\r
42         return instance;\r
43     }\r
44     \r
45     @Override\r
46     public GetFeaturesOutput bufferToMessage(ByteBuf rawMessage, short version) {\r
47         GetFeaturesOutputBuilder builder = new GetFeaturesOutputBuilder();\r
48         builder.setVersion(version);\r
49         builder.setXid(rawMessage.readUnsignedInt());\r
50         byte[] datapathId = new byte[Long.SIZE/Byte.SIZE];\r
51         rawMessage.readBytes(datapathId);\r
52         builder.setDatapathId(new BigInteger(datapathId));\r
53         builder.setBuffers(rawMessage.readUnsignedInt());\r
54         builder.setTables(rawMessage.readUnsignedByte());\r
55         rawMessage.skipBytes(PADDING_IN_FEATURES_REPLY_HEADER);\r
56         builder.setCapabilitiesV10(createCapabilitiesV10(rawMessage.readUnsignedInt()));\r
57         builder.setActionsV10(createActionsV10(rawMessage.readUnsignedInt()));\r
58         deserializePort(rawMessage, builder);\r
59         return builder.build();\r
60     }\r
61 \r
62     private static CapabilitiesV10 createCapabilitiesV10(long input) {\r
63         final Boolean FLOW_STATS = (input & (1 << 0)) != 0;\r
64         final Boolean TABLE_STATS = (input & (1 << 1)) != 0;\r
65         final Boolean PORT_STATS = (input & (1 << 2)) != 0;\r
66         final Boolean STP = (input & (1 << 3)) != 0;\r
67         final Boolean RESERVED = (input & (1 << 4)) != 0;\r
68         final Boolean IP_REASM = (input & (1 << 5)) != 0;\r
69         final Boolean QUEUE_STATS = (input & (1 << 6)) != 0;\r
70         final Boolean ARP_MATCH_IP = (input & (1 << 7)) != 0;\r
71         return new CapabilitiesV10(ARP_MATCH_IP, FLOW_STATS, IP_REASM,\r
72                 PORT_STATS, QUEUE_STATS, RESERVED, STP, TABLE_STATS);\r
73     }\r
74     \r
75     private static ActionTypeV10 createActionsV10(long input) {\r
76         final Boolean OUTPUT = (input & (1 << 0)) != 0;\r
77         final Boolean SET_VLAN_VID = (input & (1 << 1)) != 0;\r
78         final Boolean SET_VLAN_PCP = (input & (1 << 2)) != 0;\r
79         final Boolean STRIP_VLAN = (input & (1 << 3)) != 0;\r
80         final Boolean SET_DL_SRC = (input & (1 << 4)) != 0;\r
81         final Boolean SET_DL_DST = (input & (1 << 5)) != 0;\r
82         final Boolean SET_NW_SRC = (input & (1 << 6)) != 0;\r
83         final Boolean SET_NW_DST = (input & (1 << 7)) != 0;\r
84         final Boolean SET_NW_TOS = (input & (1 << 8)) != 0;\r
85         final Boolean SET_TP_SRC = (input & (1 << 9)) != 0;\r
86         final Boolean SET_TP_DST = (input & (1 << 10)) != 0;\r
87         final Boolean ENQUEUE = (input & (1 << 11)) != 0;\r
88         final Boolean VENDOR = (input & (1 << 12)) != 0;\r
89         return new ActionTypeV10(ENQUEUE, OUTPUT, SET_DL_DST, SET_DL_SRC,\r
90                 SET_NW_DST, SET_NW_SRC, SET_NW_TOS, SET_TP_DST, SET_TP_SRC,\r
91                 SET_VLAN_PCP, SET_VLAN_VID, STRIP_VLAN, VENDOR);\r
92     }\r
93     \r
94     private static void deserializePort(ByteBuf rawMessage, GetFeaturesOutputBuilder builder) {\r
95         builder.setPortNo((long) rawMessage.readUnsignedShort());\r
96         StringBuffer macToString = new StringBuffer();\r
97         for(int i = 0; i < MAC_ADDRESS_LENGTH; i++){\r
98             short mac = rawMessage.readUnsignedByte();\r
99             macToString.append(String.format("%02X", mac));\r
100         }\r
101         builder.setHwAddr(new MacAddress(macToString.toString()));\r
102         byte[] name = new byte[MAX_PORT_NAME_LENGTH];\r
103         rawMessage.readBytes(name);\r
104         builder.setName(name.toString());\r
105         builder.setConfigV10(createPortConfig(rawMessage.readUnsignedInt()));\r
106         builder.setStateV10(createPortState(rawMessage.readUnsignedInt()));\r
107         builder.setCurrentFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
108         builder.setAdvertisedFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
109         builder.setSupportedFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
110         builder.setPeerFeaturesV10(createPortFeatures(rawMessage.readUnsignedInt()));\r
111     }\r
112     \r
113     private static PortStateV10 createPortState(long input){\r
114         final Boolean _linkDown = ((input) & (1<<0)) != 0;\r
115         final Boolean _blocked = ((input) & (1<<1)) != 0;\r
116         final Boolean _live = ((input) & (1<<2)) != 0;\r
117         final Boolean _stpListen = ((input) & (0<<8)) != 0;\r
118         final Boolean _stpLearn = ((input) & (1<<8)) != 0;\r
119         final Boolean _stpForward = ((input) & (1<<9)) != 0; // equals 2 << 8\r
120         final Boolean _stpBlock = (((input) & (1<<9)) != 0) && (((input) & (1<<8)) != 0); // equals 3 << 8\r
121         final Boolean _stpMask = ((input) & (1<<10)) != 0; // equals 4 << 8\r
122         return new PortStateV10(_blocked, _linkDown, _live, _stpBlock, _stpForward, _stpLearn, _stpListen, _stpMask);\r
123     }\r
124     \r
125     private static PortConfigV10 createPortConfig(long input){\r
126         final Boolean _portDown = ((input) & (1<<0)) != 0;\r
127         final Boolean _noStp = ((input) & (1<<1)) != 0;\r
128         final Boolean _noRecv = ((input) & (1<<2)) != 0;\r
129         final Boolean _noRecvStp = ((input) & (1<<3)) != 0;\r
130         final Boolean _noFlood = ((input) & (1<<4)) != 0;\r
131         final Boolean _noFwd  = ((input) & (1<<5)) != 0;\r
132         final Boolean _noPacketIn = ((input) & (1<<6)) != 0;\r
133         return new PortConfigV10(_noFlood, _noFwd, _noPacketIn, _noRecv, _noRecvStp, _noStp, _portDown);\r
134     }\r
135     \r
136     private static PortFeaturesV10 createPortFeatures(long input){\r
137         final Boolean _10mbHd = ((input) & (1<<0)) != 0;\r
138         final Boolean _10mbFd = ((input) & (1<<1)) != 0;\r
139         final Boolean _100mbHd = ((input) & (1<<2)) != 0;\r
140         final Boolean _100mbFd = ((input) & (1<<3)) != 0;\r
141         final Boolean _1gbHd = ((input) & (1<<4)) != 0;\r
142         final Boolean _1gbFd = ((input) & (1<<5)) != 0;\r
143         final Boolean _10gbFd = ((input) & (1<<6)) != 0;\r
144         final Boolean _copper = ((input) & (1<<7)) != 0;\r
145         final Boolean _fiber = ((input) & (1<<8)) != 0;\r
146         final Boolean _autoneg = ((input) & (1<<9)) != 0;\r
147         final Boolean _pause = ((input) & (1<<10)) != 0;\r
148         final Boolean _pauseAsym = ((input) & (1<<11)) != 0;\r
149         return new PortFeaturesV10(_100mbFd, _100mbHd, _10gbFd, _10mbFd, _10mbHd,\r
150                 _1gbFd, _1gbHd, _autoneg, _copper, _fiber, _pause, _pauseAsym);\r
151     }\r
152     \r
153 }\r