2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
11 import io.netty.buffer.ByteBuf;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
15 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutputBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.FlowRemovedMask;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.FlowRemovedMaskBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PacketInMask;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PacketInMaskBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PortStatusMask;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PortStatusMaskBuilder;
29 * Translates GetAsyncReply messages.
31 * @author timotej.kubas
32 * @author michal.polkorab
34 public class GetAsyncReplyMessageFactory implements OFDeserializer<GetAsyncOutput> {
36 private static final byte SEPARATE_ROLES = 2;
39 public GetAsyncOutput deserialize(ByteBuf rawMessage) {
40 GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder();
41 builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
42 builder.setXid(rawMessage.readUnsignedInt());
43 builder.setPacketInMask(decodePacketInMask(rawMessage));
44 builder.setPortStatusMask(decodePortStatusMask(rawMessage));
45 builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage));
46 return builder.build();
49 private static List<PacketInMask> decodePacketInMask(ByteBuf input) {
50 List<PacketInMask> inMasks = new ArrayList<>();
51 PacketInMaskBuilder maskBuilder;
52 for (int i = 0; i < SEPARATE_ROLES; i++) {
53 maskBuilder = new PacketInMaskBuilder();
54 maskBuilder.setMask(decodePacketInReasons(input.readUnsignedInt()));
55 inMasks.add(maskBuilder.build());
60 private static List<PortStatusMask> decodePortStatusMask(ByteBuf input) {
61 List<PortStatusMask> inMasks = new ArrayList<>();
62 PortStatusMaskBuilder maskBuilder;
63 for (int i = 0; i < SEPARATE_ROLES; i++) {
64 maskBuilder = new PortStatusMaskBuilder();
65 maskBuilder.setMask(decodePortReasons(input.readUnsignedInt()));
66 inMasks.add(maskBuilder.build());
71 private static List<FlowRemovedMask> decodeFlowRemovedMask(ByteBuf input) {
72 List<FlowRemovedMask> inMasks = new ArrayList<>();
73 FlowRemovedMaskBuilder maskBuilder;
74 for (int i = 0; i < SEPARATE_ROLES; i++) {
75 maskBuilder = new FlowRemovedMaskBuilder();
76 maskBuilder.setMask(decodeFlowRemovedReasons(input.readUnsignedInt()));
77 inMasks.add(maskBuilder.build());
82 private static List<PacketInReason> decodePacketInReasons(long input) {
83 List<PacketInReason> reasons = new ArrayList<>();
84 if ((input & 1 << 0) != 0) {
85 reasons.add(PacketInReason.OFPRNOMATCH);
87 if ((input & 1 << 1) != 0) {
88 reasons.add(PacketInReason.OFPRACTION);
90 if ((input & 1 << 2) != 0) {
91 reasons.add(PacketInReason.OFPRINVALIDTTL);
96 private static List<PortReason> decodePortReasons(long input) {
97 List<PortReason> reasons = new ArrayList<>();
98 if ((input & 1 << 0) != 0) {
99 reasons.add(PortReason.OFPPRADD);
101 if ((input & 1 << 1) != 0) {
102 reasons.add(PortReason.OFPPRDELETE);
104 if ((input & 1 << 2) != 0) {
105 reasons.add(PortReason.OFPPRMODIFY);
110 private static List<FlowRemovedReason> decodeFlowRemovedReasons(long input) {
111 List<FlowRemovedReason> reasons = new ArrayList<>();
112 if ((input & 1 << 0) != 0) {
113 reasons.add(FlowRemovedReason.OFPRRIDLETIMEOUT);
115 if ((input & 1 << 1) != 0) {
116 reasons.add(FlowRemovedReason.OFPRRHARDTIMEOUT);
118 if ((input & 1 << 2) != 0) {
119 reasons.add(FlowRemovedReason.OFPRRDELETE);
121 if ((input & 1 << 3) != 0) {
122 reasons.add(FlowRemovedReason.OFPRRGROUPDELETE);