Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}