]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/bsnmp/snmp_mibII/snmp_mibII.h
MFC 338013: bsnmpd(8): fix and optimize interface description processing
[FreeBSD/stable/10.git] / contrib / bsnmp / snmp_mibII / snmp_mibII.h
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.18 2006/02/14 09:04:19 brandt_h 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         uint64_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         uint64_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         /* to be set by ifType specific modules. This is ifSpecific. */
81         struct asn_oid  spec_oid;
82
83         char            *alias;
84         size_t          alias_size;
85
86         /* private data - don't touch */
87         void            *private;
88 };
89
90 /*
91  * Interface IP-address table.
92  */
93 struct mibifa {
94         TAILQ_ENTRY(mibifa) link;
95         struct in_addr  inaddr;
96         struct in_addr  inmask;
97         struct in_addr  inbcast;
98         struct asn_oid  index;          /* index for table search */
99         u_int           ifindex;
100         u_int           flags;
101 };
102
103 /*
104  * Interface receive addresses. Interface link-level multicast, broadcast
105  * and hardware addresses are handled automatically.
106  */
107 struct mibrcvaddr {
108         TAILQ_ENTRY(mibrcvaddr) link;
109         struct asn_oid  index;
110         u_int           ifindex;
111         u_char          addr[ASN_MAXOIDLEN];
112         size_t          addrlen;
113         u_int           flags;
114 };
115 enum {
116         MIBRCVADDR_VOLATILE     = 0x00000001,
117         MIBRCVADDR_BCAST        = 0x00000002,
118         MIBRCVADDR_HW           = 0x00000004,
119 };
120
121 /* network socket */
122 extern int mib_netsock;
123
124 /* set an interface name to dynamic mode */
125 void mib_if_set_dyn(const char *);
126
127 /* re-read the systems interface list */
128 void mib_refresh_iflist(void);
129
130 /* find interface by index */
131 struct mibif *mib_find_if(u_int);
132 struct mibif *mib_find_if_sys(u_int);
133 struct mibif *mib_find_if_name(const char *);
134
135 /* iterate through all interfaces */
136 struct mibif *mib_first_if(void);
137 struct mibif *mib_next_if(const struct mibif *);
138
139 /* register for interface creations */
140 int mib_register_newif(int (*)(struct mibif *), const struct lmodule *);
141 void mib_unregister_newif(const struct lmodule *);
142
143 /* get fresh MIB data */
144 int mib_fetch_ifmib(struct mibif *);
145
146 /* change the ADMIN status of an interface and refresh the MIB */
147 int mib_if_admin(struct mibif *, int up);
148
149 /* find interface address by address */
150 struct mibifa *mib_find_ifa(struct in_addr);
151
152 /* find first/next address for a given interface */
153 struct mibifa *mib_first_ififa(const struct mibif *);
154 struct mibifa *mib_next_ififa(struct mibifa *);
155
156 /* create/delete stacking entries */
157 int mib_ifstack_create(const struct mibif *lower, const struct mibif *upper);
158 void mib_ifstack_delete(const struct mibif *lower, const struct mibif *upper);
159
160 /* find receive address */
161 struct mibrcvaddr *mib_find_rcvaddr(u_int, const u_char *, size_t);
162
163 /* create/delete receive addresses */
164 struct mibrcvaddr *mib_rcvaddr_create(struct mibif *, const u_char *, size_t);
165 void mib_rcvaddr_delete(struct mibrcvaddr *);
166
167 /* register for interface notification */
168 void *mibif_notify(struct mibif *, const struct lmodule *, mibif_notify_f,
169     void *);
170 void mibif_unnotify(void *);
171
172 #endif