📄 interfaces.c
字号:
if (if_list != 0) { free (if_list); if_list = 0; } if ((if_list = malloc (size)) == 0) { snmp_log(LOG_ERR,"out of memory allocating route table\n"); return; } if_list_size = size; } else { size = if_list_size; } if (sysctl (name, sizeof (name) / sizeof (int), if_list, &size, 0, 0) == -1) { snmp_log(LOG_ERR,"sysctl get fail\n"); } if_list_end = if_list + size; }}u_char *var_ifEntry(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ int interface; struct if_msghdr if_msg; static char if_name[100]; struct small_ifaddr sifa; char * cp; interface = header_ifEntry(vp, name, length, exact, var_len, write_method); if ( interface == MATCH_FAILED ) return NULL; if (Interface_Scan_By_Index(interface, &if_msg, if_name, &sifa) != 0) return NULL; switch (vp->magic) { case IFINDEX: long_return = interface; return (u_char *) &long_return; case IFDESCR: cp = if_name; *var_len = strlen (if_name); return (u_char *) cp; case IFTYPE: long_return = (long) if_msg.ifm_data.ifi_type; return (u_char *) &long_return; case IFMTU: long_return = (long) if_msg.ifm_data.ifi_mtu; return (u_char *) &long_return; case IFSPEED:#if STRUCT_IFNET_HAS_IF_BAUDRATE_IFS_VALUE long_return = (u_long) if_msg.ifm_data.ifi_baudrate.ifs_value << if_msg.ifm_data.ifi_baudrate.ifs_log2;#else long_return = (u_long) if_msg.ifm_data.ifi_baudrate;#endif return (u_char *) &long_return; case IFPHYSADDRESS: /* XXX */ return NULL; case IFADMINSTATUS: long_return = if_msg.ifm_flags & IFF_UP ? 1 : 2; return (u_char *) &long_return; case IFOPERSTATUS: long_return = if_msg.ifm_flags & IFF_RUNNING ? 1 : 2; return (u_char *) &long_return; /* ifLastChange */ case IFINOCTETS: long_return = (u_long) if_msg.ifm_data.ifi_ibytes; return (u_char *) &long_return; case IFINUCASTPKTS: long_return = (u_long) if_msg.ifm_data.ifi_ipackets-if_msg.ifm_data.ifi_imcasts; return (u_char *) &long_return; case IFINNUCASTPKTS: long_return = (u_long) if_msg.ifm_data.ifi_imcasts; return (u_char *) &long_return; case IFINDISCARDS: long_return = (u_long) if_msg.ifm_data.ifi_iqdrops; return (u_char *) &long_return; case IFINERRORS: long_return = (u_long) if_msg.ifm_data.ifi_ierrors; return (u_char *) &long_return; case IFINUNKNOWNPROTOS: long_return = (u_long) if_msg.ifm_data.ifi_noproto; return (u_char *) &long_return; case IFOUTOCTETS: long_return = (u_long) if_msg.ifm_data.ifi_obytes; return (u_char *) &long_return; case IFOUTUCASTPKTS: long_return = (u_long) if_msg.ifm_data.ifi_opackets-if_msg.ifm_data.ifi_omcasts; return (u_char *) &long_return; case IFOUTNUCASTPKTS: long_return = (u_long) if_msg.ifm_data.ifi_omcasts; return (u_char *) &long_return; case IFOUTDISCARDS:#ifdef if_odrops long_return = (u_long) if_msg.ifm_data.ifi_odrops;#else#if NO_DUMMY_VALUES return NULL;#endif long_return = 0;#endif return (u_char *) &long_return; case IFOUTERRORS: long_return = (u_long) if_msg.ifm_data.ifi_oerrors; return (u_char *) &long_return; case IFLASTCHANGE:#ifdef irix6 long_return = 0;#else if (if_msg.ifm_data.ifi_lastchange.tv_sec == 0 && if_msg.ifm_data.ifi_lastchange.tv_usec == 0) long_return = 0; else if (if_msg.ifm_data.ifi_lastchange.tv_sec < starttime.tv_sec) long_return = 0; else { long_return = (u_long) ((if_msg.ifm_data.ifi_lastchange.tv_sec - starttime.tv_sec) * 100 + (if_msg.ifm_data.ifi_lastchange.tv_usec - starttime.tv_usec) / 10000); }#endif return (u_char *) &long_return; default: return 0; }}int Interface_Scan_Next(short *Index, char *Name, struct ifnet *Retifnet, struct in_ifaddr *Retin_ifaddr){ return 0;}#else /* not USE_SYSCTL_IFLIST */ /********************* * * Kernel & interface information, * and internal forward declarations * *********************/#ifndef HAVE_NET_IF_MIB_H#ifndef solaris2static int Interface_Scan_By_Index (int, char *, struct ifnet *, struct in_ifaddr *);static int Interface_Get_Ether_By_Index (int, u_char *);#endif /********************* * * System specific implementation functions * *********************/#ifndef solaris2#ifndef hpuxu_char *var_ifEntry(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ static struct ifnet ifnet; int interface; static struct in_ifaddr in_ifaddr; static char Name[16]; char *cp; conf_if_list *if_ptr = conf_list;#if STRUCT_IFNET_HAS_IF_LASTCHANGE_TV_SEC struct timeval now;#endif interface = header_ifEntry(vp, name, length, exact, var_len, write_method); if ( interface == MATCH_FAILED ) return NULL; Interface_Scan_By_Index(interface, Name, &ifnet, &in_ifaddr); while (if_ptr && strcmp(Name, if_ptr->name)) if_ptr = if_ptr->next; switch (vp->magic){ case IFINDEX: long_return = interface; return (u_char *) &long_return; case IFDESCR: cp = Name; *var_len = strlen(cp); return (u_char *)cp; case IFTYPE: if (if_ptr) long_return = if_ptr->type; else {#if STRUCT_IFNET_HAS_IF_TYPE long_return = ifnet.if_type;#else long_return = 1; /* OTHER */#endif } return (u_char *) &long_return; case IFMTU: { long_return = (long) ifnet.if_mtu; return (u_char *) &long_return; } case IFSPEED: if (if_ptr) long_return = if_ptr->speed; else {#if STRUCT_IFNET_HAS_IF_BAUDRATE long_return = ifnet.if_baudrate;#elif STRUCT_IFNET_HAS_IF_SPEED long_return = ifnet.if_speed;#elif STRUCT_IFNET_HAS_IF_TYPE && defined(IFT_ETHER) if(ifnet.if_type == IFT_ETHER) long_return=10000000; if(ifnet.if_type == IFT_P10) long_return=10000000; if(ifnet.if_type == IFT_P80) long_return=80000000; if(ifnet.if_type == IFT_ISDNBASIC) long_return=64000; /* EDSS1 only */ if(ifnet.if_type == IFT_ISDNPRIMARY) long_return=64000*30;#else#if NO_DUMMY_VALUES return NULL;#endif long_return = (u_long) 10000000;#endif } return (u_char *) &long_return; case IFPHYSADDRESS: Interface_Get_Ether_By_Index(interface, return_buf); *var_len = 6; if ((return_buf[0] == 0) && (return_buf[1] == 0) && (return_buf[2] == 0) && (return_buf[3] == 0) && (return_buf[4] == 0) && (return_buf[5] == 0)) *var_len = 0; return(u_char *) return_buf; case IFADMINSTATUS: long_return = ifnet.if_flags & IFF_UP ? 1 : 2; return (u_char *) &long_return; case IFOPERSTATUS: long_return = ifnet.if_flags & IFF_RUNNING ? 1 : 2; return (u_char *) &long_return; case IFLASTCHANGE:#if defined(STRUCT_IFNET_HAS_IF_LASTCHANGE_TV_SEC) && !(defined(freebsd2) && __FreeBSD_version < 199607)/* XXX - SNMP's ifLastchange is time when op. status changed * FreeBSD's if_lastchange is time when packet was input or output * (at least in 2.1.0-RELEASE. Changed in later versions of the kernel?) *//* FreeBSD's if_lastchange before the 2.1.5 release is the time when * a packet was last input or output. In the 2.1.5 and later releases, * this is fixed, thus the 199607 comparison. */ if (ifnet.if_lastchange.tv_sec == 0 && ifnet.if_lastchange.tv_usec == 0) long_return = 0; else if (ifnet.if_lastchange.tv_sec < starttime.tv_sec) long_return = 0; else { long_return = (u_long) ((ifnet.if_lastchange.tv_sec - starttime.tv_sec) * 100 + (ifnet.if_lastchange.tv_usec - starttime.tv_usec) / 10000); }#else#if NO_DUMMY_VALUES return NULL;#endif long_return = 0; /* XXX */#endif return (u_char *) &long_return; case IFINOCTETS:#ifdef STRUCT_IFNET_HAS_IF_IBYTES long_return = (u_long) ifnet.if_ibytes;#else#if NO_DUMMY_VALUES return NULL;#endif long_return = (u_long) ifnet.if_ipackets * 308; /* XXX */#endif return (u_char *) &long_return; case IFINUCASTPKTS: { long_return = (u_long) ifnet.if_ipackets;#if STRUCT_IFNET_HAS_IF_IMCASTS long_return -= (u_long) ifnet.if_imcasts;#endif } return (u_char *) &long_return; case IFINNUCASTPKTS:#if STRUCT_IFNET_HAS_IF_IMCASTS long_return = (u_long) ifnet.if_imcasts;#else#if NO_DUMMY_VALUES return NULL;#endif long_return = (u_long) 0; /* XXX */#endif return (u_char *) &long_return; case IFINDISCARDS:#if STRUCT_IFNET_HAS_IF_IQDROPS long_return = (u_long) ifnet.if_iqdrops;#else#if NO_DUMMY_VALUES return NULL;#endif long_return = (u_long) 0; /* XXX */#endif return (u_char *) &long_return; case IFINERRORS: long_return = (u_long) ifnet.if_ierrors; return (u_char *) &long_return; case IFINUNKNOWNPROTOS:#if STRUCT_IFNET_HAS_IF_NOPROTO long_return = (u_long) ifnet.if_noproto;#else#if NO_DUMMY_VALUES return NULL;#endif long_return = (u_long) 0; /* XXX */#endif return (u_char *) &long_return; case IFOUTOCTETS:#ifdef STRUCT_IFNET_HAS_IF_OBYTES long_return = (u_long) ifnet.if_obytes;#else#if NO_DUMMY_VALUES return NULL;#endif long_return = (u_long) ifnet.if_opackets * 308; /* XXX */#endif return (u_char *) &long_return; case IFOUTUCASTPKTS: { long_return = (u_long) ifnet.if_opackets;#if STRUCT_IFNET_HAS_IF_OMCASTS long_return -= (u_long) ifnet.if_omcasts;#endif } return (u_char *) &long_return; case IFOUTNUCASTPKTS:#if STRUCT_IFNET_HAS_IF_OMCASTS long_return = (u_long) ifnet.if_omcasts;#else#if NO_DUMMY_VALUES return NULL;#endif long_return = (u_long) 0; /* XXX */#endif return (u_char *) &long_return; case IFOUTDISCARDS: long_return = ifnet.if_snd.ifq_drops; return (u_char *) &long_return; case IFOUTERRORS: long_return = ifnet.if_oerrors; return (u_char *) &long_return; case IFOUTQLEN: long_return = ifnet.if_snd.ifq_len; return (u_char *) &long_return; case IFSPECIFIC: *var_len = nullOidLen; return (u_char *) nullOid; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ifEntry\n", vp->magic)); } return NULL;}#else /* hpux */u_char *var_ifEntry(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ static struct ifnet ifnet; register int interface; static struct in_ifaddr in_ifaddrVar; static char Name[16]; register char *cp;#if STRUCT_IFNET_HAS_IF_LASTCHANGE_TV_SEC struct timeval now;#endif struct nmparms hp_nmparms; static mib_ifEntry hp_ifEntry; int hp_fd; int hp_len=sizeof(hp_ifEntry); interface = header_ifEntry(vp, name, length, exact, var_len, write_method); if ( interface == MATCH_FAILED ) return NULL; Interface_Scan_By_Index(interface, Name, &ifnet, &in_ifaddrVar); /* * Additional information about the interfaces is available under * HP-UX through the network management interface '/dev/netman' */ hp_ifEntry.ifIndex = interface; hp_nmparms.objid = ID_ifEntry; hp_nmparms.buffer = (char *)&hp_ifEntry; hp_nmparms.len = &hp_len; if ((hp_fd=open("/dev/netman", O_RDONLY)) != -1 ) { if (ioctl(hp_fd, NMIOGET, &hp_nmparms) != -1 ) { close(hp_fd); } else { close(hp_fd); hp_fd = -1; /* failed */ } } switch (vp->magic){ case IFINDEX: long_return = interface; return (u_char *) &long_return; case IFDESCR: if ( hp_fd != -1 ) cp = hp_ifEntry.ifDescr; else cp = Name; *var_len = strlen(cp); return (u_char *)cp; case IFTYPE: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifType; else long_return = 1; /* OTHER */ return (u_char *) &long_return; case IFMTU: { long_return = (long) ifnet.if_mtu; return (u_char *) &long_return; } case IFSPEED: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifSpeed; else long_return = (u_long) 1; /* OTHER */ return (u_char *) &long_return; case IFPHYSADDRESS: Interface_Get_Ether_By_Index(interface, return_buf); *var_len = 6; if ((return_buf[0] == 0) && (return_buf[1] == 0) && (return_buf[2] == 0) && (return_buf[3] == 0) && (return_buf[4] == 0) && (return_buf[5] == 0)) *var_len = 0; return(u_char *) return_buf; case IFADMINSTATUS: long_return = ifnet.if_flags & IFF_UP ? 1 : 2; return (u_char *) &long_return; case IFOPERSTATUS: long_return = ifnet.if_flags & IFF_RUNNING ? 1 : 2; return (u_char *) &long_return; case IFLASTCHANGE: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifLastChange; else long_return = 0; /* XXX */ return (u_char *) &long_return; case IFINOCTETS: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifInOctets; else long_return = (u_long) ifnet.if_ipackets * 308; /* XXX */ return (u_char *) &long_return; case IFINUCASTPKTS: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifInUcastPkts; else long_return = (u_long) ifnet.if_ipackets; return (u_char *) &long_return; case IFINNUCASTPKTS: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifInNUcastPkts; else long_return = (u_long) 0; /* XXX */ return (u_char *) &long_return; case IFINDISCARDS: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifInDiscards; else long_return = (u_long) 0; /* XXX */ return (u_char *) &long_return; case IFINERRORS: return (u_char *) &ifnet.if_ierrors; case IFINUNKNOWNPROTOS: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifInUnknownProtos; else long_return = (u_long) 0; /* XXX */ return (u_char *) &long_return; case IFOUTOCTETS: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifOutOctets; else long_return = (u_long) ifnet.if_opackets * 308; /* XXX */ return (u_char *) &long_return; case IFOUTUCASTPKTS: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifOutUcastPkts; else long_return = (u_long) ifnet.if_opackets; return (u_char *) &long_return; case IFOUTNUCASTPKTS: if ( hp_fd != -1 ) long_return = hp_ifEntry.ifOutNUcastPkts; else long_return = (u_long) 0; /* XXX */ return (u_char *) &long_return; case IFOUTDISCARDS: return (u_char *) &ifnet.if_snd.ifq_drops; case IFOUTERRORS: return (u_char *) &ifnet.if_oerrors; case IFOUTQLEN: return (u_char *) &ifnet.if_snd.ifq_len; case IFSPECIFIC: *var_len = nullOidLen; return (u_char *) nullOid; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ifEntry\n", vp->magic)); } return NULL;}#endif /* hpux */#else /* solaris2 */static intIF_cmp(void *addr, void *ep){ DEBUGMSGTL(("mibII/interfaces", "... IF_cmp %d %d\n", ((mib2_ifEntry_t *)ep)->ifIndex, ((mib2_ifEntry_t *)addr)->ifIndex)); if (((mib2_ifEntry_t *)ep)->ifIndex == ((mib2_ifEntry_t *)addr)->ifIndex) return (0); else return (1);}u_char *var_ifEntry(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ int interface; mib2_ifEntry_t ifstat; interface = header_ifEntry(vp, name, length, exact, var_len, write_method); if ( interface == MATCH_FAILED ) return NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -