blob: 1c1a74a54232e35f03ce537774b3a5b4b0b6329e [file] [log] [blame]
Jonathan Hartf5829202015-02-12 09:37:02 -08001/*
2 * Copyright 2015 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.bgprouter;
17
alshabib910aff12015-04-09 16:55:57 -070018import com.google.common.collect.ConcurrentHashMultiset;
19import com.google.common.collect.HashMultimap;
20import com.google.common.collect.Maps;
21import com.google.common.collect.Multimap;
22import com.google.common.collect.Multiset;
Jonathan Hartf5829202015-02-12 09:37:02 -080023import org.apache.felix.scr.annotations.Activate;
24import org.apache.felix.scr.annotations.Component;
25import org.apache.felix.scr.annotations.Deactivate;
26import org.apache.felix.scr.annotations.Reference;
27import org.apache.felix.scr.annotations.ReferenceCardinality;
28import org.onlab.packet.Ethernet;
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -070029import org.onlab.packet.Ip4Address;
alshabib2a441c62015-04-13 18:39:38 -070030import org.onlab.packet.Ip4Prefix;
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -070031import org.onlab.packet.Ip6Address;
Jonathan Hart7baba072015-02-23 14:27:59 -080032import org.onlab.packet.IpAddress;
33import org.onlab.packet.IpPrefix;
alshabib2a441c62015-04-13 18:39:38 -070034import org.onlab.packet.MacAddress;
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -070035import org.onlab.util.KryoNamespace;
Jonathan Hart54b406b2015-03-06 16:24:14 -080036import org.onosproject.config.NetworkConfigService;
Jonathan Hartf5829202015-02-12 09:37:02 -080037import org.onosproject.core.ApplicationId;
38import org.onosproject.core.CoreService;
39import org.onosproject.net.DeviceId;
Jonathan Hartf5829202015-02-12 09:37:02 -080040import org.onosproject.net.flow.DefaultTrafficSelector;
41import org.onosproject.net.flow.DefaultTrafficTreatment;
Jonathan Hartf5829202015-02-12 09:37:02 -080042import org.onosproject.net.flow.FlowRuleService;
43import org.onosproject.net.flow.TrafficSelector;
44import org.onosproject.net.flow.TrafficTreatment;
alshabib910aff12015-04-09 16:55:57 -070045import org.onosproject.net.flow.criteria.Criteria;
46import org.onosproject.net.flowobjective.DefaultFilteringObjective;
alshabib2a441c62015-04-13 18:39:38 -070047import org.onosproject.net.flowobjective.DefaultForwardingObjective;
48import org.onosproject.net.flowobjective.DefaultNextObjective;
alshabib910aff12015-04-09 16:55:57 -070049import org.onosproject.net.flowobjective.FilteringObjective;
50import org.onosproject.net.flowobjective.FlowObjectiveService;
alshabib2a441c62015-04-13 18:39:38 -070051import org.onosproject.net.flowobjective.ForwardingObjective;
52import org.onosproject.net.flowobjective.NextObjective;
Jonathan Hartf5829202015-02-12 09:37:02 -080053import org.onosproject.net.group.GroupService;
54import org.onosproject.net.packet.PacketService;
Jonathan Hart7baba072015-02-23 14:27:59 -080055import org.onosproject.routing.FibEntry;
Jonathan Hart2da1e602015-02-18 19:09:24 -080056import org.onosproject.routing.FibListener;
57import org.onosproject.routing.FibUpdate;
58import org.onosproject.routing.RoutingService;
Saurav Dasfbe25c52015-03-04 11:12:00 -080059import org.onosproject.routing.config.BgpSpeaker;
Jonathan Hart2da1e602015-02-18 19:09:24 -080060import org.onosproject.routing.config.Interface;
61import org.onosproject.routing.config.RoutingConfigurationService;
Jonathan Hartf5829202015-02-12 09:37:02 -080062import org.slf4j.Logger;
63import org.slf4j.LoggerFactory;
64
alshabib910aff12015-04-09 16:55:57 -070065import java.util.Collection;
66import java.util.Collections;
67import java.util.HashMap;
alshabib910aff12015-04-09 16:55:57 -070068import java.util.Map;
69import java.util.Set;
alshabib2a441c62015-04-13 18:39:38 -070070
71import static org.onlab.util.Tools.delay;
Jonathan Hartf5829202015-02-12 09:37:02 -080072
73/**
74 * BgpRouter component.
75 */
76@Component(immediate = true)
77public class BgpRouter {
78
79 private static final Logger log = LoggerFactory.getLogger(BgpRouter.class);
80
81 private static final String BGP_ROUTER_APP = "org.onosproject.bgprouter";
82
Jonathan Hart12ef2052015-03-10 13:58:13 -070083 private static final int PRIORITY_OFFSET = 100;
84 private static final int PRIORITY_MULTIPLIER = 5;
Jonathan Hartf5829202015-02-12 09:37:02 -080085
86 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
87 protected CoreService coreService;
88
89 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
90 protected FlowRuleService flowService;
91
92 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
93 protected GroupService groupService;
94
95 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
96 protected RoutingService routingService;
97
98 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
99 protected RoutingConfigurationService configService;
100
101 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
102 protected PacketService packetService;
103
Saurav Dasfbe25c52015-03-04 11:12:00 -0800104 //
105 // NOTE: Unused reference - needed to guarantee that the
106 // NetworkConfigReader component is activated and the network configuration
107 // is read.
108 //
109 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
110 protected NetworkConfigService networkConfigService;
111
Jonathan Hartf5829202015-02-12 09:37:02 -0800112 private ApplicationId appId;
113
Jonathan Hart7baba072015-02-23 14:27:59 -0800114 // Reference count for how many times a next hop is used by a route
115 private final Multiset<IpAddress> nextHopsCount = ConcurrentHashMultiset.create();
116
117 // Mapping from prefix to its current next hop
118 private final Map<IpPrefix, IpAddress> prefixToNextHop = Maps.newHashMap();
119
120 // Mapping from next hop IP to next hop object containing group info
alshabib2a441c62015-04-13 18:39:38 -0700121 private final Map<IpAddress, Integer> nextHops = Maps.newHashMap();
Jonathan Hart7baba072015-02-23 14:27:59 -0800122
123 // Stores FIB updates that are waiting for groups to be set up
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700124 private final Multimap<NextHopGroupKey, FibEntry> pendingUpdates = HashMultimap.create();
Jonathan Hartf5829202015-02-12 09:37:02 -0800125
Saurav Dasfbe25c52015-03-04 11:12:00 -0800126 // Device id of data-plane switch - should be learned from config
127 private DeviceId deviceId;
128
129 // Device id of control-plane switch (OVS) connected to BGP Speaker - should be
130 // learned from config
131 private DeviceId ctrlDeviceId;
Jonathan Hartf5829202015-02-12 09:37:02 -0800132
alshabib2a441c62015-04-13 18:39:38 -0700133 //private final GroupListener groupListener = new InternalGroupListener();
Jonathan Hart7baba072015-02-23 14:27:59 -0800134
Jonathan Hartf5829202015-02-12 09:37:02 -0800135 private TunnellingConnectivityManager connectivityManager;
136
sangho5eaf0332015-03-09 15:08:12 -0700137 private IcmpHandler icmpHandler;
138
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -0700139 private KryoNamespace appKryo = new KryoNamespace.Builder()
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700140 .register(IpAddress.Version.class)
141 .register(IpAddress.class)
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -0700142 .register(Ip4Address.class)
143 .register(Ip6Address.class)
144 .register(byte[].class)
145 .register(NextHopGroupKey.class)
146 .build();
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700147
alshabib910aff12015-04-09 16:55:57 -0700148
149 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
150 protected FlowObjectiveService flowObjectiveService;
151
Jonathan Hartf5829202015-02-12 09:37:02 -0800152 @Activate
153 protected void activate() {
Jonathan Hartf5829202015-02-12 09:37:02 -0800154 appId = coreService.registerApplication(BGP_ROUTER_APP);
Saurav Dasfbe25c52015-03-04 11:12:00 -0800155 getDeviceConfiguration(configService.getBgpSpeakers());
Jonathan Hartf5829202015-02-12 09:37:02 -0800156
alshabib2a441c62015-04-13 18:39:38 -0700157 //groupService.addListener(groupListener);
Jonathan Hart7baba072015-02-23 14:27:59 -0800158
Saurav Dascfd63d22015-04-13 16:08:24 -0700159 processIntfFilters(true, configService.getInterfaces());
alshabib10580802015-02-18 18:30:33 -0800160
Jonathan Hartf5829202015-02-12 09:37:02 -0800161 connectivityManager = new TunnellingConnectivityManager(appId,
162 configService,
Jonathan Hart936a7292015-03-06 18:02:57 -0800163 packetService,
Saurav Das3d038262015-04-23 12:36:58 -0700164 flowObjectiveService);
Jonathan Hartf5829202015-02-12 09:37:02 -0800165
sangho5eaf0332015-03-09 15:08:12 -0700166 icmpHandler = new IcmpHandler(configService, packetService);
167
Pingping Line28ae4c2015-03-13 11:37:03 -0700168 routingService.addFibListener(new InternalFibListener());
169 routingService.start();
Jonathan Hartf5829202015-02-12 09:37:02 -0800170
171 connectivityManager.start();
172
sangho5eaf0332015-03-09 15:08:12 -0700173 icmpHandler.start();
174
Jonathan Hartf5829202015-02-12 09:37:02 -0800175 log.info("BgpRouter started");
alshabib2a441c62015-04-13 18:39:38 -0700176
177 delay(1000);
178
179 FibEntry fibEntry = new FibEntry(Ip4Prefix.valueOf("10.1.0.0/16"),
180 Ip4Address.valueOf("192.168.10.1"),
181 MacAddress.valueOf("DE:AD:BE:EF:FE:ED"));
182 FibUpdate fibUpdate = new FibUpdate(FibUpdate.Type.UPDATE, fibEntry);
183 updateFibEntry(Collections.singletonList(fibUpdate));
Jonathan Hartf5829202015-02-12 09:37:02 -0800184 }
185
186 @Deactivate
187 protected void deactivate() {
188 routingService.stop();
189 connectivityManager.stop();
sangho5eaf0332015-03-09 15:08:12 -0700190 icmpHandler.stop();
Saurav Dascfd63d22015-04-13 16:08:24 -0700191 processIntfFilters(false, configService.getInterfaces());
Jonathan Hartf5829202015-02-12 09:37:02 -0800192
alshabib2a441c62015-04-13 18:39:38 -0700193 //groupService.removeListener(groupListener);
Jonathan Hart7baba072015-02-23 14:27:59 -0800194
Jonathan Hartf5829202015-02-12 09:37:02 -0800195 log.info("BgpRouter stopped");
196 }
197
Saurav Dasfbe25c52015-03-04 11:12:00 -0800198 private void getDeviceConfiguration(Map<String, BgpSpeaker> bgps) {
199 if (bgps == null || bgps.values().isEmpty()) {
200 log.error("BGP speakers configuration is missing");
201 return;
202 }
203 for (BgpSpeaker s : bgps.values()) {
204 ctrlDeviceId = s.connectPoint().deviceId();
205 if (s.interfaceAddresses() == null || s.interfaceAddresses().isEmpty()) {
206 log.error("BGP Router must have interfaces configured");
207 return;
208 }
209 deviceId = s.interfaceAddresses().get(0).connectPoint().deviceId();
210 break;
211 }
sangho5eaf0332015-03-09 15:08:12 -0700212
Saurav Dasfbe25c52015-03-04 11:12:00 -0800213 log.info("Router dpid: {}", deviceId);
214 log.info("Control Plane OVS dpid: {}", ctrlDeviceId);
215 }
216
Jonathan Hartf5829202015-02-12 09:37:02 -0800217 private void updateFibEntry(Collection<FibUpdate> updates) {
alshabib2a441c62015-04-13 18:39:38 -0700218 Map<FibEntry, Integer> toInstall = new HashMap<>(updates.size());
Jonathan Hart5b141422015-03-06 12:59:09 -0800219
Jonathan Hartf5829202015-02-12 09:37:02 -0800220 for (FibUpdate update : updates) {
Jonathan Hart7baba072015-02-23 14:27:59 -0800221 FibEntry entry = update.entry();
Jonathan Hartf5829202015-02-12 09:37:02 -0800222
Jonathan Hart7baba072015-02-23 14:27:59 -0800223 addNextHop(entry);
Jonathan Hartf5829202015-02-12 09:37:02 -0800224
alshabib2a441c62015-04-13 18:39:38 -0700225 Integer nextId;
Jonathan Hart7baba072015-02-23 14:27:59 -0800226 synchronized (pendingUpdates) {
alshabib2a441c62015-04-13 18:39:38 -0700227 nextId = nextHops.get(entry.nextHopIp());
228
229 /*
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700230 group = groupService.getGroup(deviceId,
231 new DefaultGroupKey(
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -0700232 appKryo.serialize(nextHop.group())));
Jonathan Hartf5829202015-02-12 09:37:02 -0800233
Jonathan Hart7baba072015-02-23 14:27:59 -0800234 if (group == null) {
235 log.debug("Adding pending flow {}", update.entry());
236 pendingUpdates.put(nextHop.group(), update.entry());
237 continue;
alshabib2a441c62015-04-13 18:39:38 -0700238 }*/
Jonathan Hartf5829202015-02-12 09:37:02 -0800239 }
240
alshabib2a441c62015-04-13 18:39:38 -0700241 toInstall.put(update.entry(), nextId);
Jonathan Hartf5829202015-02-12 09:37:02 -0800242 }
Jonathan Hart5b141422015-03-06 12:59:09 -0800243
244 installFlows(toInstall);
Jonathan Hartf5829202015-02-12 09:37:02 -0800245 }
246
alshabib2a441c62015-04-13 18:39:38 -0700247 private void installFlows(Map<FibEntry, Integer> entriesToInstall) {
Jonathan Hart7baba072015-02-23 14:27:59 -0800248
alshabib2a441c62015-04-13 18:39:38 -0700249 for (Map.Entry<FibEntry, Integer> entry : entriesToInstall.entrySet()) {
Jonathan Hart5b141422015-03-06 12:59:09 -0800250 FibEntry fibEntry = entry.getKey();
alshabib2a441c62015-04-13 18:39:38 -0700251 Integer nextId = entry.getValue();
Jonathan Hart5b141422015-03-06 12:59:09 -0800252
alshabib2a441c62015-04-13 18:39:38 -0700253 flowObjectiveService.forward(deviceId,
254 generateRibFlowRule(fibEntry.prefix(), nextId).add());
Saurav Das3d038262015-04-23 12:36:58 -0700255 log.trace("Sending forwarding objective {} -> nextId:{}", fibEntry, nextId);
Jonathan Hart5b141422015-03-06 12:59:09 -0800256 }
257
Jonathan Hart7baba072015-02-23 14:27:59 -0800258 }
259
260 private synchronized void deleteFibEntry(Collection<FibUpdate> withdraws) {
Jonathan Hart5b141422015-03-06 12:59:09 -0800261
Jonathan Hart7baba072015-02-23 14:27:59 -0800262 for (FibUpdate update : withdraws) {
263 FibEntry entry = update.entry();
alshabib2a441c62015-04-13 18:39:38 -0700264 Integer nextId = nextHops.get(entry.nextHopIp());
Jonathan Hart7baba072015-02-23 14:27:59 -0800265
alshabib2a441c62015-04-13 18:39:38 -0700266 /*Group group = deleteNextHop(entry.prefix());
Jonathan Hart37d659c2015-03-08 19:20:38 -0700267 if (group == null) {
268 log.warn("Group not found when deleting {}", entry);
269 return;
alshabib2a441c62015-04-13 18:39:38 -0700270 }*/
Jonathan Hartf5829202015-02-12 09:37:02 -0800271
alshabib2a441c62015-04-13 18:39:38 -0700272 flowObjectiveService.forward(deviceId,
273 generateRibFlowRule(entry.prefix(), nextId).remove());
Jonathan Hartf5829202015-02-12 09:37:02 -0800274
Jonathan Hartf5829202015-02-12 09:37:02 -0800275 }
Jonathan Hart5b141422015-03-06 12:59:09 -0800276
Jonathan Hartf5829202015-02-12 09:37:02 -0800277 }
278
alshabib2a441c62015-04-13 18:39:38 -0700279 private ForwardingObjective.Builder generateRibFlowRule(IpPrefix prefix, Integer nextId) {
Jonathan Hart37d659c2015-03-08 19:20:38 -0700280 TrafficSelector selector = DefaultTrafficSelector.builder()
281 .matchEthType(Ethernet.TYPE_IPV4)
282 .matchIPDst(prefix)
283 .build();
284
Jonathan Hart12ef2052015-03-10 13:58:13 -0700285 int priority = prefix.prefixLength() * PRIORITY_MULTIPLIER + PRIORITY_OFFSET;
286
alshabib2a441c62015-04-13 18:39:38 -0700287 ForwardingObjective.Builder fwdBuilder = DefaultForwardingObjective.builder()
288 .fromApp(appId)
289 .makePermanent()
290 .nextStep(nextId)
291 .withSelector(selector)
292 .withPriority(priority)
293 .withFlag(ForwardingObjective.Flag.SPECIFIC);
294
295 return fwdBuilder;
296
297
Jonathan Hart37d659c2015-03-08 19:20:38 -0700298 }
299
Jonathan Hart7baba072015-02-23 14:27:59 -0800300 private synchronized void addNextHop(FibEntry entry) {
301 prefixToNextHop.put(entry.prefix(), entry.nextHopIp());
302 if (nextHopsCount.count(entry.nextHopIp()) == 0) {
Jonathan Hartf5829202015-02-12 09:37:02 -0800303 // There was no next hop in the multiset
304
Jonathan Hart7baba072015-02-23 14:27:59 -0800305 Interface egressIntf = configService.getMatchingInterface(entry.nextHopIp());
Jonathan Hartf5829202015-02-12 09:37:02 -0800306 if (egressIntf == null) {
Jonathan Hart7baba072015-02-23 14:27:59 -0800307 log.warn("no egress interface found for {}", entry);
Jonathan Hartf5829202015-02-12 09:37:02 -0800308 return;
309 }
310
Jonathan Hart7baba072015-02-23 14:27:59 -0800311 NextHopGroupKey groupKey = new NextHopGroupKey(entry.nextHopIp());
312
313 NextHop nextHop = new NextHop(entry.nextHopIp(), entry.nextHopMac(), groupKey);
Jonathan Hartf5829202015-02-12 09:37:02 -0800314
315 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
316 .setEthSrc(egressIntf.mac())
317 .setEthDst(nextHop.mac())
Jonathan Hart54b406b2015-03-06 16:24:14 -0800318 .pushVlan()
Jonathan Hartf5829202015-02-12 09:37:02 -0800319 .setVlanId(egressIntf.vlan())
alshabibda1644e2015-03-13 14:01:35 -0700320 .setVlanPcp((byte) 0)
Jonathan Hartf5829202015-02-12 09:37:02 -0800321 .setOutput(egressIntf.connectPoint().port())
322 .build();
323
Saurav Das3ea46622015-04-22 14:01:34 -0700324 int nextId = flowObjectiveService.allocateNextId();
325
alshabib2a441c62015-04-13 18:39:38 -0700326 NextObjective nextObjective = DefaultNextObjective.builder()
Saurav Das3ea46622015-04-22 14:01:34 -0700327 .withId(nextId)
alshabib2a441c62015-04-13 18:39:38 -0700328 .addTreatment(treatment)
329 .withType(NextObjective.Type.SIMPLE)
330 .fromApp(appId)
331 .add();
332
333 flowObjectiveService.next(deviceId, nextObjective);
334
335 /*
Jonathan Hartf5829202015-02-12 09:37:02 -0800336 GroupBucket bucket = DefaultGroupBucket.createIndirectGroupBucket(treatment);
337
338 GroupDescription groupDescription
339 = new DefaultGroupDescription(deviceId,
340 GroupDescription.Type.INDIRECT,
341 new GroupBuckets(Collections
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -0700342 .singletonList(bucket)),
343 new DefaultGroupKey(appKryo.serialize(groupKey)),
Jonathan Hartf5829202015-02-12 09:37:02 -0800344 appId);
345
346 groupService.addGroup(groupDescription);
alshabib2a441c62015-04-13 18:39:38 -0700347 */
Jonathan Hart7baba072015-02-23 14:27:59 -0800348
Saurav Das3ea46622015-04-22 14:01:34 -0700349 nextHops.put(nextHop.ip(), nextId);
Jonathan Hart7baba072015-02-23 14:27:59 -0800350
Jonathan Hartf5829202015-02-12 09:37:02 -0800351 }
Jonathan Hart7baba072015-02-23 14:27:59 -0800352
353 nextHopsCount.add(entry.nextHopIp());
Jonathan Hartf5829202015-02-12 09:37:02 -0800354 }
355
alshabib2a441c62015-04-13 18:39:38 -0700356 /*private synchronized Group deleteNextHop(IpPrefix prefix) {
Jonathan Hart7baba072015-02-23 14:27:59 -0800357 IpAddress nextHopIp = prefixToNextHop.remove(prefix);
358 NextHop nextHop = nextHops.get(nextHopIp);
359 if (nextHop == null) {
360 log.warn("No next hop found when removing prefix {}", prefix);
Jonathan Hart37d659c2015-03-08 19:20:38 -0700361 return null;
Jonathan Hart7baba072015-02-23 14:27:59 -0800362 }
363
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700364 Group group = groupService.getGroup(deviceId,
365 new DefaultGroupKey(appKryo.
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700366 serialize(nextHop.group())));
Jonathan Hart37d659c2015-03-08 19:20:38 -0700367
Jonathan Hartf9f2cbb2015-03-12 17:44:03 -0700368 // FIXME disabling group deletes for now until we verify the logic is OK
alshabib2a441c62015-04-13 18:39:38 -0700369 *//*if (nextHopsCount.remove(nextHopIp, 1) <= 1) {
Jonathan Hartf5829202015-02-12 09:37:02 -0800370 // There was one or less next hops, so there are now none
371
Jonathan Hart7baba072015-02-23 14:27:59 -0800372 log.debug("removing group for next hop {}", nextHop);
Jonathan Hartf5829202015-02-12 09:37:02 -0800373
Jonathan Hart7baba072015-02-23 14:27:59 -0800374 nextHops.remove(nextHopIp);
375
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700376 groupService.removeGroup(deviceId,
377 new DefaultGroupKey(appKryo.build().serialize(nextHop.group())),
378 appId);
alshabib2a441c62015-04-13 18:39:38 -0700379 }*//*
Jonathan Hart37d659c2015-03-08 19:20:38 -0700380
381 return group;
alshabib2a441c62015-04-13 18:39:38 -0700382 }*/
Jonathan Hartf5829202015-02-12 09:37:02 -0800383
384 private class InternalFibListener implements FibListener {
385
386 @Override
387 public void update(Collection<FibUpdate> updates,
388 Collection<FibUpdate> withdraws) {
389 BgpRouter.this.deleteFibEntry(withdraws);
390 BgpRouter.this.updateFibEntry(updates);
391 }
392 }
alshabib10580802015-02-18 18:30:33 -0800393
Saurav Dascfd63d22015-04-13 16:08:24 -0700394 private void processIntfFilters(boolean install, Set<Interface> intfs) {
395 log.info("Processing {} router interfaces", intfs.size());
396 for (Interface intf : intfs) {
397 FilteringObjective.Builder fob = DefaultFilteringObjective.builder();
398 fob.withKey(Criteria.matchInPort(intf.connectPoint().port()))
399 .addCondition(Criteria.matchEthDst(intf.mac()))
400 .addCondition(Criteria.matchVlanId(intf.vlan()));
401 intf.ipAddresses().stream()
402 .forEach(ipaddr -> fob.addCondition(
403 Criteria.matchIPDst(ipaddr.subnetAddress())));
404 fob.permit().fromApp(appId);
alshabib2a441c62015-04-13 18:39:38 -0700405 flowObjectiveService.filter(deviceId, fob.add());
alshabib10580802015-02-18 18:30:33 -0800406 }
Jonathan Hart7baba072015-02-23 14:27:59 -0800407 }
alshabib10580802015-02-18 18:30:33 -0800408
alshabib2a441c62015-04-13 18:39:38 -0700409 /* private class InternalGroupListener implements GroupListener {
Jonathan Hart7baba072015-02-23 14:27:59 -0800410
411 @Override
412 public void event(GroupEvent event) {
413 Group group = event.subject();
414
415 if (event.type() == GroupEvent.Type.GROUP_ADDED ||
416 event.type() == GroupEvent.Type.GROUP_UPDATED) {
417 synchronized (pendingUpdates) {
Jonathan Hart5b141422015-03-06 12:59:09 -0800418
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700419 NextHopGroupKey nhGroupKey =
Srikanth Vavilapalli89ad3772015-03-25 18:00:38 -0700420 appKryo.deserialize(group.appCookie().key());
Jonathan Hart5b141422015-03-06 12:59:09 -0800421 Map<FibEntry, Group> entriesToInstall =
Srikanth Vavilapalli717361f2015-03-16 12:06:04 -0700422 pendingUpdates.removeAll(nhGroupKey)
Jonathan Hart5b141422015-03-06 12:59:09 -0800423 .stream()
424 .collect(Collectors
425 .toMap(e -> e, e -> group));
426
427 installFlows(entriesToInstall);
Jonathan Hart7baba072015-02-23 14:27:59 -0800428 }
429 }
430 }
alshabib2a441c62015-04-13 18:39:38 -0700431 }*/
Jonathan Hartf5829202015-02-12 09:37:02 -0800432}