blob: 47fad41054b70394e44dcf4c442fd9efc96a3a5f [file] [log] [blame]
Carmelo Cascone770507f2017-09-14 20:58:04 +02001/*
2 * Copyright 2017-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.p4tutorial.pipeconf;
18
19import org.apache.felix.scr.annotations.Activate;
20import org.apache.felix.scr.annotations.Component;
21import org.apache.felix.scr.annotations.Deactivate;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
Carmelo Cascone770507f2017-09-14 20:58:04 +020024import org.onosproject.driver.pipeline.DefaultSingleTablePipeline;
25import org.onosproject.net.behaviour.Pipeliner;
26import org.onosproject.net.device.PortStatisticsDiscovery;
27import org.onosproject.net.pi.model.DefaultPiPipeconf;
28import org.onosproject.net.pi.model.PiPipeconf;
29import org.onosproject.net.pi.model.PiPipeconfId;
30import org.onosproject.net.pi.model.PiPipelineInterpreter;
31import org.onosproject.net.pi.model.PiPipelineModel;
Carmelo Cascone39c28ca2017-11-15 13:03:57 -080032import org.onosproject.net.pi.service.PiPipeconfService;
Carmelo Cascone87892e22017-11-13 16:01:29 -080033import org.onosproject.p4runtime.model.P4InfoParser;
34import org.onosproject.p4runtime.model.P4InfoParserException;
Carmelo Cascone770507f2017-09-14 20:58:04 +020035
36import java.net.URL;
37
38import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.BMV2_JSON;
39import static org.onosproject.net.pi.model.PiPipeconf.ExtensionType.P4_INFO_TEXT;
40
41/**
42 * Component that produces and registers a pipeconf when loaded.
43 */
44@Component(immediate = true)
45public final class PipeconfFactory {
46
47 public static final PiPipeconfId PIPECONF_ID = new PiPipeconfId("p4-tutorial-pipeconf");
Carmelo Cascone700648c2018-04-11 12:02:16 -070048 private static final URL P4INFO_URL = PipeconfFactory.class.getResource("/mytunnel.p4info");
49 private static final URL BMV2_JSON_URL = PipeconfFactory.class.getResource("/mytunnel.json");
Carmelo Cascone770507f2017-09-14 20:58:04 +020050
51 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
52 private PiPipeconfService piPipeconfService;
53
54 @Activate
55 public void activate() {
56 // Registers the pipeconf at component activation.
Carmelo Cascone87892e22017-11-13 16:01:29 -080057 piPipeconfService.register(buildPipeconf());
Carmelo Cascone770507f2017-09-14 20:58:04 +020058 }
59
60 @Deactivate
61 public void deactivate() {
Carmelo Cascone87892e22017-11-13 16:01:29 -080062 piPipeconfService.remove(PIPECONF_ID);
63 }
64
65 private PiPipeconf buildPipeconf() {
66 final PiPipelineModel pipelineModel;
67 try {
68 pipelineModel = P4InfoParser.parse(P4INFO_URL);
69 } catch (P4InfoParserException e) {
Ray Milkey986a47a2018-01-25 11:38:51 -080070 throw new IllegalStateException(e);
Carmelo Cascone87892e22017-11-13 16:01:29 -080071 }
72
73 return DefaultPiPipeconf.builder()
74 .withId(PIPECONF_ID)
75 .withPipelineModel(pipelineModel)
76 .addBehaviour(PiPipelineInterpreter.class, PipelineInterpreterImpl.class)
77 .addBehaviour(PortStatisticsDiscovery.class, PortStatisticsDiscoveryImpl.class)
Carmelo Cascone700648c2018-04-11 12:02:16 -070078 // Since mytunnel.p4 defines only 1 table, we re-use the existing single-table pipeliner.
Carmelo Cascone87892e22017-11-13 16:01:29 -080079 .addBehaviour(Pipeliner.class, DefaultSingleTablePipeline.class)
80 .addExtension(P4_INFO_TEXT, P4INFO_URL)
81 .addExtension(BMV2_JSON, BMV2_JSON_URL)
82 .build();
Carmelo Cascone770507f2017-09-14 20:58:04 +020083 }
84}