package {
    default_team: "trendy_team_fwk_core_networking",
    default_applicable_licenses: ["packages_modules_DnsResolver_license"],
}

// Added automatically by a large-scale-change that took the approach of
// 'apply every license found to every target'. While this makes sure we respect
// every license restriction, it may not be entirely correct.
//
// e.g. GPL in an MIT project might only apply to the contrib/ directory.
//
// Please consider splitting the single license below into multiple licenses,
// taking care not to lose any license_kind information, and overriding the
// default license using the 'licenses: [...]' property on targets as needed.
//
// For unused files, consider creating a 'fileGroup' with "//visibility:private"
// to attach the license to, and including a comment whether the files may be
// used in the current project.
// See: http://go/android-license-faq
license {
    name: "packages_modules_DnsResolver_license",
    visibility: [":__subpackages__"],
    license_kinds: [
        "SPDX-license-identifier-Apache-2.0",
        "SPDX-license-identifier-BSD",
        "SPDX-license-identifier-ISC",
        "SPDX-license-identifier-MIT",
    ],
    license_text: [
        "NOTICE",
    ],
}

cc_library_headers {
    name: "libnetd_resolv_headers",
    export_include_dirs: ["include"],
}

// Used only by dns_responder_client_ndk.cpp for ResolverStats.h
// TODO: refactor stats to use a Parcel and eliminate this dependency
cc_library_headers {
    name: "libnetd_resolv_internal_headers",
    export_include_dirs: ["."],
}

cc_library_headers {
    name: "dnsproxyd_protocol_headers",
    sdk_version: "30",
    min_sdk_version: "30",
    export_include_dirs: ["include/dnsproxyd_protocol"],
    apex_available: [
        "//apex_available:platform",
        "com.android.tethering",
    ],
}

dnsresolver_aidl_interface_lateststable_version = "V17"

cc_library_static {
    name: "dnsresolver_aidl_interface-lateststable-ndk",
    whole_static_libs: [
        "dnsresolver_aidl_interface-" + dnsresolver_aidl_interface_lateststable_version + "-ndk",
    ],
    apex_available: [
        "com.android.resolv",
    ],
    min_sdk_version: "30",
}

aidl_interface {
    name: "dnsresolver_aidl_interface",
    local_include_dir: "binder",
    srcs: [
        "binder/android/net/IDnsResolver.aidl",
        "binder/android/net/ResolverHostsParcel.aidl",
        "binder/android/net/ResolverOptionsParcel.aidl",
        "binder/android/net/ResolverParamsParcel.aidl",
        // New AIDL classes should go into android.net.resolv.aidl so they can be clearly identified
        "binder/android/net/resolv/aidl/**/*.aidl",
    ],
    imports: [
        "netd_event_listener_interface-V1",
    ],
    backend: {
        java: {
            apex_available: [
                "com.android.tethering",
                "com.android.wifi",
            ],
            min_sdk_version: "30",
        },
        ndk: {
            gen_log: true,
            apex_available: [
                "com.android.resolv",
            ],
            min_sdk_version: "30",
        },
    },

    dumpapi: {
        no_license: true,
    },
    versions_with_info: [
        {
            version: "1",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "2",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "3",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "4",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "5",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "6",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "7",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "8",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "9",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "10",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "11",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "12",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "13",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "14",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "15",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "16",
            imports: ["netd_event_listener_interface-V1"],
        },
        {
            version: "17",
            imports: ["netd_event_listener_interface-V1"],
        },

    ],
    frozen: true,

}

filegroup {
    name: "resolv_test_default_map",
    srcs: ["resolv_test_default.map"],
}

cc_defaults {
    name: "resolv_test_defaults",
    cflags: [
        // networkCreatePhysical and networkCreateVpn were deprecated from netd_aidl_interface v6.
        "-Wno-error=deprecated-declarations",
    ],
    // The resolv-related tests run on older platform versions, so many libraries (such as
    // libbase and libc++) need to be linked statically. The tests also need to be linked with a
    // version script to ensure that the statically-linked library isn't exported from the
    // executable, where it would override the shared libraries that the platform itself uses. See
    // b/333438055 for an example of what goes wrong when libc++ is partially exported from an
    // executable.
    version_script: ":resolv_test_default_map",
    stl: "libc++_static",
    static_libs: [
        "libbase",
    ],
    shared_libs: [
        "liblog",
    ],
    min_sdk_version: "30",
}

cc_defaults {
    // This is necessary to have the coverage tests run on cf_x86_phone.
    // Because the test_suite target is 64 bit and the test infra is running the 64 bit test
    // suite on cf_x86_phone (32-bit) for coverage.
    // See b/147785146 for details.
    // TODO: Remove this target after coverage test switched to 64-bit device.
    name: "resolv_test_mts_coverage_defaults",
    test_config_template: ":resolv_test_config_template",
    compile_multilib: "both",
    multilib: {
        lib32: {
            suffix: "32",
        },
        lib64: {
            suffix: "64",
        },
    },
    // 'resolv_test_config_template' used DisableConfigSyncTargetPreparer provided
    // by net-tests-utils-host-common; adding it to make the host jar available
    // after the build process.
    host_required: [
        "net-tests-utils-host-common",
    ],
}

cc_defaults {
    // Similar to resolv_test_mts_coverage_defaults, but it's for the tests that don't need
    // root access.
    name: "resolv_test_mts_coverage_without_root_defaults",
    test_config_template: ":resolv_test_config_without_root_template",
    compile_multilib: "both",
    multilib: {
        lib32: {
            suffix: "32",
        },
        lib64: {
            suffix: "64",
        },
    },
    // 'resolv_test_config_without_root_template' used DisableConfigSyncTargetPreparer
    // provided by net-tests-utils-host-common; adding it to make the host jar available
    // after the build process.
    host_required: [
        "net-tests-utils-host-common",
    ],
}

cc_library {
    name: "libnetd_resolv",
    version_script: "libnetd_resolv.map.txt",
    stubs: {
        versions: [
            "1",
        ],
        symbol_file: "libnetd_resolv.map.txt",
    },
    defaults: ["netd_defaults"],
    generated_headers: [
        "cxx-bridge-header",
        "libdns_proxy_cxx_bridge_header",
    ],
    generated_sources: ["libdns_proxy_cxx_bridge_source"],
    srcs: [
        "getaddrinfo.cpp",
        "gethnamaddr.cpp",
        "sethostent.cpp",
        "res_cache.cpp",
        "res_comp.cpp",
        "res_debug.cpp",
        "res_mkquery.cpp",
        "res_query.cpp",
        "res_send.cpp",
        "res_stats.cpp",
        "util.cpp",
        "Dns64Configuration.cpp",
        "DnsProxyListener.cpp",
        "DnsQueryLog.cpp",
        "DnsProxy.cpp",
        "DnsResolver.cpp",
        "DnsResolverService.cpp",
        "DnsStats.cpp",
        "DnsTlsDispatcher.cpp",
        "DnsTlsQueryMap.cpp",
        "DnsTlsTransport.cpp",
        "DnsTlsServer.cpp",
        "DnsTlsSessionCache.cpp",
        "DnsTlsSocket.cpp",
        "Experiments.cpp",
        "PrivateDnsConfiguration.cpp",
        "ResolverController.cpp",
        "ResolverEventReporter.cpp",
        "rust/src/dns_proxy/net_context_client.cpp",
    ],
    // Link most things statically to minimize our dependence on system ABIs.
    stl: "libc++_static",
    static_libs: [
        "dnsresolver_aidl_interface-lateststable-ndk",
        "libbase",
        "libcutils",
        "libnetdutils",
        "libmodules-utils-build",
        "libprotobuf-cpp-lite",
        "libresolvrs_ffi",
        "libstatslog_resolv",
        "libsysutils",
        "netd_event_listener_interface-lateststable-ndk",
        "server_configurable_flags",
        "stats_proto",
    ],
    // libcrypto needs to be used as a shared library because it performs an
    // integrity check (against a checksum) that is not supported for static
    // libs. See http://b/141248879
    // We're also adding libssl here to treat it consistently.
    // liblog is added as a shared library because it provides stable C API
    // from the platform; we don't need to include it in this module by
    // statically linking to it. Doing so is even dangerous because the socket
    // protocol to logd implemented in the library isn't guaranteed to be
    // stable. See b/151051671
    shared_libs: [
        "libbinder_ndk",
        "libcrypto",
        "liblog", //Used by libstatslog_resolv
        "libssl",
        "libstatssocket",
    ],
    runtime_libs: [
        "libcom.android.tethering.dns_helper",
    ],
    header_libs: [
        "libnetdbinder_utils_headers",
    ],
    export_include_dirs: ["include"],

    product_variables: {
        debuggable: {
            cppflags: [
                "-DRESOLV_ALLOW_VERBOSE_LOGGING=1",
            ],
        },
    },
    header_abi_checker: {
        enabled: true,
        symbol_file: "libnetd_resolv.map.txt",
    },
    sanitize: {
        cfi: true,
    },
    apex_available: ["com.android.resolv"],
    min_sdk_version: "30",
}

cc_library_static {
    name: "stats_proto",
    defaults: ["netd_defaults"],
    proto: {
        export_proto_headers: true,
        type: "lite",
    },
    srcs: [
        "stats.proto",
    ],
    apex_available: ["com.android.resolv"],
    min_sdk_version: "30",
}

genrule {
    name: "statslog_resolv.h",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog_resolv.h --module resolv" +
        " --namespace android,net,stats --minApiLevel 30",
    out: [
        "statslog_resolv.h",
    ],
}

genrule {
    name: "statslog_resolv.cpp",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog_resolv.cpp --module resolv" +
        " --namespace android,net,stats --importHeader statslog_resolv.h --minApiLevel 30",
    out: [
        "statslog_resolv.cpp",
    ],
}

cc_library_static {
    name: "libstatslog_resolv",
    generated_sources: ["statslog_resolv.cpp"],
    generated_headers: ["statslog_resolv.h"],
    defaults: ["netd_defaults"],
    export_generated_headers: ["statslog_resolv.h"],
    static_libs: [
        "libcutils",
    ],
    shared_libs: [
        "libstatssocket",
    ],
    apex_available: ["com.android.resolv"],
    min_sdk_version: "30",
}

filegroup {
    name: "resolv_test_config_template",
    srcs: [
        "resolv_test_config_template.xml",
    ],
}

filegroup {
    name: "resolv_test_config_without_root_template",
    srcs: [
        "resolv_test_config_without_root_template.xml",
    ],
}

filegroup {
    name: "resolv_unit_test_files",
    srcs: [
        "DnsQueryLogTest.cpp",
        "DnsStatsTest.cpp",
        "ExperimentsTest.cpp",
        "OperationLimiterTest.cpp",
        "PrivateDnsConfigurationTest.cpp",
    ],
}

