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; }
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); } } } }