root/regress/usr.sbin/snmpd/backend.c
#include <sys/socket.h>
#include <sys/time.h>

#include <ber.h>
#include <err.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#include "regress.h"

#define MIB_BACKEND_GET MIB_BACKEND, 1
#define MIB_BACKEND_GETNEXT MIB_BACKEND, 2
#define MIB_BACKEND_GETBULK MIB_BACKEND, 3
#define MIB_BACKEND_ERROR MIB_BACKEND, 4

#define MIB_SUBAGENT_BACKEND_GET MIB_SUBAGENT_BACKEND, 1
#define MIB_SUBAGENT_BACKEND_GETNEXT MIB_SUBAGENT_BACKEND, 2
#define MIB_SUBAGENT_BACKEND_GETBULK MIB_SUBAGENT_BACKEND, 3
#define MIB_SUBAGENT_BACKEND_ERROR MIB_SUBAGENT_BACKEND, 4

#define nitems(_a)     (sizeof((_a)) / sizeof((_a)[0]))

void
backend_get_integer(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 1, 0),
                .data.int32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 1), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_octetstring(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 2, 0),
                .data.octetstring.string = "test",
                .data.octetstring.len = 4
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 2), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 2), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_OCTETSTRING;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_objectidentifier(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 3, 0),
                .data.oid = OID_STRUCT(MIB_BACKEND_GET, 3, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 3), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 3), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_OBJECTIDENTIFIER;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_ipaddress(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 4, 0),
                .data.octetstring.string = "\0\0\0\0",
                .data.octetstring.len = 4
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 4), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 4), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_IPADDRESS;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_counter32(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 5, 0),
                .data.uint32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 5), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 5), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_COUNTER32;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_gauge32(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 6, 0),
                .data.uint32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 6), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 6), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_GAUGE32;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_timeticks(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 7, 0),
                .data.uint32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 7), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 7), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_TIMETICKS;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_opaque(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 8, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;
        struct ber ber = {};
        struct ber_element *elm;
        ssize_t len;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 8), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 8), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        if ((elm = ober_add_integer(NULL, 1)) == NULL)
                err(1, "ober_add_integer");
        if (ober_write_elements(&ber, elm) == -1)
                err(1, "ober_write_elements");
        varbind.data.octetstring.len = ober_get_writebuf(
            &ber, (void **)&varbind.data.octetstring.string);
        ober_free_elements(elm);

        varbind.type = TYPE_OPAQUE;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
        ober_free(&ber);
}

void
backend_get_counter64(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 9, 0),
                .data.uint64 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 9), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 9), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_COUNTER64;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_nosuchobject(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 10, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 10), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 10), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_NOSUCHOBJECT;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_nosuchinstance(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 11, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 11), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 11), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_NOSUCHINSTANCE;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_endofmibview(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 12, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 12), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 12), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_ENDOFMIBVIEW;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        varbind.type = TYPE_NULL;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_get_two_single_backend(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 13, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 13, 2),
                        .data.int32 = 2
                }
        };
        struct varbind varbind_ax[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 13, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 13, 2),
                        .data.int32 = 2
                }
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 13), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 13), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, varbind, 2);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, varbind_ax, 2);

        agentx_response(ax_s, buf, NOERROR, 0, varbind_ax, 2);

        varbind[0].type = varbind[1].type = TYPE_INTEGER;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            varbind, 2);
}

void
backend_get_two_double_backend(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s1, ax_s2;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 14, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 14, 2),
                        .data.int32 = 2
                }
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s1 = agentx_connect(axsocket);
        ax_s2 = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s1, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 14, 1),
            "backend_get_two_double_backend.1");
        sessionid2 = agentx_open(ax_s2, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 14, 2),
            "backend_get_two_double_backend.2");
        agentx_register(ax_s1, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 14, 1), 0);
        agentx_register(ax_s2, sessionid2, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 14, 2), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, varbind, 2);

        varbind[0].type = varbind[1].type = TYPE_INTEGER;
        n = agentx_read(ax_s1, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid1, varbind, 1);
        agentx_response(ax_s1, buf, NOERROR, 0, varbind, 1);

        n = agentx_read(ax_s2, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid2, varbind + 1, 1);
        agentx_response(ax_s2, buf, NOERROR, 0, varbind + 1, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            varbind, 2);
}

void
backend_get_wrongorder(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 15, 1),
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 15, 2),
                }
        };
        struct varbind varbind_ax[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 15, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 15, 2),
                        .data.int32 = 2
                }
        }, tmpvarbind;
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 15), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 15), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, varbind, 2);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, varbind_ax, 2);
        tmpvarbind = varbind_ax[0];
        varbind_ax[0] = varbind_ax[1];
        varbind_ax[1] = tmpvarbind;

        agentx_response(ax_s, buf, NOERROR, 0, varbind_ax, 2);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 2,
            varbind, 2);
}

void
backend_get_toofew(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 16, 1),
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 16, 2),
                }
        };
        struct varbind varbind_ax[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 16, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 16, 2),
                        .data.int32 = 2
                }
        }, tmpvarbind;
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 16), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 16), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, varbind, 2);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, varbind_ax, 2);

        agentx_response(ax_s, buf, NOERROR, 0, varbind_ax, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 2,
            varbind, 2);
}

void
backend_get_toomany(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 17, 1),
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 17, 2),
                }
        };
        struct varbind varbind_ax[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 17, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 17, 2),
                        .data.int32 = 2
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GET, 17, 3),
                        .data.int32 = 3
                }
        }, tmpvarbind;
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 17), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 17), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, varbind, 2);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, varbind_ax, 2);

        agentx_response(ax_s, buf, NOERROR, 0, varbind_ax, 3);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 2,
            varbind, 2);
}

void
backend_get_instance(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 18, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 18), __func__);
        agentx_register(ax_s, sessionid, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 18, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_instance_below(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 19, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 19), __func__);
        agentx_register(ax_s, sessionid, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 19), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        varbind.type = TYPE_NOSUCHINSTANCE;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_timeout_default(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 20, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;
        struct timespec start, end, diff;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 20), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 20), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        if (clock_gettime(CLOCK_MONOTONIC, &start) == -1)
                err(1, "clock_gettime");
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 6000, community, requestid, GENERR, 1,
            &varbind, 1);
        if (clock_gettime(CLOCK_MONOTONIC, &end) == -1)
                err(1, "clock_gettime");
        timespecsub(&end, &start, &diff);
        if (diff.tv_sec != 5)
                errx(1, "%s: unexpected timeout (%lld.%09ld/5)", __func__,
                    diff.tv_sec, diff.tv_nsec);
}

void
backend_get_timeout_session_lower(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 21, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;
        struct timespec start, end, diff;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 1,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 21), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 21), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        if (clock_gettime(CLOCK_MONOTONIC, &start) == -1)
                err(1, "clock_gettime");
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 6000, community, requestid, GENERR, 1,
            &varbind, 1);
        if (clock_gettime(CLOCK_MONOTONIC, &end) == -1)
                err(1, "clock_gettime");
        timespecsub(&end, &start, &diff);
        if (diff.tv_sec != 1)
                errx(1, "%s: unexpected timeout (%lld.%09ld/1)", __func__,
                    diff.tv_sec, diff.tv_nsec);
}

void
backend_get_timeout_session_higher(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 22, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;
        struct timespec start, end, diff;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 6,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 22), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 22), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        if (clock_gettime(CLOCK_MONOTONIC, &start) == -1)
                err(1, "clock_gettime");
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 7000, community, requestid, GENERR, 1,
            &varbind, 1);
        if (clock_gettime(CLOCK_MONOTONIC, &end) == -1)
                err(1, "clock_gettime");
        timespecsub(&end, &start, &diff);
        if (diff.tv_sec != 6)
                errx(1, "%s: unexpected timeout (%lld.%09ld/6)", __func__,
                    diff.tv_sec, diff.tv_nsec);
}

void
backend_get_timeout_region_lower(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 23, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;
        struct timespec start, end, diff;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 4,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 23), __func__);
        agentx_register(ax_s, sessionid, 0, 1, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 23), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        if (clock_gettime(CLOCK_MONOTONIC, &start) == -1)
                err(1, "clock_gettime");
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 6000, community, requestid, GENERR, 1,
            &varbind, 1);
        if (clock_gettime(CLOCK_MONOTONIC, &end) == -1)
                err(1, "clock_gettime");
        timespecsub(&end, &start, &diff);
        if (diff.tv_sec != 1)
                errx(1, "%s: unexpected timeout (%lld.%09ld/1)", __func__,
                    diff.tv_sec, diff.tv_nsec);
}

void
backend_get_timeout_region_higher(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 24, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;
        struct timespec start, end, diff;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 7,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 24), __func__);
        agentx_register(ax_s, sessionid, 0, 6, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 24), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        if (clock_gettime(CLOCK_MONOTONIC, &start) == -1)
                err(1, "clock_gettime");
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 8000, community, requestid, GENERR, 1,
            &varbind, 1);
        if (clock_gettime(CLOCK_MONOTONIC, &end) == -1)
                err(1, "clock_gettime");
        timespecsub(&end, &start, &diff);
        if (diff.tv_sec != 6)
                errx(1, "%s: unexpected timeout (%lld.%09ld/6)", __func__,
                    diff.tv_sec, diff.tv_nsec);
}

void
backend_get_priority_lower(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 25, 0),
                .data.int32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 25, 1), "backend_get_priority.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 25, 2), "backend_get_priority.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 25), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 126, 0,
            OID_ARG(MIB_BACKEND_GET, 25), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid2, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_priority_higher(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 26, 0),
                .data.int32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 26, 1),
            "backend_get_priority_higher.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 26, 2),
            "backend_get_priority_higher.2");
        agentx_register(ax_s, sessionid1, 0, 0, 126, 0,
            OID_ARG(MIB_BACKEND_GET, 26), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 26), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid1, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_priority_below_lower(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 27, 0),
                .data.int32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 27, 1),
            "backend_get_priority_below_lower.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 27, 2),
            "backend_get_priority_below_lower.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 27), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 126, 0,
            OID_ARG(MIB_BACKEND_GET, 27, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid2, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_priority_below_higher(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 28, 0),
                .data.int32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 28, 1),
            "backend_get_priority_below_higher.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 28, 2),
            "backend_get_priority_below_higher.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 28), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 128, 0,
            OID_ARG(MIB_BACKEND_GET, 28, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid2, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_close(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 29, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 29), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 29), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_close(ax_s, sessionid, REASONOTHER);

        varbind.type = TYPE_NOSUCHOBJECT;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_close_overlap(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s1, ax_s2;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 30, 0),
                .data.int32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s1 = agentx_connect(axsocket);
        ax_s2 = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s1, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 30, 1),
            "backend_get_close_overlap.1");
        sessionid2 = agentx_open(ax_s2, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 30, 1),
            "backend_get_close_overlap.2");
        agentx_register(ax_s1, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 30), 0);
        agentx_register(ax_s2, sessionid2, 0, 0, 128, 0,
            OID_ARG(MIB_BACKEND_GET, 30), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s1, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid1, &varbind, 1);
        agentx_close(ax_s1, sessionid1, REASONOTHER);

        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s2, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid2, &varbind, 1);
        agentx_response(ax_s2, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_disappear(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 31, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 31), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 31), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);
        close(ax_s);

        varbind.type = TYPE_NOSUCHOBJECT;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_disappear_overlap(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s1, ax_s2;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 32, 0),
                .data.int32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s1 = agentx_connect(axsocket);
        ax_s2 = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s1, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 32, 1),
            "backend_get_close_overlap.1");
        sessionid2 = agentx_open(ax_s2, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 32, 1),
            "backend_get_close_overlap.2");
        agentx_register(ax_s1, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 32), 0);
        agentx_register(ax_s2, sessionid2, 0, 0, 128, 0,
            OID_ARG(MIB_BACKEND_GET, 32), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s1, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid1, &varbind, 1);
        close(ax_s1);

        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s2, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid2, &varbind, 1);
        agentx_response(ax_s2, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_disappear_doublesession(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 33, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 33, 1),
            "backend_get_disappear_doublesession.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 33, 2),
            "backend_get_disappear_doublesession.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 33), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 128, 0,
            OID_ARG(MIB_BACKEND_GET, 33), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid1, &varbind, 1);
        close(ax_s);

        varbind.type = TYPE_NOSUCHOBJECT;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_octetstring_max(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        char vbbuf[65535] = {};
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 34, 0),
                .data.octetstring.string = vbbuf,
                .data.octetstring.len = sizeof(vbbuf)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        memset(vbbuf, 'a', sizeof(vbbuf));
        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 34), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 34), 0);

        /* Too big for SOCK_DGRAM */
        salen = snmp_resolve(SOCK_STREAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_STREAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_OCTETSTRING;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_get_octetstring_too_long(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        char vbbuf[65536];
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 35, 0),
                .data.octetstring.string = vbbuf,
                .data.octetstring.len = sizeof(vbbuf)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        memset(vbbuf, 'a', sizeof(vbbuf));
        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 35), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 35), 0);

        salen = snmp_resolve(SOCK_STREAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_STREAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_OCTETSTRING;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        varbind.type = TYPE_NULL;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_get_ipaddress_too_short(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 36, 0),
                .data.octetstring.string = "\0\0\0",
                .data.octetstring.len = 3
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 36), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 36), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_IPADDRESS;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        varbind.type = TYPE_NULL;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_get_ipaddress_too_long(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 37, 0),
                .data.octetstring.string = "\0\0\0\0\0",
                .data.octetstring.len = 5
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 37), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 37), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_IPADDRESS;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        varbind.type = TYPE_NULL;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_get_opaque_non_ber(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 38, 0),
                .data.octetstring.string = "\1",
                .data.octetstring.len = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;
        ssize_t len;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 38), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 38), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        varbind.type = TYPE_OPAQUE;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        varbind.type = TYPE_NULL;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_get_opaque_double_value(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        char vbbuf[1024];
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GET, 39, 0),
                .data.octetstring.string = vbbuf
        };
        int32_t requestid;
        void *berdata;
        char buf[1024];
        size_t n;
        struct ber ber = {};
        struct ber_element *elm;
        ssize_t len;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GET, 39), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GET, 39), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        if ((elm = ober_add_integer(NULL, 1)) == NULL)
                err(1, "ober_add_integer");
        if (ober_write_elements(&ber, elm) == -1)
                err(1, "ober_write_elements");
        len = ober_get_writebuf(&ber, &berdata);
        ober_free_elements(elm);

        memcpy(vbbuf, berdata, len);
        memcpy(vbbuf + len, berdata, len);
        varbind.data.octetstring.len = 2 * len;

        varbind.type = TYPE_OPAQUE;
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        varbind.type = TYPE_NULL;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
        ober_free(&ber);
}

void
backend_getnext_selfbound(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 1),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 1),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 2)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 1), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_getnext_lowerbound(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 2),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 2),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 2, 1)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 2, 1),
            "backend_getnext_lowerbound.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 2, 2),
            "backend_getnext_lowerbound.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 2), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 2, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, &searchrange,
            &varbind, 1);

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_getnext_lowerbound_self(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 3),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 3),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 4)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 3), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 3), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_getnext_lowerbound_highprio(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 4),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 4),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 4, 1)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 4, 1),
            "backend_getnext_lowerbound_highprio.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 4, 2),
            "backend_getnext_lowerbound_highprio.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 4), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 128, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 4, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, &searchrange,
            &varbind, 1);

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_getnext_lowerbound_lowprio(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 5),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 5),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 5, 1)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 5, 1),
            "backend_getnext_lowerbound_lowprio.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 5, 2),
            "backend_getnext_lowerbound_lowprio.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 5), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 128, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 5, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, &searchrange,
            &varbind, 1);

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_getnext_sibling(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 6),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 6),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 8)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 6), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 6), 0);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 7), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_getnext_child_gap(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 7),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 7),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 7, 2)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 6, 1),
            "backend_getnext_child_gap.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 6, 2),
            "backend_getnext_child_gap.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 7), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 7, 2), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, &searchrange,
            &varbind, 1);

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_getnext_nosuchobject(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 8),
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 8),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 9)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 8), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 8), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_NOSUCHOBJECT;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        varbind.name.n_subid--;
        varbind.type = TYPE_NULL;

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_getnext_nosuchinstance(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 9),
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 9),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 10)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 9), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 9), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_NOSUCHINSTANCE;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        varbind.name.n_subid--;
        varbind.type = TYPE_NULL;

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

/* Assume that everything is registered under 1.3.* */
void
backend_getnext_endofmibview(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(2, 0),
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(2, 0),
                .end = OID_STRUCT(2, 1)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 10), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(2, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_ENDOFMIBVIEW;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        varbind.name.n_subid--;

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            &varbind, 1);
}

void
backend_getnext_inclusive(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 11),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 11, 0),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 11, 1)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        searchrange.start.include = 1;
        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 11), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 11, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind, 1);
}

void
backend_getnext_jumpnext(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind1 = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 12)
        }, varbind2 = {
                .type = TYPE_INTEGER,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 12, 1),
                .data.int32 = 1
        };
        struct searchrange searchrange1 = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 12),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 12, 1)
        }, searchrange2 = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 12, 1),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 12, 2)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 12, 1),
            "backend_getnext_jumpnext.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 12, 2),
            "backend_getnext_jumpnext.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 12), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 12, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind1, 1);

        varbind1.type = TYPE_ENDOFMIBVIEW;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, &searchrange1,
            &varbind1, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind1, 1);

        searchrange2.start.include = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid2, &searchrange2,
            &varbind2, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind2, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind2, 1);
}

/* Assume that everything is registered under 1.3.* */
void
backend_getnext_jumpnext_endofmibview(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind1 = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(2, 0)
        }, varbind2 = {
                .type = TYPE_ENDOFMIBVIEW,
                .name = OID_STRUCT(2, 1),
        };
        struct searchrange searchrange1 = {
                .start = OID_STRUCT(2, 0),
                .end = OID_STRUCT(2, 1)
        }, searchrange2 = {
                .start = OID_STRUCT(2, 1),
                .end = OID_STRUCT(2, 2)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 13, 1),
            "backend_getnext_jumpnext_endofmibview.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 13, 2),
            "backend_getnext_jumpnext_endofmibview.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(2, 0), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 127, 0,
            OID_ARG(2, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind1, 1);

        varbind1.type = TYPE_ENDOFMIBVIEW;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, &searchrange1,
            &varbind1, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind1, 1);

        searchrange2.start.include = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid2, &searchrange2,
            &varbind2, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind2, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind1, 1);
}

void
backend_getnext_jump_up(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind1 = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 14, 1)
        }, varbind2 = {
                .type = TYPE_INTEGER,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 14, 2),
                .data.int32 = 1
        };
        struct searchrange searchrange1 = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 14, 1),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 14, 2)
        }, searchrange2 = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 14, 2),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 15)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 14, 1),
            "backend_getnext_jump_up.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 14, 2),
            "backend_getnext_jump_up.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 14), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 14, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind1, 1);

        varbind1.type = TYPE_ENDOFMIBVIEW;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid2, &searchrange1,
            &varbind1, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind1, 1);

        searchrange2.start.include = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, &searchrange2,
            &varbind2, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind2, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, 0, 0,
            &varbind2, 1);
}

void
backend_getnext_two_single_backend(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 15, 0),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 15, 1),
                        .data.int32 = 2
                }
        };
        struct varbind varbind_ax[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 15, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 15, 2),
                        .data.int32 = 2
                }
        };
        struct searchrange searchrange[] = {
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 15, 0),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 16)
                },
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 15, 1),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 16)
                }
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 15), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 15), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, varbind, 2);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, searchrange,
            varbind_ax, 2);

        agentx_response(ax_s, buf, NOERROR, 0, varbind_ax, 2);

        varbind[0].type = varbind[1].type = TYPE_INTEGER;
        varbind[0].name.subid[varbind[0].name.n_subid -1]++;
        varbind[1].name.subid[varbind[1].name.n_subid - 1]++;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            varbind, 2);
}

void
backend_getnext_two_double_backend(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s1, ax_s2;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 16, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 16, 2),
                        .data.int32 = 2
                }
        };
        struct searchrange searchrange1 = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 16, 1),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 16, 2)
        }, searchrange2 = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 16, 2),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 16, 3)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s1 = agentx_connect(axsocket);
        ax_s2 = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s1, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 16, 1),
            "backend_getnext_two_double_backend.1");
        sessionid2 = agentx_open(ax_s2, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 16, 2),
            "backend_getnext_two_double_backend.2");
        agentx_register(ax_s1, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 16, 1), 0);
        agentx_register(ax_s2, sessionid2, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 16, 2), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, varbind, 2);

        varbind[0].name.subid[varbind[0].name.n_subid++] = 0;
        varbind[1].name.subid[varbind[1].name.n_subid++] = 0;
        varbind[0].type = varbind[1].type = TYPE_INTEGER;
        n = agentx_read(ax_s1, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, &searchrange1,
            varbind + 0, 1);
        agentx_response(ax_s1, buf, NOERROR, 0, varbind + 0, 1);

        n = agentx_read(ax_s2, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid2, &searchrange2,
            varbind + 1, 1);
        agentx_response(ax_s2, buf, NOERROR, 0, varbind + 1, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            varbind, 2);
}

void
backend_getnext_instance_below(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 17, 1, 1),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 17, 2),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 17, 3)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 17), __func__);
        agentx_register(ax_s, sessionid, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 17, 1), 0);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 17, 2), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 17, 2);
        searchrange.start.include = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            &varbind, 1);
}

void
backend_getnext_instance(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 18),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 18, 1),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 18, 2)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 18), __func__);
        agentx_register(ax_s, sessionid, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 18, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 18, 1);
        searchrange.start.include = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            &varbind, 1);
}

void
backend_getnext_instance_exact(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 19, 1),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 19, 2),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 19, 3)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 19), __func__);
        agentx_register(ax_s, sessionid, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 19, 1), 0);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 19, 2), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 19, 2);
        searchrange.start.include = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            &varbind, 1);
}

void
backend_getnext_instance_ignore(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 20),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 20, 1),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 20, 2)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 20), __func__);
        agentx_register(ax_s, sessionid, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 20, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 20, 1, 0);
        searchrange.start.include = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);
        varbind.type = TYPE_NULL;
        varbind.name.n_subid -= 2;

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_getnext_backwards(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 21),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 21),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 22)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 21), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 21), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 21, 1);
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 20);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);
        varbind.type = TYPE_NULL;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 21);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_getnext_stale(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 22),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 22),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 23)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 22), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 22), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 22, 1);
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 22);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);
        varbind.type = TYPE_NULL;

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_getnext_inclusive_backwards(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 23),
                .data.int32 = 1
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 23, 1),
                .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 23, 2)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 23), __func__);
        agentx_register(ax_s, sessionid, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 23, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.type = TYPE_INTEGER;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 23, 1);
        searchrange.start.include = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 22);
        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);
        varbind.type = TYPE_NULL;
        varbind.name = OID_STRUCT(MIB_BACKEND_GETNEXT, 23);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_getnext_toofew(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 24, 0),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 24, 1),
                        .data.int32 = 2
                }
        };
        struct searchrange searchrange[] = {
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 24, 0),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 25)
                },
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 24, 1),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 25)
                }
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 24), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 24), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, varbind, 2);

        varbind[0].name.subid[varbind[0].name.n_subid - 1]++;
        varbind[1].name.subid[varbind[1].name.n_subid - 1]++;
        varbind[0].type = varbind[1].type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, searchrange,
            varbind, 2);
        agentx_response(ax_s, buf, NOERROR, 0, varbind, 1);
        varbind[0].type = varbind[1].type = TYPE_NULL;
        varbind[0].name = OID_STRUCT(MIB_BACKEND_GETNEXT, 24, 0),
        varbind[1].name = OID_STRUCT(MIB_BACKEND_GETNEXT, 24, 1),

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 2,
            varbind, 2);
}

void
backend_getnext_toomany(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 25, 0),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 25, 1),
                        .data.int32 = 2
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 25, 3),
                        .data.int32 = 3
                }
        };
        struct searchrange searchrange[] = {
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 25, 0),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 26)
                },
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 25, 1),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 26)
                }
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 25), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 25), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, varbind, 2);

        varbind[0].name.subid[varbind[0].name.n_subid - 1]++;
        varbind[1].name.subid[varbind[1].name.n_subid - 1]++;
        varbind[0].type = varbind[1].type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, searchrange,
            varbind, 2);
        agentx_response(ax_s, buf, NOERROR, 0, varbind, 3);
        varbind[0].type = varbind[1].type = TYPE_NULL;
        varbind[0].name = OID_STRUCT(MIB_BACKEND_GETNEXT, 25, 0),
        varbind[1].name = OID_STRUCT(MIB_BACKEND_GETNEXT, 25, 1),

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 2,
            varbind, 2);
}

void
backend_getnext_response_equal_end(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 26),
                        .data.int32 = 1
                },
        };
        struct searchrange searchrange[] = {
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 26),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 26, 1, 1)
                },
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 26, 1),
            "backend_getnext_end_equal.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 26, 2),
            "backend_getnext_end_equal.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 26), 0);
        agentx_register(ax_s, sessionid2, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 26, 1, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, varbind, 1);

        /* Fool agentx_getnext_handle() */
        varbind[0].name.subid[varbind[0].name.n_subid++] = 1;
        varbind[0].type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, searchrange,
            varbind, 1);
        varbind[0].name = searchrange[0].end;
        agentx_response(ax_s, buf, NOERROR, 0, varbind, 1);
        varbind[0].type = TYPE_NULL;
        varbind[0].name = OID_STRUCT(MIB_BACKEND_GETNEXT, 26),

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            varbind, 1);
}

void
backend_getnext_instance_below_region_before_instance(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 27),
                        .data.int32 = 1
                },
        };
        struct searchrange searchrange[] = {
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 27),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 27, 1, 0)
                },
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 27, 1),
            "backend_getnext_instance_below_region_before_instance.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 27, 2),
            "backend_getnext_instance_below_region_before_instance.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 27), 0);
        agentx_register(ax_s, sessionid2, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 27, 1, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        varbind[0].type = TYPE_ENDOFMIBVIEW;
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, searchrange,
            varbind, 1);
        agentx_response(ax_s, buf, NOERROR, 0, varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        varbind[0].name = searchrange[0].end;
        varbind[0].type = TYPE_INTEGER;
        searchrange[0].start = searchrange[0].end;
        searchrange[0].start.include = 1;
        searchrange[0].end.subid[searchrange[0].end.n_subid - 1]++;
        agentx_getnext_handle(__func__, buf, n, 0, sessionid2, searchrange,
            varbind, 1);
        agentx_response(ax_s, buf, NOERROR, 0, varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            varbind, 1);
}

void
backend_getnext_instance_below_region_on_instance(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 28, 1, 0),
                        .data.int32 = 1
                },
        };
        struct searchrange searchrange[] = {
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 28, 1, 1),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 29)
                },
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 28, 1),
            "backend_getnext_instance_below_region_on_instance.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 28, 2),
            "backend_getnext_instance_below_region_on_instance.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 28), 0);
        agentx_register(ax_s, sessionid2, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 28, 1, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, varbind, 1);

        searchrange[0].start.include = 1;
        varbind[0].name = searchrange[0].start;
        varbind[0].type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, searchrange,
            varbind, 1);
        agentx_response(ax_s, buf, NOERROR, 0, varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            varbind, 1);
}

void
backend_getnext_instance_below_region_below_instance(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid1, sessionid2;
        struct varbind varbind[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETNEXT, 29, 1, 0, 1),
                        .data.int32 = 1
                },
        };
        struct searchrange searchrange[] = {
                {
                        .start = OID_STRUCT(MIB_BACKEND_GETNEXT, 29, 1, 1),
                        .end = OID_STRUCT(MIB_BACKEND_GETNEXT, 30)
                },
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid1 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 29, 1),
            "backend_getnext_instance_below_region_below_instance.1");
        sessionid2 = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETNEXT, 29, 2),
            "backend_getnext_instance_below_region_below_instance.2");
        agentx_register(ax_s, sessionid1, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 29), 0);
        agentx_register(ax_s, sessionid2, 1, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETNEXT, 29, 1, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, varbind, 1);

        searchrange[0].start.include = 1;
        varbind[0].name = searchrange[0].start;
        varbind[0].type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid1, searchrange,
            varbind, 1);
        agentx_response(ax_s, buf, NOERROR, 0, varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            varbind, 1);
}

void
backend_getbulk_nonrep_zero_maxrep_one(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind request = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETBULK, 1)
        }, ax_request[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 1, 0),
                        .data.int32 = 1
                }
        }, ax_response[nitems(ax_request)], response[nitems(ax_request)];
        int32_t requestid;
        char buf[1024];
        size_t n, nvarbind = nitems(ax_request), nout;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 1), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETBULK, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 1, &request, 1);

        memcpy(response, ax_request, sizeof(ax_request));
        while (nvarbind > 0) {
                n = agentx_read(ax_s, buf, sizeof(buf), 1000);
                nout = agentx_getbulk_handle(__func__, buf, n, 0,
                    sessionid, ax_request, nvarbind, ax_response);
                agentx_response(ax_s, buf, NOERROR, 0, ax_response, nout);
                nvarbind -= nout;
        }

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            response, nitems(response));
}

void
backend_getbulk_nonrep_zero_maxrep_two(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind request = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETBULK, 2)
        }, ax_request[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 2, 1),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 2, 2),
                        .data.int32 = 2
                }
        }, ax_response[nitems(ax_request)], response[nitems(ax_request)];
        int32_t requestid;
        char buf[1024];
        size_t n, nvarbind = nitems(ax_request), nout;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 2), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETBULK, 2), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 2, &request, 1);

        memcpy(response, ax_request, sizeof(ax_request));
        while (nvarbind > 0) {
                n = agentx_read(ax_s, buf, sizeof(buf), 1000);
                nout = agentx_getbulk_handle(__func__, buf, n, 0,
                    sessionid, ax_request, nvarbind, ax_response);
                agentx_response(ax_s, buf, NOERROR, 0, ax_response, nout);
                nvarbind -= nout;
        }

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            response, nitems(response));
}

void
backend_getbulk_nonrep_one_maxrep_one(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind request[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 3, 1)
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 3, 2)
                }
        }, ax_request[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 3, 1, 0),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 3, 2, 0),
                        .data.int32 = 2
                }
        }, ax_response[nitems(ax_request)], response[nitems(ax_request)];
        int32_t requestid;
        char buf[1024];
        size_t n, nvarbind = nitems(ax_request), nout;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 3), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETBULK, 3), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 1, 1, request, 2);

        memcpy(response, ax_request, sizeof(ax_request));
        while (nvarbind > 0) {
                n = agentx_read(ax_s, buf, sizeof(buf), 1000);
                nout = agentx_getbulk_handle(__func__, buf, n, 0,
                    sessionid, ax_request, nvarbind, ax_response);
                agentx_response(ax_s, buf, NOERROR, 0, ax_response, nout);
                nvarbind -= nout;
        }

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            response, nitems(response));
}

void
backend_getbulk_nonrep_one_maxrep_two(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind request[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 4, 1)
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 4, 2)
                }
        }, ax_request[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 4, 1, 0),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 4, 2, 2),
                        .data.int32 = 2
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 4, 2, 3),
                        .data.int32 = 3
                }
        }, ax_response[nitems(ax_request)], response[nitems(ax_request)];
        int32_t requestid;
        char buf[1024];
        size_t n, nvarbind = nitems(ax_request), nout;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 4), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETBULK, 4), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 1, 2, request, 2);

        memcpy(response, ax_request, sizeof(ax_request));
        while (nvarbind > 0) {
                n = agentx_read(ax_s, buf, sizeof(buf), 1000);
                nout = agentx_getbulk_handle(__func__, buf, n, 0,
                    sessionid, ax_request, nvarbind, ax_response);
                agentx_response(ax_s, buf, NOERROR, 0, ax_response, nout);
                nvarbind -= nout;
        }

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            response, nitems(response));
}

void
backend_getbulk_nonrep_two_maxrep_two(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind request[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 5, 1)
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 5, 2)
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 5, 3)
                }
        }, ax_request[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 5, 1, 0),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 5, 2, 0),
                        .data.int32 = 2
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 5, 3, 3),
                        .data.int32 = 3
                },
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 5, 3, 4),
                        .data.int32 = 4
                }
        }, ax_response[nitems(ax_request)], response[nitems(ax_request)];
        int32_t requestid;
        char buf[1024];
        size_t n, nvarbind = nitems(ax_request), nout;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 5), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETBULK, 5), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 2, 2, request, 3);

        memcpy(response, ax_request, sizeof(ax_request));
        while (nvarbind > 0) {
                n = agentx_read(ax_s, buf, sizeof(buf), 1000);
                nout = agentx_getbulk_handle(__func__, buf, n, 0,
                    sessionid, ax_request, nvarbind, ax_response);
                agentx_response(ax_s, buf, NOERROR, 0, ax_response, nout);
                nvarbind -= nout;
        }

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            response, nitems(response));
}

void
backend_getbulk_nonrep_negative(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind request = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_GETBULK, 6)
        }, ax_request[] = {
                {
                        .type = TYPE_INTEGER,
                        .name = OID_STRUCT(MIB_BACKEND_GETBULK, 6),
                        .data.int32 = 1
                }
        }, ax_response[nitems(ax_request)], response[nitems(ax_request)];
        int32_t requestid;
        char buf[1024];
        size_t n, nvarbind = nitems(ax_request), nout;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 6), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_GETBULK, 6), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, -1, 1, &request, 1);

        agentx_timeout(ax_s, 1000);
        snmp_timeout(snmp_s, 1);
}

/* Assume that everything is registered under 1.3.* */
void
backend_getbulk_endofmibview(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(2, 0),
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(2, 0),
                .end = OID_STRUCT(2, 1)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 7), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(2, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 2, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        varbind.type = TYPE_ENDOFMIBVIEW;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &varbind, 1);
        varbind.name.n_subid--;

        agentx_response(ax_s, buf, NOERROR, 0, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            &varbind, 1);
}

void
backend_getbulk_endofmibview_second_rep(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind request[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(2 ,0),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_ENDOFMIBVIEW,
                        .name = OID_STRUCT(2, 0, 0),
                }
        };
        struct searchrange searchrange = {
                .start = OID_STRUCT(2, 0),
                .end = OID_STRUCT(2, 1)
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 8), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(2, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 2, request, 1);

        request[0].name.subid[request[0].name.n_subid++] = 0;
        request[0].type = TYPE_INTEGER;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            request, 1);
        agentx_response(ax_s, buf, NOERROR, 0, request, 1);

        searchrange.start = request[0].name;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange,
            &request[1], 1);
        agentx_response(ax_s, buf, NOERROR, 0, &request[1], 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            request, 2);
}

void
backend_getbulk_endofmibview_two_varbinds(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind request[] = {
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(2 ,0),
                        .data.int32 = 1
                },
                {
                        .type = TYPE_NULL,
                        .name = OID_STRUCT(2, 0, 0),
                },
                {
                        .type = TYPE_ENDOFMIBVIEW,
                        .name = OID_STRUCT(2, 0, 0),
                },
                {
                        .type = TYPE_ENDOFMIBVIEW,
                        .name = OID_STRUCT(2, 0, 0),
                }
        };
        struct searchrange searchrange[] = {
                {
                        .start = OID_STRUCT(2, 0),
                        .end = OID_STRUCT(2, 1)
                },
                {
                        .start = OID_STRUCT(2, 0, 0),
                        .end = OID_STRUCT(2, 1)
                },
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_GETBULK, 9), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(2, 0), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 2, request, 2);

        request[0].name.subid[request[0].name.n_subid++] = 0;
        request[0].type = TYPE_INTEGER;
        request[1].type = TYPE_ENDOFMIBVIEW;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, searchrange,
            request, 2);
        agentx_response(ax_s, buf, NOERROR, 0, request, 2);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, &searchrange[1],
            &request[1], 1);
        agentx_response(ax_s, buf, NOERROR, 0, &request[1], 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOERROR, 0,
            request, 4);
}

void
backend_error_get_toobig(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 1, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 1), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 1), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, TOOBIG, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, TOOBIG, 1,
            &varbind, 1);
}

void
backend_error_get_nosuchname(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 2, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 2), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 2), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, NOSUCHNAME, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOSUCHNAME, 1,
            &varbind, 1);
}

void
backend_error_get_badvalue(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 3, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 3), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 3), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, BADVALUE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_readonly(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 4, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 4), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 4), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, READONLY, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_generr(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 5, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 5), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 5), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, GENERR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_noaccess(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 6, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 6), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 5), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, NOACCESS, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_wrongtype(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 7, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 7), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 7), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, WRONGTYPE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_wronglength(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 8, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 8), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 8), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, WRONGLENGTH, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_wrongencoding(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 9, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 9), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 9), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, WRONGENCODING, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_wrongvalue(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 10, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 10), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 10), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, WRONGVALUE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_nocreation(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 11, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 11), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 11), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, NOCREATION, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_inconsistentvalue(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 12, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 12), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 12), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, INCONSISTENTVALUE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_resourceunavailable(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 13, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 13), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 13), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, WRONGVALUE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_commitfailed(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 14, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 14), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 14), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, COMMITFAILED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_undofailed(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 15, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 15), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 15), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, UNDOFAILED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_authorizationerror(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 16, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 16), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 16), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, AUTHORIZATIONERROR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, AUTHORIZATIONERROR, 1,
            &varbind, 1);
}

void
backend_error_get_notwritable(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 17, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 17), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 17), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, NOTWRITABLE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_inconsistentname(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 18, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 18), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 18), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, INCONSISTENTNAME, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_openfailed(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 19, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 19), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 19), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, OPENFAILED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_notopen(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 20, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 20), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 20), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, NOTOPEN, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_indexwrongtype(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 21, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 21), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 21), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, INDEXWRONGTYPE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_indexalreadyallocated(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 22, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 22), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 22), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, INDEXALREADYALLOCATED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_indexnonavailable(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 23, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 23), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 23), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, INDEXNONEAVAILABLE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_indexnotallocated(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 24, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 24), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 24), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, INDEXNOTALLOCATED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_unsupportedcontext(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 25, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 25), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 25), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, UNSUPPORTEDCONTEXT, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_duplicateregistration(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 26, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 26), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 26), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, DUPLICATEREGISTRATION, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_unknownregistration(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 27, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 27), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 27), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, UNKNOWNREGISTRATION, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_parseerror(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 28, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 28), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 28), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, PARSEERROR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_requestdenied(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 29, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 29), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 29), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, REQUESTDENIED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_processingerror(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 30, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 30), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 30), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, PROCESSINGERROR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_get_nonstandard(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 31, 0),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 31), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 31), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_get(snmp_s, community, 0, &varbind, 1);

        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_get_handle(__func__, buf, n, 0, sessionid, &varbind, 1);

        agentx_response(ax_s, buf, 0xFFFF, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_toobig(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 32),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 32), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 32), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, TOOBIG, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, TOOBIG, 1,
            &varbind, 1);
}

void
backend_error_getnext_nosuchname(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 33),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 33), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 33), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, NOSUCHNAME, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, NOSUCHNAME, 1,
            &varbind, 1);
}

void
backend_error_getnext_badvalue(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 34),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 34), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 34), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, BADVALUE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_readonly(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 35),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 35), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 35), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, READONLY, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_generr(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 36),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 36), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 36), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, GENERR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_noaccess(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 37),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 37), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 37), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, NOACCESS, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_wrongtype(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 38),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 38), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 38), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, WRONGTYPE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_wronglength(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 39),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 39), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 39), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, WRONGLENGTH, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_wrongencoding(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 40),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 40), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 40), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, WRONGENCODING, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_wrongvalue(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 41),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 41), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 41), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, WRONGVALUE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_nocreation(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 42),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 42), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 42), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, NOCREATION, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_inconsistentvalue(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 43),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 43), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 43), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, INCONSISTENTVALUE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_resourceunavailable(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 44),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 44), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 44), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, RESOURCEUNAVAILABLE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_commitfailed(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 45),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 45), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 45), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, COMMITFAILED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_undofailed(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 46),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 46), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 46), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, UNDOFAILED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_authorizationerror(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 47),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 47), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 47), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, AUTHORIZATIONERROR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_notwritable(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 48),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 48), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 48), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, NOTWRITABLE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_inconsistentname(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 49),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 49), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 49), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, INCONSISTENTNAME, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_openfailed(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 50),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 50), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 50), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, OPENFAILED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_notopen(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 51),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 51), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 51), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, NOTOPEN, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_indexwrongtype(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 52),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 52), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 52), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, INDEXWRONGTYPE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_indexalreadyallocated(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 53),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 53), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 53), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, INDEXALREADYALLOCATED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_indexnonavailable(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 54),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 54), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 54), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, INDEXNONEAVAILABLE, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_indexnotallocated(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 55),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 55), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 55), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, INDEXNOTALLOCATED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_unsupportedcontext(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 56),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 56), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 56), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, UNSUPPORTEDCONTEXT, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_duplicateregistration(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 57),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 57), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 57), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, DUPLICATEREGISTRATION, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_unknownregistration(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 58),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 58), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 58), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, UNKNOWNREGISTRATION, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_parseerror(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 59),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 59), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 59), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, PARSEERROR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_requestdenied(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 60),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 60), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 60), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, REQUESTDENIED, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_processingerror(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 61),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 61), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 61), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, PROCESSINGERROR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getnext_nonstandard(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 62),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 62), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 62), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getnext(snmp_s, community, 0, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, 0xFFFF, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getbulk_firstrepetition(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 63),
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 63), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 63), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 2, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.n_subid--;
        agentx_response(ax_s, buf, GENERR, 1, &varbind, 1);

        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}

void
backend_error_getbulk_secondrepetition(void)
{
        struct sockaddr_storage ss;
        struct sockaddr *sa = (struct sockaddr *)&ss;
        socklen_t salen;
        int snmp_s, ax_s;
        uint32_t sessionid;
        struct varbind varbind = {
                .type = TYPE_NULL,
                .name = OID_STRUCT(MIB_BACKEND_ERROR, 64),
                .data.int32 = 1
        };
        int32_t requestid;
        char buf[1024];
        size_t n;

        ax_s = agentx_connect(axsocket);
        sessionid = agentx_open(ax_s, 0, 0,
            OID_ARG(MIB_SUBAGENT_BACKEND_ERROR, 64), __func__);
        agentx_register(ax_s, sessionid, 0, 0, 127, 0,
            OID_ARG(MIB_BACKEND_ERROR, 64), 0);

        salen = snmp_resolve(SOCK_DGRAM, hostname, servname, sa);
        snmp_s = snmp_connect(SOCK_DGRAM, sa, salen);
        requestid = snmpv2_getbulk(snmp_s, community, 0, 0, 2, &varbind, 1);

        varbind.name.subid[varbind.name.n_subid++] = 0;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.type = TYPE_INTEGER;
        agentx_response(ax_s, buf, 0, NOERROR, &varbind, 1);
        varbind.name.subid[varbind.name.n_subid - 1] = 1;
        n = agentx_read(ax_s, buf, sizeof(buf), 1000);
        agentx_getnext_handle(__func__, buf, n, 0, sessionid, NULL, &varbind, 1);
        varbind.name.subid[varbind.name.n_subid - 1] = 0;
        varbind.type = TYPE_NULL;
        agentx_response(ax_s, buf, 0, GENERR, &varbind, 1);

        varbind.name.n_subid--;
        snmpv2_response_validate(snmp_s, 1000, community, requestid, GENERR, 1,
            &varbind, 1);
}