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