/*
* Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowjava.protocol.impl.deserialization.match;
import io.netty.buffer.ByteBuf;
import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderDeserializer;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
/**
* @author michal.polkorab
*
*/
public abstract class AbstractOxmMatchEntryDeserializer implements HeaderDeserializer<MatchEntry> {
@Override
public MatchEntry deserializeHeader(ByteBuf input) {
MatchEntryBuilder builder = processHeader(getOxmClass(), getOxmField(), input);
return builder.build();
}
/**
* @return oxm_field class
*/
protected abstract Class<? extends MatchField> getOxmField();
/**
* @return oxm_class class
*/
protected abstract Class<? extends OxmClassBase> getOxmClass();
/**
* Prepares match entry header - sets oxm_class, oxm_field, hasMask
* + sets the buffer.readerIndex() to the end of match entry
* - where augmentation starts
* @param oxmClass oxm class type
* @param oxmField oxm field type
* @param input input bytebuf
* @return MatchEntriesBuilder which can be filled with MatchEntry augmentation
*/
protected MatchEntryBuilder processHeader(Class<? extends OxmClassBase> oxmClass,
Class<? extends MatchField> oxmField, ByteBuf input) {
MatchEntryBuilder builder = new MatchEntryBuilder();
builder.setOxmClass(oxmClass);
// skip oxm_class (provided)
input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
builder.setOxmMatchField(oxmField);
boolean hasMask = (input.readUnsignedByte() & 1) != 0;
builder.setHasMask(hasMask);
// skip match entry length - not needed
input.skipBytes(EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
return builder;
}
}