1 #include <net-snmp/net-snmp-config.h>
19 #include <net-snmp/output_api.h>
20 #include <net-snmp/utilities.h>
22 #include <net-snmp/library/snmp_transport.h>
23 #include <net-snmp/library/snmpUDPDomain.h>
24 #ifdef SNMP_TRANSPORT_TCP_DOMAIN
25 #include <net-snmp/library/snmpTCPDomain.h>
27 #ifdef SNMP_TRANSPORT_IPX_DOMAIN
28 #include <net-snmp/library/snmpIPXDomain.h>
30 #ifdef SNMP_TRANSPORT_UNIX_DOMAIN
31 #include <net-snmp/library/snmpUnixDomain.h>
33 #ifdef SNMP_TRANSPORT_AAL5PVC_DOMAIN
34 #include <net-snmp/library/snmpAAL5PVCDomain.h>
36 #ifdef SNMP_TRANSPORT_UDPIPV6_DOMAIN
37 #include <net-snmp/library/snmpUDPIPv6Domain.h>
39 #ifdef SNMP_TRANSPORT_TCPIPV6_DOMAIN
40 #include <net-snmp/library/snmpTCPIPv6Domain.h>
42 #include <net-snmp/library/snmp_api.h>
46 * Our list of supported transport domains.
49 static netsnmp_tdomain *domain_list = NULL;
54 * The standard SNMP domains.
57 oid netsnmpUDPDomain[] = { 1, 3, 6, 1, 6, 1, 1 };
58 size_t netsnmpUDPDomain_len = OID_LENGTH(netsnmpUDPDomain);
59 oid netsnmpCLNSDomain[] = { 1, 3, 6, 1, 6, 1, 2 };
60 size_t netsnmpCLNSDomain_len = OID_LENGTH(netsnmpCLNSDomain);
61 oid netsnmpCONSDomain[] = { 1, 3, 6, 1, 6, 1, 3 };
62 size_t netsnmpCONSDomain_len = OID_LENGTH(netsnmpCONSDomain);
63 oid netsnmpDDPDomain[] = { 1, 3, 6, 1, 6, 1, 4 };
64 size_t netsnmpDDPDomain_len = OID_LENGTH(netsnmpDDPDomain);
65 oid netsnmpIPXDomain[] = { 1, 3, 6, 1, 6, 1, 5 };
66 size_t netsnmpIPXDomain_len = OID_LENGTH(netsnmpIPXDomain);
68 static void netsnmp_tdomain_dump(void);
71 * Make a deep copy of an netsnmp_transport.
75 netsnmp_transport_copy(netsnmp_transport *t)
77 netsnmp_transport *n = NULL;
79 n = (netsnmp_transport *) malloc(sizeof(netsnmp_transport));
83 memset(n, 0, sizeof(netsnmp_transport));
85 if (t->domain != NULL) {
86 n->domain = t->domain;
87 n->domain_length = t->domain_length;
93 if (t->local != NULL) {
94 n->local = (u_char *) malloc(t->local_length);
95 if (n->local == NULL) {
96 netsnmp_transport_free(n);
99 n->local_length = t->local_length;
100 memcpy(n->local, t->local, t->local_length);
106 if (t->remote != NULL) {
107 n->remote = (u_char *) malloc(t->remote_length);
108 if (n->remote == NULL) {
109 netsnmp_transport_free(n);
112 n->remote_length = t->remote_length;
113 memcpy(n->remote, t->remote, t->remote_length);
116 n->remote_length = 0;
119 if (t->data != NULL && t->data_length > 0) {
120 n->data = malloc(t->data_length);
121 if (n->data == NULL) {
122 netsnmp_transport_free(n);
125 n->data_length = t->data_length;
126 memcpy(n->data, t->data, t->data_length);
132 n->msgMaxSize = t->msgMaxSize;
133 n->f_accept = t->f_accept;
134 n->f_recv = t->f_recv;
135 n->f_send = t->f_send;
136 n->f_close = t->f_close;
137 n->f_fmtaddr = t->f_fmtaddr;
147 netsnmp_transport_free(netsnmp_transport *t)
149 if (t->local != NULL) {
152 if (t->remote != NULL) {
155 if (t->data != NULL) {
162 #if BRCM_SNMP_SUPPORT
164 netsnmp_tdomain_support(const oid * in_oid,
166 const oid ** out_oid, size_t * out_len)
168 netsnmp_tdomain *d = NULL;
170 for (d = domain_list; d != NULL; d = d->next) {
171 if (netsnmp_oid_equals(in_oid, in_len, d->name, d->name_length) == 0) {
172 if (out_oid != NULL && out_len != NULL) {
174 *out_len = d->name_length;
181 #endif /* BRCM_SNMP_SUPPORT */
185 netsnmp_tdomain_init(void)
187 DEBUGMSGTL(("tdomain", "netsnmp_tdomain_init() called\n"));
189 #ifdef SNMP_TRANSPORT_TCP_DOMAIN
192 #ifdef SNMP_TRANSPORT_IPX_DOMAIN
195 #ifdef SNMP_TRANSPORT_UNIX_DOMAIN
198 #ifdef SNMP_TRANSPORT_AAL5PVC_DOMAIN
199 netsnmp_aal5pvc_ctor();
201 #ifdef SNMP_TRANSPORT_UDPIPV6_DOMAIN
204 #ifdef SNMP_TRANSPORT_TCPIPV6_DOMAIN
207 #if BRCM_SNMP_SUPPORT
208 netsnmp_tdomain_dump();
212 #if BRCM_SNMP_SUPPORT
214 netsnmp_tdomain_dump(void)
219 DEBUGMSGTL(("tdomain", "domain_list -> "));
220 for (d = domain_list; d != NULL; d = d->next) {
221 DEBUGMSG(("tdomain", "{ "));
222 DEBUGMSGOID(("tdomain", d->name, d->name_length));
223 DEBUGMSG(("tdomain", ", \""));
224 for (i = 0; d->prefix[i] != NULL; i++) {
225 DEBUGMSG(("tdomain", "%s%s", d->prefix[i],
226 (d->prefix[i + 1]) ? "/" : ""));
228 DEBUGMSG(("tdomain", "\" } -> "));
230 DEBUGMSG(("tdomain", "[NIL]\n"));
232 #endif /* #if BRCM_SNMP_SUPPORT */
236 netsnmp_tdomain_register(netsnmp_tdomain *n)
238 netsnmp_tdomain **prevNext = &domain_list, *d;
241 for (d = domain_list; d != NULL; d = d->next) {
242 if (netsnmp_oid_equals(n->name, n->name_length,
243 d->name, d->name_length) == 0) {
245 * Already registered.
249 prevNext = &(d->next);
262 netsnmp_tdomain_unregister(netsnmp_tdomain *n)
264 netsnmp_tdomain **prevNext = &domain_list, *d;
267 for (d = domain_list; d != NULL; d = d->next) {
268 if (netsnmp_oid_equals(n->name, n->name_length,
269 d->name, d->name_length) == 0) {
273 prevNext = &(d->next);
284 netsnmp_tdomain_transport(const char *string, int local,
285 const char *default_domain)
288 netsnmp_transport *t = NULL;
289 const char *spec, *addr;
293 if (string == NULL) {
297 if ((mystring = strdup(string)) == NULL) {
298 DEBUGMSGTL(("tdomain", "can't strdup(\"%s\")\n", string));
302 if ((cp = strchr(mystring, ':')) == NULL) {
304 * There doesn't appear to be a transport specifier.
306 DEBUGMSGTL(("tdomain", "no specifier in \"%s\"\n", mystring));
307 if (*mystring == '/') {
311 if (default_domain) {
312 spec = default_domain;
323 DEBUGMSGTL(("tdomain", "specifier \"%s\" address \"%s\"\n", spec,
326 for (d = domain_list; d != NULL; d = d->next) {
327 for (i = 0; d->prefix[i] != NULL; i++) {
328 if (strcasecmp(d->prefix[i], spec) == 0) {
329 DEBUGMSGTL(("tdomain", "specifier \"%s\" matched\n",
331 t = d->f_create_from_tstring(addr, local);
339 * Okay no match so far. Consider the possibility that we have something
340 * like hostname.domain.com:port which will have confused the parser above.
341 * Try and match again with the appropriate default domain.
344 if (default_domain) {
345 spec = default_domain;
354 DEBUGMSGTL(("tdomain",
355 "try again with specifier \"%s\" address \"%s\"\n", spec,
358 for (d = domain_list; d != NULL; d = d->next) {
359 for (i = 0; d->prefix[i] != NULL; i++) {
360 if (strcmp(d->prefix[i], spec) == 0) {
361 DEBUGMSGTL(("tdomain", "specifier \"%s\" matched\n",
363 t = d->f_create_from_tstring(addr, local);
370 snmp_log(LOG_ERR, "No support for requested transport domain \"%s\"\n",
378 netsnmp_tdomain_transport_oid(const oid * dom,
380 const u_char * o, size_t o_len, int local)
385 DEBUGMSGTL(("tdomain", "domain \""));
386 DEBUGMSGOID(("tdomain", dom, dom_len));
387 DEBUGMSG(("tdomain", "\"\n"));
389 for (d = domain_list; d != NULL; d = d->next) {
390 for (i = 0; d->prefix[i] != NULL; i++) {
391 if (netsnmp_oid_equals(dom, dom_len, d->name, d->name_length) ==
393 return d->f_create_from_ostring(o, o_len, local);
398 snmp_log(LOG_ERR, "No support for requested transport domain\n");
403 /** adds a transport to a linked list of transports.
404 Returns 1 on failure, 0 on success */
406 netsnmp_transport_add_to_list(netsnmp_transport_list **transport_list,
407 netsnmp_transport *transport)
409 netsnmp_transport_list *newptr =
410 SNMP_MALLOC_TYPEDEF(netsnmp_transport_list);
415 newptr->next = *transport_list;
416 newptr->transport = transport;
418 *transport_list = newptr;
424 /** removes a transport from a linked list of transports.
425 Returns 1 on failure, 0 on success */
427 netsnmp_transport_remove_from_list(netsnmp_transport_list **transport_list,
428 netsnmp_transport *transport)
430 netsnmp_transport_list *ptr = *transport_list, *lastptr = NULL;
432 while (ptr && ptr->transport != transport) {
441 lastptr->next = ptr->next;
443 *transport_list = ptr->next;