blob: 6d3f77fddce607e4e7feb1429fa9002ebc902c21 [file] [log] [blame]
Karthik Vegesna20ce41e2017-07-11 10:34:37 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2014-present Open Networking Foundation
Karthik Vegesna20ce41e2017-07-11 10:34:37 -07003 *
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.
Karthik Vegesna99012712017-07-20 12:07:23 -070013 * See the License for the specific language governing permissions and
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070014 * limitations under the License.
15 */
Karthik Vegesna99012712017-07-20 12:07:23 -070016
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070017package org.onosproject.packetstats;
18import com.codahale.metrics.Counter;
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;
24import org.onlab.packet.Ethernet;
25import org.onlab.packet.IPv4;
26import org.onlab.packet.UDP;
27import org.onosproject.cfg.ComponentConfigService;
28import org.onosproject.core.ApplicationId;
29import org.onosproject.core.CoreService;
30import org.onosproject.net.flow.FlowRuleService;
31import org.onosproject.net.packet.InboundPacket;
32import org.onosproject.net.packet.PacketContext;
33import org.onosproject.net.packet.PacketProcessor;
34import org.onosproject.net.packet.PacketService;
35
36import org.osgi.service.component.ComponentContext;
37import org.slf4j.Logger;
38import static org.slf4j.LoggerFactory.getLogger;
39import org.onlab.metrics.MetricsComponent;
40import org.onlab.metrics.MetricsFeature;
41import org.onlab.metrics.MetricsService;
42
43/**
44 * Application for Packet Statistics.
45 */
46@Component(immediate = true)
Karthik Vegesna99012712017-07-20 12:07:23 -070047public class PacketStatistics {
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070048
49 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
50 protected PacketService packetService;
51
52
53 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
54 protected FlowRuleService flowRuleService;
55
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 protected CoreService coreService;
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
61 protected ComponentConfigService cfgService;
62
63 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
64 protected MetricsService metricService;
65
66 private ReactivePacketProcessor processor = new ReactivePacketProcessor();
67 private final Logger log = getLogger(getClass());
68
69 private ApplicationId appId;
70
71
72 private MetricsComponent packetStatisticsComponent;
73 private MetricsFeature arpFeature;
74 private Counter arpCounter;
75 private MetricsFeature dhcpFeature;
76 private Counter dhcpCounter;
77 private MetricsFeature lldpFeature;
78 private Counter lldpCounter;
79 private MetricsFeature vlanFeature;
80 private Counter vlanCounter;
81 private MetricsFeature tcpFeature;
82 private Counter tcpCounter;
83 private MetricsFeature icmpFeature;
84 private Counter icmpCounter;
85 private MetricsFeature igmpFeature;
86 private Counter igmpCounter;
87 private MetricsFeature pimFeature;
88 private Counter pimCounter;
89 private MetricsFeature bsnFeature;
90 private Counter bsnCounter;
91 private MetricsFeature rarpFeature;
92 private Counter rarpCounter;
93 private MetricsFeature mplsFeature;
94 private Counter mplsCounter;
95 private MetricsFeature unknownFeature;
96 private Counter unknownCounter;
97
98
99
100 @Activate
101 public void activate(ComponentContext context) {
102 this.packetStatisticsComponent =
103 metricService.registerComponent("packetStatisticsComponent");
104 this.arpFeature =
105 packetStatisticsComponent.registerFeature("arpFeature");
106 this.dhcpFeature =
107 packetStatisticsComponent.registerFeature("dhcpFeature");
108 this.lldpFeature =
109 packetStatisticsComponent.registerFeature("lldpFeature");
110 this.vlanFeature =
111 packetStatisticsComponent.registerFeature("vlanFeature");
112 this.tcpFeature =
113 packetStatisticsComponent.registerFeature("tcpFeature");
114 this.icmpFeature =
115 packetStatisticsComponent.registerFeature("icmpFeature");
116 this.igmpFeature =
117 packetStatisticsComponent.registerFeature("igmpFeature");
118 this.pimFeature =
119 packetStatisticsComponent.registerFeature("pimFeature");
120 this.bsnFeature =
121 packetStatisticsComponent.registerFeature("bsnFeature");
122 this.rarpFeature =
123 packetStatisticsComponent.registerFeature("rarpFeature");
124 this.mplsFeature =
125 packetStatisticsComponent.registerFeature("mplsFeature");
126 this.unknownFeature =
127 packetStatisticsComponent.registerFeature("unknownFeature");
128 this.arpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700129 metricService.createCounter(packetStatisticsComponent, arpFeature, "arpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700130 this.dhcpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700131 metricService.createCounter(packetStatisticsComponent, dhcpFeature, "dhcpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700132 this.lldpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700133 metricService.createCounter(packetStatisticsComponent, lldpFeature, "lldpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700134 this.vlanCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700135 metricService.createCounter(packetStatisticsComponent, vlanFeature, "vlanPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700136 this.icmpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700137 metricService.createCounter(packetStatisticsComponent, icmpFeature, "icmpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700138 this.igmpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700139 metricService.createCounter(packetStatisticsComponent, igmpFeature, "igmpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700140 this.pimCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700141 metricService.createCounter(packetStatisticsComponent, pimFeature, "pimPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700142 this.bsnCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700143 metricService.createCounter(packetStatisticsComponent, bsnFeature, "bsnPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700144 this.mplsCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700145 metricService.createCounter(packetStatisticsComponent, mplsFeature, "mplsPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700146 this.unknownCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700147 metricService.createCounter(packetStatisticsComponent, unknownFeature, "unknownPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700148
149
150 appId = coreService.registerApplication("org.onosproject.packet-stats");
151
Karthik Vegesna99012712017-07-20 12:07:23 -0700152 packetService.addProcessor(processor, PacketProcessor.director(0));
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700153 log.info("Started", appId.id());
154
155
156 }
157
158 @Deactivate
159 public void deactivate() {
160 cfgService.unregisterProperties(getClass(), false);
161 flowRuleService.removeFlowRulesById(appId);
162 packetService.removeProcessor(processor);
163 processor = null;
164 log.info("Stopped");
165 }
166
167
168 /**
169 * Packet processor responsible for forwarding packets along their paths.
170 */
171 private class ReactivePacketProcessor implements PacketProcessor {
172 @Override
173 public void process(PacketContext context) {
174 InboundPacket pkt = context.inPacket();
175 Ethernet ethPkt = pkt.parsed();
176
177 //Indicates whether this is an ARP Packet
178 if (ethPkt.getEtherType() == Ethernet.TYPE_ARP) {
179 arpCounter.inc();
180
181 } else if (ethPkt.getEtherType() == Ethernet.TYPE_LLDP) {
182 lldpCounter.inc();
183
184 } else if (ethPkt.getEtherType() == Ethernet.TYPE_VLAN) {
185 vlanCounter.inc();
186
187 } else if (ethPkt.getEtherType() == Ethernet.TYPE_BSN) {
188 bsnCounter.inc();
189
190 } else if (ethPkt.getEtherType() == Ethernet.TYPE_RARP) {
191 rarpCounter.inc();
192
193 } else if (ethPkt.getEtherType() == Ethernet.MPLS_UNICAST
194 || ethPkt.getEtherType() == Ethernet.MPLS_MULTICAST) {
195 mplsCounter.inc();
196
197 } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV4) {
198 IPv4 ipv4Packet = (IPv4) ethPkt.getPayload();
199 //Indicates whether this is a TCP Packet
200 if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_TCP) {
201 tcpCounter.inc();
202
203 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_ICMP) {
204 icmpCounter.inc();
205
206 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_IGMP) {
207 igmpCounter.inc();
208
209 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_PIM) {
210 pimCounter.inc();
211
212 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_UDP) {
213 UDP udpPacket = (UDP) ipv4Packet.getPayload();
214 //Indicates whether this packet is a DHCP Packet
215 if (udpPacket.getSourcePort() == UDP.DHCP_CLIENT_PORT
216 || udpPacket.getSourcePort() == UDP.DHCP_SERVER_PORT) {
217 dhcpCounter.inc();
218 }
219 }
220
221 } else {
222 log.info("Packet is unknown.");
223 unknownCounter.inc();
224 }
225 }
226 }
227
228 }