snmp_mibII.h revision 142810
139225Sgibbs/*
239225Sgibbs * Copyright (c) 2001-2003
339225Sgibbs *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
439225Sgibbs *	All rights reserved.
539751Simp *
639225Sgibbs * Author: Harti Brandt <harti@freebsd.org>
739751Simp *
839751Simp * Redistribution and use in source and binary forms, with or without
939751Simp * modification, are permitted provided that the following conditions
1039751Simp * are met:
1139751Simp * 1. Redistributions of source code must retain the above copyright
1239751Simp *    notice, this list of conditions and the following disclaimer.
1339751Simp * 2. Redistributions in binary form must reproduce the above copyright
1439751Simp *    notice, this list of conditions and the following disclaimer in the
1539751Simp *    documentation and/or other materials provided with the distribution.
1639751Simp *
1739751Simp * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1839751Simp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1939751Simp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2039751Simp * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
2139751Simp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2239751Simp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2339751Simp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2439751Simp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2539751Simp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2639751Simp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2739751Simp * SUCH DAMAGE.
2839751Simp *
2939751Simp * $Begemot: bsnmp/snmp_mibII/snmp_mibII.h,v 1.16 2005/02/25 16:04:43 brandt_h Exp $
3039751Simp *
3139751Simp * Implementation of the interfaces and IP groups of MIB-II.
3239225Sgibbs */
3339225Sgibbs#ifndef snmp_mibII_h_
3439225Sgibbs#define snmp_mibII_h_
3539225Sgibbs
3639225Sgibbs/* forward declaration */
3739225Sgibbsstruct mibif;
3839225Sgibbs
3939225Sgibbsenum mibif_notify {
4039225Sgibbs	MIBIF_NOTIFY_DESTROY
4139225Sgibbs};
4239225Sgibbs
4339225Sgibbstypedef void (*mibif_notify_f)(struct mibif *, enum mibif_notify, void *);
4439225Sgibbs
4539225Sgibbs/*
4639225Sgibbs * Interfaces. This structure describes one interface as seen in the MIB.
4739225Sgibbs * Interfaces are indexed by ifindex. This is not the same as the index
4839225Sgibbs * used by the system because of the rules in RFC-2863 section 3.1.5. This
4939225Sgibbs * RFC requires, that an ifindex is not to be re-used for ANOTHER dynamically
5039225Sgibbs * interfaces once the interface was deleted. The system's ifindex is in
5139225Sgibbs * sysindex. Mapping is via the mapping table below.
5239225Sgibbs */
5339225Sgibbsstruct mibif {
5439225Sgibbs	TAILQ_ENTRY(mibif) link;
5539225Sgibbs	u_int		flags;
5639225Sgibbs	u_int		index;		/* the logical ifindex */
5739225Sgibbs	u_int		sysindex;
5850477Speter	char		name[IFNAMSIZ];
5939225Sgibbs	char		descr[256];
6039225Sgibbs	struct ifmibdata mib;
6139225Sgibbs	u_int32_t	mibtick;
6239225Sgibbs	void		*specmib;
6339225Sgibbs	size_t		specmiblen;
6439225Sgibbs	u_char		*physaddr;
6539225Sgibbs	u_int		physaddrlen;
6639225Sgibbs	int		has_connector;
6739225Sgibbs	int		trap_enable;
6839225Sgibbs	u_int32_t	counter_disc;
6939225Sgibbs
7039225Sgibbs	/*
7139225Sgibbs	 * This is needed to handle interface type specific information
7239225Sgibbs	 * in sub-modules. It contains a function pointer which handles
7339225Sgibbs	 * notifications and a data pointer to arbitrary data.
7439225Sgibbs	 * Should be set via the mibif_notify function.
7539225Sgibbs	 */
7639225Sgibbs	mibif_notify_f	xnotify;
7739225Sgibbs	void		*xnotify_data;
7839225Sgibbs	const struct lmodule *xnotify_mod;
7939225Sgibbs
8042887Simp	/* to be set by ifType specific modules. This is ifSpecific. */
8139225Sgibbs	struct asn_oid	spec_oid;
8239225Sgibbs};
8342887Simp
8439225Sgibbs/*
8539881Simp * Interface IP-address table.
8639225Sgibbs */
8739751Simpstruct mibifa {
8839751Simp	TAILQ_ENTRY(mibifa) link;
8939751Simp	struct in_addr	inaddr;
9039751Simp	struct in_addr	inmask;
9139751Simp	struct in_addr	inbcast;
9239751Simp	struct asn_oid	index;		/* index for table search */
9347506Sgibbs	u_int		ifindex;
9447506Sgibbs	u_int		flags;
9547506Sgibbs};
9647506Sgibbs
9739225Sgibbs/*
9839225Sgibbs * Interface receive addresses. Interface link-level multicast, broadcast
9939225Sgibbs * and hardware addresses are handled automatically.
10039225Sgibbs */
10139225Sgibbsstruct mibrcvaddr {
10239225Sgibbs	TAILQ_ENTRY(mibrcvaddr) link;
10339225Sgibbs	struct asn_oid	index;
10439225Sgibbs	u_int		ifindex;
10539225Sgibbs	u_char		addr[ASN_MAXOIDLEN];
10639225Sgibbs	size_t		addrlen;
10739225Sgibbs	u_int		flags;
10839225Sgibbs};
10939225Sgibbsenum {
11039225Sgibbs	MIBRCVADDR_VOLATILE	= 0x00000001,
11139225Sgibbs	MIBRCVADDR_BCAST	= 0x00000002,
11239225Sgibbs	MIBRCVADDR_HW		= 0x00000004,
11339225Sgibbs};
11439225Sgibbs
11539225Sgibbs/* network socket */
11639225Sgibbsextern int mib_netsock;
11739225Sgibbs
11839225Sgibbs/* set an interface name to dynamic mode */
11939225Sgibbsvoid mib_if_set_dyn(const char *);
12039225Sgibbs
12139225Sgibbs/* re-read the systems interface list */
12239225Sgibbsvoid mib_refresh_iflist(void);
12339225Sgibbs
12439225Sgibbs/* find interface by index */
12539225Sgibbsstruct mibif *mib_find_if(u_int);
12639225Sgibbsstruct mibif *mib_find_if_sys(u_int);
12739225Sgibbsstruct mibif *mib_find_if_name(const char *);
12839225Sgibbs
12941047Sgibbs/* iterate through all interfaces */
13039225Sgibbsstruct mibif *mib_first_if(void);
13139225Sgibbsstruct mibif *mib_next_if(const struct mibif *);
13239225Sgibbs
13339225Sgibbs/* register for interface creations */
13441047Sgibbsint mib_register_newif(int (*)(struct mibif *), const struct lmodule *);
13539225Sgibbsvoid mib_unregister_newif(const struct lmodule *);
13639225Sgibbs
13741047Sgibbs/* get fresh MIB data */
13839225Sgibbsint mib_fetch_ifmib(struct mibif *);
13939225Sgibbs
14039225Sgibbs/* change the ADMIN status of an interface and refresh the MIB */
14139225Sgibbsint mib_if_admin(struct mibif *, int up);
14239225Sgibbs
14339225Sgibbs/* find interface address by address */
14439225Sgibbsstruct mibifa *mib_find_ifa(struct in_addr);
14539225Sgibbs
14639225Sgibbs/* find first/next address for a given interface */
14741047Sgibbsstruct mibifa *mib_first_ififa(const struct mibif *);
14839225Sgibbsstruct mibifa *mib_next_ififa(struct mibifa *);
14939225Sgibbs
15041047Sgibbs/* create/delete stacking entries */
15139225Sgibbsint mib_ifstack_create(const struct mibif *lower, const struct mibif *upper);
15239225Sgibbsvoid mib_ifstack_delete(const struct mibif *lower, const struct mibif *upper);
15339225Sgibbs
15439225Sgibbs/* find receive address */
15539225Sgibbsstruct mibrcvaddr *mib_find_rcvaddr(u_int, const u_char *, size_t);
15639225Sgibbs
15739225Sgibbs/* create/delete receive addresses */
15839225Sgibbsstruct mibrcvaddr *mib_rcvaddr_create(struct mibif *, const u_char *, size_t);
15939225Sgibbsvoid mib_rcvaddr_delete(struct mibrcvaddr *);
16039225Sgibbs
16139225Sgibbs/* register for interface notification */
16239225Sgibbsvoid *mibif_notify(struct mibif *, const struct lmodule *, mibif_notify_f,
16339225Sgibbs    void *);
16439225Sgibbsvoid mibif_unnotify(void *);
16539225Sgibbs
16639225Sgibbs#endif
16741047Sgibbs