]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/agentx.c
Merge pull request #8008 from chiragshah6/yang_nb5
[mirror_frr.git] / lib / agentx.c
index 603d8d6172d7926f7e842d9682cc67331a60914b..c1ff7a61b1039da702f6045d9cc0cf95069f14af 100644 (file)
 #include "linklist.h"
 #include "version.h"
 #include "lib_errors.h"
+#include "xref.h"
+
+XREF_SETUP()
+
+DEFINE_HOOK(agentx_enabled, (), ())
 
 static int agentx_enabled = 0;
 
@@ -223,6 +228,7 @@ DEFUN (agentx_enable,
                events = list_new();
                agentx_events_update();
                agentx_enabled = 1;
+               hook_call(agentx_enabled);
        }
 
        return CMD_SUCCESS;
@@ -240,6 +246,11 @@ DEFUN (no_agentx,
        return CMD_WARNING_CONFIG_FAILED;
 }
 
+int smux_enabled(void)
+{
+       return agentx_enabled;
+}
+
 void smux_init(struct thread_master *tm)
 {
        agentx_tm = tm;
@@ -256,17 +267,44 @@ void smux_init(struct thread_master *tm)
        install_element(CONFIG_NODE, &no_agentx_cmd);
 }
 
+void smux_agentx_enable(void)
+{
+       if (!agentx_enabled) {
+               init_snmp(FRR_SMUX_NAME);
+               events = list_new();
+               agentx_events_update();
+               agentx_enabled = 1;
+       }
+}
+
 void smux_register_mib(const char *descr, struct variable *var, size_t width,
                       int num, oid name[], size_t namelen)
 {
        register_mib(descr, var, width, num, name, namelen);
 }
 
-int smux_trap(struct variable *vp, size_t vp_len, const oid *ename,
-             size_t enamelen, const oid *name, size_t namelen,
-             const oid *iname, size_t inamelen,
-             const struct trap_object *trapobj, size_t trapobjlen,
-             uint8_t sptrap)
+void smux_trap(struct variable *vp, size_t vp_len, const oid *ename,
+              size_t enamelen, const oid *name, size_t namelen,
+              const oid *iname, size_t inamelen,
+              const struct trap_object *trapobj, size_t trapobjlen,
+              uint8_t sptrap)
+{
+       struct index_oid trap_index[1];
+
+       /* copy the single index into the multi-index format */
+       oid_copy(trap_index[0].indexname, iname, inamelen);
+       trap_index[0].indexlen = inamelen;
+
+       smux_trap_multi_index(vp, vp_len, ename, enamelen, name, namelen,
+                             trap_index, array_size(trap_index), trapobj,
+                             trapobjlen, sptrap);
+}
+
+int smux_trap_multi_index(struct variable *vp, size_t vp_len, const oid *ename,
+                         size_t enamelen, const oid *name, size_t namelen,
+                         struct index_oid *iname, size_t index_len,
+                         const struct trap_object *trapobj, size_t trapobjlen,
+                         uint8_t sptrap)
 {
        oid objid_snmptrap[] = {1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0};
        size_t objid_snmptrap_len = sizeof(objid_snmptrap) / sizeof(oid);
@@ -296,6 +334,13 @@ int smux_trap(struct variable *vp, size_t vp_len, const oid *ename,
                size_t val_len;
                WriteMethod *wm = NULL;
                struct variable cvp;
+               unsigned int iindex;
+               /*
+                * this allows the behaviour of smux_trap with a singe index
+                * for all objects to be maintained whilst allowing traps which
+                * have different indices per object to be supported
+                */
+               iindex = (index_len == 1) ? 0 : i;
 
                /* Make OID. */
                if (trapobj[i].namelen > 0) {
@@ -303,8 +348,10 @@ int smux_trap(struct variable *vp, size_t vp_len, const oid *ename,
                        onamelen = trapobj[i].namelen;
                        oid_copy(oid, name, namelen);
                        oid_copy(oid + namelen, trapobj[i].name, onamelen);
-                       oid_copy(oid + namelen + onamelen, iname, inamelen);
-                       oid_len = namelen + onamelen + inamelen;
+                       oid_copy(oid + namelen + onamelen,
+                                iname[iindex].indexname,
+                                iname[iindex].indexlen);
+                       oid_len = namelen + onamelen + iname[iindex].indexlen;
                } else {
                        /* Scalar object */
                        onamelen = trapobj[i].namelen * (-1);
@@ -330,6 +377,7 @@ int smux_trap(struct variable *vp, size_t vp_len, const oid *ename,
                        cvp.magic = vp[j].magic;
                        cvp.acl = vp[j].acl;
                        cvp.findVar = vp[j].findVar;
+
                        /* Grab the result. */
                        val = cvp.findVar(&cvp, oid, &oid_len, 1, &val_len,
                                          &wm);
@@ -349,4 +397,9 @@ int smux_trap(struct variable *vp, size_t vp_len, const oid *ename,
        return 1;
 }
 
+void smux_events_update(void)
+{
+       agentx_events_update();
+}
+
 #endif /* SNMP_AGENTX */