2 * Copyright (c) 2018 SUSE LINUX GmbH. 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
8 package org.opendaylight.openflowjava.nx.codec.match;
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.oxm.container.match.entry.value.ExperimenterIdCase;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.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.oxm.container.match.entry.value.experimenter.id._case.NxExpMatchEntryValue;
27 import org.opendaylight.yangtools.yang.common.Uint32;
29 public abstract class AbstractExperimenterMatchCodec extends AbstractMatchCodec {
31 protected static <F extends MatchField> MatchEntrySerializerKey<ExperimenterClass, F> createSerializerKey(
32 short version, Uint32 expId, Class<F> oxmField) {
33 MatchEntrySerializerKey<ExperimenterClass, F> key = new MatchEntrySerializerKey<>(
34 version, ExperimenterClass.class, oxmField);
35 key.setExperimenterId(expId);
39 protected static MatchEntryDeserializerKey createDeserializerKey(
40 short version, Uint32 expId, int fieldCode) {
41 MatchEntryDeserializerKey key = new MatchEntryDeserializerKey(
42 version, OxmMatchConstants.EXPERIMENTER_CLASS, fieldCode);
43 key.setExperimenterId(expId);
48 public void serialize(MatchEntry input, ByteBuf outBuffer) {
49 // serializes standard header + experimenterId
50 serializeHeader(input, outBuffer);
52 ExperimenterIdCase experimenterIdCase = (ExperimenterIdCase) input.getMatchEntryValue();
53 OfjAugNxExpMatch ofjAugNxExpMatch = experimenterIdCase.augmentation(OfjAugNxExpMatch.class);
54 NxExpMatchEntryValue nxExpMatchEntryValue = ofjAugNxExpMatch.getNxExpMatchEntryValue();
56 serializeValue(nxExpMatchEntryValue, input.isHasMask(), outBuffer);
59 protected abstract void serializeValue(NxExpMatchEntryValue value, boolean hasMask, ByteBuf outBuffer);
62 public MatchEntry deserialize(ByteBuf message) {
63 final MatchEntryBuilder matchEntryBuilder = deserializeHeaderToBuilder(message);
65 // skip experimenter Id
66 message.skipBytes(Integer.BYTES);
68 ExperimenterIdCaseBuilder expCaseBuilder = new ExperimenterIdCaseBuilder();
69 ExperimenterBuilder expBuilder = new ExperimenterBuilder();
70 expBuilder.setExperimenter(new ExperimenterId(getExperimenterId()));
71 expCaseBuilder.setExperimenter(expBuilder.build());
73 final NxExpMatchEntryValue value = deserializeValue(message, matchEntryBuilder.isHasMask());
75 return buildMatchEntry(matchEntryBuilder, expCaseBuilder, value);
78 protected abstract NxExpMatchEntryValue deserializeValue(ByteBuf message, boolean hasMask);
80 private static MatchEntry buildMatchEntry(MatchEntryBuilder matchEntryBuilder,
81 ExperimenterIdCaseBuilder experimenterIdCaseBuilder,
82 NxExpMatchEntryValue nxExpMatchEntryValue) {
83 return matchEntryBuilder
84 .setMatchEntryValue(experimenterIdCaseBuilder.addAugmentation(new OfjAugNxExpMatchBuilder()
85 .setNxExpMatchEntryValue(nxExpMatchEntryValue)
92 public void serializeHeader(NxmHeader input, ByteBuf outBuffer) {
93 outBuffer.writeLong(input.toLong());
97 protected NxmHeader buildHeader(boolean hasMask) {
101 Integer.BYTES + (hasMask ? getValueLength() * 2 : getValueLength()),
102 getExperimenterId().longValue());
106 public Class<? extends OxmClassBase> getOxmClass() {
107 return ExperimenterClass.class;
111 public int getOxmClassCode() {
112 return OxmMatchConstants.EXPERIMENTER_CLASS;
115 protected abstract @NonNull Uint32 getExperimenterId();