xref: /freebsd/contrib/bsnmp/snmp_mibII/snmp_mibII.h (revision 6af83ee0d2941d18880b6aaa2b4facd1d30c6106)
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 */
37 struct mibif;
38 
39 enum mibif_notify {
40 	MIBIF_NOTIFY_DESTROY
41 };
42 
43 typedef 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  */
53 struct 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  */
84 struct 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  */
98 struct 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 };
106 enum {
107 	MIBRCVADDR_VOLATILE	= 0x00000001,
108 	MIBRCVADDR_BCAST	= 0x00000002,
109 	MIBRCVADDR_HW		= 0x00000004,
110 };
111 
112 /* network socket */
113 extern int mib_netsock;
114 
115 /* set an interface name to dynamic mode */
116 void mib_if_set_dyn(const char *);
117 
118 /* re-read the systems interface list */
119 void mib_refresh_iflist(void);
120 
121 /* find interface by index */
122 struct mibif *mib_find_if(u_int);
123 struct mibif *mib_find_if_sys(u_int);
124 struct mibif *mib_find_if_name(const char *);
125 
126 /* iterate through all interfaces */
127 struct mibif *mib_first_if(void);
128 struct mibif *mib_next_if(const struct mibif *);
129 
130 /* register for interface creations */
131 int mib_register_newif(int (*)(struct mibif *), const struct lmodule *);
132 void mib_unregister_newif(const struct lmodule *);
133 
134 /* get fresh MIB data */
135 int mib_fetch_ifmib(struct mibif *);
136 
137 /* change the ADMIN status of an interface and refresh the MIB */
138 int mib_if_admin(struct mibif *, int up);
139 
140 /* find interface address by address */
141 struct mibifa *mib_find_ifa(struct in_addr);
142 
143 /* find first/next address for a given interface */
144 struct mibifa *mib_first_ififa(const struct mibif *);
145 struct mibifa *mib_next_ififa(struct mibifa *);
146 
147 /* create/delete stacking entries */
148 int mib_ifstack_create(const struct mibif *lower, const struct mibif *upper);
149 void mib_ifstack_delete(const struct mibif *lower, const struct mibif *upper);
150 
151 /* find receive address */
152 struct mibrcvaddr *mib_find_rcvaddr(u_int, const u_char *, size_t);
153 
154 /* create/delete receive addresses */
155 struct mibrcvaddr *mib_rcvaddr_create(struct mibif *, const u_char *, size_t);
156 void mib_rcvaddr_delete(struct mibrcvaddr *);
157 
158 /* register for interface notification */
159 void *mibif_notify(struct mibif *, const struct lmodule *, mibif_notify_f,
160     void *);
161 void mibif_unnotify(void *);
162 
163 #endif
164