blob: 55d65b66f3f6e5b30e851bdf3ca3cf8efb80be24 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Jonathan Hart1ad75f22016-04-13 21:24:13 -070016
Jonathan Hart2da1e602015-02-18 19:09:24 -080017package org.onosproject.routing.impl;
Jonathan Hart335ef462014-10-16 08:20:46 -070018
Jonathan Hart41349e92015-02-09 14:14:02 -080019import org.apache.felix.scr.annotations.Component;
Jonathan Hart41349e92015-02-09 14:14:02 -080020import org.apache.felix.scr.annotations.Reference;
21import org.apache.felix.scr.annotations.ReferenceCardinality;
22import org.apache.felix.scr.annotations.Service;
Jonathan Hart552e31f2015-02-06 11:11:59 -080023import org.onlab.packet.IpAddress;
Jonathan Hart1ad75f22016-04-13 21:24:13 -070024import org.onosproject.incubator.net.routing.ResolvedRoute;
25import org.onosproject.incubator.net.routing.Route;
26import org.onosproject.incubator.net.routing.RouteEvent;
27import org.onosproject.incubator.net.routing.RouteListener;
28import org.onosproject.incubator.net.routing.RouteService;
29import org.onosproject.incubator.net.routing.RouteTableId;
Jonathan Hart2da1e602015-02-18 19:09:24 -080030import org.onosproject.routing.FibEntry;
31import org.onosproject.routing.FibListener;
32import org.onosproject.routing.FibUpdate;
33import org.onosproject.routing.RouteEntry;
Jonathan Hart2da1e602015-02-18 19:09:24 -080034import org.onosproject.routing.RoutingService;
Jonathan Hart552e31f2015-02-06 11:11:59 -080035
Jonathan Hart66018992015-07-31 11:19:27 -070036import java.util.Collection;
37import java.util.Collections;
Jonathan Hart1ad75f22016-04-13 21:24:13 -070038import java.util.stream.Collectors;
Pingping Line28ae4c2015-03-13 11:37:03 -070039
Jonathan Hart335ef462014-10-16 08:20:46 -070040/**
Jonathan Hart1ad75f22016-04-13 21:24:13 -070041 * Adapts new route service interface to old RoutingService interface.
Jonathan Hart335ef462014-10-16 08:20:46 -070042 */
Jonathan Hart41349e92015-02-09 14:14:02 -080043@Service
Jonathan Hart1ad75f22016-04-13 21:24:13 -070044@Component(immediate = true, enabled = false)
Jonathan Hart41349e92015-02-09 14:14:02 -080045public class Router implements RoutingService {
Jonathan Hart335ef462014-10-16 08:20:46 -070046
Jonathan Hart41349e92015-02-09 14:14:02 -080047 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hart1ad75f22016-04-13 21:24:13 -070048 protected RouteService routeService;
Jonathan Hart66018992015-07-31 11:19:27 -070049
Jonathan Hart1ad75f22016-04-13 21:24:13 -070050 @Override
51 public void start() {
Jonathan Hart41349e92015-02-09 14:14:02 -080052 }
53
54 @Override
Pingping Line28ae4c2015-03-13 11:37:03 -070055 public void addFibListener(FibListener fibListener) {
Jonathan Hart1ad75f22016-04-13 21:24:13 -070056 routeService.addListener(new InternalRouteListener(fibListener));
Jonathan Hart335ef462014-10-16 08:20:46 -070057 }
58
Jonathan Hart41349e92015-02-09 14:14:02 -080059 @Override
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080060 public void stop() {
Jonathan Hart739c8352014-10-29 17:49:26 -070061 }
62
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -070063 @Override
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080064 public Collection<RouteEntry> getRoutes4() {
Jonathan Hart1ad75f22016-04-13 21:24:13 -070065 return routeService.getAllRoutes().get(new RouteTableId("ipv4")).stream()
66 .map(route -> new RouteEntry(route.prefix(), route.nextHop()))
67 .collect(Collectors.toList());
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080068 }
69
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -070070 @Override
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080071 public Collection<RouteEntry> getRoutes6() {
Jonathan Hart1ad75f22016-04-13 21:24:13 -070072 return routeService.getAllRoutes().get(new RouteTableId("ipv6")).stream()
73 .map(route -> new RouteEntry(route.prefix(), route.nextHop()))
74 .collect(Collectors.toList());
75 }
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080076
Jonathan Hart1ad75f22016-04-13 21:24:13 -070077 @Override
78 public RouteEntry getLongestMatchableRouteEntry(IpAddress ipAddress) {
79 Route route = routeService.longestPrefixMatch(ipAddress);
80 if (route != null) {
81 return new RouteEntry(route.prefix(), route.nextHop());
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080082 }
Jonathan Hart1ad75f22016-04-13 21:24:13 -070083 return null;
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080084 }
85
86 /**
Jonathan Hart1ad75f22016-04-13 21:24:13 -070087 * Internal route listener.
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080088 */
Jonathan Hart1ad75f22016-04-13 21:24:13 -070089 private class InternalRouteListener implements RouteListener {
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080090
Jonathan Hart1ad75f22016-04-13 21:24:13 -070091 private final FibListener fibListener;
Pavlin Radoslavov3a0a52e2015-01-06 17:41:37 -080092
Jonathan Hart1ad75f22016-04-13 21:24:13 -070093 /**
94 * Constructor.
95 *
96 * @param fibListener FIB listener
97 */
98 public InternalRouteListener(FibListener fibListener) {
99 this.fibListener = fibListener;
Pavlin Radoslavov248c2ae2014-12-02 09:51:25 -0800100 }
101
Jonathan Hart335ef462014-10-16 08:20:46 -0700102 @Override
Jonathan Hart1ad75f22016-04-13 21:24:13 -0700103 public void event(RouteEvent event) {
104 ResolvedRoute route = event.subject();
105 FibEntry entry = new FibEntry(route.prefix(), route.nextHop(), route.nextHopMac());
Pavlin Radoslavov248c2ae2014-12-02 09:51:25 -0800106
Pavlin Radoslavov248c2ae2014-12-02 09:51:25 -0800107 switch (event.type()) {
Jonathan Hart1ad75f22016-04-13 21:24:13 -0700108 case ROUTE_ADDED:
109 case ROUTE_UPDATED:
110 fibListener.update(Collections.singleton(new FibUpdate(FibUpdate.Type.UPDATE, entry)),
111 Collections.emptyList());
Pavlin Radoslavov248c2ae2014-12-02 09:51:25 -0800112 break;
Jonathan Hart1ad75f22016-04-13 21:24:13 -0700113 case ROUTE_REMOVED:
114 fibListener.update(Collections.emptyList(),
115 Collections.singleton(new FibUpdate(FibUpdate.Type.DELETE, entry)));
Pavlin Radoslavov248c2ae2014-12-02 09:51:25 -0800116 break;
117 default:
118 break;
Jonathan Hart335ef462014-10-16 08:20:46 -0700119 }
120 }
121 }
Jonathan Hart335ef462014-10-16 08:20:46 -0700122}