/*
 * Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors
 *
 * 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.opencord.cordmcast;

import org.onlab.packet.VlanId;
import org.onosproject.event.ListenerService;

/**
 * Service for interacting with CordMcastStatisticsEvent data.
 */
public interface CordMcastStatisticsService
        extends ListenerService<CordMcastStatisticsEvent, CordMcastStatisticsEventListener> {
    /**
     * To set current vlanValue in Statistics Service.
     * @param vlanValue current vlan value.
     */
    void setVlanValue(VlanId vlanValue);

    /**
     * To set current innerVlanValue in Statistics Service.
     * @param innerVlanValue current inner vlan value.
     */
    void setInnerVlanValue(VlanId innerVlanValue);
}
