예제 #1
0
int getLocalInterfaceList(InterfaceRefList& iflist, const bool onlyUp) 
{
        char buf[1024];
	int sock;
        struct ifconf ifc;
	struct ifreq *ifr;
	int n, i, num = 0;
        
        sock = socket(AF_INET, SOCK_DGRAM, 0);

	if (sock == INVALID_SOCKET) {
		HAGGLE_ERR("Could not calculate node id\n");
		return -1;
	}

	ifc.ifc_len = sizeof(buf);
	ifc.ifc_buf = buf;
        
	if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) {
		HAGGLE_ERR("SIOCGIFCONF failed\n");
		return -1;
	}
        
        ifr = ifc.ifc_req;
	n = ifc.ifc_len / sizeof(struct ifreq);
        
	for (i = 0; i < n; i++) {
                Addresses addrs;
		struct ifreq *item = &ifr[i];

                // if (ioctl(sock, SIOCGIFBRDADDR, item) < 0)
                //         continue;         
                
		//printf(", MAC %s\\n", ether_ntoa((struct ether_addr *)item->ifr_hwaddr.sa_data));
                if (onlyUp && !(item->ifr_flags & IFF_UP)) 
                        continue;

                addrs.add(new IPv4Address(((struct sockaddr_in *)&item->ifr_addr)->sin_addr));
		addrs.add(new IPv4BroadcastAddress(((struct sockaddr_in *)&item->ifr_broadaddr)->sin_addr));

		if (ioctl(sock, SIOCGIFHWADDR, item) < 0)
                        continue;
               
                addrs.add(new EthernetAddress((unsigned char *)item->ifr_hwaddr.sa_data));
		
		InterfaceRef iface = Interface::create<EthernetInterface>(item->ifr_hwaddr.sa_data, item->ifr_name, IFFLAG_LOCAL | ((item->ifr_flags & IFF_UP) ? IFFLAG_UP : 0));

		if (iface) {
			iface->addAddresses(addrs);
			iflist.push_back(iface);
			num++;
		}
        }
        
        close(sock);
              
        return num;
}
예제 #2
0
int getLocalInterfaceList(InterfaceRefList& iflist, const bool onlyUp) 
{
	int sock, num = 0, ret = -1;
#define REQ_BUF_SIZE (sizeof(struct ifreq) * 20)
	struct {
		struct ifconf ifc;
		char buf[REQ_BUF_SIZE];
	} req = { { REQ_BUF_SIZE, { req.buf}}, { 0 } };

	sock = socket(AF_INET, SOCK_DGRAM, 0);

	if (sock == INVALID_SOCKET) {
		HAGGLE_ERR("Could not open socket\n");
		return -1;
	}

	ret = ioctl(sock, SIOCGIFCONF, &req);

	if (ret < 0) {
		HAGGLE_ERR("ioctl() failed\n");
		return -1;
	}

	struct ifreq *ifr = (struct ifreq *) req.buf;
	int len = 0;
	
	for (; req.ifc.ifc_len != 0; ifr = (struct ifreq *) ((char *) ifr + len), req.ifc.ifc_len -= len) {
		Addresses addrs;
		unsigned char macaddr[6];
			
		len = (sizeof(ifr->ifr_name) + max(sizeof(struct sockaddr),
						       ifr->ifr_addr.sa_len));

		if (ifr->ifr_addr.sa_family != AF_LINK	// || strncmp(ifr->ifr_name, "en", 2) != 0
		    ) {
			continue;
		}
		struct sockaddr_dl *ifaddr = (struct sockaddr_dl *) &ifr->ifr_addr;

		// Type 6 seems to be Ethernet
		if (ifaddr->sdl_type != 6) {
			continue;
		}

		memcpy(macaddr, LLADDR(ifaddr), 6);
		
		addrs.add(new EthernetAddress(macaddr));

		ifr->ifr_addr.sa_family = AF_INET;

		if (ioctl(sock, SIOCGIFADDR, ifr) != -1) {
			addrs.add(new IPv4Address(((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr));
		}
		if (ioctl(sock, SIOCGIFBRDADDR, ifr) != -1) {
			addrs.add(new IPv4BroadcastAddress(((struct sockaddr_in *) &ifr->ifr_broadaddr)->sin_addr));
		}
#if defined(ENABLE_IPv6)
		ifr->ifr_addr.sa_family = AF_INET6;
		
		if (ioctl(sock, SIOCGIFADDR, ifr) != -1) {
			addrs.add(new IPv6Address(((struct sockaddr_in6 *) &ifr->ifr_addr)->sin6_addr));
		}
		
		if (ioctl(sock, SIOCGIFBRDADDR, ifr) != -1) {
			addrs.add(new IPv6BroadcastAddress(((struct sockaddr_in6 *) &ifr->ifr_broadaddr)->sin6_addr));
		}
#endif
		if (ioctl(sock, SIOCGIFFLAGS, ifr) == -1) {
                        continue;
                }

                if (onlyUp && !(ifr->ifr_flags & IFF_UP)) 
                        continue;

		if (addrs.size() <= 1) {
			// No IPv4 or IPv6 addresses on interface --> ignore it
			continue;
		}
		// FIXME: separate 802.3 (wired) from 802.11 (wireless) ethernet
		iflist.push_back(InterfaceRef(Interface::create(Interface::TYPE_ETHERNET, macaddr, 
								ifr->ifr_name, addrs, IFFLAG_UP | IFFLAG_LOCAL)));
			
                num++;
	}

	close(sock);

	return num;
}
예제 #3
0
/*
  This is a bit of a hack for the android platform. It seems that the
  TI wifi interface cannot be read by the normal ioctl() functions
  (at least not to discover the name and mac). Therefore we have special
  code that uses the driver API directly.
 */
int getLocalInterfaceList(InterfaceRefList& iflist, const bool onlyUp) 
{
        char wifi_iface_name[PROPERTY_VALUE_MAX];
        OS_802_11_MAC_ADDRESS hwaddr;
        unsigned char mac[6];
        tiINT32 res;
        unsigned int flags;
        struct in_addr addr;
	struct in_addr baddr;
        struct ifreq ifr;   
        int ret, s;
        Addresses addrs;
        
        // Read the WiFi interface name from the Android property manager
        ret = property_get("wifi.interface", wifi_iface_name, "sta");
        
        if (ret < 1)
                return -1;

        // Get a handle to the adapter throught the TI API
        TI_HANDLE h_adapter = TI_AdapterInit((tiCHAR *)wifi_iface_name);

        if (h_adapter == NULL)
                return -1;

        memset(&hwaddr, 0, sizeof(OS_802_11_MAC_ADDRESS));
        
        // Read the mac from the adapter
        res = TI_GetCurrentAddress(h_adapter, &hwaddr);
        
        if (res != TI_RESULT_OK) {
                // Deinit handle
                TI_AdapterDeinit(h_adapter);
                return -1;
        }

        memcpy(mac, &hwaddr, 6);

        addrs.add(new EthernetAddress(mac));

        // We are done with the adapter handle
        TI_AdapterDeinit(h_adapter);

        s = socket(AF_INET, SOCK_DGRAM, 0);
        
        if (s < 0) {
            HAGGLE_ERR("socket() failed: %s\n", strerror(errno));
            return -1;
        }

        memset(&ifr, 0, sizeof(struct ifreq));
        strncpy(ifr.ifr_name, wifi_iface_name, IFNAMSIZ);
        ifr.ifr_name[IFNAMSIZ - 1] = 0;

        /*
          Getting the mac address via ioctl() does not seem to work
        for the TI wifi interface, but we got the mac from the driver
        API instead

        ret = ioctl(s, SIOCGIFHWADDR, &ifr);

        if (ret < 0) {
                CM_DBG("Could not get mac address of interface %s\n", name);
                close(s);
                return NULL;
        }
        */

        if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) {
                flags = 0;
        } else {
                flags = ifr.ifr_flags;
        }
        
        if (onlyUp && !(flags & IFF_UP)) {
                close(s);
                return 0;
        }

        if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {
		close(s);
		return 0;
        } 
	addr.s_addr = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr;
        
        if (ioctl(s, SIOCGIFBRDADDR, &ifr) < 0) {
		close(s);
		return 0;
        }
	
	baddr.s_addr = ((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr.s_addr;
	addrs.add(new IPv4Address(addr));
	addrs.add(new IPv4BroadcastAddress(baddr));
        
        close(s);

	InterfaceRef iface = Interface::create<EthernetInterface>(mac, wifi_iface_name, addrs, 
								  IFFLAG_LOCAL | ((flags & IFF_UP) ? IFFLAG_UP : 0));

	if (iface)
		iflist.push_back(iface);

        return 1;
}