Example #1
0
int vlan_check(int ifindex, char * parent)
{
    struct Ip_ifreq   ifreq;
    struct Ip_vlanreq vlanreq;
    
    int fd;
        fd = ipcom_socket(IP_AF_INET, IP_SOCK_DGRAM, 0);
        
    ipcom_memset(&vlanreq, 0, sizeof(struct Ip_vlanreq));
    ifreq.ip_ifr_data = &vlanreq;
    if (ipcom_if_indextoname(ifindex, ifreq.ifr_name) == IP_NULL
        || ipcom_socketioctl(fd, IP_SIOCGETVLAN, &ifreq) < 0)
        return 0;

    if(ipcom_strcmp(parent,vlanreq.vlr_parent) == 0)
    { 
        	return 1;
        }
    else
    	return -1; 
    
}
/*
 *===========================================================================
 *                    ipcom_waitif_gifaddr
 *===========================================================================
 * Description: Get interface address.
 * Parameters:  fd - socket descriptor
 *              ifindex - Interface index.
 *              domain - The address domain.
 * Returns:     0 = No address available, 1 = No address available, -1 = error.
 *
 */
IP_STATIC int
ipcom_waitif_gifaddr(Ip_fd fd, int ifindex, int domain)
{
    int ret = -1;

    switch (domain)
    {
    case IP_AF_INET:
    {
        struct Ip_ifreq ifreq;

        /* Get if name */
        ipcom_memset(&ifreq, 0, sizeof(ifreq));
        (void)ipcom_if_indextoname(ifindex, ifreq.ifr_name);

        /* Get main address */
        if (ipcom_socketioctl(fd, IP_SIOCGIFADDR, &ifreq) < 0)
        {
            if (ipcom_errno != IP_ERRNO_EADDRNOTAVAIL && ipcom_errno != IP_ERRNO_ENXIO)
            {
                IPCOM_LOG1(ERR, "ipcom_waitif :: ipcom_socketioctl(SIOCGIFADDR) failed, errno = %d", ipcom_errno);
            }
        }
        else
        {
            struct Ip_in_addr network = ((struct Ip_sockaddr_in *)&ifreq.ip_ifr_addr)->sin_addr;

            if (network.s_addr != IP_INADDR_DEFAULT)
            {
                ret = 0;
            }
        }
        break;
    }

#ifdef IPCOM_USE_INET6
    case IP_AF_INET6:
    {
        int len = IPNET_WAITIF_MAXIF * sizeof(struct Ip_ifreq);
        char ifname[IP_IFNAMSIZ];
        struct Ip_ifconf ifc;
        char *buf = IP_NULL;
        char *ptr;

        /* Get if name */
        (void)ipcom_if_indextoname(ifindex, ifname);

        /* Get if data buffer */
        if ((buf = ipcom_malloc(IPNET_WAITIF_MAXIF * sizeof(struct Ip_ifreq))) == IP_NULL)
        {
            IPCOM_LOG0(ERR, "ipcom_waitif :: Out of memory");
            goto leave;
        }

        /* Enter buf in ifconf struct */
        ifc.ifc_len = len;
        ifc.ip_ifc_buf = buf;

        if (ipcom_socketioctl(fd, IP_SIOCGIFCONF, &ifc) < 0)
        {
            IPCOM_LOG1(ERR, "ipcom_socketioctl(SIOCGIFCONF) failed, errno = %d\n", ipcom_errno);
            goto leave;
        }

        /* Loop for all interfaces */
        for (ptr = buf; ptr < buf + ifc.ifc_len; )
        {
            struct Ip_ifreq *ifr = (struct Ip_ifreq *)ptr;
            char *cptr;

            /* Calculate pointer to next if */
            len = IP_MAX(sizeof(struct Ip_sockaddr_in), ifr->ip_ifr_addr.sa_len);
            ptr += sizeof(ifr->ifr_name) + len;

            if ((cptr = ipcom_strchr(ifr->ifr_name, ':')) != IP_NULL)
            {
                *cptr = '\0';
            }

            /* Only for v6 addresses */
            if (ipcom_strcmp(ifr->ifr_name, ifname) == 0 &&
                ifr->ip_ifr_addr.sa_family == IP_AF_INET6)
            {
                struct Ip_sockaddr_in6 *in6 = (struct Ip_sockaddr_in6 *)&ifr->ip_ifr_addr;

                if (!IP_IN6_IS_ADDR_UNSPECIFIED(&in6->sin6_addr))
                {
                    ret = 0;
                    break;
                }
            }
        }

leave:
        if (buf != IP_NULL)
        {
            ipcom_free(buf);
        }
        break;
    }
#endif /* IPCOM_USE_INET6 */
    }

    return ret;
}
Example #3
0
void test_if(char *parent)
{
	
	int                     name[6];
	Ip_u8                  *if_data;
	Ip_size_t               if_data_len;
	Ip_size_t               if_data_offset;
	struct Ipnet_if_msghdr *ifm;
	struct Ip_sockaddr     *hwaddr;
	char                    ifname[IP_IFNAMSIZ];
	char                    ifname2[IP_IFNAMSIZ];
	char                    str[80];

    
	name[0] = IP_CTL_NET;
	name[1] = IP_AF_ROUTE;
	name[2] = 0;    /* Always 0 */
	name[3] = 0;
	name[4] = IP_NET_RT_IFLIST;
	name[5] = 0;
	
	 if (ipcom_sysctl(name, 6, IP_NULL, &if_data_len, IP_NULL, 0) < 0)
	 {
		 printf("ifconfig: ipnet_sysctl() failed: %s"IP_LF, ipcom_strerror(ipcom_errno));
		 return;
	 }

	 if_data = ipcom_malloc(if_data_len);
	 if (if_data == IP_NULL)
	 {
		 printf("ifconfig: out of memory"IP_LF);
		 return;
	 }

	 if (ipcom_sysctl(name, 6, if_data, &if_data_len, IP_NULL, 0) < 0)
	 {
		 if (ipcom_errno == IP_ERRNO_ENOMEM)
		 {
			 ipcom_free(if_data);
		 }
		 printf("ifconfig: ipnet_sysctl() failed: %s"IP_LF, ipcom_strerror(ipcom_errno));
	 }

	 if_data_offset = 0;
	 while (if_data_len > if_data_offset + sizeof(struct Ipnet_if_msghdr))
	 {
		 ifm = (struct Ipnet_if_msghdr *) &if_data[if_data_offset];
		 if_data_offset += ifm->ifm_msglen;

		 /* Resolve the interface name */
		 		 if (ipcom_if_indextoname(ifm->ifm_index, ifname) == IP_NULL)
		 			 continue;	

		 		if (ifm->ifm_data.ifi_type == IP_IFT_L2VLAN)
		 		{
		 			
		 			if (( vlan_check(ifm->ifm_index, parent) == 0) || (vlan_check(ifm->ifm_index, parent) == -1))
		 				continue;
		 			else
		 			{
		 				printf("Interface=%s\n", ifname);
		 				ipcom_if_indextoname(ifm->ifm_index, ifname2);
		 				return get_ip(ifname2);
		 				
		 			}
		 		}	
		 		 		
   }		
}