blob: 20013ede3298069fa849696b16b175a7e35a8ba0 [file] [log] [blame]
/*
* interface data access header
*
* $Id$
*/
#ifndef NETSNMP_ACCESS_INTERFACE_H
#define NETSNMP_ACCESS_INTERFACE_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* define flags to indicate the availability of certain data
*/
#define NETSNMP_INTERFACE_FLAGS_ACTIVE 0x00000001
#define NETSNMP_INTERFACE_FLAGS_HAS_BYTES 0x00000002
#define NETSNMP_INTERFACE_FLAGS_HAS_DROPS 0x00000004
#define NETSNMP_INTERFACE_FLAGS_HAS_MCAST_PKTS 0x00000008
#define NETSNMP_INTERFACE_FLAGS_HAS_HIGH_BYTES 0x00000010
#define NETSNMP_INTERFACE_FLAGS_HAS_HIGH_PACKETS 0x00000020
#define NETSNMP_INTERFACE_FLAGS_HAS_HIGH_SPEED 0x00000040
#define NETSNMP_INTERFACE_FLAGS_DYNAMIC_SPEED 0x00000080
#define NETSNMP_INTERFACE_FLAGS_HAS_LASTCHANGE 0x00000100
#define NETSNMP_INTERFACE_FLAGS_HAS_DISCONTINUITY 0x00000200
#define NETSNMP_INTERFACE_FLAGS_HAS_IF_FLAGS 0x00000400
#define NETSNMP_INTERFACE_FLAGS_CAN_DOWN_PROTOCOL 0x00000800
#define NETSNMP_INTERFACE_FLAGS_HAS_IPV4 0x00001000
#define NETSNMP_INTERFACE_FLAGS_HAS_IPV6 0x00002000
#define NETSNMP_INTERFACE_FLAGS_HAS_V4_RETRANSMIT 0x00004000
#define NETSNMP_INTERFACE_FLAGS_HAS_V4_REASMMAX 0x00008000
#define NETSNMP_INTERFACE_FLAGS_HAS_V6_RETRANSMIT 0x00010000
#define NETSNMP_INTERFACE_FLAGS_HAS_V6_REASMMAX 0x00020000
#define NETSNMP_INTERFACE_FLAGS_HAS_V6_REACHABLE 0x00040000
#define NETSNMP_INTERFACE_FLAGS_HAS_V6_IFID 0x00080000
#define NETSNMP_INTERFACE_FLAGS_HAS_V6_FORWARDING 0x00100000
/* Some platforms, e.g.Linux, do not provide standalone counter
* for incoming unicast packets - they provide counter of all packets
* + separate counter for the multicast ones.
* That means the counter of all packets must watched and checked
* for overflows to reconstruct its 64-bit value (i.e. as usual
* for counter of unicast packets), and after its expansion to 64-bits,
* nr.of multicast packets must be substracted to get nr. of unicast
* packets.
* This flag marks stats of such platforms. Nr. of all incoming packets,
* provided by the platform, must be stored in
* netsnmp_interface_stats.iall and netsnmp_interface_stats.iucast will
* be automatically calculated later.
*/
#define NETSNMP_INTERFACE_FLAGS_CALCULATE_UCAST 0x00200000
/*************************************************************
* constants for enums for the MIB node
* ifAdminStatus (INTEGER / ASN_INTEGER)
*
* since a Textual Convention may be referenced more than once in a
* MIB, protect againt redifinitions of the enum values.
*/
#ifndef ifAdminStatus_ENUMS
#define ifAdminStatus_ENUMS
#define IFADMINSTATUS_UP 1
#define IFADMINSTATUS_DOWN 2
#define IFADMINSTATUS_TESTING 3
#endif /* ifAdminStatus_ENUMS */
/*************************************************************
* constants for enums for the MIB node
* ifOperStatus (INTEGER / ASN_INTEGER)
*
* since a Textual Convention may be referenced more than once in a
* MIB, protect againt redifinitions of the enum values.
*/
#ifndef ifOperStatus_ENUMS
#define ifOperStatus_ENUMS
#define IFOPERSTATUS_UP 1
#define IFOPERSTATUS_DOWN 2
#define IFOPERSTATUS_TESTING 3
#define IFOPERSTATUS_UNKNOWN 4
#define IFOPERSTATUS_DORMANT 5
#define IFOPERSTATUS_NOTPRESENT 6
#define IFOPERSTATUS_LOWERLAYERDOWN 7
#endif /* ifOperStatus_ENUMS */
/* nominal speed of network interface - used when the real speed is unknown */
#define NOMINAL_LINK_SPEED 10000000
/**---------------------------------------------------------------------*/
/*
* structure definitions
*
* NOTE: if you add fields, update code dealing with
* stats in interface_common.c, particularly
* netsnmp_access_interface_entry_update_stats()
*
*/
typedef struct netsnmp_interface_stats_s {
/*
* "Dynamic" fields
* Cached versions of byte/packet counters, etc
* (saved as a 'struct counter64' even if the
* high order half isn't actually used)
*
*/
/** input */
struct counter64 ibytes;
/*
* nr. of all packets (to calculate iucast, when underlying platform does
* not provide it)
*/
struct counter64 iall;
struct counter64 iucast;
struct counter64 imcast;
struct counter64 ibcast;
unsigned int ierrors;
unsigned int idiscards;
unsigned int iunknown_protos;
unsigned int inucast;
/** output */
struct counter64 obytes;
struct counter64 oucast;
struct counter64 omcast;
struct counter64 obcast;
unsigned int oerrors;
unsigned int odiscards;
unsigned int oqlen;
unsigned int collisions;
unsigned int onucast;
} netsnmp_interface_stats;
/*
*
* NOTE: if you add fields, update code dealing with
* them in interface_common.c, particularly
* netsnmp_access_interface_entry_copy().
*/
typedef struct netsnmp_interface_entry_s {
netsnmp_index oid_index;
u_int ns_flags; /* net-snmp flags */
oid index;
/*
* "Static" information
* Typically constant for a given interface
*/
char *name;
char *descr;
int type;
u_int speed;
u_int speed_high;
char *paddr;
u_int paddr_len;
u_int mtu;
u_int retransmit_v4; /* milliseconds */
u_int retransmit_v6; /* milliseconds */
u_int reachable_time; /* ipv6 / milliseconds */
u_long lastchange;
time_t discontinuity;
uint16_t reasm_max_v4; /* 0..65535 */
uint16_t reasm_max_v6; /* 1500..65535 */
char admin_status;
char oper_status;
/** booleans (not TruthValues!) */
char promiscuous;
char connector_present;
char forwarding_v6;
char v6_if_id_len;
u_char v6_if_id[8];
/*-----------------------------------------------
* platform/arch/access specific data
*/
u_int os_flags; /* iff NETSNMP_INTERFACE_FLAGS_HAS_IF_FLAGS */
/*
* statistics
*/
netsnmp_interface_stats stats;
/** old_stats is used in netsnmp_access_interface_entry_update_stats */
netsnmp_interface_stats *old_stats;
} netsnmp_interface_entry;
/*
* conf file overrides
*/
typedef struct _conf_if_list {
const char *name;
int type;
uint64_t speed;
struct _conf_if_list *next;
} netsnmp_conf_if_list;
typedef netsnmp_conf_if_list conf_if_list; /* backwards compat */
/**---------------------------------------------------------------------*/
/*
* ACCESS function prototypes
*/
void init_interface(void);
void netsnmp_access_interface_init(void);
/*
* ifcontainer init
*/
netsnmp_container * netsnmp_access_interface_container_init(u_int init_flags);
#define NETSNMP_ACCESS_INTERFACE_INIT_NOFLAGS 0x0000
#define NETSNMP_ACCESS_INTERFACE_INIT_ADDL_IDX_BY_NAME 0x0001
/*
* ifcontainer load and free
*/
netsnmp_container*
netsnmp_access_interface_container_load(netsnmp_container* container,
u_int load_flags);
#define NETSNMP_ACCESS_INTERFACE_LOAD_NOFLAGS 0x0000
#define NETSNMP_ACCESS_INTERFACE_LOAD_NO_STATS 0x0001
#define NETSNMP_ACCESS_INTERFACE_LOAD_IP4_ONLY 0x0002
#define NETSNMP_ACCESS_INTERFACE_LOAD_IP6_ONLY 0x0004
void netsnmp_access_interface_container_free(netsnmp_container *container,
u_int free_flags);
#define NETSNMP_ACCESS_INTERFACE_FREE_NOFLAGS 0x0000
#define NETSNMP_ACCESS_INTERFACE_FREE_DONT_CLEAR 0x0001
/*
* create/free an ifentry
*/
netsnmp_interface_entry *
netsnmp_access_interface_entry_create(const char *name, oid if_index);
void netsnmp_access_interface_entry_free(netsnmp_interface_entry * entry);
int
netsnmp_access_interface_entry_set_admin_status(netsnmp_interface_entry * entry,
int ifAdminStatus);
/*
* find entry in container
*/
netsnmp_interface_entry *
netsnmp_access_interface_entry_get_by_name(netsnmp_container *container,
const char *name);
netsnmp_interface_entry *
netsnmp_access_interface_entry_get_by_index(netsnmp_container *container,
oid index);
/*
* find ifIndex for given interface. 0 == not found.
*/
oid netsnmp_access_interface_index_find(const char *name);
/*
* find name for given index
*/
const char *netsnmp_access_interface_name_find(oid index);
/*
* copy interface entry data
*/
int netsnmp_access_interface_entry_copy(netsnmp_interface_entry * lhs,
netsnmp_interface_entry * rhs);
/*
* utility routines
*/
void netsnmp_access_interface_entry_guess_speed(netsnmp_interface_entry *);
void netsnmp_access_interface_entry_overrides(netsnmp_interface_entry *);
netsnmp_conf_if_list *
netsnmp_access_interface_entry_overrides_get(const char * name);
/**---------------------------------------------------------------------*/
#if defined( USING_IF_MIB_IFTABLE_IFTABLE_DATA_ACCESS_MODULE ) && \
! defined( NETSNMP_NO_BACKWARDS_COMPATABILITY )
void
Interface_Scan_Init(void);
int
Interface_Scan_Next(short *index, char *name, netsnmp_interface_entry **entry,
void *dc);
int
Interface_Scan_NextInt(int *index, char *name, netsnmp_interface_entry **entry,
void *dc);
#endif
/**---------------------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif /* NETSNMP_ACCESS_INTERFACE_H */