Use ByteBuf.readRetainedSlice()
[openflowplugin.git] / extension / openflowjava-extension-nicira / src / main / java / org / opendaylight / openflowjava / nx / codec / match / AbstractExperimenterMatchCodec.java
1 /*
2  * Copyright (c) 2018 SUSE LINUX GmbH.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.openflowjava.nx.codec.match;
9
10 import io.netty.buffer.ByteBuf;
11 import org.eclipse.jdt.annotation.NonNull;
12 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
13 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
14 import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.experimenter.id.match.entry.ExperimenterIdCase;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.experimenter.id.match.entry.ExperimenterIdCaseBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.experimenter.id.match.entry.experimenter.id._case.ExperimenterBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxExpMatch;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxExpMatchBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.aug.nx.exp.match.NxExpMatchEntryValue;
27 import org.opendaylight.yangtools.yang.common.Uint32;
28 import org.opendaylight.yangtools.yang.common.Uint8;
29
30 public abstract class AbstractExperimenterMatchCodec extends AbstractMatchCodec {
31
32     protected static <F extends MatchField> MatchEntrySerializerKey<ExperimenterClass, F> createSerializerKey(
33             final Uint8 version, final Uint32 expId, final F oxmField) {
34         MatchEntrySerializerKey<ExperimenterClass, F> key = new MatchEntrySerializerKey<>(
35                 version, ExperimenterClass.VALUE, oxmField);
36         key.setExperimenterId(expId);
37         return key;
38     }
39
40     protected static MatchEntryDeserializerKey createDeserializerKey(
41             final Uint8 version, final Uint32 expId, final int fieldCode) {
42         MatchEntryDeserializerKey key = new MatchEntryDeserializerKey(
43                 version, OxmMatchConstants.EXPERIMENTER_CLASS, fieldCode);
44         key.setExperimenterId(expId);
45         return key;
46     }
47
48     @Override
49     public void serialize(final MatchEntry input, final ByteBuf outBuffer) {
50         // serializes standard header + experimenterId
51         serializeHeader(input, outBuffer);
52
53         ExperimenterIdCase experimenterIdCase = (ExperimenterIdCase) input.getMatchEntryValue();
54         OfjAugNxExpMatch ofjAugNxExpMatch = experimenterIdCase.augmentation(OfjAugNxExpMatch.class);
55         NxExpMatchEntryValue nxExpMatchEntryValue = ofjAugNxExpMatch.getNxExpMatchEntryValue();
56
57         serializeValue(nxExpMatchEntryValue, input.getHasMask(), outBuffer);
58     }
59
60     protected abstract void serializeValue(NxExpMatchEntryValue value, boolean hasMask, ByteBuf outBuffer);
61
62     @Override
63     public MatchEntry deserialize(final ByteBuf message) {
64         final MatchEntryBuilder matchEntryBuilder = deserializeHeaderToBuilder(message);
65
66         // skip experimenter Id
67         message.skipBytes(Integer.BYTES);
68
69         ExperimenterIdCaseBuilder expCaseBuilder = new ExperimenterIdCaseBuilder();
70         ExperimenterBuilder expBuilder = new ExperimenterBuilder();
71         expBuilder.setExperimenter(new ExperimenterId(getExperimenterId()));
72         expCaseBuilder.setExperimenter(expBuilder.build());
73
74         final NxExpMatchEntryValue value = deserializeValue(message, matchEntryBuilder.getHasMask());
75
76         return buildMatchEntry(matchEntryBuilder, expCaseBuilder, value);
77     }
78
79     protected abstract NxExpMatchEntryValue deserializeValue(ByteBuf message, boolean hasMask);
80
81     private static MatchEntry buildMatchEntry(final MatchEntryBuilder matchEntryBuilder,
82                                               final ExperimenterIdCaseBuilder experimenterIdCaseBuilder,
83                                               final NxExpMatchEntryValue nxExpMatchEntryValue) {
84         return matchEntryBuilder
85                 .setMatchEntryValue(experimenterIdCaseBuilder.addAugmentation(new OfjAugNxExpMatchBuilder()
86                     .setNxExpMatchEntryValue(nxExpMatchEntryValue)
87                     .build())
88                     .build())
89                 .build();
90     }
91
92     @Override
93     public void serializeHeader(final NxmHeader input, final ByteBuf outBuffer) {
94         outBuffer.writeLong(input.toLong());
95     }
96
97     @Override
98     protected NxmHeader buildHeader(final boolean hasMask) {
99         return new NxmHeader(
100                 getNxmFieldCode(),
101                 hasMask,
102                 Integer.BYTES + (hasMask ? getValueLength() * 2 : getValueLength()),
103                 getExperimenterId().longValue());
104     }
105
106     @Override
107     public OxmClassBase getOxmClass() {
108         return ExperimenterClass.VALUE;
109     }
110
111     @Override
112     public int getOxmClassCode() {
113         return OxmMatchConstants.EXPERIMENTER_CLASS;
114     }
115
116     protected abstract @NonNull Uint32 getExperimenterId();
117 }