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