blob: 39114d41002e49e1e948cdb2ddf64cd202ee0f0e [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)
Harshada Chaundkar754701c2019-03-08 14:15:53 -050049public 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");
Harshada Chaundkar754701c2019-03-08 14:15:53 -0500148 this.tcpCounter =
149 metricService.createCounter(packetStatisticsComponent, tcpFeature, "tcpPC");
150 this.rarpCounter =
151 metricService.createCounter(packetStatisticsComponent, rarpFeature, "rarpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700152 this.icmpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700153 metricService.createCounter(packetStatisticsComponent, icmpFeature, "icmpPC");
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500154 this.icmp6Counter =
155 metricService.createCounter(packetStatisticsComponent, icmp6Feature, "icmp6PC");
156 this.nbrSolicitCounter =
157 metricService.createCounter(packetStatisticsComponent, nbrSolicitFeature, "nbrSolicitPC");
158 this.nbrAdvertCounter =
159 metricService.createCounter(packetStatisticsComponent, nbrAdvertFeature, "nbrAdvertPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700160 this.igmpCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700161 metricService.createCounter(packetStatisticsComponent, igmpFeature, "igmpPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700162 this.pimCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700163 metricService.createCounter(packetStatisticsComponent, pimFeature, "pimPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700164 this.bsnCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700165 metricService.createCounter(packetStatisticsComponent, bsnFeature, "bsnPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700166 this.mplsCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700167 metricService.createCounter(packetStatisticsComponent, mplsFeature, "mplsPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700168 this.unknownCounter =
Karthik Vegesna99012712017-07-20 12:07:23 -0700169 metricService.createCounter(packetStatisticsComponent, unknownFeature, "unknownPC");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700170
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700171 appId = coreService.registerApplication("org.onosproject.packet-stats");
172
Karthik Vegesna99012712017-07-20 12:07:23 -0700173 packetService.addProcessor(processor, PacketProcessor.director(0));
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700174 log.info("Started", appId.id());
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700175 }
176
177 @Deactivate
178 public void deactivate() {
179 cfgService.unregisterProperties(getClass(), false);
180 flowRuleService.removeFlowRulesById(appId);
181 packetService.removeProcessor(processor);
182 processor = null;
183 log.info("Stopped");
184 }
185
186
187 /**
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500188 * Packet processor responsible for counting various types of packets.
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700189 */
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500190 private class PacketCounter implements PacketProcessor {
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700191 @Override
192 public void process(PacketContext context) {
193 InboundPacket pkt = context.inPacket();
194 Ethernet ethPkt = pkt.parsed();
195
196 //Indicates whether this is an ARP Packet
197 if (ethPkt.getEtherType() == Ethernet.TYPE_ARP) {
198 arpCounter.inc();
199
200 } else if (ethPkt.getEtherType() == Ethernet.TYPE_LLDP) {
201 lldpCounter.inc();
202
203 } else if (ethPkt.getEtherType() == Ethernet.TYPE_VLAN) {
204 vlanCounter.inc();
205
206 } else if (ethPkt.getEtherType() == Ethernet.TYPE_BSN) {
207 bsnCounter.inc();
208
209 } else if (ethPkt.getEtherType() == Ethernet.TYPE_RARP) {
210 rarpCounter.inc();
211
212 } else if (ethPkt.getEtherType() == Ethernet.MPLS_UNICAST
213 || ethPkt.getEtherType() == Ethernet.MPLS_MULTICAST) {
214 mplsCounter.inc();
215
216 } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV4) {
217 IPv4 ipv4Packet = (IPv4) ethPkt.getPayload();
218 //Indicates whether this is a TCP Packet
219 if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_TCP) {
220 tcpCounter.inc();
221
222 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_ICMP) {
223 icmpCounter.inc();
224
225 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_IGMP) {
226 igmpCounter.inc();
227
228 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_PIM) {
229 pimCounter.inc();
230
231 } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_UDP) {
232 UDP udpPacket = (UDP) ipv4Packet.getPayload();
233 //Indicates whether this packet is a DHCP Packet
234 if (udpPacket.getSourcePort() == UDP.DHCP_CLIENT_PORT
235 || udpPacket.getSourcePort() == UDP.DHCP_SERVER_PORT) {
236 dhcpCounter.inc();
237 }
238 }
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500239 } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV6) {
240 IPv6 ipv6Pkt = (IPv6) ethPkt.getPayload();
241 if (ipv6Pkt.getNextHeader() == IPv6.PROTOCOL_ICMP6) {
242 icmp6Counter.inc();
243 ICMP6 icmpv6 = (ICMP6) ipv6Pkt.getPayload();
244 if (icmpv6.getIcmpType() == ICMP6.NEIGHBOR_SOLICITATION) {
245 nbrSolicitCounter.inc();
246 } else if (icmpv6.getIcmpType() == ICMP6.NEIGHBOR_ADVERTISEMENT) {
247 nbrAdvertCounter.inc();
248 }
249 }
250 } else {
251 log.debug("Packet is unknown.");
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700252 unknownCounter.inc();
Karthik Vegesna20ce41e2017-07-11 10:34:37 -0700253 }
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500254 }
Harshada Chaundkar754701c2019-03-08 14:15:53 -0500255 }
Sudhir Kumar Maurya2cc77982018-12-14 06:41:33 -0500256}