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( ((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; }
int ifc_get_info(const char *name, in_addr_t *addr, in_addr_t *mask, unsigned *flags) { struct ifreq ifr; ifc_init_ifr(name, &ifr); if (addr != NULL) { if(1 || ioctl(ifc_ctl_sock, SIOCGIFADDR, &ifr) < 0) { *addr = 0; } else { *addr = ((struct sockaddr_in*) (void*) &ifr.ifr_addr)->sin_addr.s_addr; } } if (mask != NULL) { if(ioctl(ifc_ctl_sock, SIOCGIFNETMASK, &ifr) < 0) { *mask = 0; } else { *mask = ((struct sockaddr_in*) (void*) &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; }
int ifc_ccmni_md_cfg(const char *ifname, int md_id) { struct ifreq ifr; int ret = 0; int ctl_sock = 0; ifc_init_ifr(ifname, &ifr); ifr.ifr_ifru.ifru_ivalue = md_id; ctl_sock = socket(AF_INET, SOCK_DGRAM, 0); if(ctl_sock < 0){ printerr("ifc_ccmni_md_cfg: create ctl socket failed\n"); return -1; } if(ioctl(ctl_sock, SIOCSCCMNICFG, &ifr) < 0) { printerr("ifc_ccmni_md_configure(ifname=%s, md_id=%d) error:%d(%s)", \ ifname, md_id, errno, strerror(errno)); ret = -1; } else { printerr("ifc_ccmni_md_configure(ifname=%s, md_id=%d) OK", ifname, md_id); } close(ctl_sock); 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); }
int ifc_set_mask(const char *name, in_addr_t mask) { struct ifreq ifr; ifc_init_ifr(name, &ifr); init_sockaddr_in(&ifr.ifr_addr, mask); return ioctl(ifc_ctl_sock, SIOCSIFNETMASK, &ifr); }
int ifc_set_addr(const char *name, in_addr_t addr) { struct ifreq ifr; ifc_init_ifr(name, &ifr); init_sockaddr_in(&ifr.ifr_addr, addr); return ioctl(ifc_ctl_sock, SIOCSIFADDR, &ifr); }
int ifc_set_hwaddr(const char *name, const void *ptr) { struct ifreq ifr; ifc_init_ifr(name, &ifr); ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; memcpy(&ifr.ifr_hwaddr.sa_data, ptr, ETH_ALEN); return ioctl(ifc_ctl_sock, SIOCSIFHWADDR, &ifr); }
int ifc_set_prefixLength(const char *name, int prefixLength) { struct ifreq ifr; // TODO - support ipv6 if (prefixLength > 32 || prefixLength < 0) return -1; in_addr_t mask = prefixLengthToIpv4Netmask(prefixLength); ifc_init_ifr(name, &ifr); init_sockaddr_in(&ifr.ifr_addr, mask); return ioctl(ifc_ctl_sock, SIOCSIFNETMASK, &ifr); }
int ifc_set_mask(const char *name, in_addr_t mask) { struct ifreq ifr; int ret; ifc_init_ifr(name, &ifr); init_sockaddr_in(&ifr.ifr_addr, mask); ret = ioctl(ifc_ctl_sock, SIOCSIFNETMASK, &ifr); if (DBG) printerr("ifc_set_mask(%s, xx) = %d", name, ret); return ret; }
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; }
int ifc_get_ifindex(const char *name, int *if_indexp) { int r; struct ifreq ifr; ifc_init_ifr(name, &ifr); r = ioctl(ifc_ctl_sock, SIOCGIFINDEX, &ifr); if(r < 0) return -1; *if_indexp = ifr.ifr_ifindex; return 0; }
int ifc_get_hwaddr(const char *name, void *ptr) { int r; struct ifreq ifr; ifc_init_ifr(name, &ifr); r = ioctl(ifc_ctl_sock, SIOCGIFHWADDR, &ifr); if(r < 0) return -1; memcpy(ptr, &ifr.ifr_hwaddr.sa_data, ETH_ALEN); return 0; }
int ifc_reset_connections(const char *ifname, const int reset_mask) { #ifdef HAVE_ANDROID_OS int result = 0, success; in_addr_t myaddr = 0; struct ifreq ifr; struct in6_ifreq ifr6; int ctl_sock = -1; if (reset_mask & RESET_IPV4_ADDRESSES) { /* IPv4. Clear connections on the IP address. */ ctl_sock = socket(AF_INET, SOCK_DGRAM, 0); if (ctl_sock >= 0) { if (!(reset_mask & RESET_IGNORE_INTERFACE_ADDRESS)) { ifc_get_info(ifname, &myaddr, NULL, NULL); } ifc_init_ifr(ifname, &ifr); init_sockaddr_in(&ifr.ifr_addr, myaddr); result = ioctl(ctl_sock, SIOCKILLADDR, &ifr); close(ctl_sock); } else { result = -1; } } 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. */ ctl_sock = socket(AF_INET6, SOCK_DGRAM, 0); // This implicitly specifies an address of ::, i.e., kill all IPv6 sockets. memset(&ifr6, 0, sizeof(ifr6)); if (ctl_sock >= 0) { success = ioctl(ctl_sock, SIOCKILLADDR, &ifr6); if (result == 0) { result = success; } close(ctl_sock); } else { result = -1; } } return result; #else return 0; #endif }
int ifc_get_addr(const char *name, in_addr_t *addr) { struct ifreq ifr; int ret = 0; ifc_init_ifr(name, &ifr); if (addr != NULL) { ret = ioctl(ifc_ctl_sock, SIOCGIFADDR, &ifr); if (ret < 0) { *addr = 0; } else { *addr = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr; } } return ret; }
int ifc_is_up(const char *name, unsigned *isup) { struct ifreq ifr; ifc_init_ifr(name, &ifr); if(ioctl(ifc_ctl_sock, SIOCGIFFLAGS, &ifr) < 0) { printerr("ifc_is_up get flags error:%d(%s)", errno, strerror(errno)); return -1; } if(ifr.ifr_flags & IFF_UP) *isup = 1; else *isup = 0; return 0; }
int ifc_reset_connections(const char *ifname) { #ifdef HAVE_ANDROID_OS int result; in_addr_t myaddr; struct ifreq ifr; 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(); return result; #else return 0; #endif }