EC_BOOL lic_mac_collect(LIC_MAC *lic_mac_tbl, const UINT32 lic_mac_tbl_max_size, UINT32 *lic_mac_num) { int fd; UINT32 net_interface; struct ifreq buf[ LIC_INTERFACE_MAX_NUM ]; struct ifconf ifc; UINT32 lic_mac_idx; LIC_MAC *lic_mac; lic_mac_idx = 0; if ((fd = csocket_open(AF_INET, SOCK_DGRAM, 0)) >= 0) { ifc.ifc_len = sizeof(buf); ifc.ifc_buf = (caddr_t) buf; if (ioctl(fd, SIOCGIFCONF, (char *) &ifc)) { close(fd); return (EC_FALSE); } net_interface = sizeof(buf) / sizeof(buf[0]); if(net_interface > lic_mac_tbl_max_size) { net_interface = lic_mac_tbl_max_size; } while (net_interface -- > 0) { /*Jugde whether the net card status is promisc */ if (ioctl(fd, SIOCGIFFLAGS, (char *) &buf[net_interface])) { continue; } if (!(buf[net_interface].ifr_flags & IFF_UP)) { continue; } /*Get HW ADDRESS of the net card */ if (ioctl(fd, SIOCGIFHWADDR, (char *) &buf[net_interface])) { continue; } lic_mac = (lic_mac_tbl + lic_mac_idx); #if 0 sys_log(stdout, "HW address is:"); sys_print(stdout, "%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[0], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[1], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[2], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[3], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[4], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[5]); #endif LIC_MAC_ADDR(lic_mac, 0) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[0]; LIC_MAC_ADDR(lic_mac, 1) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[1]; LIC_MAC_ADDR(lic_mac, 2) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[2]; LIC_MAC_ADDR(lic_mac, 3) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[3]; LIC_MAC_ADDR(lic_mac, 4) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[4]; LIC_MAC_ADDR(lic_mac, 5) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[5]; lic_mac_idx ++; } } close(fd); (*lic_mac_num) = lic_mac_idx; return (EC_TRUE); }
UINT32 cnetcard_collect(CSET *cnetcard_set, const UINT32 max_cnetcard_num) { int fd; struct ifreq *ifreq_tbl; struct ifconf ifc; struct sockaddr_in *in; UINT32 cnetcard_pos; UINT32 cnetcard_num; fd = csocket_open(AF_INET, SOCK_DGRAM, 0); if(0 > fd) { dbg_log(SEC_0011_CDEVICE, 0)(LOGSTDOUT, "error:cnetcard_collect: failed to create a socket\n"); return ((UINT32)-1); } ifreq_tbl = (struct ifreq *)SAFE_MALLOC(sizeof(struct ifreq) * max_cnetcard_num, LOC_CDEVICE_0003); if(NULL_PTR == ifreq_tbl) { dbg_log(SEC_0011_CDEVICE, 0)(LOGSTDOUT, "error:cnetcard_collect: failed to malloc %ld struct ifreq\n", max_cnetcard_num); csocket_close_force(fd); return ((UINT32)-1); } ifc.ifc_len = sizeof(struct ifreq) * max_cnetcard_num; ifc.ifc_buf = (caddr_t) ifreq_tbl; if (0 != ioctl(fd, SIOCGIFCONF, (char *) &ifc)) { dbg_log(SEC_0011_CDEVICE, 0)(LOGSTDOUT, "error:cnetcard_collect: failed to fetch %ld IF CONFIG\n", max_cnetcard_num); csocket_close_force(fd); SAFE_FREE(ifreq_tbl, LOC_CDEVICE_0004); return ((UINT32)-1); } cnetcard_num = ifc.ifc_len / sizeof(struct ifreq);/*actual device number*/ //dbg_log(SEC_0011_CDEVICE, 5)(LOGSTDOUT, "cnetcard_num = %ld\n", cnetcard_num); for(cnetcard_pos = 0; cnetcard_pos < cnetcard_num; cnetcard_pos ++) { CNETCARD *cnetcard; struct ifreq *ifreq_item; ifreq_item = (ifreq_tbl + cnetcard_pos); //dbg_log(SEC_0011_CDEVICE, 5)(LOGSTDOUT, "ifreq_tbl %lx, cnetcard_pos %lx => ifreq_item %lx\n", ifreq_tbl, cnetcard_pos, ifreq_item); cnetcard = cnetcard_new(); if(NULL_PTR == cnetcard) { dbg_log(SEC_0011_CDEVICE, 0)(LOGSTDOUT, "error:cnetcard_collect: failed to new CNETCARD when handle # %ld device\n", cnetcard_pos); csocket_close_force(fd); SAFE_FREE(ifreq_tbl, LOC_CDEVICE_0005); return ((UINT32)-1); } /*get device name*/ cstring_format(CNETCARD_NAME(cnetcard), "%s", ifreq_item->ifr_name); /*judge whether the net card status is up */ if(0 != ioctl(fd, SIOCGIFFLAGS, (char *)ifreq_item)) { dbg_log(SEC_0011_CDEVICE, 0)(LOGSTDOUT, "error:cnetcard_collect: failed to fetch # %ld device IF FLAGS\n", cnetcard_pos); cnetcard_free(cnetcard); continue; } if(ifreq_item->ifr_flags & IFF_UP) { CNETCARD_STATE(cnetcard) = CNETCARD_UP_STATE; } else { CNETCARD_STATE(cnetcard) = CNETCARD_DOWN_STATE; } /*get IP of the net card */ if (0 != ioctl(fd, SIOCGIFADDR, (char *)ifreq_item)) { dbg_log(SEC_0011_CDEVICE, 0)(LOGSTDOUT, "error:cnetcard_collect: failed to fetch # %ld device IF ADDR\n", cnetcard_pos); cnetcard_free(cnetcard); continue; } in = (struct sockaddr_in*) (&(ifreq_item->ifr_addr)); cstring_format(CNETCARD_IPV4STR(cnetcard), "%s", c_inet_ntos(&(in->sin_addr))); CNETCARD_IPV4VAL(cnetcard) = c_ipv4_to_word((char *)cstring_get_str(CNETCARD_IPV4STR(cnetcard))); /*get HW ADDRESS of the net card */ if(0 != ioctl(fd, SIOCGIFHWADDR, (char *)ifreq_item)) { dbg_log(SEC_0011_CDEVICE, 0)(LOGSTDOUT, "error:cnetcard_collect: failed to fetch # %ld device IF HW ADDR\n", cnetcard_pos); cnetcard_free(cnetcard); continue; } BCOPY(ifreq_item->ifr_hwaddr.sa_data, CNETCARD_MACADDR(cnetcard), 6); cstring_format(CNETCARD_MACSTR(cnetcard), "%02x:%02x:%02x:%02x:%02x:%02x", (UINT8) ifreq_item->ifr_hwaddr.sa_data[0], (UINT8) ifreq_item->ifr_hwaddr.sa_data[1], (UINT8) ifreq_item->ifr_hwaddr.sa_data[2], (UINT8) ifreq_item->ifr_hwaddr.sa_data[3], (UINT8) ifreq_item->ifr_hwaddr.sa_data[4], (UINT8) ifreq_item->ifr_hwaddr.sa_data[5] ); /*add to set*/ if(EC_FALSE == cset_add(cnetcard_set, (void *)cnetcard, (CSET_DATA_CMP)cnetcard_cmp)) { cnetcard_free(cnetcard); } } csocket_close_force(fd); SAFE_FREE(ifreq_tbl, LOC_CDEVICE_0006); //dbg_log(SEC_0011_CDEVICE, 3)(LOGSTDOUT, "info:cnetcard_collect: device list:\n"); //cset_print(LOGSTDOUT, cnetcard_set, (CSET_DATA_PRINT)cnetcard_print); return (0); }