2 * Copyright (c) 2014 Cisco Systems, Inc. and others. 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
9 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf;
11 import java.util.List;
14 import com.google.common.collect.ImmutableList;
15 import org.opendaylight.groupbasedpolicy.sf.classifiers.EtherTypeClassifierDefinition;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.IntBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValuesBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValue;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValueBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
32 * Match on the ether type of the traffic
34 public class EtherTypeClassifier extends Classifier {
36 protected EtherTypeClassifier(Classifier parent) {
41 public ClassifierDefinitionId getId() {
42 return EtherTypeClassifierDefinition.ID;
46 public ClassifierDefinition getClassifierDefinition() {
47 return EtherTypeClassifierDefinition.DEFINITION;
51 public List<SupportedParameterValues> getSupportedParameterValues() {
53 List<SupportedIntValue> values = ImmutableList.of(
54 new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.ARP_VALUE)
56 new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.IPv4_VALUE)
58 new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.IPv6_VALUE)
60 SupportedParameterValuesBuilder b = new SupportedParameterValuesBuilder();
61 b.setParameterName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
62 b.setParameterType(new IntBuilder().setSupportedIntValue(values).build());
64 return ImmutableList.of(b.build());
68 protected void checkPresenceOfRequiredParams(Map<String, ParameterValue> params) {
69 if (params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM) == null) {
70 throw new IllegalArgumentException(
71 "Parameter " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM + " not specified.");
73 if (params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM).getIntValue() == null) {
74 throw new IllegalArgumentException(
75 "Value of " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM + " parameter is not present.");
80 protected List<MatchBuilder> update(List<MatchBuilder> matches,
81 Map<String, ParameterValue> params) {
82 Long type = params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM).getIntValue();
83 for (MatchBuilder match : matches) {
84 EthernetMatchBuilder em;
85 if (match.getEthernetMatch() != null) {
86 equalOrNotSetValidation(match.getEthernetMatch().getEthernetType(), type);
89 em = new EthernetMatchBuilder();
91 em.setEthernetType(new EthernetTypeBuilder().setType(new EtherType(type)).build());
92 match.setEthernetMatch(em.build());
97 private void equalOrNotSetValidation(EthernetType ethTypeInMatch, long paramValue) {
98 if (ethTypeInMatch != null) {
99 if (paramValue != ethTypeInMatch.getType().getValue().longValue()) {
100 throw new IllegalArgumentException(
101 "Classification conflict detected at " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM + " parameter for values " + ethTypeInMatch
103 .getValue() + " and " + paramValue + ". It is not allowed " + "to assign different values to the same parameter among all the classifiers within one rule.");
109 protected void checkPrereqs(List<MatchBuilder> matches) {
110 // So far EthType has no prereqs.