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