snmp_mibII.h revision 122394
1/*
2 * Copyright (c) 2001-2003
3 *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4 *	All rights reserved.
5 *
6 * Author: Harti Brandt <harti@freebsd.org>
7 *
8 * Redistribution of this software and documentation and use in source and
9 * binary forms, with or without modification, are permitted provided that
10 * the following conditions are met:
11 *
12 * 1. Redistributions of source code or documentation must retain the above
13 *    copyright notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY FRAUNHOFER FOKUS
22 * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
23 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
24 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
25 * FRAUNHOFER FOKUS OR ITS CONTRIBUTORS  BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
28 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
31 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 * $Begemot: bsnmp/snmp_mibII/snmp_mibII.h,v 1.13 2002/03/21 11:18:51 hbb Exp $
34 *
35 * Implementation of the interfaces and IP groups of MIB-II.
36 */
37#ifndef snmp_mibII_h_
38#define snmp_mibII_h_
39
40/* forward declaration */
41struct mibif;
42
43enum mibif_notify {
44	MIBIF_NOTIFY_DESTROY
45};
46
47typedef void (*mibif_notify_f)(struct mibif *, enum mibif_notify, void *);
48
49/*
50 * Interfaces. This structure describes one interface as seen in the MIB.
51 * Interfaces are indexed by ifindex. This is not the same as the index
52 * used by the system because of the rules in RFC-2863 section 3.1.5. This
53 * RFC requires, that an ifindex is not to be re-used for ANOTHER dynamically
54 * interfaces once the interface was deleted. The system's ifindex is in
55 * sysindex. Mapping is via the mapping table below.
56 */
57struct mibif {
58	TAILQ_ENTRY(mibif) link;
59	u_int		flags;
60	u_int		index;		/* the logical ifindex */
61	u_int		sysindex;
62	char		name[IFNAMSIZ];
63	char		descr[256];
64	struct ifmibdata mib;
65	u_int32_t	mibtick;
66	void		*specmib;
67	size_t		specmiblen;
68	u_char		*physaddr;
69	u_int		physaddrlen;
70	int		has_connector;
71	int		trap_enable;
72	u_int32_t	counter_disc;
73
74	/*
75	 * This is needed to handle interface type specific information
76	 * in sub-modules. It contains a function pointer which handles
77	 * notifications and a data pointer to arbitrary data.
78	 * Should be set via the mibif_notify function.
79	 */
80	mibif_notify_f	xnotify;
81	void		*xnotify_data;
82	const struct lmodule *xnotify_mod;
83};
84
85/*
86 * Interface IP-address table.
87 */
88struct mibifa {
89	TAILQ_ENTRY(mibifa) link;
90	struct in_addr	inaddr;
91	struct in_addr	inmask;
92	struct in_addr	inbcast;
93	struct asn_oid	index;		/* index for table search */
94	u_int		ifindex;
95	u_int		flags;
96};
97
98/*
99 * Interface receive addresses. Interface link-level multicast, broadcast
100 * and hardware addresses are handled automatically.
101 */
102struct mibrcvaddr {
103	TAILQ_ENTRY(mibrcvaddr) link;
104	struct asn_oid	index;
105	u_int		ifindex;
106	u_char		addr[ASN_MAXOIDLEN];
107	size_t		addrlen;
108	u_int		flags;
109};
110enum {
111	MIBRCVADDR_VOLATILE	= 0x00000001,
112	MIBRCVADDR_BCAST	= 0x00000002,
113	MIBRCVADDR_HW		= 0x00000004,
114};
115
116/* network socket */
117extern int mib_netsock;
118
119/* set an interface name to dynamic mode */
120void mib_if_set_dyn(const char *);
121
122/* re-read the systems interface list */
123void mib_refresh_iflist(void);
124
125/* find interface by index */
126struct mibif *mib_find_if(u_int);
127struct mibif *mib_find_if_sys(u_int);
128struct mibif *mib_find_if_name(const char *);
129
130/* iterate through all interfaces */
131struct mibif *mib_first_if(void);
132struct mibif *mib_next_if(const struct mibif *);
133
134/* register for interface creations */
135int mib_register_newif(int (*)(struct mibif *), const struct lmodule *);
136void mib_unregister_newif(const struct lmodule *);
137
138/* get fresh MIB data */
139int mib_fetch_ifmib(struct mibif *);
140
141/* change the ADMIN status of an interface and refresh the MIB */
142int mib_if_admin(struct mibif *, int up);
143
144/* find interface address by address */
145struct mibifa *mib_find_ifa(struct in_addr);
146
147/* find first/next address for a given interface */
148struct mibifa *mib_first_ififa(const struct mibif *);
149struct mibifa *mib_next_ififa(struct mibifa *);
150
151/* create/delete stacking entries */
152int mib_ifstack_create(const struct mibif *lower, const struct mibif *upper);
153void mib_ifstack_delete(const struct mibif *lower, const struct mibif *upper);
154
155/* find receive address */
156struct mibrcvaddr *mib_find_rcvaddr(u_int, const u_char *, size_t);
157
158/* create/delete receive addresses */
159struct mibrcvaddr *mib_rcvaddr_create(struct mibif *, const u_char *, size_t);
160void mib_rcvaddr_delete(struct mibrcvaddr *);
161
162/* register for interface notification */
163void *mibif_notify(struct mibif *, const struct lmodule *, mibif_notify_f,
164    void *);
165void mibif_unnotify(void *);
166
167#endif
168