libnetutils 中的 ifc_utils.c

本文详细解析了Android系统中用于网络配置的关键接口实现,包括接口的初始化、关闭、启用及禁用等功能。此外还介绍了如何设置IP地址、前缀长度、网关以及DNS服务器等网络参数,并展示了移除默认路由和清理连接的方法。

源代码位于: system/core/libnetutils/*


0605$ ls system/core/libnetutils/
Android.mk    dhcpclient.c  dhcpmsg.c     dhcpmsg.h     dhcp_utils.c  ifc_utils.c   ifc_utils.c~  NOTICE        packet.c      packet.h


1. ifc_init(),  ifc_close() :

int ifc_init(void)
{
    int ret;
    if (ifc_ctl_sock == -1) {
        ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM, 0); //socket通信
        if (ifc_ctl_sock < 0) {
            printerr("socket() failed: %s\n", strerror(errno));
        }
    }

    ret = ifc_ctl_sock < 0 ? -1 : 0;
    if (DBG) printerr("ifc_init_returning %d", ret);
    return ret;
}

int ifc_init6(void)
{
    if (ifc_ctl_sock6 == -1) {
        ifc_ctl_sock6 = socket(AF_INET6, SOCK_DGRAM, 0);
        if (ifc_ctl_sock6 < 0) {
            printerr("socket() failed: %s\n", strerror(errno));
        }
    }
    return ifc_ctl_sock6 < 0 ? -1 : 0;
}

void ifc_close(void)
{
    if (DBG) printerr("ifc_close");
    if (ifc_ctl_sock != -1) {
        (void)close(ifc_ctl_sock); // close socket
        ifc_ctl_sock = -1;
    }
}

void ifc_close6(void)
{
    if (ifc_ctl_sock6 != -1) {
        (void)close(ifc_ctl_sock6);
        ifc_ctl_sock6 = -1;
    }
}

2. ifc_up(), ifc_down():

int ifc_up(const char *name)
{
    int ret = ifc_set_flags(name, IFF_UP, 0);
    if (DBG) printerr("ifc_up(%s) = %d", name, ret);
    return ret;
}

int ifc_down(const char *name)
{
    int ret = ifc_set_flags(name, 0, IFF_UP);
    if (DBG) printerr("ifc_down(%s) = %d", name, ret);
    return ret;
}
static int ifc_set_flags(const char *name, unsigned set, unsigned clr)
{
    struct ifreq ifr;
    ifc_init_ifr(name, &ifr);

    if(ioctl(ifc_ctl_sock, SIOCGIFFLAGS, &ifr) < 0) return -1;
    ifr.ifr_flags = (ifr.ifr_flags & (~clr)) | set;
    return ioctl(ifc_ctl_sock, SIOCSIFFLAGS, &ifr);
}
static void ifc_init_ifr(const char *name, struct ifreq *ifr)
{
    memset(ifr, 0, sizeof(struct ifreq));
    strncpy(ifr->ifr_name, name, IFNAMSIZ);
    ifr->ifr_name[IFNAMSIZ - 1] = 0;
}

3. ifc_enable(), ifc_disable():

int ifc_enable(const char *ifname)
{
    int result;

    ifc_init();
    result = ifc_up(ifname);
    ifc_close();
    return result;
}

int ifc_disable(const char *ifname)
{
    unsigned addr, count;
    int result;

    ifc_init();
    result = ifc_down(ifname);

    ifc_set_addr(ifname, 0);
    for (count=0, addr=1;((addr != 0) && (count < 255)); count++) {
       if (ifc_get_addr(ifname, &addr) < 0)
            break;
       if (addr)
          ifc_set_addr(ifname, 0);
    }

    ifc_close();
    return result;
}

d. int ifc_set_addr(const char *name, in_addr_t addr)
int ifc_set_addr(const char *name, in_addr_t addr)
{
    struct ifreq ifr;
    int ret;

    ifc_init_ifr(name, &ifr);
    init_sockaddr_in(&ifr.ifr_addr, addr);

    ret = ioctl(ifc_ctl_sock, SIOCSIFADDR, &ifr);
    if (DBG) printerr("ifc_set_addr(%s, xx) = %d", name, ret);
    return ret;
}
static void init_sockaddr_in(struct sockaddr *sa, in_addr_t addr)
{
    struct sockaddr_in *sin = (struct sockaddr_in *) sa;
    sin->sin_family = AF_INET;
    sin->sin_port = 0;
    sin->sin_addr.s_addr = addr;
}

4. int ifc_reset_connections(const char *ifname, const int reset_mask)
#define RESET_IPV4_ADDRESSES 0x01
#define RESET_IPV6_ADDRESSES 0x02
#define RESET_ALL_ADDRESSES  (RESET_IPV4_ADDRESSES | RESET_IPV6_ADDRESSES)

int ifc_reset_connections(const char *ifname, const int reset_mask)
{
#ifdef HAVE_ANDROID_OS
    int result, success;
    in_addr_t myaddr;
    struct ifreq ifr;
    struct in6_ifreq ifr6;

    if (reset_mask & RESET_IPV4_ADDRESSES) {
        /* IPv4. Clear connections on the IP address. */
        ifc_init();
        ifc_get_info(ifname, &myaddr, NULL, NULL);
        ifc_init_ifr(ifname, &ifr);
        init_sockaddr_in(&ifr.ifr_addr, myaddr);
        result = ioctl(ifc_ctl_sock, SIOCKILLADDR,  &ifr);
        ifc_close();
    } else {
        result = 0;
    }

    if (reset_mask & RESET_IPV6_ADDRESSES) {
        /*
         * IPv6. On Linux, when an interface goes down it loses all its IPv6
         * addresses, so we don't know which connections belonged to that interface
         * So we clear all unused IPv6 connections on the device by specifying an
         * empty IPv6 address.
         */
        ifc_init6();
        // This implicitly specifies an address of ::, i.e., kill all IPv6 sockets.
        memset(&ifr6, 0, sizeof(ifr6));
        success = ioctl(ifc_ctl_sock6, SIOCKILLADDR,  &ifr6);
        if (result == 0) {
            result = success;
        }
        ifc_close6();
    }

    return result;
#else
    return 0;
#endif
}
int ifc_get_info(const char *name, in_addr_t *addr, int *prefixLength, unsigned *flags)
{
    struct ifreq ifr;
    ifc_init_ifr(name, &ifr);

    if (addr != NULL) {
        if(ioctl(ifc_ctl_sock, SIOCGIFADDR, &ifr) < 0) {
            *addr = 0;
        } else {
            *addr = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr;
        }
    }

    if (prefixLength != NULL) {
        if(ioctl(ifc_ctl_sock, SIOCGIFNETMASK, &ifr) < 0) {
            *prefixLength = 0;
        } else {
            *prefixLength = ipv4NetmaskToPrefixLength((int)
                    ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr);
        }
    }

    if (flags != NULL) {
        if(ioctl(ifc_ctl_sock, SIOCGIFFLAGS, &ifr) < 0) {
            *flags = 0;
        } else {
            *flags = ifr.ifr_flags;
        }
    }

    return 0;
}

5. int ifc_remove_default_route(const char *ifname):

/*
 * Removes the default route for the named interface.
 */
int ifc_remove_default_route(const char *ifname)
{
    struct rtentry rt;
    int result;

    ifc_init();
    memset(&rt, 0, sizeof(rt));
    rt.rt_dev = (void *)ifname;
    rt.rt_flags = RTF_UP|RTF_GATEWAY;
    init_sockaddr_in(&rt.rt_dst, 0);
    if ((result = ioctl(ifc_ctl_sock, SIOCDELRT, &rt)) < 0) {
        LOGD("failed to remove default route for %s: %s", ifname, strerror(errno));
    }
    if (ifc_set_addr(ifname, 0)) {
        printerr("failed to set ipaddr to 0 : %s\n", strerror(errno));
    }
    ifc_close();
    return result;
}

6. ifc_configure()

int
ifc_configure(const char *ifname,
        in_addr_t address,
        in_addr_t prefixLength,
        in_addr_t gateway,
        in_addr_t dns1,
        in_addr_t dns2) {

    char dns_prop_name[PROPERTY_KEY_MAX];

    ifc_init();

    if (ifc_up(ifname)) {
        printerr("failed to turn on interface %s: %s\n", ifname, strerror(errno));
        ifc_close();
        return -1;
    }
    if (ifc_set_addr(ifname, address)) {
        printerr("failed to set ipaddr %s: %s\n", ipaddr_to_string(address), strerror(errno));
        ifc_close();
        return -1;
    }
    if (ifc_set_prefixLength(ifname, prefixLength)) {
        printerr("failed to set prefixLength %d: %s\n", prefixLength, strerror(errno));
        ifc_close();
        return -1;
    }
    if (ifc_create_default_route(ifname, gateway)) {
        printerr("failed to set default route %s: %s\n", ipaddr_to_string(gateway), strerror(errno));
        ifc_close();
        return -1;
    }

    ifc_close();

    snprintf(dns_prop_name, sizeof(dns_prop_name), "net.%s.dns1", ifname);
    property_set(dns_prop_name, dns1 ? ipaddr_to_string(dns1) : "");
    snprintf(dns_prop_name, sizeof(dns_prop_name), "net.%s.dns2", ifname);
    property_set(dns_prop_name, dns2 ? ipaddr_to_string(dns2) : "");

    return 0;
}



FAILED: out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/LINKED/libimpl-ril.so /bin/bash -c "prebuilts/clang/host/linux-x86/clang-r416183b1/bin/clang++ -nostdlib -Wl,-soname,libimpl-ril.so -Wl,--gc-sections -shared out/soong/.intermediates/bionic/libc/crtbegin_so/android_vendor.31_arm64_armv8-2a/crtbegin_so.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_thermal.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_userAgent.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/common/at_tok.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/common/atchannel.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/common/misc.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/common/utils.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/common/channel_controller.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/custom/ril_custom.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/impl_ril.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_sim.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_network.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_data.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_call.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_ss.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_sms.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_misc.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_stk.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_ims.o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/ril_se.o -Wl,--whole-archive -Wl,--no-whole-archive out/target/product/ums9230_1h10/obj/STATIC_LIBRARIES/libc++demangle.vendor_intermediates/libc++demangle.vendor.a out/target/product/ums9230_1h10/obj/STATIC_LIBRARIES/libclang_rt.ubsan_minimal-aarch64-android.vendor_intermediates/libclang_rt.ubsan_minimal-aarch64-android.vendor.a prebuilts/clang/host/linux-x86/clang-r416183b1/lib64/clang/12.0.7/lib/linux//libclang_rt.builtins-aarch64-android.a -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--build-id=md5 -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined-version -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_stripped.a -Wl,--exclude-libs,libunwind_llvm.a -Wl,--exclude-libs,libunwind.a -Wl,--icf=safe -fuse-ld=lld -Wl,--hash-style=gnu -Wl,-z,separate-code -Wl,-z,max-page-size=4096 -Bprebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin -Wl,--pack-dyn-relocs=android+relr -Wl,--use-android-relr-tags out/target/product/ums9230_1h10/vendor/lib64/libril-private.so -Wl,--exclude-libs,libclang_rt.ubsan_minimal-aarch64-android.a -Wl,--no-undefined -target aarch64-linux-android31 out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/liblog.vendor_intermediates/liblog.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libcutils.vendor_intermediates/libcutils.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libutils.vendor_intermediates/libutils.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/librilcore_intermediates/librilcore.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/librilutils_intermediates/librilutils.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libnetutils.vendor_intermediates/libnetutils.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libhidlbase.vendor_intermediates/libhidlbase.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/vendor.sprd.hardware.thermal@1.0.vendor_intermediates/vendor.sprd.hardware.thermal@1.0.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libpowerhal_cli.vendor_intermediates/libpowerhal_cli.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libtinyxml2.vendor_intermediates/libtinyxml2.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libcutils.vendor_intermediates/libcutils.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libutils.vendor_intermediates/libutils.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libc++.vendor_intermediates/libc++.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libc.vendor_intermediates/libc.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libm.vendor_intermediates/libm.vendor.so out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libdl.vendor_intermediates/libdl.vendor.so -o out/target/product/ums9230_1h10/obj/SHARED_LIBRARIES/libimpl-ril_intermediates/LINKED/libimpl-ril.so out/soong/.intermediates/bionic/libc/crtend_so/android_vendor.31_arm64_armv8-2a/obj/bionic/libc/arch-common/bionic/crtend_so.o" clang-12: error: no such file or directory: 'out/target/product/ums9230_1h10/vendor/lib64/libril-private.so'
最新发布
11-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值