/*
 * Copyright 2014-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for  the specific language governing permissions and
 * limitations under the License.
 */

package org.onosproject.packetstats;
import com.codahale.metrics.Counter;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onlab.packet.Ethernet;
import org.onlab.packet.IPv4;
import org.onlab.packet.IPv6;
import org.onlab.packet.ICMP6;
import org.onlab.packet.UDP;
import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.flow.FlowRuleService;
import org.onosproject.net.packet.InboundPacket;
import org.onosproject.net.packet.PacketContext;
import org.onosproject.net.packet.PacketProcessor;
import org.onosproject.net.packet.PacketService;

import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;
import org.onlab.metrics.MetricsComponent;
import org.onlab.metrics.MetricsFeature;
import org.onlab.metrics.MetricsService;

/**
 * Application for Packet Statistics.
 */
@Component(immediate = true)
public class  PacketStatistics {

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected PacketService packetService;


    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected FlowRuleService flowRuleService;


    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected CoreService coreService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected ComponentConfigService cfgService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected MetricsService metricService;

    private PacketCounter processor = new PacketCounter();
    private final Logger log = getLogger(getClass());

    private ApplicationId appId;


    private MetricsComponent packetStatisticsComponent;
    private MetricsFeature arpFeature;
    private Counter arpCounter;
    private MetricsFeature dhcpFeature;
    private Counter dhcpCounter;
    private MetricsFeature lldpFeature;
    private Counter lldpCounter;
    private MetricsFeature vlanFeature;
    private Counter vlanCounter;
    private MetricsFeature tcpFeature;
    private Counter tcpCounter;
    private MetricsFeature icmpFeature;
    private Counter icmpCounter;
    private MetricsFeature icmp6Feature;
    private Counter icmp6Counter;
    private MetricsFeature nbrSolicitFeature;
    private Counter nbrSolicitCounter;
    private MetricsFeature nbrAdvertFeature;
    private Counter nbrAdvertCounter;
    private MetricsFeature igmpFeature;
    private Counter igmpCounter;
    private MetricsFeature pimFeature;
    private Counter pimCounter;
    private MetricsFeature bsnFeature;
    private Counter bsnCounter;
    private MetricsFeature rarpFeature;
    private Counter rarpCounter;
    private MetricsFeature mplsFeature;
    private Counter mplsCounter;
    private MetricsFeature unknownFeature;
    private Counter unknownCounter;

    @Activate
    public void activate(ComponentContext context) {
        this.packetStatisticsComponent =
                metricService.registerComponent("packetStatisticsComponent");
        this.arpFeature =
                packetStatisticsComponent.registerFeature("arpFeature");
        this.dhcpFeature =
                packetStatisticsComponent.registerFeature("dhcpFeature");
        this.lldpFeature =
                packetStatisticsComponent.registerFeature("lldpFeature");
        this.vlanFeature =
                packetStatisticsComponent.registerFeature("vlanFeature");
        this.tcpFeature =
                packetStatisticsComponent.registerFeature("tcpFeature");
        this.icmpFeature =
                packetStatisticsComponent.registerFeature("icmpFeature");
        this.icmp6Feature =
                packetStatisticsComponent.registerFeature("icmp6Feature");
        this.nbrSolicitFeature =
                packetStatisticsComponent.registerFeature("nbrSolicitFeature");
        this.nbrAdvertFeature =
                packetStatisticsComponent.registerFeature("nbrAdvertFeature");
        this.igmpFeature =
                packetStatisticsComponent.registerFeature("igmpFeature");
        this.pimFeature =
                packetStatisticsComponent.registerFeature("pimFeature");
        this.bsnFeature =
                packetStatisticsComponent.registerFeature("bsnFeature");
        this.rarpFeature =
                packetStatisticsComponent.registerFeature("rarpFeature");
        this.mplsFeature =
                packetStatisticsComponent.registerFeature("mplsFeature");
        this.unknownFeature =
                packetStatisticsComponent.registerFeature("unknownFeature");
        this.arpCounter =
                metricService.createCounter(packetStatisticsComponent, arpFeature, "arpPC");
        this.dhcpCounter =
                metricService.createCounter(packetStatisticsComponent, dhcpFeature, "dhcpPC");
        this.lldpCounter =
                metricService.createCounter(packetStatisticsComponent, lldpFeature, "lldpPC");
        this.vlanCounter =
                metricService.createCounter(packetStatisticsComponent, vlanFeature, "vlanPC");
        this.tcpCounter =
                metricService.createCounter(packetStatisticsComponent, tcpFeature, "tcpPC");
        this.rarpCounter =
                metricService.createCounter(packetStatisticsComponent, rarpFeature, "rarpPC");
        this.icmpCounter =
                metricService.createCounter(packetStatisticsComponent, icmpFeature, "icmpPC");
        this.icmp6Counter =
                metricService.createCounter(packetStatisticsComponent, icmp6Feature, "icmp6PC");
        this.nbrSolicitCounter =
                metricService.createCounter(packetStatisticsComponent, nbrSolicitFeature, "nbrSolicitPC");
        this.nbrAdvertCounter =
                metricService.createCounter(packetStatisticsComponent, nbrAdvertFeature, "nbrAdvertPC");
        this.igmpCounter =
                metricService.createCounter(packetStatisticsComponent, igmpFeature, "igmpPC");
        this.pimCounter =
                metricService.createCounter(packetStatisticsComponent, pimFeature, "pimPC");
        this.bsnCounter =
                metricService.createCounter(packetStatisticsComponent, bsnFeature, "bsnPC");
        this.mplsCounter =
                metricService.createCounter(packetStatisticsComponent, mplsFeature, "mplsPC");
        this.unknownCounter =
                metricService.createCounter(packetStatisticsComponent, unknownFeature, "unknownPC");

        appId = coreService.registerApplication("org.onosproject.packet-stats");

        packetService.addProcessor(processor, PacketProcessor.director(0));
        log.info("Started", appId.id());
    }

    @Deactivate
    public void deactivate() {
        cfgService.unregisterProperties(getClass(), false);
        flowRuleService.removeFlowRulesById(appId);
        packetService.removeProcessor(processor);
        processor = null;
        log.info("Stopped");
    }


    /**
     * Packet processor responsible for counting various types of packets.
     */
    private class PacketCounter implements PacketProcessor {
        @Override
        public void process(PacketContext context) {
            InboundPacket pkt = context.inPacket();
            Ethernet ethPkt = pkt.parsed();

            //Indicates whether this is an ARP Packet
            if (ethPkt.getEtherType() == Ethernet.TYPE_ARP) {
                arpCounter.inc();

            } else if (ethPkt.getEtherType() == Ethernet.TYPE_LLDP) {
                lldpCounter.inc();

            } else if (ethPkt.getEtherType() == Ethernet.TYPE_VLAN) {
                vlanCounter.inc();

            } else if (ethPkt.getEtherType() == Ethernet.TYPE_BSN) {
                bsnCounter.inc();

            } else if (ethPkt.getEtherType() == Ethernet.TYPE_RARP) {
                rarpCounter.inc();

            } else if (ethPkt.getEtherType() == Ethernet.MPLS_UNICAST
                    || ethPkt.getEtherType() == Ethernet.MPLS_MULTICAST) {
                mplsCounter.inc();

            } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV4) {
                IPv4 ipv4Packet = (IPv4) ethPkt.getPayload();
                //Indicates whether this is a TCP Packet
                if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_TCP) {
                    tcpCounter.inc();

                } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_ICMP) {
                    icmpCounter.inc();

                } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_IGMP) {
                    igmpCounter.inc();

                } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_PIM) {
                    pimCounter.inc();

                } else if (ipv4Packet.getProtocol() == IPv4.PROTOCOL_UDP) {
                    UDP udpPacket = (UDP) ipv4Packet.getPayload();
                        //Indicates whether this packet is a DHCP Packet
                        if (udpPacket.getSourcePort() == UDP.DHCP_CLIENT_PORT
                                || udpPacket.getSourcePort() == UDP.DHCP_SERVER_PORT) {
                            dhcpCounter.inc();
                        }
                    }
            } else if (ethPkt.getEtherType() == Ethernet.TYPE_IPV6) {
                IPv6 ipv6Pkt = (IPv6) ethPkt.getPayload();
                if (ipv6Pkt.getNextHeader() == IPv6.PROTOCOL_ICMP6) {
                    icmp6Counter.inc();
                    ICMP6 icmpv6 = (ICMP6) ipv6Pkt.getPayload();
                    if (icmpv6.getIcmpType() == ICMP6.NEIGHBOR_SOLICITATION) {
                        nbrSolicitCounter.inc();
                    } else if (icmpv6.getIcmpType() == ICMP6.NEIGHBOR_ADVERTISEMENT) {
                        nbrAdvertCounter.inc();
                    }
                }
            } else {
                log.debug("Packet is unknown.");
                unknownCounter.inc();
            }
        }
    }
}
