/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * 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.
 */

syntax = "proto3";

package android.service;

option java_multiple_files = true;
option java_outer_classname = "NetworkStatsServiceProto";

// Represents dumpsys from NetworkStatsService (netstats).
message NetworkStatsServiceDumpProto {
    repeated NetworkInterfaceProto active_interfaces = 1;

    repeated NetworkInterfaceProto active_uid_interfaces = 2;

    // Device level network stats, which may include non-IP layer traffic.
    NetworkStatsRecorderProto dev_stats = 3;

    // IP-layer traffic stats.
    NetworkStatsRecorderProto xt_stats = 4;

    // Per-UID network stats.
    NetworkStatsRecorderProto uid_stats = 5;

    // Per-UID, per-tag network stats, excluding the default tag (i.e. tag=0).
    NetworkStatsRecorderProto uid_tag_stats = 6;
}

// Corresponds to NetworkStatsService.mActiveIfaces/mActiveUidIfaces.
message NetworkInterfaceProto {
    string interface = 1;

    NetworkIdentitySetProto identities = 2;
}

// Corresponds to NetworkIdentitySet.
message NetworkIdentitySetProto {
    repeated NetworkIdentityProto identities = 1;
}

// Corresponds to NetworkIdentity.
message NetworkIdentityProto {
    // Constats from ConnectivityManager.TYPE_*.
    int32 type = 1;

    string subscriber_id = 2;

    string network_id = 3;

    bool roaming = 4;

    bool metered = 5;
}

// Corresponds to NetworkStatsRecorder.
message NetworkStatsRecorderProto {
    int64 pending_total_bytes = 1;

    NetworkStatsCollectionProto complete_history = 2;
}

// Corresponds to NetworkStatsCollection.
message NetworkStatsCollectionProto {
    repeated NetworkStatsCollectionStatsProto stats = 1;
}

// Corresponds to NetworkStatsCollection.mStats.
message NetworkStatsCollectionStatsProto {
    NetworkStatsCollectionKeyProto key = 1;

    NetworkStatsHistoryProto history = 2;
}

// Corresponds to NetworkStatsCollection.Key.
message NetworkStatsCollectionKeyProto {
    NetworkIdentitySetProto identity = 1;

    int32 uid = 2;

    int32 set = 3;

    int32 tag = 4;
}

// Corresponds to NetworkStatsHistory.
message NetworkStatsHistoryProto {
    // Duration for this bucket in milliseconds.
    int64 bucket_duration_ms = 1;

    repeated NetworkStatsHistoryBucketProto buckets = 2;
}

// Corresponds to each bucket in NetworkStatsHistory.
message NetworkStatsHistoryBucketProto {
    // Bucket start time in milliseconds since epoch.
    int64 bucket_start_ms = 1;

    int64 rx_bytes = 2;

    int64 rx_packets = 3;

    int64 tx_bytes = 4;

    int64 tx_packets = 5;

    int64 operations = 6;
}
