Пример #1
0
u32 ethtool_bitrate(const char *ifname)
{
	int ret, sock, bitrate;
	struct ifreq ifr;
	struct ethtool_cmd ecmd;

	sock = af_socket(AF_INET);

	memset(&ecmd, 0, sizeof(ecmd));

	memset(&ifr, 0, sizeof(ifr));
	strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);

	ecmd.cmd = ETHTOOL_GSET;
	ifr.ifr_data = (char *) &ecmd;

	ret = ioctl(sock, SIOCETHTOOL, &ifr);
	if (ret) {
		bitrate = 0;
		goto out;
	}

	bitrate = ethtool_cmd_speed(&ecmd);
	if (bitrate == SPEED_UNKNOWN)
		bitrate = 0;
out:
	close(sock);

	return bitrate;
}
Пример #2
0
int device_address(const char *ifname, int af, struct sockaddr_storage *ss)
{
	int ret, sock;
	struct ifreq ifr;

	if (unlikely(!ss))
		return -EINVAL;
	if (!strncmp("any", ifname, strlen("any")))
		return -EINVAL;
	if (af == AF_INET6)
		return __device_address6(ifname, ss);

	sock = af_socket(af);

	memset(&ifr, 0, sizeof(ifr));
	strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);

	ifr.ifr_addr.sa_family = af;

	ret = ioctl(sock, SIOCGIFADDR, &ifr);
	if (likely(!ret))
		memcpy(ss, &ifr.ifr_addr, sizeof(ifr.ifr_addr));

	close(sock);
	return ret;
}
Пример #3
0
int ethtool_link(const char *ifname)
{
	int ret, sock;
	struct ifreq ifr;
	struct ethtool_value ecmd;

	sock = af_socket(AF_INET);

	memset(&ecmd, 0, sizeof(ecmd));

	memset(&ifr, 0, sizeof(ifr));
	strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);

	ecmd.cmd = ETHTOOL_GLINK;
	ifr.ifr_data = (char *) &ecmd;

	ret = ioctl(sock, SIOCETHTOOL, &ifr);
	if (ret)
		ret = -EINVAL;
	else
		ret = !!ecmd.data;

	close(sock);
	return ret;
}
Пример #4
0
int wireless_rangemax_sigqual(const char *ifname)
{
	int ret, sock, sigqual;
	struct iwreq iwr;
	struct iw_range iwrange;

	sock = af_socket(AF_INET);

	memset(&iwrange, 0, sizeof(iwrange));

	memset(&iwr, 0, sizeof(iwr));
	strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);

	iwr.u.data.pointer = (caddr_t) &iwrange;
	iwr.u.data.length = sizeof(iwrange);
	iwr.u.data.flags = 0;

	ret = ioctl(sock, SIOCGIWRANGE, &iwr);
	if (!ret)
		sigqual = iwrange.max_qual.qual;
	else
		sigqual = 0;

	close(sock);

	return sigqual;
}
Пример #5
0
int ethtool_bitrate(const char *ifname)
{
    int ret, sock, bitrate;
    struct ifreq ifr;
    struct ethtool_cmd ecmd;
    sock = af_socket(AF_INET);
    memset(&ecmd, 0, sizeof(ecmd));
    memset(&ifr, 0, sizeof(ifr));
    strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
    ecmd.cmd = ETHTOOL_GSET;
    ifr.ifr_data = (char *) &ecmd;
    ret = ioctl(sock, SIOCETHTOOL, &ifr);
    if (ret) {
        bitrate = 0;
        goto out;
    }
    switch (ecmd.speed) {
    case SPEED_10:
    case SPEED_100:
    case SPEED_1000:
    case SPEED_10000:
        bitrate = ecmd.speed;
        break;
    default:
        bitrate = 0;
        break;
    };
out:
    close(sock);
    return bitrate;
}
Пример #6
0
void device_set_flags(const char *ifname, const short flags)
{
    int ret, sock;
    struct ifreq ifr;
    sock = af_socket(AF_INET);
    memset(&ifr, 0, sizeof(ifr));
    strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
    ifr.ifr_flags = flags;
    ret = ioctl(sock, SIOCSIFFLAGS, &ifr);
    if (ret < 0)
        panic("Cannot set NIC flags!\n");
    close(sock);
}
Пример #7
0
int ethtool_drvinf(const char *ifname, struct ethtool_drvinfo *drvinf)
{
    int ret, sock;
    struct ifreq ifr;
    sock = af_socket(AF_INET);
    memset(drvinf, 0, sizeof(*drvinf));
    memset(&ifr, 0, sizeof(ifr));
    strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
    drvinf->cmd = ETHTOOL_GDRVINFO;
    ifr.ifr_data = (char *) drvinf;
    ret = ioctl(sock, SIOCETHTOOL, &ifr);
    close(sock);
    return ret;
}
Пример #8
0
int wireless_sigqual(const char *ifname, struct iw_statistics *stats)
{
    int ret, sock;
    struct iwreq iwr;
    sock = af_socket(AF_INET);
    memset(&iwr, 0, sizeof(iwr));
    strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
    iwr.u.data.pointer = (caddr_t) stats;
    iwr.u.data.length = sizeof(*stats);
    iwr.u.data.flags = 1;
    ret = ioctl(sock, SIOCGIWSTATS, &iwr);
    close(sock);
    return ret;
}
Пример #9
0
int wireless_bitrate(const char *ifname)
{
    int sock, ret, rate_in_mbit;
    struct iwreq iwr;
    sock = af_socket(AF_INET);
    memset(&iwr, 0, sizeof(iwr));
    strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
    ret = ioctl(sock, SIOCGIWRATE, &iwr);
    if (!ret)
        rate_in_mbit = iwr.u.bitrate.value / 1000000;
    else
        rate_in_mbit = 0;
    close(sock);
    return rate_in_mbit;
}
Пример #10
0
int device_mtu(const char *ifname)
{
    int ret, sock, mtu;
    struct ifreq ifr;
    sock = af_socket(AF_INET);
    memset(&ifr, 0, sizeof(ifr));
    strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
    ret = ioctl(sock, SIOCGIFMTU, &ifr);
    if (!ret)
        mtu = ifr.ifr_mtu;
    else
        mtu = 0;
    close(sock);
    return mtu;
}
Пример #11
0
int device_ifindex(const char *ifname)
{
    int ret, sock, index;
    struct ifreq ifr;
    if (!strncmp("any", ifname, strlen("any")))
        return 0;
    sock = af_socket(AF_INET);
    memset(&ifr, 0, sizeof(ifr));
    strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
    ret = ioctl(sock, SIOCGIFINDEX, &ifr);
    if (!ret)
        index = ifr.ifr_ifindex;
    else
        index = -1;
    close(sock);
    return index;
}
Пример #12
0
short device_get_flags(const char *ifname)
{
    /* Really, it's short! Look at struct ifreq */
    short flags;
    int ret, sock;
    struct ifreq ifr;
    sock = af_socket(AF_INET);
    memset(&ifr, 0, sizeof(ifr));
    strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
    ret = ioctl(sock, SIOCGIFFLAGS, &ifr);
    if (!ret)
        flags = ifr.ifr_flags;
    else
        flags = 0;
    close(sock);
    return flags;
}
Пример #13
0
int wireless_essid(const char *ifname, char *essid)
{
    int ret, sock, essid_len;
    struct iwreq iwr;
    sock = af_socket(AF_INET);
    memset(&iwr, 0, sizeof(iwr));
    strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
    iwr.u.essid.pointer = essid;
    iwr.u.essid.length = IW_ESSID_MAX_SIZE;
    ret = ioctl(sock, SIOCGIWESSID, &iwr);
    if (!ret)
        essid_len = iwr.u.essid.length;
    else
        essid_len = 0;
    close(sock);
    return essid_len;
}
Пример #14
0
short device_get_flags(const char *ifname)
{
	short flags = 0;
	int ret, sock;
	struct ifreq ifr;

	sock = af_socket(AF_INET);

	memset(&ifr, 0, sizeof(ifr));
	strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);

	ret = ioctl(sock, SIOCGIFFLAGS, &ifr);
	if (likely(!ret))
		flags = ifr.ifr_flags;

	close(sock);
	return flags;
}
Пример #15
0
int wireless_tx_power(const char *ifname)
{
    int ret, sock, tx_power;
    struct iwreq iwr;

    sock = af_socket(AF_INET);

    memset(&iwr, 0, sizeof(iwr));
    strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);

    ret = ioctl(sock, SIOCGIWTXPOW, &iwr);
    if (!ret)
        tx_power = iwr.u.txpower.value;
    else
        tx_power = 0;

    close(sock);
    return ret;
}
Пример #16
0
int device_type(const char *ifname)
{
	int ret, sock, type;
	struct ifreq ifr;

	if (!strncmp("any", ifname, strlen("any")))
		return ARPHRD_ETHER;

	sock = af_socket(AF_INET);

	memset(&ifr, 0, sizeof(ifr));
	strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);

	ret = ioctl(sock, SIOCGIFHWADDR, &ifr);
	if (unlikely(ret))
		panic("Cannot get iftype from device!\n");

	/* dev->type */
	type = ifr.ifr_hwaddr.sa_family;
	close(sock);

	return type;
}
Пример #17
0
int device_hw_address(const char *ifname, uint8_t *addr, size_t len)
{
	int ret, sock;
	struct ifreq ifr;

	if (!addr)
		return -EINVAL;
	if (len < IFHWADDRLEN)
		return -ENOSPC;
	if (!strncmp("any", ifname, strlen("any")))
		return -EINVAL;

	sock = af_socket(AF_INET);

	memset(&ifr, 0, sizeof(ifr));
	strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);

	ret = ioctl(sock, SIOCGIFHWADDR, &ifr);
	if (!ret)
		memcpy(addr, &ifr.ifr_hwaddr.sa_data[0], IFHWADDRLEN);

	close(sock);
	return ret;
}