@Override public OFAction mapInstruction(OFFactory factory, ExtensionTreatment extensionTreatment) { ExtensionTreatmentType type = extensionTreatment.type(); if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_VLAN_ID.type())) { VlanId vlanId = ((OfdpaSetVlanVid) extensionTreatment).vlanId(); // NOTE: OFDPA requires isPresent bit set to zero. OFVlanVidMatch match = OFVlanVidMatch.ofRawVid(vlanId.toShort()); return factory.actions().setField(factory.oxms().vlanVid(match)); } throw new UnsupportedOperationException( "Unexpected ExtensionTreatment: " + extensionTreatment.toString()); }
@Override public OFOxm<?> mapSelector(OFFactory factory, ExtensionSelector extensionSelector) { ExtensionSelectorType type = extensionSelector.type(); if (type.equals(ExtensionSelectorType.ExtensionSelectorTypes.OFDPA_MATCH_VLAN_VID.type())) { VlanId vlanId = ((OfdpaMatchVlanVid) extensionSelector).vlanId(); // Special VLAN 0x0000/0x1FFF required by OFDPA if (vlanId.equals(VlanId.NONE)) { OFVlanVidMatch vid = OFVlanVidMatch.ofRawVid((short) 0x0000); OFVlanVidMatch mask = OFVlanVidMatch.ofRawVid((short) 0x1FFF); return factory.oxms().vlanVidMasked(vid, mask); // Normal case } else if (vlanId.equals(VlanId.ANY)) { return factory.oxms().vlanVidMasked(OFVlanVidMatch.PRESENT, OFVlanVidMatch.PRESENT); } else { return factory.oxms().vlanVid(OFVlanVidMatch.ofVlanVid(VlanVid.ofVlan(vlanId.toShort()))); } } throw new UnsupportedOperationException( "Unexpected ExtensionSelector: " + extensionSelector.toString()); }
@Override public ExtensionSelector mapOxm(OFOxm<?> oxm) { VlanId vlanId; if (oxm.getMatchField().equals(MatchField.VLAN_VID)) { if (oxm.isMasked()) { OFVlanVidMatch vid = ((OFOxmVlanVidMasked) oxm).getValue(); OFVlanVidMatch mask = ((OFOxmVlanVidMasked) oxm).getMask(); if (vid.equals(OFVlanVidMatch.ofRawVid((short) 0))) { vlanId = VlanId.NONE; } else if (vid.equals(OFVlanVidMatch.PRESENT) && mask.equals(OFVlanVidMatch.PRESENT)) { vlanId = VlanId.ANY; } else { vlanId = VlanId.vlanId(vid.getVlan()); } } else { OFVlanVidMatch vid = ((OFOxmVlanVid) oxm).getValue(); if (!vid.isPresentBitSet()) { vlanId = VlanId.NONE; } else { vlanId = VlanId.vlanId(vid.getVlan()); } } return new OfdpaMatchVlanVid(vlanId); } throw new UnsupportedOperationException( "Unexpected OXM: " + oxm.toString()); }