blob: 93bbd5d3c3a894c69b6e727d21f0c63fd6b3347b [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.proxyarp;
alshabibc274c902014-10-03 14:58:27 -070017
18import static org.slf4j.LoggerFactory.getLogger;
19
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Reference;
24import org.apache.felix.scr.annotations.ReferenceCardinality;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080025import org.onlab.packet.Ethernet;
Kunihiro Ishiguro93224452015-02-13 00:40:08 +090026import org.onlab.packet.IPv6;
27import org.onlab.packet.ICMP6;
Brian O'Connorabafb502014-12-02 22:26:20 -080028import org.onosproject.core.ApplicationId;
29import org.onosproject.core.CoreService;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080030import org.onosproject.net.flow.DefaultTrafficSelector;
31import org.onosproject.net.flow.TrafficSelector;
Brian O'Connorabafb502014-12-02 22:26:20 -080032import org.onosproject.net.packet.PacketContext;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080033import org.onosproject.net.packet.PacketPriority;
Brian O'Connorabafb502014-12-02 22:26:20 -080034import org.onosproject.net.packet.PacketProcessor;
35import org.onosproject.net.packet.PacketService;
36import org.onosproject.net.proxyarp.ProxyArpService;
alshabibc274c902014-10-03 14:58:27 -070037import org.slf4j.Logger;
38
39/**
40 * Sample reactive proxy arp application.
41 */
42@Component(immediate = true)
43public class ProxyArp {
44
alshabibc274c902014-10-03 14:58:27 -070045 private final Logger log = getLogger(getClass());
46
47 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
48 protected PacketService packetService;
49
50 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
51 protected ProxyArpService proxyArpService;
52
53 private ProxyArpProcessor processor = new ProxyArpProcessor();
54
alshabib92c65ad2014-10-08 21:56:05 -070055 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
56 protected CoreService coreService;
57
alshabibc274c902014-10-03 14:58:27 -070058 private ApplicationId appId;
59
60 @Activate
61 public void activate() {
Brian O'Connorabafb502014-12-02 22:26:20 -080062 appId = coreService.registerApplication("org.onosproject.proxyarp");
alshabibc274c902014-10-03 14:58:27 -070063 packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 1);
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080064
65 TrafficSelector.Builder selectorBuilder =
66 DefaultTrafficSelector.builder();
67 selectorBuilder.matchEthType(Ethernet.TYPE_ARP);
68 packetService.requestPackets(selectorBuilder.build(),
69 PacketPriority.CONTROL, appId);
70
Kunihiro Ishiguro93224452015-02-13 00:40:08 +090071 // IPv6 Neighbor Solicitation packet.
72 selectorBuilder = DefaultTrafficSelector.builder();
73 selectorBuilder.matchEthType(Ethernet.TYPE_IPV6);
74 selectorBuilder.matchIPProtocol(IPv6.PROTOCOL_ICMP6);
75 selectorBuilder.matchIcmpv6Type(ICMP6.NEIGHBOR_SOLICITATION);
76 packetService.requestPackets(selectorBuilder.build(),
77 PacketPriority.CONTROL, appId);
78
79 // IPv6 Neighbor Advertisement packet.
80 selectorBuilder = DefaultTrafficSelector.builder();
81 selectorBuilder.matchEthType(Ethernet.TYPE_IPV6);
82 selectorBuilder.matchIPProtocol(IPv6.PROTOCOL_ICMP6);
83 selectorBuilder.matchIcmpv6Type(ICMP6.NEIGHBOR_ADVERTISEMENT);
84 packetService.requestPackets(selectorBuilder.build(),
85 PacketPriority.CONTROL, appId);
86
alshabibc274c902014-10-03 14:58:27 -070087 log.info("Started with Application ID {}", appId.id());
88 }
89
90 @Deactivate
91 public void deactivate() {
92 packetService.removeProcessor(processor);
93 processor = null;
94 log.info("Stopped");
95 }
96
97
98 /**
99 * Packet processor responsible for forwarding packets along their paths.
100 */
101 private class ProxyArpProcessor implements PacketProcessor {
102
103 @Override
104 public void process(PacketContext context) {
105 // Stop processing if the packet has been handled, since we
106 // can't do any more to it.
107 if (context.isHandled()) {
108 return;
109 }
110
111 //handle the arp packet.
Kunihiro Ishigurof1bff502015-01-30 15:47:06 -0800112 proxyArpService.handlePacket(context);
alshabibc274c902014-10-03 14:58:27 -0700113 }
114 }
115}
116
117