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.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
16 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Description;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definition.ParameterBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definition.Parameter.IsRequired;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definition.Parameter.Type;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinitionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
29 import com.google.common.collect.ImmutableList;
30 import com.google.common.collect.ImmutableMap;
33 * Match on the IP protocol of IP traffic
35 public class IpProtoClassifier extends EtherTypeClassifier {
36 public static final ClassifierDefinitionId ID =
37 new ClassifierDefinitionId("79c6fdb2-1e1a-4832-af57-c65baf5c2335");
38 protected static final String PROTO = "proto";
39 protected static final ClassifierDefinition DEF =
40 new ClassifierDefinitionBuilder()
42 .setParent(EtherTypeClassifier.ID)
43 .setName(new ClassifierName("ip_proto"))
44 .setDescription(new Description("Match on the IP protocol of IP traffic"))
45 .setParameter(ImmutableList.of(new ParameterBuilder()
46 .setName(new ParameterName(PROTO))
47 .setDescription(new Description("The IP protocol to match against"))
48 .setIsRequired(IsRequired.Required)
53 private static final Map<String, Object> ipv4 =
54 ImmutableMap.<String,Object>of(TYPE, FlowUtils.IPv4);
55 private static final Map<String, Object> ipv6 =
56 ImmutableMap.<String,Object>of(TYPE, FlowUtils.IPv6);
59 public ClassifierDefinitionId getId() {
64 public ClassifierDefinition getClassDef() {
69 public List<MatchBuilder> updateMatch(List<MatchBuilder> matches,
70 Map<String, Object> params) {
71 Object param = params.get(PROTO);
72 // XXX TODO generate exception and fail the match
73 if (param == null || !(param instanceof Long)) return matches;
74 Long proto = (Long)param;
76 ArrayList<MatchBuilder> r = new ArrayList<>();
77 for (MatchBuilder b : matches) {
78 r.addAll(updateMatch(new MatchBuilder(b.build()), proto, ipv4));
79 r.addAll(updateMatch(new MatchBuilder(b.build()), proto, ipv6));
84 private List<MatchBuilder> updateMatch(MatchBuilder match,
86 Map<String, Object> parentParams) {
87 List<MatchBuilder> r =
88 super.updateMatch(Collections.singletonList(match),
90 for (MatchBuilder mb : r) {
92 if (mb.getIpMatch() != null)
93 imb = new IpMatchBuilder(mb.getIpMatch());
95 imb = new IpMatchBuilder();
96 imb.setIpProtocol(proto.shortValue());
97 mb.setIpMatch(imb.build());