e02f8d0c9613c31ec060705931d0daa18adb69b4
[groupbasedpolicy.git] / renderers / ofoverlay / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / sf / IpProtoClassifier.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf;
10
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.Map;
15
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;
28
29 import com.google.common.collect.ImmutableList;
30 import com.google.common.collect.ImmutableMap;
31
32 /**
33  * Match on the IP protocol of IP traffic
34  */
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()
41                 .setId(ID)
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)
49                     .setType(Type.Int)
50                     .build()))
51                 .build();
52
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);
57
58     @Override
59     public ClassifierDefinitionId getId() {
60         return ID;
61     }
62
63     @Override
64     public ClassifierDefinition getClassDef() {
65         return DEF;
66     }
67
68     @Override
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;
75         
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));
80         }
81         return r;
82     }
83
84     private List<MatchBuilder> updateMatch(MatchBuilder match,
85                                            Long proto,
86                                            Map<String, Object> parentParams) {
87         List<MatchBuilder> r = 
88                 super.updateMatch(Collections.singletonList(match), 
89                                   parentParams);
90         for (MatchBuilder mb : r) {
91             IpMatchBuilder imb;
92             if (mb.getIpMatch() != null)
93                 imb = new IpMatchBuilder(mb.getIpMatch());
94             else 
95                 imb = new IpMatchBuilder();
96             imb.setIpProtocol(proto.shortValue());
97             mb.setIpMatch(imb.build());
98         }
99         return r;
100     }
101 }