blob: ad3074e1af285e3e284d3ef3d19d7857fb781f9b [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;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070019import org.osgi.service.component.annotations.Activate;
20import org.osgi.service.component.annotations.Component;
21import org.osgi.service.component.annotations.Deactivate;
22import org.osgi.service.component.annotations.Reference;
23import org.osgi.service.component.annotations.ReferenceCardinality;
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070024import org.onlab.packet.Ethernet;
25import org.onlab.packet.IPv4;
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -050026import org.onlab.packet.IPv6;
27import org.onlab.packet.ICMP6;
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070028import org.onlab.packet.UDP;
29import org.onosproject.cfg.ComponentConfigService;
30import org.onosproject.core.ApplicationId;
31import org.onosproject.core.CoreService;
32import org.onosproject.net.flow.FlowRuleService;
33import org.onosproject.net.packet.InboundPacket;
34import org.onosproject.net.packet.PacketContext;
35import org.onosproject.net.packet.PacketProcessor;
36import org.onosproject.net.packet.PacketService;
37
38import org.osgi.service.component.ComponentContext;
39import org.slf4j.Logger;
40import static org.slf4j.LoggerFactory.getLogger;
41import org.onlab.metrics.MetricsComponent;
42import org.onlab.metrics.MetricsFeature;
43import org.onlab.metrics.MetricsService;
44
45/**
46 * Application for Packet Statistics.
47 */
48@Component(immediate = true)
Karthik Vegesna99012712017-07-20 12:07:23 -070049public class PacketStatistics {
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070050
Ray Milkeyd84f89b2018-08-17 14:54:17 -070051 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070052 protected PacketService packetService;
53
54
Ray Milkeyd84f89b2018-08-17 14:54:17 -070055 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070056 protected FlowRuleService flowRuleService;
57
58
Ray Milkeyd84f89b2018-08-17 14:54:17 -070059 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070060 protected CoreService coreService;
61
Ray Milkeyd84f89b2018-08-17 14:54:17 -070062 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070063 protected ComponentConfigService cfgService;
64
Ray Milkeyd84f89b2018-08-17 14:54:17 -070065 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070066 protected MetricsService metricService;
67
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -050068 private PacketCounter processor = new PacketCounter();
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070069 private final Logger log = getLogger(getClass());
70
71 private ApplicationId appId;
72
73
74 private MetricsComponent packetStatisticsComponent;
75 private MetricsFeature arpFeature;
76 private Counter arpCounter;
77 private MetricsFeature dhcpFeature;
78 private Counter dhcpCounter;
79 private MetricsFeature lldpFeature;
80 private Counter lldpCounter;
81 private MetricsFeature vlanFeature;
82 private Counter vlanCounter;
83 private MetricsFeature tcpFeature;
84 private Counter tcpCounter;
85 private MetricsFeature icmpFeature;
86 private Counter icmpCounter;
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -050087 private MetricsFeature icmp6Feature;
88 private Counter icmp6Counter;
89 private MetricsFeature nbrSolicitFeature;
90 private Counter nbrSolicitCounter;
91 private MetricsFeature nbrAdvertFeature;
92 private Counter nbrAdvertCounter;
Karthik Vegesna20ce41e2017-07-11 10:34:37 -070093 private MetricsFeature igmpFeature;
94 private Counter igmpCounter;
95 private MetricsFeature pimFeature;
96 private Counter pimCounter;
97 private MetricsFeature bsnFeature;
98 private Counter bsnCounter;
99 private MetricsFeature rarpFeature;
100 private Counter rarpCounter;
101 private MetricsFeature mplsFeature;
102 private Counter mplsCounter;
103 private MetricsFeature unknownFeature;
104 private Counter unknownCounter;
105
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700106 @Activate
107 public void activate(ComponentContext context) {
108 this.packetStatisticsComponent =
109 metricService.registerComponent("packetStatisticsComponent");
110 this.arpFeature =
111 packetStatisticsComponent.registerFeature("arpFeature");
112 this.dhcpFeature =
113 packetStatisticsComponent.registerFeature("dhcpFeature");
114 this.lldpFeature =
115 packetStatisticsComponent.registerFeature("lldpFeature");
116 this.vlanFeature =
117 packetStatisticsComponent.registerFeature("vlanFeature");
118 this.tcpFeature =
119 packetStatisticsComponent.registerFeature("tcpFeature");
120 this.icmpFeature =
121 packetStatisticsComponent.registerFeature("icmpFeature");
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500122 this.icmp6Feature =
123 packetStatisticsComponent.registerFeature("icmp6Feature");
124 this.nbrSolicitFeature =
125 packetStatisticsComponent.registerFeature("nbrSolicitFeature");
126 this.nbrAdvertFeature =
127 packetStatisticsComponent.registerFeature("nbrAdvertFeature");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700128 this.igmpFeature =
129 packetStatisticsComponent.registerFeature("igmpFeature");
130 this.pimFeature =
131 packetStatisticsComponent.registerFeature("pimFeature");
132 this.bsnFeature =
133 packetStatisticsComponent.registerFeature("bsnFeature");
134 this.rarpFeature =
135 packetStatisticsComponent.registerFeature("rarpFeature");
136 this.mplsFeature =
137 packetStatisticsComponent.registerFeature("mplsFeature");
138 this.unknownFeature =
139 packetStatisticsComponent.registerFeature("unknownFeature");
140 this.arpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700141 metricService.createCounter(packetStatisticsComponent, arpFeature, "arpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700142 this.dhcpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700143 metricService.createCounter(packetStatisticsComponent, dhcpFeature, "dhcpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700144 this.lldpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700145 metricService.createCounter(packetStatisticsComponent, lldpFeature, "lldpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700146 this.vlanCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700147 metricService.createCounter(packetStatisticsComponent, vlanFeature, "vlanPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700148 this.icmpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700149 metricService.createCounter(packetStatisticsComponent, icmpFeature, "icmpPC");
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500150 this.icmp6Counter =
151 metricService.createCounter(packetStatisticsComponent, icmp6Feature, "icmp6PC");
152 this.nbrSolicitCounter =
153 metricService.createCounter(packetStatisticsComponent, nbrSolicitFeature, "nbrSolicitPC");
154 this.nbrAdvertCounter =
155 metricService.createCounter(packetStatisticsComponent, nbrAdvertFeature, "nbrAdvertPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700156 this.igmpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700157 metricService.createCounter(packetStatisticsComponent, igmpFeature, "igmpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700158 this.pimCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700159 metricService.createCounter(packetStatisticsComponent, pimFeature, "pimPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700160 this.bsnCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700161 metricService.createCounter(packetStatisticsComponent, bsnFeature, "bsnPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700162 this.mplsCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700163 metricService.createCounter(packetStatisticsComponent, mplsFeature, "mplsPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700164 this.unknownCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700165 metricService.createCounter(packetStatisticsComponent, unknownFeature, "unknownPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700166
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700167 appId = coreService.registerApplication("org.onosproject.packet-stats");
168
Karthik Vegesna99012712017-07-20 12:07:23 -0700169 packetService.addProcessor(processor, PacketProcessor.director(0));
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700170 log.info("Started", appId.id());
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700171 }
172
173 @Deactivate
174 public void deactivate() {
175 cfgService.unregisterProperties(getClass(), false);
176 flowRuleService.removeFlowRulesById(appId);
177 packetService.removeProcessor(processor);
178 processor = null;
179 log.info("Stopped");
180 }
181
182
183 /**
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500184 * Packet processor responsible for counting various types of packets.
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700185 */
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500186 private class PacketCounter implements PacketProcessor {
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700187 @Override
188 public void process(PacketContext context) {
189 InboundPacket pkt = context.inPacket();
190 Ethernet ethPkt = pkt.parsed();
191
192 //Indicates whether this is an ARP Packet
193 if (ethPkt.getEtherType() == Ethernet.TYPE_ARP) {
194 arpCounter.inc();
195
196 } else if (ethPkt.getEtherType() == Ethernet.TYPE_LLDP) {
197 lldpCounter.inc();
198
199 } else if (ethPkt.getEtherType() == Ethernet.TYPE_VLAN) {
200 vlanCounter.inc();
201
202 } else if (ethPkt.getEtherType() == Ethernet.TYPE_BSN) {
203 bsnCounter.inc();
204
205 } else if (ethPkt.getEtherType() == Ethernet.TYPE_RARP) {
206 rarpCounter.inc();
207
208 } else if (ethPkt.getEtherType() == Ethernet.MPLS_UNICAST
209 || ethPkt.getEtherType() == Ethernet.MPLS_MULTICAST) {
210 mplsCounter.inc();
211
212 } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV4) {
213 IPv4 ipv4Packet = (IPv4) ethPkt.getPayload();
214 //Indicates whether this is a TCP Packet
215 if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_TCP) {
216 tcpCounter.inc();
217
218 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_ICMP) {
219 icmpCounter.inc();
220
221 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_IGMP) {
222 igmpCounter.inc();
223
224 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_PIM) {
225 pimCounter.inc();
226
227 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_UDP) {
228 UDP udpPacket = (UDP) ipv4Packet.getPayload();
229 //Indicates whether this packet is a DHCP Packet
230 if (udpPacket.getSourcePort() == UDP.DHCP_CLIENT_PORT
231 || udpPacket.getSourcePort() == UDP.DHCP_SERVER_PORT) {
232 dhcpCounter.inc();
233 }
234 }
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500235 } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV6) {
236 IPv6 ipv6Pkt = (IPv6) ethPkt.getPayload();
237 if (ipv6Pkt.getNextHeader() == IPv6.PROTOCOL_ICMP6) {
238 icmp6Counter.inc();
239 ICMP6 icmpv6 = (ICMP6) ipv6Pkt.getPayload();
240 if (icmpv6.getIcmpType() == ICMP6.NEIGHBOR_SOLICITATION) {
241 nbrSolicitCounter.inc();
242 } else if (icmpv6.getIcmpType() == ICMP6.NEIGHBOR_ADVERTISEMENT) {
243 nbrAdvertCounter.inc();
244 }
245 }
246 } else {
247 log.debug("Packet is unknown.");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700248 unknownCounter.inc();
249 }
250 }
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500251 }
252}