blob: 87a6c9981788a214f927335e2fae94e3fa5de0e2 [file] [log] [blame]
Kyuhwi Choi5d7c9982016-01-20 13:55:55 +09001/*
2 * Copyright 2016 Open Networking Laboratory
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 */
16package org.onosproject.openstackrouting;
17
18import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
23import org.apache.felix.scr.annotations.Service;
24import org.onlab.packet.Ethernet;
25import org.onlab.packet.IPv4;
26import org.onosproject.core.ApplicationId;
27import org.onosproject.core.CoreService;
28import org.onosproject.net.driver.DriverService;
29import org.onosproject.net.packet.InboundPacket;
30import org.onosproject.net.packet.PacketContext;
31import org.onosproject.net.packet.PacketProcessor;
32import org.onosproject.net.packet.PacketService;
33import org.slf4j.Logger;
34import org.slf4j.LoggerFactory;
35
36import java.util.concurrent.ExecutorService;
37import java.util.concurrent.Executors;
38
39import static org.onlab.util.Tools.groupedThreads;
40
41@Service
42@Component(immediate = true)
43/**
44 * Populates flow rules about L3 functionality for VMs in Openstack.
45 */
46public class OpenstackRoutingManager implements OpenstackRoutingService {
47 private static Logger log = LoggerFactory
48 .getLogger(OpenstackRoutingManager.class);
49
50 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
51 protected CoreService coreService;
52
53 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
54 protected PacketService packetService;
55
56 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
57 protected DriverService driverService;
58
59 private ApplicationId appId;
60 private OpenstackICMPHandler icmpHandler;
61 private OpenstackPNATHandler natHandler;
62 private OpenstackFloatingIPHandler floatingIPHandler;
63 private OpenstackRoutingRulePopulator openstackRoutingRulePopulator;
64
65 private InternalPacketProcessor internalPacketProcessor = new InternalPacketProcessor();
66 private ExecutorService l3EventExcutorService =
67 Executors.newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "L3-event"));
68 private ExecutorService icmpEventExcutorService =
69 Executors.newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "icmp-event"));
70
71 @Activate
72 protected void activate() {
73 appId = coreService.registerApplication("org.onosproject.openstackrouting");
74 packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1));
75
76 log.info("onos-openstackrouting started");
77 }
78
79 @Deactivate
80 protected void deactivate() {
81 packetService.removeProcessor(internalPacketProcessor);
82 log.info("onos-openstackrouting stopped");
83 }
84
85
86 @Override
87 public void createFloatingIP(OpenstackFloatingIP openstackFloatingIP) {
88
89 }
90
91 @Override
92 public void updateFloatingIP(OpenstackFloatingIP openstackFloatingIP) {
93
94 }
95
96 @Override
97 public void deleteFloatingIP(String id) {
98
99 }
100
101 @Override
102 public void createRouter(OpenstackRouter openstackRouter) {
103
104 }
105
106 @Override
107 public void updateRouter(OpenstackRouter openstackRouter) {
108
109 }
110
111 @Override
112 public void deleteRouter(String id) {
113
114 }
115
116 @Override
117 public void createRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
118
119 }
120
121 @Override
122 public void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
123
124 }
125
126 @Override
127 public void deleteRouterInterface(String id) {
128
129 }
130
131 private class InternalPacketProcessor implements PacketProcessor {
132
133 @Override
134 public void process(PacketContext context) {
135
136 if (context.isHandled()) {
137 return;
138 }
139
140 InboundPacket pkt = context.inPacket();
141 Ethernet ethernet = pkt.parsed();
142
143 if (ethernet != null && ethernet.getEtherType() == Ethernet.TYPE_IPV4) {
144 IPv4 iPacket = (IPv4) ethernet.getPayload();
145 switch (iPacket.getProtocol()) {
146 case IPv4.PROTOCOL_ICMP:
147 icmpEventExcutorService.execute(new OpenstackICMPHandler(context));
148 break;
149 default:
150 l3EventExcutorService.execute(new OpenstackPNATHandler(context));
151 break;
152 }
153
154 }
155
156
157 }
158 }
159
160}