Group and Port are not mandatory in Flow.
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / OF10FlowModInputMessageFactory.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.OF10ActionsSerializer;\r
12 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchSerializer;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlagsV10;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;\r
15 \r
16 /**\r
17  * Translates FlowMod messages\r
18  * @author michal.polkorab\r
19  */\r
20 public class OF10FlowModInputMessageFactory implements OFSerializer<FlowModInput> {\r
21 \r
22     private static final byte MESSAGE_TYPE = 14;\r
23     private static final int MESSAGE_LENGTH = 72;\r
24     \r
25     private static OF10FlowModInputMessageFactory instance;\r
26    \r
27     private OF10FlowModInputMessageFactory() {\r
28         // singleton\r
29     }\r
30     \r
31     /**\r
32      * @return singleton factory\r
33      */\r
34     public static synchronized OF10FlowModInputMessageFactory getInstance() {\r
35         if(instance == null) {\r
36             instance = new OF10FlowModInputMessageFactory();\r
37         }\r
38         return instance;\r
39     }\r
40     \r
41     @Override\r
42     public void messageToBuffer(short version, ByteBuf out, FlowModInput message) {\r
43         ByteBufUtils.writeOFHeader(instance, message, out);\r
44         OF10MatchSerializer.encodeMatchV10(out, message.getMatchV10());\r
45         out.writeLong(message.getCookie().longValue());\r
46         out.writeShort(message.getCommand().getIntValue());\r
47         out.writeShort(message.getIdleTimeout().intValue());\r
48         out.writeShort(message.getHardTimeout().intValue());\r
49         out.writeShort(message.getPriority());\r
50         out.writeInt(message.getBufferId().intValue());\r
51         if (null != message.getOutPort()) {\r
52             out.writeShort(message.getOutPort().getValue().intValue());\r
53         }\r
54         out.writeShort(createFlowModFlagsBitmask(message.getFlagsV10()));\r
55         OF10ActionsSerializer.encodeActionsV10(out, message.getActionsList());\r
56     }\r
57 \r
58     @Override\r
59     public int computeLength(FlowModInput message) {\r
60         return MESSAGE_LENGTH + OF10ActionsSerializer.computeActionsLength(message.getActionsList());\r
61     }\r
62 \r
63     @Override\r
64     public byte getMessageType() {\r
65         return MESSAGE_TYPE;\r
66     }\r
67 \r
68     private static int createFlowModFlagsBitmask(FlowModFlagsV10 flags) {\r
69         int flowModFlagBitmask = 0;\r
70         Map<Integer, Boolean> flowModFlagsMap = new HashMap<>();\r
71         flowModFlagsMap.put(0, flags.isOFPFFSENDFLOWREM());\r
72         flowModFlagsMap.put(1, flags.isOFPFFCHECKOVERLAP());\r
73         flowModFlagsMap.put(2, flags.isOFPFFEMERG());\r
74         flowModFlagBitmask = ByteBufUtils.fillBitMaskFromMap(flowModFlagsMap);\r
75         return flowModFlagBitmask;\r
76     }\r
77 }\r