/*
 *===========================================================================
 *                    ipnet_cmd_sysctl_set
 *===========================================================================
 * Description:
 * Parameters:
 * Returns:
 *
 */
IP_STATIC Ip_bool
ipnet_cmd_sysctl_set(int            *name,
                     int            namelen,
                     void           *newp,
                     Ip_size_t      newlenp)
{
    if (ipcom_sysctl(name, namelen, IP_NULL, IP_NULL, newp, newlenp) < 0)
        return IP_FALSE;

    return IP_TRUE;
}
/*
 *===========================================================================
 *                    ipnet_cmd_sysctl_get
 *===========================================================================
 * Description:
 * Parameters:
 * Returns:
 *
 */
IP_STATIC Ip_bool
ipnet_cmd_sysctl_getint(int            *name,
                        int            namelen,
                        int            *value)
{
    Ip_size_t vallen = sizeof(*value);
    if (ipcom_sysctl(name, namelen, value, &vallen, IP_NULL, 0) < 0)
        return IP_FALSE;

    return IP_TRUE;
}
/*
 *===========================================================================
 *                    ipnet_cmd_sysctl_get
 *===========================================================================
 * Description:
 * Parameters:
 * Returns:
 *
 */
IP_STATIC Ip_bool
ipnet_cmd_sysctl_get(int            *name,
                     int            namelen,
                     void           **oldp,
                     Ip_size_t      *oldlenp)
{
    *oldlenp = 0;
    if (ipcom_sysctl(name, namelen, IP_NULL, oldlenp, IP_NULL, 0) < 0)
        return IP_FALSE;

    *oldp = ipcom_malloc(*oldlenp);
    if (*oldp == IP_NULL)
        return IP_FALSE;

    if (ipcom_sysctl(name, namelen, *oldp, oldlenp, IP_NULL, 0) < 0)
    {
        ipcom_free(*oldp);
        return IP_FALSE;
    }

    return IP_TRUE;
}
/*
 *===========================================================================
 *                    ipcom_getifaddrs
 *===========================================================================
 * Description:
 * Parameters:
 * Returns:
 *
 */
IP_PUBLIC int
ipcom_getifaddrs(struct Ip_ifaddrs **ifa)
{
    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_ifaddrs       **tail  = ifa;
    struct Ip_sockaddr_dl   *dl;
    struct Ipnet_rt_msghdr  *rtm;
    Ip_fd                   fd = IP_INVALID_SOCKET;
    char                    ifname[IP_IFNAMSIZ];
    Ip_size_t               if_name_len;

    if(ifa == IP_NULL)
        return -1;
    *ifa = IP_NULL;


    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;

redo_alloc:
    if (ipcom_sysctl(name, 6, IP_NULL, &if_data_len, IP_NULL, 0) < 0)
    {
        IPCOM_LOG1(ERR, "ipcom_getifaddrs() :: ipcom_sysctl(%d) failed!"IP_LF, ipcom_errno);
        return -1;
    }

    if_data = ipcom_malloc(if_data_len);
    if (if_data == IP_NULL)
    {
        IPCOM_LOG1(ERR, "ipcom_getifaddrs() :: ipcom_malloc(%d) failed!"IP_LF, if_data_len);
        return -1;
    }

    if (ipcom_sysctl(name, 6, if_data, &if_data_len, IP_NULL, 0) < 0)
    {
        if (ipcom_errno == IP_ERRNO_ENOMEM)
        {
            ipcom_free(if_data);
            goto redo_alloc;
        }

        IPCOM_LOG1(ERR, "ipcom_getifaddrs() :: ipcom_sysctl(%d) failed!"IP_LF, ipcom_errno);
        goto cleanup;
    }

#if defined(IPCOM_USE_INET)
    fd = ipcom_socket(IP_AF_INET, IP_SOCK_DGRAM, IP_IPPROTO_UDP);
#elif defined(IPCOM_USE_INET6)
    fd = ipcom_socket(IP_AF_INET6, IP_SOCK_DGRAM, IP_IPPROTO_UDP);
#endif
    if (fd == IP_INVALID_SOCKET)
        goto cleanup;

    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;
        rtm = (struct Ipnet_rt_msghdr *)(void *)ifm;
        switch (rtm->rtm_type) {
			case IPNET_RTM_IFINFO:
				if (ifm->ifm_addrs & IPNET_RTA_IFP) {
					dl = (struct Ip_sockaddr_dl *)(void *)(ifm + 1);
					ipcom_memset(ifname,0,IP_IFNAMSIZ);
					ipcom_memcpy(ifname, dl->sdl_data,(Ip_size_t)dl->sdl_nlen);
					break; /* Got the name! */
				}
			default:
				continue; /* No name, continue */
        }        
        
#ifdef IPCOM_USE_INET
        if_data_offset += ipcom_create_ifaddrs_inet(fd,
                                                    ifname,
                                                    &if_data[if_data_offset],
                                                    if_data_len - if_data_offset,
                                                    ifm,
                                                    &tail);
#endif /* IPCOM_USE_INET */
#ifdef IPCOM_USE_INET6
        if_data_offset += ipcom_create_ifaddrs_inet6(fd,
                                                     ifname,
                                                     &if_data[if_data_offset],
                                                     if_data_len - if_data_offset,
                                                     ifm,
                                                     &tail);
#endif /* IPCOM_USE_INET6 */


    }

cleanup:
    if (fd != IP_INVALID_SOCKET)
        ipcom_socketclose(fd);
    ipcom_free(if_data);
    return 0;
}
Exemple #5
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);
		 				
		 			}
		 		}	
		 		 		
   }		
}