⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interface_linux.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
                     scan_expected, scan_count);            netsnmp_access_interface_entry_free(entry);            continue;        }        entry->ns_flags |= NETSNMP_INTERFACE_FLAGS_ACTIVE;        /*         * linux previous to 1.3.~13 may miss transmitted loopback pkts:          */        if (!strcmp(entry->name, "lo") && rec_pkt > 0 && !snd_pkt)            snd_pkt = rec_pkt;        /*         * xxx-rks: get descr by linking mem from /proc/pci and /proc/iomem         */        entry->stats.ibytes.low = rec_oct & 0xffffffff;        entry->stats.iucast.low = rec_pkt & 0xffffffff;        entry->stats.imcast.low = rec_mcast & 0xffffffff;        entry->stats.obytes.low = snd_oct & 0xffffffff;        entry->stats.oucast.low = snd_pkt & 0xffffffff;#ifdef SCNuMAX   /* XXX - should be flag for 64-bit variables */        entry->stats.ibytes.high = rec_oct >> 32;        entry->stats.iucast.high = rec_pkt >> 32;        entry->stats.imcast.high = rec_mcast >> 32;        entry->stats.obytes.high = snd_oct >> 32;        entry->stats.oucast.high = snd_pkt >> 32;#endif        entry->stats.ierrors   = rec_err;        entry->stats.idiscards = rec_drop;        entry->stats.oerrors   = snd_err;        entry->stats.odiscards = snd_drop;        entry->stats.collisions = coll;        /*         * calculated stats.         *         *  we have imcast, but not ibcast.         */        entry->stats.inucast = entry->stats.imcast.low +            entry->stats.ibcast.low;        /*         * use ioctls for some stuff         *  (ignore rc, so we get as much info as possible)         */        netsnmp_access_interface_ioctl_physaddr_get(fd, entry);        /*         * physaddr should have set type. make some guesses (based         * on name) if not.         */        if(0 == entry->type) {            typedef struct _match_if {               int             mi_type;               const char     *mi_name;            }              *pmatch_if, match_if;                        static match_if lmatch_if[] = {                {IANAIFTYPE_SOFTWARELOOPBACK, "lo"},                {IANAIFTYPE_ETHERNETCSMACD, "eth"},                {IANAIFTYPE_ETHERNETCSMACD, "vmnet"},                {IANAIFTYPE_ISO88025TOKENRING, "tr"},                {IANAIFTYPE_FASTETHER, "feth"},                {IANAIFTYPE_GIGABITETHERNET,"gig"},                {IANAIFTYPE_PPP, "ppp"},                {IANAIFTYPE_SLIP, "sl"},                {IANAIFTYPE_TUNNEL, "sit"},                {IANAIFTYPE_BASICISDN, "ippp"},                {IANAIFTYPE_PROPVIRTUAL, "bond"}, /* Bonding driver find fastest slave */                {IANAIFTYPE_PROPVIRTUAL, "vad"},  /* ANS driver - ?speed? */                {0, 0}                  /* end of list */            };            int             ii, len;            register pmatch_if pm;                        for (ii = 0, pm = lmatch_if; pm->mi_name; pm++) {                len = strlen(pm->mi_name);                if (0 == strncmp(entry->name, pm->mi_name, len)) {                    entry->type = pm->mi_type;                    break;                }            }            if(NULL == pm->mi_name)                entry->type = IANAIFTYPE_OTHER;        }        if (IANAIFTYPE_ETHERNETCSMACD == entry->type)            entry->speed =                netsnmp_arch_interface_get_if_speed(fd, entry->name);#ifdef APPLIED_PATCH_836390   /* xxx-rks ifspeed fixes */        else if (IANAIFTYPE_PROPVIRTUAL == entry->type)            entry->speed = _get_bonded_if_speed(entry)#endif        else            netsnmp_access_interface_entry_guess_speed(entry);        netsnmp_access_interface_ioctl_flags_get(fd, entry);        netsnmp_access_interface_ioctl_mtu_get(fd, entry);        /*         * Zero speed means link problem.         * -i'm not sure this is always true...         */        if((entry->speed == 0) && (entry->os_flags & IFF_UP)){            entry->os_flags &= ~IFF_RUNNING;        }        netsnmp_access_interface_entry_overrides(entry);        /*         * add to container         */        CONTAINER_INSERT(container, entry);    }    fclose(devin);    close(fd);    return 0;}intnetsnmp_arch_set_admin_status(netsnmp_interface_entry * entry,                              int ifAdminStatus_val){    int and_complement;        DEBUGMSGTL(("access:interface:arch", "set_admin_status\n"));    if(IFADMINSTATUS_UP == ifAdminStatus_val)        and_complement = 0; /* |= */    else        and_complement = 1; /* &= ~ */    return netsnmp_access_interface_ioctl_flags_set(-1, entry,                                                    IFF_UP, and_complement);}/** * Determines network interface speed. */unsigned intnetsnmp_arch_interface_get_if_speed(int fd, const char *name){    unsigned int retspeed = 10000000;    struct ifreq ifr;    /* the code is based on mii-diag utility by Donald Becker     * see ftp://ftp.scyld.com/pub/diag/mii-diag.c     */    ushort *data = (ushort *)(&ifr.ifr_data);    unsigned phy_id;    unsigned char new_ioctl_nums = 0;    int mii_reg, i;    ushort mii_val[32];    ushort bmcr, bmsr, nway_advert, lkpar;    const unsigned int media_speeds[] = {10000000, 10000000, 100000000, 100000000, 10000000, 0};	    /* It corresponds to "10baseT", "10baseT-FD", "100baseTx", "100baseTx-FD", "100baseT4", "Flow-control", 0, */    strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));    ifr.ifr_name[ sizeof(ifr.ifr_name)-1 ] = 0;    data[0] = 0;        if (ioctl(fd, 0x8947, &ifr) >= 0) {        new_ioctl_nums = 1;    } else if (ioctl(fd, SIOCDEVPRIVATE, &ifr) >= 0) {        new_ioctl_nums = 0;    } else {        DEBUGMSGTL(("mibII/interfaces", "SIOCGMIIPHY on %s failed\n",                    ifr.ifr_name));        return retspeed;    }    /* Begin getting mii register values */    phy_id = data[0];    for (mii_reg = 0; mii_reg < 8; mii_reg++){        data[0] = phy_id;        data[1] = mii_reg;        if(ioctl(fd, new_ioctl_nums ? 0x8948 : SIOCDEVPRIVATE+1, &ifr) <0){            DEBUGMSGTL(("mibII/interfaces", "SIOCGMIIREG on %s failed\n", ifr.ifr_name));        }        mii_val[mii_reg] = data[3];		    }    /*Parsing of mii values*/    /*Invalid basic mode control register*/    if (mii_val[0] == 0xffff  ||  mii_val[1] == 0x0000) {        DEBUGMSGTL(("mibII/interfaces", "No MII transceiver present!.\n"));        return retspeed;    }    /* Descriptive rename. */    bmcr = mii_val[0]; 	  /*basic mode control register*/    bmsr = mii_val[1]; 	  /* basic mode status register*/    nway_advert = mii_val[4]; /* autonegotiation advertisement*/    lkpar = mii_val[5]; 	  /*link partner ability*/        /*Check for link existence, returns 0 if link is absent*/    if ((bmsr & 0x0016) != 0x0004){        DEBUGMSGTL(("mibII/interfaces", "No link...\n"));        retspeed = 0;        return retspeed;    }        if(!(bmcr & 0x1000) ){        DEBUGMSGTL(("mibII/interfaces", "Auto-negotiation disabled.\n"));        retspeed = bmcr & 0x2000 ? 100000000 : 10000000;        return retspeed;    }    /* Link partner got our advertised abilities */	    if (lkpar & 0x4000) {        int negotiated = nway_advert & lkpar & 0x3e0;        int max_capability = 0;        /* Scan for the highest negotiated capability, highest priority           (100baseTx-FDX) to lowest (10baseT-HDX). */        int media_priority[] = {8, 9, 7, 6, 5}; 	/* media_names[i-5] */        for (i = 0; media_priority[i]; i++){            if (negotiated & (1 << media_priority[i])) {                max_capability = media_priority[i];                break;            }        }        if (max_capability)            retspeed = media_speeds[max_capability - 5];        else            DEBUGMSGTL(("mibII/interfaces", "No common media type was autonegotiated!\n"));    }else if(lkpar & 0x00A0){        retspeed = (lkpar & 0x0080) ? 100000000 : 10000000;    }    return retspeed;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -