/****************************************************************************** ****************************************************************************** **** This file was automatically generated by Wind River's **** MIB Compiler, version 10.1. **** This file was generated using the -stub switch. **** **** This file contains stub function declarations to aid in building **** the agent MIB interface. It creates all the MIB get, set, test, and **** next method routines that you will need to supply. However, **** since it doesn't know your system, several things are left to you. **** Look for comments with `!!!' in them for places you're likely to want **** to change for your system. Also, while the layout of the method **** routines is a commonly useful one, it will not fit all data structures **** and systems. Look at this output as a guide to how to write your **** method routines; a guide that will, in most cases, significantly reduce **** the amount of typing you need to do. **** **** The code here assumes you've created a file called `mibleaf.h' with **** the -leaf option to the mibcompiler. **** **** YOU WILL PROBABLY MODIFY THIS FILE BUT BEWARE ACCIDENTALLY **** OVERWRITING IT BY REGENERATING IT WITH THE MIB COMPILER. **** **** Last build date: Mon May 14 15:51:03 2007 **** from files: **** /usr/share/mibs/ietf/INET-ADDRESS-MIB, /usr/share/mibs/ietf/SNMPv2-MIB, **** ../../IANAifType-MIB, /usr/share/mibs/ietf/IF-MIB, **** /usr/share/mibs/ietf/IP-MIB, rfc4295.mib **** starting from node: mip6MIB ****************************************************************************** ****************************************************************************** */ #ifdef WRSNMP #ifdef IPMIP6MN #include #include #include #include #include #include #include #include #include "mip6_mth.h" #if 1 #include #include #include #include #include #include #include #include #include #include #include /* Information regarding one mobile node network */ typedef struct Ipmip6_io_network_info { struct Ipmip6_mib_mip6MnHomeAddressEntry ini_mip6MnHomeAddressEntry; struct Ipmip6_mib_mip6MnConf ini_mip6MnConf; struct Ipmip6_mib_mip6MnRegnCounters ini_mip6MnRegnCounters; struct Ipmip6_mib_mip6TotalTraffic ini_mip6TotalTraffic; struct Ipmip6_mib_mip6MnBLTable ini_mip6MnBLTable; int ind_ro_mip6MnBLTableSize; struct Ipmip6_mib_mip6MnBLTable ind_ro_mip6MnBLTable[1]; } Ipmip6_io_network_info_t; #define IPMIP6MN_MIB_InetAddressType_ipv6 (2) #define IPMIP6MN_MIB_ipv6_ntop_len 23 IMPORT struct Ip_tm *ipcom_localtime_r(const Ip_time_t *timep, struct Ip_tm *tm); IMPORT Ip_size_t ipcom_strftime(char *buf, Ip_size_t maxsize, const char *format, const struct Ip_tm *tm); /* *=========================================================================== * ipmip6mn_mib_get *=========================================================================== * Description: * Parameters: * Returns: IP_NULL on error, otherwise all data. * Call ipmip6mn_mib_free(data) afterwards. * */ IP_STATIC Ip_bool ipmip6mn_mib_get(Ipmip6_io_network_info_t *data) { Ipmip_cli_daemon_t daemon; Ipmip_cli_daemon_req_t req; Ipmip_proc_t *proc; Ip_bool ret = IP_FALSE; const char *name = NULL; daemon.fd = IP_INVALID_SOCKET; ipmip_cli_daemon_request_init(&req); proc = ipmip_proc_alloc(); if (proc == IP_NULL) return IP_FALSE; if (!ipmip6mn_cli_connect(&daemon)) goto cleanup; if (ipmip6mn_cli_network_list(&daemon, &req, name) == IPCOM_SUCCESS) { Ipmip_attr_iter_t riter; /**/ ipmip_cli_daemon_iter_request_init(&req, &riter); while (ret == IP_FALSE && (name = ipmip6mn_cli_network_next(&riter)) != IP_NULL) { Ipmip_cli_daemon_req_t breq; ipmip_cli_daemon_request_init(&breq); /* Retrieve network */ if (ipmip6mn_cli_network_get(&daemon, &breq, name) == IPCOM_SUCCESS) { const struct Ipmip6_mib_mip6MnConf *mip6MnConf = ipmip6mn_cli_network_get_mip6MnConf(&breq); const struct Ipmip6_mib_mip6MnRegnCounters *mip6MnRegnCounters = ipmip6mn_cli_network_get_mip6MnRegnCounters(&breq); const struct Ipmip6_mib_mip6TotalTraffic *mip6TotalTraffic = ipmip6mn_cli_network_get_mip6TotalTraffic(&breq); const struct Ipmip6_mib_mip6MnHomeAddressEntry *mip6MnHomeAddressEntry = ipmip6mn_cli_network_get_mip6MnHomeAddressEntry(&breq); Ipmip_attr_iter_t biter; ipcom_memcpy(&data->ini_mip6MnHomeAddressEntry, mip6MnHomeAddressEntry, sizeof(data->ini_mip6MnHomeAddressEntry)); ipcom_memcpy(&data->ini_mip6MnConf, mip6MnConf, sizeof(data->ini_mip6MnConf)); ipcom_memcpy(&data->ini_mip6MnRegnCounters, mip6MnRegnCounters, sizeof(data->ini_mip6MnRegnCounters)); ipcom_memcpy(&data->ini_mip6TotalTraffic, mip6TotalTraffic, sizeof(data->ini_mip6TotalTraffic)); if (ipmip6mn_cli_network_get_ha_bindings_iter(&breq, &biter)) { struct Ipmip_attr *rta = ipmip6mn_cli_network_get_bindings_next(&biter); if (rta) { const struct Ipmip6_mib_mip6MnBLTable *table = ipmip6mn_cli_network_get_bindings_mip6MnBLTable(rta); ipcom_memcpy(&data->ini_mip6MnBLTable, table, sizeof(data->ini_mip6MnBLTable)); ret = IP_TRUE; } } } ipmip_cli_daemon_request_release(&breq); } } cleanup: ipmip_cli_daemon_disconnect(&daemon); ipmip_cli_daemon_request_release(&req); if (proc) ipmip_proc_destroy(proc); return ret; } /*IP_EXTERN Ipmip6_io_network_info_t *ipmip6mn_mib_get(void); IP_EXTERN void ipmip6mn_mib_free(Ipmip6_io_network_info_t *data);*/ #define IPMIP6MN_MIB_GET(var, from) \ { \ Ipmip6_io_network_info_t data; \ if ((ipmip6mn_mib_get(&data))) \ var = data.ini_mip6##from.var; \ } \ #define IPMIP6MN_MIB_GET2(var, from, dest) \ { \ Ipmip6_io_network_info_t data; \ if ((ipmip6mn_mib_get(&data))) \ dest = data.ini_mip6##from.var; \ } \ #define IPMIP6MN_MIB_ntop(dest, destlen, strct) \ { \ struct Ip_in6_addr v6; \ Ip_u8 tmp[IPMIP6MN_MIB_ipv6_ntop_len+1]; \ IPMIP6MN_MIB_GET2(dest, strct, v6); \ if (ipcom_inet_ntop(IP_AF_INET6, (void *)&v6, (char *)tmp, (Ip_size_t)sizeof(tmp)) == IP_NULL) \ return -2; \ destlen = (Ip_s32)ipcom_strlen((char *)tmp); \ dest = tmp; \ } #if 0 #define IPMIP6MN_MIB_ntop2(dest, destlen, var, strct) \ { \ struct Ip_in6_addr v6; \ Ip_u8 tmp[IPMIP6MN_MIB_ipv6_ntop_len+1]; \ IPMIP6MN_MIB_GET2(var, strct, v6); \ if (ipcom_inet_ntop(IP_AF_INET6, &v6, tmp, sizeof(tmp)) == IP_NULL) \ return -2; \ destlen = ipcom_strlen((Ip_s8*)tmp); \ dest = tmp; \ } #endif #define IPMIP6MN_MIB_strftime(dest, destlen, strct) \ { \ struct Ip_tm tm; \ Ip_u8 stmp[32]; \ Ip_time_t u32t; \ IPMIP6MN_MIB_GET2(dest, strct, u32t); \ ipcom_localtime_r(&u32t, &tm); \ ipcom_strftime((char *)stmp, sizeof(stmp), "%b %d %H:%M:%S", &tm); \ dest = stmp; \ } /* *=========================================================================== * ipmip6mn_mib_free *=========================================================================== * Description: * Parameters: Ipmip6_io_network_info_t *data * Returns: * */ /*IP_STATIC void ipmip6mn_mib_free(Ipmip6_io_network_info_t *data) { if (data != IP_NULL) ipcom_free(data); }*/ int mip6System_lookup() { Ipmip6_io_network_info_t data; \ return ipmip6mn_mib_get(&data); } #if 0 int mip6MnRegnCounters_lookup() { *data = ipmip6mn_mib_get(); return !(*data); } int mip6TotalTraffic_lookup(Ipmip6_io_network_info_t **data) { *data = ipmip6mn_mib_get(); return !(*data); } int mip6MnConf_lookup(Ipmip6_io_network_info_t **data) { *data = ipmip6mn_mib_get(); return !(*data); } Ipmip6_io_network_info_t *mip6MnBLEntry_lookup(int tcount, OIDC_T *tlist) { return ipmip6mn_mib_get(); } Ipmip6_io_network_info_t *mip6MnBLEntry_first() { return ipmip6mn_mib_get(); } Ipmip6_io_network_info_t *mip6MnHomeAddressEntry_first() { return ipmip6mn_mib_get(); } Ipmip6_io_network_info_t *mip6MnBLEntry_int_next(Ipmip6_io_network_info_t *data) { (void)data; return IP_NULL; } Ipmip6_io_network_info_t *mip6MnHomeAddressEntry_int_next(Ipmip6_io_network_info_t *data) { (void)data; return IP_NULL; } #endif unsigned mip6MnBLEntry_build_instance(Ipmip6_io_network_info_t *data, OIDC_T tmp_inst[]) { int i = 0; tmp_inst[i] = 2; i++; tmp_inst[i] = 16; i++; #if 0 string_to_oid(16, &data->ini_mip6MnHomeAddressEntry.mip6MnHomeAddress, 16, (OIDC_T *)&(tmp_inst[i]), 1); i += 16; tmp_inst[i] = 2; i++; tmp_inst[i] = 16; i++; string_to_oid(16, &data->ini_mip6MnBLTable.mip6MnBLNodeAddress, 16, &(tmp_inst[i]), 1); #endif i += 16; return i; } #define STRUCT_mip6MnRegnCounters Ipmip6_io_network_info_t #define STRUCT_mip6MnBLEntry Ipmip6_io_network_info_t #define STRUCT_mip6System Ipmip6_io_network_info_t #define STRUCT_mip6TotalTraffic Ipmip6_io_network_info_t #define STRUCT_mip6MnHomeAddressEntry Ipmip6_io_network_info_t #define STRUCT_mip6MnConf Ipmip6_io_network_info_t #define STRUCT_mip6MnBLEntry Ipmip6_io_network_info_t /* * Method routines for the mip6System variables: * * mip6Capabilities -- read-only * This object indicates the Mobile IPv6 functions that * are supported by this managed entity. Multiple * Mobile IPv6 functions may be supported by a single * entity. * * mip6Status -- read-write * This object indicates whether the Mobile IPv6 * function is enabled for the managed entity. If it * is enabled, the agent discovery and registration * functions will be operational. * Changing the status from enabled(1) to disabled(2) * will terminate the agent discovery and registration * functions. On the other hand, changing the status * from disabled(2) to enabled(1) will start the agent * discovery and registration functions. * * The value of this object SHOULD remain unchanged * across reboots of the managed entity. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6System_get and mip6System_next. * You need to replace the type STRUCT_mip6System with something * appropriate to your system. */ static int mip6System_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6System *data) /* !!! */ { char *mip6Capabilities = "1"; switch(lastmatch) { case LEAF_mip6Capabilities: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ /* if the data being returned is in dynamic storage and needs * to be free'd, change the 0 argument to a 1. */ getproc_got_string(pktp, vbp, 1, (unsigned char*)mip6Capabilities, 0, VT_STRING); /* !!! */ break; case LEAF_mip6Status: /* Values: * enabled(1) = VAL_mip6Status_enabled * disabled(2) = VAL_mip6Status_disabled */ getproc_got_int32(pktp, vbp, 1); break; default: return GEN_ERR; } return NO_ERROR; } void mip6System_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* check that the instance is exactly .0 */ if (!((tcount == 1) && (*tlist == 0))) for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); /* grab the actual data for this variable. this lookup routine will * probably have to be changed for your system. for scalar variables * there might not even be any lookup routine. */ else if (mip6System_lookup() != IP_TRUE) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_error(pktp, vbp, GEN_ERR); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6System_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, NULL)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6System_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { OIDC_T instance = 0; /* the only time there's a next for a scalar is if we're given * no instance at all. */ if (tcount != 0) nextproc_no_next(pktp, vbp); /* grab the data for these variables. you'll probably have to change * this lookup routine for your system. for scalar variables there * might not even be any lookup routine. */ else if (mip6System_lookup() != IP_TRUE) /* !!! */ getproc_error(pktp, vbp, GEN_ERR); else { /* find all the varbinds in this group and retrieve their * values from the same data structure */ for (group_by_getproc_and_instance(pktp, vbp, tcount, tlist); vbp; vbp = vbp->vb_link) { nextproc_next_instance(pktp, vbp, 1, &instance); mip6System_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, NULL); } } } void mip6System_test(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { VB_T *group_vbp; /* Only scalar variables here, check for .0 */ if (!((tcount == 1) && (*tlist == 0))) { testproc_error(pktp, vbp, NO_SUCH_NAME); return; } /* find all the varbinds that share the same getproc and instance and * group them together. */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* now check each varbind */ for (group_vbp = vbp; group_vbp; group_vbp = group_vbp->vb_link) { /* !!! Add any value checking you wish to do. */ switch (group_vbp->vb_ml.ml_last_match) { case LEAF_mip6Status: /* !!! modify this switch to give an error for values your * implementation doesn't allow */ switch (VB_GET_INT32(group_vbp)) { case VAL_mip6Status_enabled: case VAL_mip6Status_disabled: break; default: testproc_error(pktp, group_vbp, WRONG_VALUE); continue; } testproc_good(pktp, group_vbp); break; default: testproc_error(pktp, group_vbp, GEN_ERR); return; } } } void mip6System_set(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { for ( ; vbp; vbp = vbp->vb_link) { switch (vbp->vb_ml.ml_last_match) { case LEAF_mip6Status: break; default: setproc_error(pktp, vbp, COMMIT_FAILED); return; } } } #if 0 /* * Method routines for the mip6BindingCacheTable: * * mip6BindingHomeAddressType -- not-accessible * The InetAddressType of the mip6BindingHomeAddress * that follows. * * mip6BindingHomeAddress -- not-accessible * The home address of the mobile node corresponding * to the Binding Cache entry. This field is used as * the key for searching the mobile node's current * care-of address in the Binding Cache. * * The type of the address represented by this object * is specified by the corresponding * mip6BindingHomeAddressType object. * * mip6BindingCOAType -- read-only * The InetAddressType of the mip6BindingCOA that * follows. * * mip6BindingCOA -- read-only * The care-of address of the mobile node indicated by * the home address field (mip6BindingHomeAddress) in * this Binding Cache entry. * * The type of the address represented by this object * is specified by the corresponding mip6BindingCOAType * object. * * mip6BindingTimeRegistered -- read-only * The timestamp when this Binding Cache entry was * created. * * mip6BindingTimeGranted -- read-only * The lifetime in seconds granted to the mobile node * for this registration. * * mip6BindingTimeRemaining -- read-only * The lifetime in seconds remaining for this * registration. * * mip6BindingHomeRegn -- read-only * This object indicates whether or not this Binding * Cache entry is a home registration entry (applicable * only on nodes that support home agent * functionality). * * mip6BindingMaxSeq -- read-only * The maximum value of the Sequence Number field * received in previous Binding Updates for this home * address (mip6BindingHomeAddress). * * mip6BindingUsageTS -- read-only * The timestamp when this entry was last looked up. * * mip6BindingUsageCount -- read-only * The number of times this entry was looked up. * * mip6BindingAdminStatus -- read-write * This is an administrative object used to control * the status of a binding cache entry. By default * the value will be 'active'(1). * A value of 'inactive'(2) will indicate that the * validity of the entry is suspended. It does not * exist in the binding cache for all practical * purposes. * The state can be changed from 'active' to * 'inactive' by operator intervention. * Causing the state to change to 'inactive' results * in the entry being deleted from the cache. * Attempts to change the status from 'inactive' * to 'active' will be rejected. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6BindingCacheEntry_get and mip6BindingCacheEntry_next. * You need to replace the type STRUCT_mip6BindingCacheEntry with something * appropriate to your system. */ static int mip6BindingCacheEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6BindingCacheEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6BindingCOAType: /* Values: * unknown(0) = VAL_mip6BindingCOAType_unknown * ipv4(1) = VAL_mip6BindingCOAType_ipv4 * ipv6(2) = VAL_mip6BindingCOAType_ipv6 * ipv4z(3) = VAL_mip6BindingCOAType_ipv4z * ipv6z(4) = VAL_mip6BindingCOAType_ipv6z * dns(16) = VAL_mip6BindingCOAType_dns */ getproc_got_int32(pktp, vbp, data->mip6BindingCOAType); /* !!! */ break; case LEAF_mip6BindingCOA: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6BindingCOA), data->mip6BindingCOA, VT_STRING); /* !!! */ break; case LEAF_mip6BindingTimeRegistered: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6BindingTimeRegistered), data->mip6BindingTimeRegistered, VT_STRING); /* !!! */ break; case LEAF_mip6BindingTimeGranted: getproc_got_uint32(pktp, vbp, data->mip6BindingTimeGranted, VT_GAUGE); /* !!! */ break; case LEAF_mip6BindingTimeRemaining: getproc_got_uint32(pktp, vbp, data->mip6BindingTimeRemaining, VT_GAUGE); /* !!! */ break; case LEAF_mip6BindingHomeRegn: /* Values: * true(1) = VAL_mip6BindingHomeRegn_true * false(2) = VAL_mip6BindingHomeRegn_false */ getproc_got_int32(pktp, vbp, data->mip6BindingHomeRegn); /* !!! */ break; case LEAF_mip6BindingMaxSeq: getproc_got_uint32(pktp, vbp, data->mip6BindingMaxSeq, VT_GAUGE); /* !!! */ break; case LEAF_mip6BindingUsageTS: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6BindingUsageTS), data->mip6BindingUsageTS, VT_STRING); /* !!! */ break; case LEAF_mip6BindingUsageCount: getproc_got_uint32(pktp, vbp, data->mip6BindingUsageCount, VT_GAUGE); /* !!! */ break; case LEAF_mip6BindingAdminStatus: /* Values: * active(1) = VAL_mip6BindingAdminStatus_active * inactive(2) = VAL_mip6BindingAdminStatus_inactive */ getproc_got_int32(pktp, vbp, data->mip6BindingAdminStatus); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6BindingCacheEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6BindingCacheEntry data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((data = mip6BindingCacheEntry_lookup(tcount, tlist)) == 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6BindingCacheEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6BindingCacheEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { #define mip6BindingCacheEntry_INSTANCE_LEN 257 /* !!! */ STRUCT_mip6BindingCacheEntry *data; /* !!! */ STRUCT_mip6BindingCacheEntry *best; /* !!! */ OIDC_T tmp_inst[mip6BindingCacheEntry_INSTANCE_LEN]; OIDC_T best_inst[mip6BindingCacheEntry_INSTANCE_LEN]; int i; int error; unsigned inst_len; unsigned best_inst_len; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ best = 0; /* This loop needs to iterate over each entry in your table */ for (data = mip6BindingCacheEntry_first(); data; /* !!! */ data = mip6BindingCacheEntry_int_next(data)) { /* !!! */ inst_len = mip6BindingCacheEntry_build_instance(data, tmp_inst); if ((oidcmp2(inst_len, tmp_inst, tcount, tlist) > 0) && ((!best || (oidcmp2(inst_len, tmp_inst, inst_len, best_inst) < 0)))) { best = data; for (i = 0; i < inst_len; i++) best_inst[i] = tmp_inst[i]; best_inst_len = inst_len; } } if (best) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6BindingCacheEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, best)) == NO_ERROR) nextproc_next_instance(pktp, vbp, best_inst_len, best_inst); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } void mip6BindingCacheEntry_test(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { /* Change the appropriate definition to 1 if you want row creation * or consistency checking. If you will never need these it's * probably best to just delete the code to make the testproc a * little more readable. */ #define mip6BindingCacheEntry_CONSISTENCY_CHECK 0 /* !!! */ #define mip6BindingCacheEntry_ROW_CREATION 0 /* !!! */ STRUCT_mip6BindingCacheEntry *data; /* !!! */ #if mip6BindingCacheEntry_CONSISTENCY_CHECK STRUCT_mip6BindingCacheEntry check_data; /* !!! */ #endif int error; VB_T *group_vbp; if ((data = mip6BindingCacheEntry_lookup(tcount, tlist)) == 0) { /* !!! */ /* optionally do row creation here !!! */ testproc_error(pktp, vbp, NO_SUCH_NAME); return; } #if mip6BindingCacheEntry_CONSISTENCY_CHECK /* get a copy of the data to modify for now to see if we end up with * something that's consistent after doing all the sets */ check_data = *data; #endif /* stash the looked up information here for the setproc */ vbp->vb_priv = data; /* find all the varbinds that share the same getproc and instance and * group them together. */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* now check each varbind */ for (group_vbp = vbp; group_vbp; group_vbp = group_vbp->vb_link) { /* !!! Add any value checking you wish to do. */ switch (group_vbp->vb_ml.ml_last_match) { case LEAF_mip6BindingAdminStatus: /* !!! modify this switch to give an error for values your * implementation doesn't allow */ switch (VB_GET_INT32(group_vbp)) { case VAL_mip6BindingAdminStatus_active: case VAL_mip6BindingAdminStatus_inactive: break; default: testproc_error(pktp, group_vbp, WRONG_VALUE); continue; } #if mip6BindingAdminStatus_CONSISTENCY_CHECK check_data.mip6BindingAdminStatus = VB_GET_INT32(group_vbp); /* !!! */ #endif testproc_good(pktp, group_vbp); break; default: testproc_error(pktp, group_vbp, GEN_ERR); return; } } #if mip6BindingCacheEntry_CONSISTENCY_CHECK /* check that the result of all the sets will work */ if (!error && (mip6BindingCacheEntry_consistency_check(&check_data) != 0)) /* !!! */ testproc_error(pktp, vbp, INCONSISTENT_VALUE); #endif } void mip6BindingCacheEntry_set(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6BindingCacheEntry *data = vbp->vb_priv; /* !!! */ for ( ; vbp; vbp = vbp->vb_link) { switch (vbp->vb_ml.ml_last_match) { case LEAF_mip6BindingAdminStatus: data->mip6BindingAdminStatus = VB_GET_INT32(vbp); /* !!! */ setproc_good(pktp, vbp); break; default: setproc_error(pktp, vbp, COMMIT_FAILED); return; } } } /* * Method routines for the mip6BindingHistoryTable: * * mip6BindingHstHomeAddressType -- not-accessible * The InetAddressType of the * mip6BindingHstHomeAddress that follows. * * mip6BindingHstHomeAddress -- not-accessible * Mobile node's home address. * * The type of the address represented by this object * is specified by the corresponding * mip6BindingHstHomeAddressType object. * * mip6BindingHstIndex -- not-accessible * The index to uniquely identify this record along * with the mobile node's HomeAddress type and * HomeAddress. It should be monotonically increasing. * It may wrap after reaching its max value. * * mip6BindingHstCOAType -- read-only * The InetAddressType of the mip6BindingHstCOA that * follows. * * mip6BindingHstCOA -- read-only * Mobile node's care-of address. One mobile node can * have multiple bindings with different * care-of addresses. * The type of the address represented by this object * is specified by the corresponding * mip6BindingHstCOAType object. * * mip6BindingHstTimeRegistered -- read-only * The timestamp when this Binding Cache entry was * created. * * mip6BindingHstTimeExpired -- read-only * The timestamp when this Binding Cache entry expired. * * mip6BindingHstHomeRegn -- read-only * This object indicates whether or not this Binding * Cache entry is a home registration entry (applicable * only on nodes that support home agent * functionality). * * mip6BindingHstUsageTS -- read-only * The timestamp when this entry was last looked up. * * mip6BindingHstUsageCount -- read-only * The number of times this entry was looked up. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6BindingHistoryEntry_get and mip6BindingHistoryEntry_next. * You need to replace the type STRUCT_mip6BindingHistoryEntry with something * appropriate to your system. */ static int mip6BindingHistoryEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6BindingHistoryEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6BindingHstCOAType: /* Values: * unknown(0) = VAL_mip6BindingHstCOAType_unknown * ipv4(1) = VAL_mip6BindingHstCOAType_ipv4 * ipv6(2) = VAL_mip6BindingHstCOAType_ipv6 * ipv4z(3) = VAL_mip6BindingHstCOAType_ipv4z * ipv6z(4) = VAL_mip6BindingHstCOAType_ipv6z * dns(16) = VAL_mip6BindingHstCOAType_dns */ getproc_got_int32(pktp, vbp, data->mip6BindingHstCOAType); /* !!! */ break; case LEAF_mip6BindingHstCOA: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6BindingHstCOA), data->mip6BindingHstCOA, VT_STRING); /* !!! */ break; case LEAF_mip6BindingHstTimeRegistered: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6BindingHstTimeRegistered), data->mip6BindingHstTimeRegistered, VT_STRING); /* !!! */ break; case LEAF_mip6BindingHstTimeExpired: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6BindingHstTimeExpired), data->mip6BindingHstTimeExpired, VT_STRING); /* !!! */ break; case LEAF_mip6BindingHstHomeRegn: /* Values: * true(1) = VAL_mip6BindingHstHomeRegn_true * false(2) = VAL_mip6BindingHstHomeRegn_false */ getproc_got_int32(pktp, vbp, data->mip6BindingHstHomeRegn); /* !!! */ break; case LEAF_mip6BindingHstUsageTS: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6BindingHstUsageTS), data->mip6BindingHstUsageTS, VT_STRING); /* !!! */ break; case LEAF_mip6BindingHstUsageCount: getproc_got_uint32(pktp, vbp, data->mip6BindingHstUsageCount, VT_GAUGE); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6BindingHistoryEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6BindingHistoryEntry data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((data = mip6BindingHistoryEntry_lookup(tcount, tlist)) == 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6BindingHistoryEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6BindingHistoryEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { #define mip6BindingHistoryEntry_INSTANCE_LEN 258 /* !!! */ STRUCT_mip6BindingHistoryEntry *data; /* !!! */ STRUCT_mip6BindingHistoryEntry *best; /* !!! */ OIDC_T tmp_inst[mip6BindingHistoryEntry_INSTANCE_LEN]; OIDC_T best_inst[mip6BindingHistoryEntry_INSTANCE_LEN]; int i; int error; unsigned inst_len; unsigned best_inst_len; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ best = 0; /* This loop needs to iterate over each entry in your table */ for (data = mip6BindingHistoryEntry_first(); data; /* !!! */ data = mip6BindingHistoryEntry_int_next(data)) { /* !!! */ inst_len = mip6BindingHistoryEntry_build_instance(data, tmp_inst); if ((oidcmp2(inst_len, tmp_inst, tcount, tlist) > 0) && ((!best || (oidcmp2(inst_len, tmp_inst, inst_len, best_inst) < 0)))) { best = data; for (i = 0; i < inst_len; i++) best_inst[i] = tmp_inst[i]; best_inst_len = inst_len; } } if (best) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6BindingHistoryEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, best)) == NO_ERROR) nextproc_next_instance(pktp, vbp, best_inst_len, best_inst); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } #endif /* * Method routines for the mip6TotalTraffic variables: * * mip6InOctets -- read-only * The total number of octets in the MIPv6 datagrams * received by the MIPv6 entity. This will include * datagrams with the Mobility Header, the Home Address * option in the Destination Option extension header * (Next Header value = 60), or the type 2 Routing * Header. It will also include the IPv6 datagrams that * are reverse tunneled to a home agent from a mobile * node's home address. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HCInOctets -- read-only * The total number of octets in the MIPv6 datagrams * received by the MIPv6 entity. This will include * datagrams with the Mobility Header, the Home Address * option in the Destination Option extension header * (Next Header value = 60), or the type 2 Routing * Header. It will also include the IPv6 datagrams that * are reverse tunneled to a home agent from a mobile * node's home address. * This object is a 64-bit version of mip6InOctets. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6InPkts -- read-only * The number of MIPv6 datagrams received by the MIPv6 * entity. This will include datagrams with the * Mobility Header, the Home Address option in the * Destination Option extension header (Next Header * value = 60), or the type 2 Routing Header. * It will also include the IPv6 datagrams that are * reverse tunneled to a home agent from a mobile * node's home address. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HCInPkts -- read-only * The number of MIPv6 datagrams received by the MIPv6 * entity. This will include datagrams with the * Mobility Header, the Home Address option in the * Destination Option extension header (Next Header * value = 60), or the type 2 Routing Header. It will * also include the IPv6 datagrams that are reverse * tunneled to a home agent from a mobile node's home * address. * This object is a 64-bit version of mip6InPkts. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6OutOctets -- read-only * The total number of octets in the MIPv6 datagrams * sent by the MIPv6 entity. This will include * datagrams with the Mobility Header, the Home Address * option in the Destination Option extension header * (Next Header value = 60), or the type 2 Routing * Header. It will also include the IPv6 datagrams that * are reverse tunneled to a home agent from a mobile * node's home address. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HCOutOctets -- read-only * The total number of octets in the MIPv6 datagrams * sent by the MIPv6 entity. This will include * datagrams with the Mobility Header, the Home Address * option in the Destination Option extension header * (Next Header value = 60), or the type 2 Routing * Header. It will also include the IPv6 datagrams that * are reverse tunneled to a home agent from a mobile * node's home address. * This object is a 64-bit version of mip6OutOctets. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6OutPkts -- read-only * The number of MIPv6 datagrams sent by the MIPv6 * entity. This will include the datagrams with * Mobility Header, the Home Address option in the * Destination Option extension header (Next Header * value = 60), or the type 2 Routing Header. It will * also include the IPv6 datagrams that are reverse * tunneled to a home agent from a mobile node's home * address. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HCOutPkts -- read-only * The number of MIPv6 datagrams sent by the MIPv6 * entity. This will include datagrams with the * Mobility Header, the Home Address option in the * Destination Option extension header (Next Header * value = 60), or the type 2 Routing Header. It will * also include the IPv6 datagrams that are reverse * tunneled to a home agent from a mobile node's home * address. * This object is a 64-bit version of mip6OutPkts. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CounterDiscontinuityTime -- read-only * The value of sysUpTime on the most recent occasion * at which any one or more of this MIPv6 entities * global counters, viz., counters with OID prefix * 'mip6TotalTraffic' or 'mip6CnGlobalStats' or * 'mip6HaGlobalStats' suffered a discontinuity. * If no such discontinuities have occurred since the * last re-initialization of the local management * subsystem, then this object will have a zero value. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6TotalTraffic_get and mip6TotalTraffic_next. * You need to replace the type STRUCT_mip6TotalTraffic with something * appropriate to your system. */ static int mip6TotalTraffic_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6TotalTraffic *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6InOctets: getproc_got_uint32(pktp, vbp, data->ini_mip6TotalTraffic.mip6InOctets, VT_COUNTER); /* !!! */ break; case LEAF_mip6HCInOctets: getproc_got_uint64(pktp, vbp, (UINT_64_T*)&data->ini_mip6TotalTraffic.mip6HCInOctets); /* !!! */ break; case LEAF_mip6InPkts: getproc_got_uint32(pktp, vbp, data->ini_mip6TotalTraffic.mip6InPkts, VT_COUNTER); /* !!! */ break; case LEAF_mip6HCInPkts: getproc_got_uint64(pktp, vbp, (UINT_64_T*)&data->ini_mip6TotalTraffic.mip6HCInPkts); /* !!! */ break; case LEAF_mip6OutOctets: getproc_got_uint32(pktp, vbp, data->ini_mip6TotalTraffic.mip6OutOctets, VT_COUNTER); /* !!! */ break; case LEAF_mip6HCOutOctets: getproc_got_uint64(pktp, vbp, (UINT_64_T*)&data->ini_mip6TotalTraffic.mip6HCOutOctets); /* !!! */ break; case LEAF_mip6OutPkts: getproc_got_uint32(pktp, vbp, data->ini_mip6TotalTraffic.mip6OutPkts, VT_COUNTER); /* !!! */ break; case LEAF_mip6HCOutPkts: getproc_got_uint64(pktp, vbp, (UINT_64_T*)&data->ini_mip6TotalTraffic.mip6HCOutPkts); /* !!! */ break; case LEAF_mip6CounterDiscontinuityTime: getproc_got_uint32(pktp, vbp, data->ini_mip6TotalTraffic.mip6CounterDiscontinuityTime, VT_TIMETICKS); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6TotalTraffic_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { Ipmip6_io_network_info_t data; int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* check that the instance is exactly .0 */ if (!((tcount == 1) && (*tlist == 0))) for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); /* grab the actual data for this variable. this lookup routine will * probably have to be changed for your system. for scalar variables * there might not even be any lookup routine. */ else if ((ipmip6mn_mib_get(&data)) != IP_TRUE) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_error(pktp, vbp, GEN_ERR); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6TotalTraffic_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6TotalTraffic_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { Ipmip6_io_network_info_t data; OIDC_T instance = 0; /* the only time there's a next for a scalar is if we're given * no instance at all. */ if (tcount != 0) nextproc_no_next(pktp, vbp); /* grab the data for these variables. you'll probably have to change * this lookup routine for your system. for scalar variables there * might not even be any lookup routine. */ else if ((ipmip6mn_mib_get(&data)) != IP_TRUE) /* !!! */ getproc_error(pktp, vbp, GEN_ERR); else { /* find all the varbinds in this group and retrieve their * values from the same data structure */ for (group_by_getproc_and_instance(pktp, vbp, tcount, tlist); vbp; vbp = vbp->vb_link) { nextproc_next_instance(pktp, vbp, 1, &instance); mip6TotalTraffic_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data); } } } #if 0 /* * Method routines for the mip6NodeTrafficTable: * * mip6NodeInOctets -- read-only * The total number of octets in the MIPv6 datagrams * received from the mobile node by the MIPv6 entity. * This will include datagrams with the Mobility * Header or the Home Address option in the Destination * Option extension header (Next Header value = 60). * It will also include the IPv6 datagrams that are * reverse tunneled to a home agent from the mobile * node's home address. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6NodeCtrDiscontinuityTime. * * mip6HCNodeInOctets -- read-only * The total number of octets in the MIPv6 datagrams * received from the mobile node by the MIPv6 entity. * This will include datagrams with the Mobility * Header or the Home Address option in the Destination * Option extension header (Next Header value = 60). * It will also include the IPv6 datagrams that are * reverse tunneled to a home agent from the mobile * node's home address. * This object is a 64-bit version of mip6NodeInOctets. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6NodeCtrDiscontinuityTime. * * mip6NodeInPkts -- read-only * The number of MIPv6 datagrams received from the * mobile node by the MIPv6 entity. This will include * the datagrams with the Mobility Header or * the Home Address option in the Destination * Option extension header (Next Header value = 60). * It will also include the IPv6 datagrams that are * reverse tunneled to a home agent from the mobile * node's home address. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6NodeCtrDiscontinuityTime. * * mip6HCNodeInPkts -- read-only * The number of MIPv6 datagrams received from the * mobile node by the MIPv6 entity. This will include * datagrams with the Mobility Header or the Home * Address option in the Destination Option extension * header (Next Header value = 60). It will also * include the IPv6 datagrams that are reverse tunneled * to a home agent from the mobile node's home address. * This object is a 64-bit version of mip6NodeInPkts. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6NodeCtrDiscontinuityTime. * * mip6NodeOutOctets -- read-only * The total number of octets in the MIPv6 datagrams * sent to the mobile node by the MIPv6 entity. This * will include datagrams with the Mobility Header * or the type 2 Routing Header. It will also include * the IPv6 datagrams that are tunneled by a home agent * to the mobile node. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6NodeCtrDiscontinuityTime. * * mip6HCNodeOutOctets -- read-only * The total number of octets in the MIPv6 datagrams * sent to the mobile node by the MIPv6 entity. This * will include datagrams with the Mobility Header * or the type 2 Routing Header. It will also include * the IPv6 datagrams that are tunneled by a home agent * to the mobile node. * This object is a 64-bit version of mip6NodeOutOctets. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6NodeCtrDiscontinuityTime. * * mip6NodeOutPkts -- read-only * The number of MIPv6 datagrams sent to the mobile * node by the MIPv6 entity. This will include * datagrams with the Mobility Header or the type 2 * Routing Header. It will also include the IPv6 * datagrams that are tunneled by a home agent to the * mobile node. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6NodeCtrDiscontinuityTime. * * mip6HCNodeOutPkts -- read-only * The number of MIPv6 datagrams sent to the mobile * node by the MIPv6 entity. This will include * datagrams with the Mobility Header or the type 2 * Routing Header. It will also include the IPv6 * datagrams that are tunneled by a home agent to the * mobile node. * This object is a 64-bit version of mip6NodeOutOctets. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6NodeCtrDiscontinuityTime. * * mip6NodeCtrDiscontinuityTime -- read-only * The value of sysUpTime on the most recent occasion * at which any one or more of the counters in this row * suffered a discontinuity. The relevant counters are * the specific instances of any Counter32 or Counter64 * objects in this row. * If no such discontinuities have occurred since the * last re-initialization of the local management * subsystem, then this object contains a zero value. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6NodeTrafficEntry_get and mip6NodeTrafficEntry_next. * You need to replace the type STRUCT_mip6NodeTrafficEntry with something * appropriate to your system. */ static int mip6NodeTrafficEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6NodeTrafficEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6NodeInOctets: getproc_got_uint32(pktp, vbp, data->mip6NodeInOctets, VT_COUNTER); /* !!! */ break; case LEAF_mip6HCNodeInOctets: getproc_got_uint64(pktp, vbp, data->mip6HCNodeInOctets); /* !!! */ break; case LEAF_mip6NodeInPkts: getproc_got_uint32(pktp, vbp, data->mip6NodeInPkts, VT_COUNTER); /* !!! */ break; case LEAF_mip6HCNodeInPkts: getproc_got_uint64(pktp, vbp, data->mip6HCNodeInPkts); /* !!! */ break; case LEAF_mip6NodeOutOctets: getproc_got_uint32(pktp, vbp, data->mip6NodeOutOctets, VT_COUNTER); /* !!! */ break; case LEAF_mip6HCNodeOutOctets: getproc_got_uint64(pktp, vbp, data->mip6HCNodeOutOctets); /* !!! */ break; case LEAF_mip6NodeOutPkts: getproc_got_uint32(pktp, vbp, data->mip6NodeOutPkts, VT_COUNTER); /* !!! */ break; case LEAF_mip6HCNodeOutPkts: getproc_got_uint64(pktp, vbp, data->mip6HCNodeOutPkts); /* !!! */ break; case LEAF_mip6NodeCtrDiscontinuityTime: getproc_got_uint32(pktp, vbp, data->mip6NodeCtrDiscontinuityTime, VT_TIMETICKS); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6NodeTrafficEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6NodeTrafficEntry data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((data = mip6NodeTrafficEntry_lookup(tcount, tlist)) == 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6NodeTrafficEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6NodeTrafficEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { #define mip6NodeTrafficEntry_INSTANCE_LEN 257 /* !!! */ STRUCT_mip6NodeTrafficEntry *data; /* !!! */ STRUCT_mip6NodeTrafficEntry *best; /* !!! */ OIDC_T tmp_inst[mip6NodeTrafficEntry_INSTANCE_LEN]; OIDC_T best_inst[mip6NodeTrafficEntry_INSTANCE_LEN]; int i; int error; unsigned inst_len; unsigned best_inst_len; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ best = 0; /* This loop needs to iterate over each entry in your table */ for (data = mip6NodeTrafficEntry_first(); data; /* !!! */ data = mip6NodeTrafficEntry_int_next(data)) { /* !!! */ inst_len = mip6NodeTrafficEntry_build_instance(data, tmp_inst); if ((oidcmp2(inst_len, tmp_inst, tcount, tlist) > 0) && ((!best || (oidcmp2(inst_len, tmp_inst, inst_len, best_inst) < 0)))) { best = data; for (i = 0; i < inst_len; i++) best_inst[i] = tmp_inst[i]; best_inst_len = inst_len; } } if (best) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6NodeTrafficEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, best)) == NO_ERROR) nextproc_next_instance(pktp, vbp, best_inst_len, best_inst); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } #endif /* * Method routines for the mip6MnHomeAddressTable: * * mip6MnHomeAddressType -- not-accessible * The InetAddressType of the mip6MnHomeAddress that * follows. * * mip6MnHomeAddress -- not-accessible * A unicast routable address assigned to the mobile * node. This is used as the 'permanent address' of the * mobile node in the sense that it remains unchanged * regardless of the mobile node's current point of * attachment. If mobile node doesn't have a home * address assigned yet, then this object will take the * default 'unspecified' value ::0. * * The type of the address represented by this object * is specified by the corresponding * mip6MnHomeAddressType object. * * mip6MnHomeAddressState -- read-only * This object indicates the state of the mobile node: * unknown -- The state of the mobile node * cannot be determined. * home -- mobile node is on the home network. * registered -- mobile node is on a foreign network * and is registered with the home * agent. * pending -- mobile node has sent registration * request to the home agent and is * waiting for the reply. * isolated -- mobile node is isolated from network, * i.e., it is not in its home network, * it is not registered, and no * registration ack is pending. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6MnHomeAddressEntry_get and mip6MnHomeAddressEntry_next. * You need to replace the type STRUCT_mip6MnHomeAddressEntry with something * appropriate to your system. */ #define mip6MnHomeAddressEntry_INSTANCE_LEN 257 static int mip6MnHomeAddressEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6MnHomeAddressEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6MnHomeAddressState: /* Values: * unknown(1) = VAL_mip6MnHomeAddressState_unknown * home(2) = VAL_mip6MnHomeAddressState_home * registered(3) = VAL_mip6MnHomeAddressState_registered * pending(4) = VAL_mip6MnHomeAddressState_pending * isolated(5) = VAL_mip6MnHomeAddressState_isolated */ { Ip_s32 mip6MnHomeAddressState = 0; IPMIP6MN_MIB_GET(mip6MnHomeAddressState, MnHomeAddressEntry); getproc_got_int32(pktp, vbp, mip6MnHomeAddressState); /* !!! */ break; } default: return GEN_ERR; } return NO_ERROR; } static int mip6MnHomeAddressEntry_lookup(int tcount, OIDC_T *tlist, OIDC_T *best, boolean_t getnext) { Ip_s32 mip6MnHomeAddressType = 0; Ip_u8 *mip6MnHomeAddress = (Ip_u8 *)""; Ip_s32 mip6MnHomeAddress_len = 0; Ip_s32 mip6MnHomeAddressTable_num_entries = 0; Ip_s32 i, bestindex = -1; char buf[mip6MnHomeAddressEntry_INSTANCE_LEN]; /* * * mip6MnHomeAddressTable_num_entries := Number_Of_Entries_In_Current_mip6MnHomeAddressTable */ mip6MnHomeAddressTable_num_entries = 1; for(i=0; i 0) { if(bestindex == -1 || oidcmp2 (len, buf,len, best) < 0) { ipcom_strcpy(best, buf); bestindex = i; } } } else { if(lex == 0) { ipcom_strcpy(best, buf); bestindex = i; break; } } #endif } return bestindex; } void mip6MnHomeAddressEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { Ipmip6_io_network_info_t data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((ipmip6mn_mib_get(&data)) != IP_TRUE) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6MnHomeAddressEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6MnHomeAddressEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { OIDC_T best[mip6MnHomeAddressEntry_INSTANCE_LEN]; int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); mip6MnHomeAddressEntry_lookup(tcount,tlist,best,TRUE); if (best[0]) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6MnHomeAddressEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, NULL)) == NO_ERROR) nextproc_next_instance(pktp, vbp, mip6MnHomeAddressEntry_INSTANCE_LEN, best); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } /* * Method routines for the mip6MnConf variables: * * mip6MnDiscoveryRequests -- read-only * Total number of ICMP Dynamic Home Agent Address * Discovery Requests sent by the mobile node. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnDiscoveryReplies -- read-only * Total number of ICMP Dynamic Home Agent Address * Discovery Replies received by the mobile node. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnDiscoveryTimeouts -- read-only * Total number of ICMP Dynamic Home Agent Address * Discovery Requests that timed out. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnPrefixSolicitationsSent -- read-only * Total number of ICMP Mobile Prefix Solicitations * sent by the mobile node. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnPrefixAdvsRecd -- read-only * Total number of ICMP Mobile Prefix Advertisements * received by the mobile node. This will include the * ICMP Mobile Prefix Advertisements that failed the * validity checks. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnPrefixAdvsIgnored -- read-only * Total number of Mobile Prefix Advertisements * discarded by the validity check. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnMovedToFN -- read-only * Number of times the mobile node has detected * movement to a foreign network from another * foreign network or from the home network, has * reconstructed its care-of address and has initiated * the care-of address registration process. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnMovedToHN -- read-only * Number of times the mobile node has detected * movement from a foreign network to its home * network. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6MnConf_get and mip6MnConf_next. * You need to replace the type STRUCT_mip6MnConf with something * appropriate to your system. */ static int mip6MnConf_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6MnConf *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6MnDiscoveryRequests: getproc_got_uint32(pktp, vbp, data->ini_mip6MnConf.mip6MnDiscoveryRequests, VT_COUNTER); /* !!! */ break; case LEAF_mip6MnDiscoveryReplies: getproc_got_uint32(pktp, vbp, data->ini_mip6MnConf.mip6MnDiscoveryReplies, VT_COUNTER); /* !!! */ break; case LEAF_mip6MnDiscoveryTimeouts: getproc_got_uint32(pktp, vbp, data->ini_mip6MnConf.mip6MnDiscoveryTimeouts, VT_COUNTER); /* !!! */ break; case LEAF_mip6MnPrefixSolicitationsSent: getproc_got_uint32(pktp, vbp, data->ini_mip6MnConf.mip6MnPrefixSolicitationsSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6MnPrefixAdvsRecd: getproc_got_uint32(pktp, vbp, data->ini_mip6MnConf.mip6MnPrefixAdvsRecd, VT_COUNTER); /* !!! */ break; case LEAF_mip6MnPrefixAdvsIgnored: getproc_got_uint32(pktp, vbp, data->ini_mip6MnConf.mip6MnPrefixAdvsIgnored, VT_COUNTER); /* !!! */ break; case LEAF_mip6MnMovedToFN: getproc_got_uint32(pktp, vbp, data->ini_mip6MnConf.mip6MnMovedToFN, VT_COUNTER); /* !!! */ break; case LEAF_mip6MnMovedToHN: getproc_got_uint32(pktp, vbp, data->ini_mip6MnConf.mip6MnMovedToHN, VT_COUNTER); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6MnConf_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { Ipmip6_io_network_info_t data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* check that the instance is exactly .0 */ if (!((tcount == 1) && (*tlist == 0))) for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); /* grab the actual data for this variable. this lookup routine will * probably have to be changed for your system. for scalar variables * there might not even be any lookup routine. */ else if ((ipmip6mn_mib_get(&data)) != IP_TRUE) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_error(pktp, vbp, GEN_ERR); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6MnConf_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6MnConf_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { Ipmip6_io_network_info_t data; /* !!! */ OIDC_T instance = 0; /* the only time there's a next for a scalar is if we're given * no instance at all. */ if (tcount != 0) nextproc_no_next(pktp, vbp); /* grab the data for these variables. you'll probably have to change * this lookup routine for your system. for scalar variables there * might not even be any lookup routine. */ else if ((ipmip6mn_mib_get(&data)) != IP_TRUE) /* !!! */ getproc_error(pktp, vbp, GEN_ERR); else { /* find all the varbinds in this group and retrieve their * values from the same data structure */ for (group_by_getproc_and_instance(pktp, vbp, tcount, tlist); vbp; vbp = vbp->vb_link) { nextproc_next_instance(pktp, vbp, 1, &instance); mip6MnConf_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data); } } } /* * Method routines for the mip6MnBLTable: * * mip6MnBLNodeAddressType -- not-accessible * The InetAddressType of the mip6MnBLNodeAddress * that follows. * * mip6MnBLNodeAddress -- not-accessible * The address of the agent as used in the destination * address of the Binding Update. The agent * may be a home agent or a correspondent node. * * The type of the address represented by this object * is specified by the corresponding * mip6MnBLNodeAddressType object. * * * mip6MnBLCOAType -- read-only * The InetAddressType of the mip6MnBLCOA that follows. * * mip6MnBLCOA -- read-only * Care-of address that the mobile node intends to * register in the Binding Update request. * * The type of the address represented by this object * is specified by the corresponding mip6MnBLCOAType * object. * * mip6MnBLLifeTimeRequested -- read-only * The lifetime requested by the mobile node (in * seconds) in the Binding Update. * * mip6MnBLLifeTimeGranted -- read-only * The lifetime granted to the mobile node for this * binding. This field will be inaccessible if the * Binding Update request has not been accepted. * The lifetime remaining (lR) can be calculated using * the current time (cT), mip6MnBLAcceptedTime (aT) and * mip6MnBLLifeTimeGranted (lG) as follows: * lR = lG - (cT - aT). * When lR is zero, this entry will be deleted from the * Binding Update List and consequently from this * table. * * mip6MnBLMaxSeq -- read-only * The maximum value of the Sequence Number field sent * in previous Binding Updates to this destination. * * mip6MnBLTimeSent -- read-only * The time when the last (re-)transmission occurred. * * mip6MnBLAccepted -- read-only * true(1) if the mobile node has received a * binding acknowledgment indicating that service has * been accepted (status code 0 or 1); false(2) * otherwise. false(2) implies that the registration * is still pending. * * mip6MnBLAcceptedTime -- read-only * The time at which the mobile node receives a binding * acknowledgment indicating that Binding Update has * been accepted (status code 0 or 1); * This object will be inaccessible if the Binding * Update request is still pending. * * mip6MnBLRetransmissions -- read-only * The number of Binding Update retransmissions. * * mip6MnBLDontSendBUFlag -- read-only * true(1) indicates that future binding updates * will not be sent to mip6MnBLNodeAddress. * false(2) implies that binding updates will be * sent to mip6MnBLNodeAddress. * The mobile node sets this flag in the when it * receives an ICMP Parameter Problem, Code 1, * error message in response to a return * routability message or Binding Update sent to * mip6MnBLNodeAddress. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6MnBLEntry_get and mip6MnBLEntry_next. * You need to replace the type STRUCT_mip6MnBLEntry with something * appropriate to your system. */ #if 1 #define mip6MnBLEntry_INSTANCE_LEN 514 static int mip6MnBLEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6MnBLEntry *data) /* !!! */ { Ip_s32 mip6MnBLCOAType = 2; switch(lastmatch) { case LEAF_mip6MnBLCOAType: /* Values: * unknown(0) = VAL_mip6MnBLCOAType_unknown * ipv4(1) = VAL_mip6MnBLCOAType_ipv4 * ipv6(2) = VAL_mip6MnBLCOAType_ipv6 * ipv4z(3) = VAL_mip6MnBLCOAType_ipv4z * ipv6z(4) = VAL_mip6MnBLCOAType_ipv6z * dns(16) = VAL_mip6MnBLCOAType_dns */ getproc_got_int32(pktp, vbp, mip6MnBLCOAType); /* !!! */ break; case LEAF_mip6MnBLCOA: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ { Ip_u8 *mip6MnBLCOA = (Ip_u8 *)""; ALENGTH_T len = 0; /*IPMIP6MN_MIB_ntop(mip6MnBLCOA, len, MnBLTable)*/ getproc_got_octet_string(pktp, vbp, len, mip6MnBLCOA, VT_STRING); /* !!! */ break;} case LEAF_mip6MnBLLifeTimeRequested: {Ip_u32 mip6MnBLLifeTimeRequested = 0; IPMIP6MN_MIB_GET(mip6MnBLLifeTimeRequested, MnBLTable) getproc_got_uint32(pktp, vbp, mip6MnBLLifeTimeRequested, VT_GAUGE); /* !!! */ break;} case LEAF_mip6MnBLLifeTimeGranted: {Ip_u32 mip6MnBLLifeTimeGranted = 0; IPMIP6MN_MIB_GET(mip6MnBLLifeTimeGranted, MnBLTable) getproc_got_uint32(pktp, vbp, mip6MnBLLifeTimeGranted, VT_GAUGE); /* !!! */ break;} case LEAF_mip6MnBLMaxSeq: {Ip_u32 mip6MnBLMaxSeq = 0; IPMIP6MN_MIB_GET(mip6MnBLMaxSeq, MnBLTable) getproc_got_uint32(pktp, vbp, mip6MnBLMaxSeq, VT_GAUGE); /* !!! */ break;} case LEAF_mip6MnBLTimeSent: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ {Ip_u8 *mip6MnBLTimeSent = (Ip_u8 *)""; ALENGTH_T len = 0; IPMIP6MN_MIB_strftime(mip6MnBLTimeSent, len, MnBLTable) getproc_got_octet_string(pktp, vbp, len, mip6MnBLTimeSent, VT_STRING); /* !!! */ break;} case LEAF_mip6MnBLAccepted: /* Values: * true(1) = VAL_mip6MnBLAccepted_true * false(2) = VAL_mip6MnBLAccepted_false */ {Ip_s32 mip6MnBLAccepted = 0; IPMIP6MN_MIB_GET(mip6MnBLAccepted, MnBLTable) getproc_got_int32(pktp, vbp, mip6MnBLAccepted); /* !!! */ break;} case LEAF_mip6MnBLAcceptedTime: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ {Ip_u8 *mip6MnBLAcceptedTime = (Ip_u8 *)""; ALENGTH_T len = 0; IPMIP6MN_MIB_strftime(mip6MnBLAcceptedTime, len, MnBLTable) getproc_got_octet_string(pktp, vbp, len, mip6MnBLAcceptedTime, VT_STRING); /* !!! */ break;} case LEAF_mip6MnBLRetransmissions: {Ip_u32 mip6MnBLRetransmissions = 0; IPMIP6MN_MIB_GET(mip6MnBLRetransmissions, MnBLTable) getproc_got_uint32(pktp, vbp, mip6MnBLRetransmissions, VT_GAUGE); /* !!! */ break;} case LEAF_mip6MnBLDontSendBUFlag: /* Values: * true(1) = VAL_mip6MnBLDontSendBUFlag_true * false(2) = VAL_mip6MnBLDontSendBUFlag_false */ {Ip_s32 mip6MnBLDontSendBUFlag = 0; IPMIP6MN_MIB_GET(mip6MnBLDontSendBUFlag, MnBLTable) getproc_got_int32(pktp, vbp, mip6MnBLDontSendBUFlag); break;} default: return GEN_ERR; } return NO_ERROR; } static int mip6MnBLEntry_lookup(int tcount, OIDC_T *tlist, OIDC_T *best, boolean_t getnext) { Ip_s32 mip6MnHomeAddressType = 0; Ip_u8 *mip6MnHomeAddress = (Ip_u8 *)""; Ip_s32 mip6MnHomeAddress_len = 0; Ip_s32 mip6MnBLNodeAddressType = 0; Ip_u8 *mip6MnBLNodeAddress = (Ip_u8 *)""; Ip_s32 mip6MnBLNodeAddress_len = 0; Ip_s32 mip6MnBLTable_num_entries = 0; Ip_s32 i; char buf[mip6MnBLEntry_INSTANCE_LEN]; /* * * mip6MnBLTable_num_entries := Number_Of_Entries_In_Current_mip6MnBLTable */ mip6MnBLTable_num_entries = 1; for(i=0; i 0) { if(bestindex == -1 || strcmp(buf,best) < 0) { ipcom_strcpy(best, buf); bestindex = i; } } } else { if(lex == 0) { ipcom_strcpy(best, buf); bestindex = i; break; } } #endif } return 0; } void mip6MnBLEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { Ipmip6_io_network_info_t data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((ipmip6mn_mib_get(&data)) != IP_TRUE) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6MnBLEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6MnBLEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { OIDC_T best[mip6MnBLEntry_INSTANCE_LEN]; int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ mip6MnBLEntry_lookup(tcount,tlist,best,TRUE); if (best[0]) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6MnBLEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, NULL)) == NO_ERROR) nextproc_next_instance(pktp, vbp, mip6MnBLEntry_INSTANCE_LEN, best); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } #endif /* * Method routines for the mip6MnRegnCounters variables: * * mip6MnMobilityMessagesSent -- read-only * The total number of mobility messages, i.e., IPv6 * datagrams with Mobility Header, sent by the mobile * node. There are 3 types of mobility messages, viz., * Home Test Init, Care-of Test Init, and Binding * Updates, that are sent by mobile nodes. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnMobilityMessagesRecd -- read-only * The total number of mobility messages, i.e., IPv6 * datagrams with Mobility Header, received by the * mobile node. There are 5 types of mobility * messages, viz., Home Test, Care-of Test, Binding * Acknowledgment, Binding Refresh Request, and Binding * Error, that are sent to mobile nodes. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnBUsToHA -- read-only * Total number of Binding Updates sent to the mobile * node's home agent(s). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnBUAcksFromHA -- read-only * Total number of valid binding acknowledgments * received from the mobile node's home agent(s). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnBUsToCN -- read-only * Total number of Binding Updates sent to * correspondent nodes by the mobile node. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnBUAcksFromCN -- read-only * Total number of valid Binding Update acks * received from all the correspondent nodes. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnBindingErrorsFromCN -- read-only * Total number of Binding Error messages received * by mobile node from CN. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnICMPErrorsRecd -- read-only * Total number of ICMP Error messages of type ICMP * Parameter Problem, Code 1 or Code 2, received by * the mobile node from a correspondent node in * response to a return routability procedure, a * Binding Update, or a packet with the Home Address * option. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6MnBRRequestsRecd -- read-only * The total number of Binding Refresh requests * received by the mobile node from correspondent * nodes. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6MnRegnCounters_get and mip6MnRegnCounters_next. * You need to replace the type STRUCT_mip6MnRegnCounters with something * appropriate to your system. */ static int mip6MnRegnCounters_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6MnRegnCounters *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6MnMobilityMessagesSent: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnMobilityMessagesSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6MnMobilityMessagesRecd: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnMobilityMessagesRecd, VT_COUNTER); break; case LEAF_mip6MnBUsToHA: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnBUsToHA, VT_COUNTER); break; case LEAF_mip6MnBUAcksFromHA: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnBUAcksFromHA, VT_COUNTER); break; case LEAF_mip6MnBUsToCN: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnBUsToCN, VT_COUNTER); break; case LEAF_mip6MnBUAcksFromCN: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnBUAcksFromCN, VT_COUNTER); break; case LEAF_mip6MnBindingErrorsFromCN: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnBindingErrorsFromCN, VT_COUNTER); break; case LEAF_mip6MnICMPErrorsRecd: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnICMPErrorsRecd, VT_COUNTER); break; case LEAF_mip6MnBRRequestsRecd: getproc_got_uint32(pktp, vbp, data->ini_mip6MnRegnCounters.mip6MnBRRequestsRecd, VT_COUNTER); break; default: return GEN_ERR; } return NO_ERROR; } void mip6MnRegnCounters_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { Ipmip6_io_network_info_t data; /* n!!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* check that the instance is exactly .0 */ if (!((tcount == 1) && (*tlist == 0))) for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); /* grab the actual data for this variable. this lookup routine will * probably have to be changed for your system. for scalar variables * there might not even be any lookup routine. */ else if ((ipmip6mn_mib_get(&data)) != IP_TRUE) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_error(pktp, vbp, GEN_ERR); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6MnRegnCounters_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6MnRegnCounters_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { Ipmip6_io_network_info_t data; /* !!! */ OIDC_T instance = 0; /* the only time there's a next for a scalar is if we're given * no instance at all. */ if (tcount != 0) nextproc_no_next(pktp, vbp); /* grab the data for these variables. you'll probably have to change * this lookup routine for your system. for scalar variables there * might not even be any lookup routine. */ else if ((ipmip6mn_mib_get(&data)) != IP_TRUE) /* !!! */ getproc_error(pktp, vbp, GEN_ERR); else { /* find all the varbinds in this group and retrieve their * values from the same data structure */ for (group_by_getproc_and_instance(pktp, vbp, tcount, tlist); vbp; vbp = vbp->vb_link) { nextproc_next_instance(pktp, vbp, 1, &instance); mip6MnRegnCounters_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data); } } } #if 0 /* * Method routines for the mip6CnGlobalStats variables: * * mip6CnHomeTestInitsRecd -- read-only * Total number of Home Test Init messages received. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnHomeTestsSent -- read-only * Total number of Home Test messages sent. If a Home * Test Init message is found to be valid, a Home Test * message will be generated and sent. Otherwise the * Home Test message is silently discarded. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnCareOfTestInitsRecd -- read-only * Total number of Care-of Test Init messages received. * * mip6CnCareOfTestsSent -- read-only * Total number of Care-of Test messages sent. If a * Care-of Test Init message is found to be valid, a * Care-of Test message will be generated and sent. * Otherwise the Care-of Test message is silently * discarded. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnBUsRecd -- read-only * Total number of Binding Updates received by the * correspondent node from mobile nodes. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnBUAcksSent -- read-only * Total number of acknowledgments sent by the * correspondent node for the Binding Updates received. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnBRsSent -- read-only * Total number of Binding Refresh Request messages * sent by the correspondent node. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnBindingErrors -- read-only * Total number of Binding Error messages sent by the * correspondent node to the mobile node. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnBUsAccepted -- read-only * Total number of Binding Updates accepted by the * correspondent node. If a Binding Acknowledgment * message is sent for the Binding Update request, * the Status code field in the message will have * a value less than 128. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnBUsRejected -- read-only * Total number of Binding Update requests rejected * by the correspondent node. If a Binding * Acknowledgment message has been sent for the Binding * Update request, the Status code field in the * message will have a value greater than or equal to * 128. Otherwise the Binding Update request will be * silently discarded. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnReasonUnspecified -- read-only * Total number of Binding Update requests rejected by * the correspondent node with status code in the * Binding Acknowledgment message indicating 'reason * unspecified' (Code 128). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnInsufficientResource -- read-only * Total number of Binding Update requests rejected by * the correspondent node with status code in the * Binding Acknowledgment message indicating * 'insufficient resources' (Code 130). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnHomeRegnNotSupported -- read-only * Total number of Binding Update requests rejected by * correspondent node with status code in the Binding * Acknowledgment message indicating 'home registration * not supported' (Code 131). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnSeqNumberOutOfWindow -- read-only * Total number of Binding Updates rejected by * correspondent node with status code in the Binding * Acknowledgment message indicating 'sequence number * out of window' (Code 135). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnExpiredHomeNonceIndex -- read-only * The total number of Binding Updates rejected by * correspondent node with status code in the Binding * Acknowledgment message indicating 'expired home * nonce index' (Code 136). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnExpiredCareOfNonceIndex -- read-only * The total number of Binding Updates rejected by * correspondent node with status code in the Binding * Acknowledgment message indicating 'expired * care-of nonce index' (Code 137). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnExpiredNonce -- read-only * The total number of Binding Updates rejected by * correspondent node with status code in the Binding * Acknowledgment message indicating 'expired nonces' * (Code 138), i.e., the correspondent node no longer * recognizes the Home Nonce Index value and the * Care-of Nonce Index value. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6CnRegTypeChangeDisallowed -- read-only * The total number of Binding Updates rejected by * correspondent node with status code in the Binding * Acknowledgment message indicating 'registration * type change disallowed' (Code 139), i.e., a binding * already exists for the given home address and the * home registration flag has a different value than * the Home Registration (H) bit in the Binding Update. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6CnGlobalStats_get and mip6CnGlobalStats_next. * You need to replace the type STRUCT_mip6CnGlobalStats with something * appropriate to your system. */ static int mip6CnGlobalStats_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6CnGlobalStats *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6CnHomeTestInitsRecd: getproc_got_uint32(pktp, vbp, data->mip6CnHomeTestInitsRecd, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnHomeTestsSent: getproc_got_uint32(pktp, vbp, data->mip6CnHomeTestsSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnCareOfTestInitsRecd: getproc_got_uint32(pktp, vbp, data->mip6CnCareOfTestInitsRecd, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnCareOfTestsSent: getproc_got_uint32(pktp, vbp, data->mip6CnCareOfTestsSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnBUsRecd: getproc_got_uint32(pktp, vbp, data->mip6CnBUsRecd, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnBUAcksSent: getproc_got_uint32(pktp, vbp, data->mip6CnBUAcksSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnBRsSent: getproc_got_uint32(pktp, vbp, data->mip6CnBRsSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnBindingErrors: getproc_got_uint32(pktp, vbp, data->mip6CnBindingErrors, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnBUsAccepted: getproc_got_uint32(pktp, vbp, data->mip6CnBUsAccepted, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnBUsRejected: getproc_got_uint32(pktp, vbp, data->mip6CnBUsRejected, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnReasonUnspecified: getproc_got_uint32(pktp, vbp, data->mip6CnReasonUnspecified, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnInsufficientResource: getproc_got_uint32(pktp, vbp, data->mip6CnInsufficientResource, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnHomeRegnNotSupported: getproc_got_uint32(pktp, vbp, data->mip6CnHomeRegnNotSupported, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnSeqNumberOutOfWindow: getproc_got_uint32(pktp, vbp, data->mip6CnSeqNumberOutOfWindow, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnExpiredHomeNonceIndex: getproc_got_uint32(pktp, vbp, data->mip6CnExpiredHomeNonceIndex, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnExpiredCareOfNonceIndex: getproc_got_uint32(pktp, vbp, data->mip6CnExpiredCareOfNonceIndex, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnExpiredNonce: getproc_got_uint32(pktp, vbp, data->mip6CnExpiredNonce, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnRegTypeChangeDisallowed: getproc_got_uint32(pktp, vbp, data->mip6CnRegTypeChangeDisallowed, VT_COUNTER); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6CnGlobalStats_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6CnGlobalStats data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* check that the instance is exactly .0 */ if (!((tcount == 1) && (*tlist == 0))) for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); /* grab the actual data for this variable. this lookup routine will * probably have to be changed for your system. for scalar variables * there might not even be any lookup routine. */ else if (mip6CnGlobalStats_lookup(&data) != 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_error(pktp, vbp, GEN_ERR); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6CnGlobalStats_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6CnGlobalStats_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6CnGlobalStats data; /* !!! */ OIDC_T instance = 0; /* the only time there's a next for a scalar is if we're given * no instance at all. */ if (tcount != 0) nextproc_no_next(pktp, vbp); /* grab the data for these variables. you'll probably have to change * this lookup routine for your system. for scalar variables there * might not even be any lookup routine. */ else if (mip6CnGlobalStats_lookup(&data)) /* !!! */ getproc_error(pktp, vbp, GEN_ERR); else { /* find all the varbinds in this group and retrieve their * values from the same data structure */ for (group_by_getproc_and_instance(pktp, vbp, tcount, tlist); vbp; vbp = vbp->vb_link) { nextproc_next_instance(pktp, vbp, 1, &instance); mip6CnGlobalStats_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data); } } } /* * Method routines for the mip6CnCounterTable: * * mip6CnBURequestsAccepted -- read-only * Total number of Binding Update requests from the * mobile node accepted by the correspondent node. * If Binding Acknowledgment messages are sent, then * the status code in the message will have a value * less than 128. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CnCtrDiscontinuityTime. * * mip6CnBURequestsRejected -- read-only * Total number of Binding Update requests from the * mobile node that have been rejected by the * correspondent node. This includes the Binding Update * requests for which a Binding Acknowledgment message * has been sent with status code value greater than or * equal to 128 and the Binding Acknowledgment requests * that have been silently discarded. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CnCtrDiscontinuityTime. * * mip6CnBCEntryCreationTime -- read-only * The time when the current Binding Cache entry was * created for the mobile node. * * mip6CnBUAcceptedTime -- read-only * The time at which the last Binding Update was * accepted by the correspondent node and the * corresponding Binding Cache entry was updated. * * mip6CnBURejectionTime -- read-only * The time at which the last Binding Update message * was rejected by the correspondent node. * If there have been no rejections, then this object * will be inaccessible. * * mip6CnBURejectionCode -- read-only * If a Binding Acknowledgment is sent to the mobile * node, this is the status code (> 128) that is * returned in the Binding Acknowledgment. * In case a Binding Acknowledgment is not sent to * the mobile node, then this will be the value * of the Status code that corresponds to the reason * of the rejection. If there have been no * rejections, then this object will be inaccessible. * * mip6CnCtrDiscontinuityTime -- read-only * The value of sysUpTime on the most recent occasion * at which any one or more of counters in this row, * viz., instances of 'mip6CnBURequestsAccepted' and * 'mip6CnBURequestsRejected', suffered a discontinuity. * If no such discontinuities have occurred since the * last re-initialization of the local management * subsystem, then this object will have a zero value. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6CnCounterEntry_get and mip6CnCounterEntry_next. * You need to replace the type STRUCT_mip6CnCounterEntry with something * appropriate to your system. */ static int mip6CnCounterEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6CnCounterEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6CnBURequestsAccepted: getproc_got_uint32(pktp, vbp, data->mip6CnBURequestsAccepted, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnBURequestsRejected: getproc_got_uint32(pktp, vbp, data->mip6CnBURequestsRejected, VT_COUNTER); /* !!! */ break; case LEAF_mip6CnBCEntryCreationTime: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6CnBCEntryCreationTime), data->mip6CnBCEntryCreationTime, VT_STRING); /* !!! */ break; case LEAF_mip6CnBUAcceptedTime: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6CnBUAcceptedTime), data->mip6CnBUAcceptedTime, VT_STRING); /* !!! */ break; case LEAF_mip6CnBURejectionTime: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6CnBURejectionTime), data->mip6CnBURejectionTime, VT_STRING); /* !!! */ break; case LEAF_mip6CnBURejectionCode: /* Values: * reasonUnspecified(1) = VAL_mip6CnBURejectionCode_reasonUnspecified * admProhibited(2) = VAL_mip6CnBURejectionCode_admProhibited * insufficientResource(3) = VAL_mip6CnBURejectionCode_insufficientResource * homeRegistrationNotSupported(4) = VAL_mip6CnBURejectionCode_homeRegistrationNotSupported * notHomeSubnet(5) = VAL_mip6CnBURejectionCode_notHomeSubnet * notHomeAgentForThisMobileNode(6) = VAL_mip6CnBURejectionCode_notHomeAgentForThisMobileNode * duplicateAddressDetectionFailed(7) = VAL_mip6CnBURejectionCode_duplicateAddressDetectionFailed * sequenceNumberOutOfWindow(8) = VAL_mip6CnBURejectionCode_sequenceNumberOutOfWindow * expiredHomeNonceIndex(9) = VAL_mip6CnBURejectionCode_expiredHomeNonceIndex * expiredCareofNonceIndex(10) = VAL_mip6CnBURejectionCode_expiredCareofNonceIndex * expiredNonces(11) = VAL_mip6CnBURejectionCode_expiredNonces * registrationTypeChangeDisallowed(12) = VAL_mip6CnBURejectionCode_registrationTypeChangeDisallowed */ getproc_got_int32(pktp, vbp, data->mip6CnBURejectionCode); /* !!! */ break; case LEAF_mip6CnCtrDiscontinuityTime: getproc_got_uint32(pktp, vbp, data->mip6CnCtrDiscontinuityTime, VT_TIMETICKS); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6CnCounterEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6CnCounterEntry data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((data = mip6CnCounterEntry_lookup(tcount, tlist)) == 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6CnCounterEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6CnCounterEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { #define mip6CnCounterEntry_INSTANCE_LEN 257 /* !!! */ STRUCT_mip6CnCounterEntry *data; /* !!! */ STRUCT_mip6CnCounterEntry *best; /* !!! */ OIDC_T tmp_inst[mip6CnCounterEntry_INSTANCE_LEN]; OIDC_T best_inst[mip6CnCounterEntry_INSTANCE_LEN]; int i; int error; unsigned inst_len; unsigned best_inst_len; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ best = 0; /* This loop needs to iterate over each entry in your table */ for (data = mip6CnCounterEntry_first(); data; /* !!! */ data = mip6CnCounterEntry_int_next(data)) { /* !!! */ inst_len = mip6CnCounterEntry_build_instance(data, tmp_inst); if ((oidcmp2(inst_len, tmp_inst, tcount, tlist) > 0) && ((!best || (oidcmp2(inst_len, tmp_inst, inst_len, best_inst) < 0)))) { best = data; for (i = 0; i < inst_len; i++) best_inst[i] = tmp_inst[i]; best_inst_len = inst_len; } } if (best) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6CnCounterEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, best)) == NO_ERROR) nextproc_next_instance(pktp, vbp, best_inst_len, best_inst); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } /* * Method routines for the mip6HaConfTable: * * mip6HaAdvPreference -- read-write * The preference value for the home agent to * be used in the Router Advertisements. Higher * value denotes greater preference. * * mip6HaAdvLifetime -- read-write * The lifetime value for the home agent to be * used in the Router Advertisements. * * mip6HaPrefixAdv -- read-write * Indicates whether the home agent should support * sending of the ICMP Mobile Prefix Advertisements. * If it is disabled(2), the home agent will not * send ICMP Mobile Prefix Advertisements to the * mobile nodes. * The state can be changed from enabled(1) to * disabled(2) and vice versa by operator * intervention. * Causing the state to change from enabled(1) to * disabled(2) will result in the home agent * disabling the Prefix advertisement function. * On the other hand, changing the status from * disabled(2) to enabled(1) will start the prefix * advertisement function. * * mip6HaPrefixSolicitation -- read-write * Indicates whether the home agent should respond * to ICMP Mobile Prefix Solicitation messages it * receives from the mobile nodes. By default, the * value will be set to enabled(1). If it is * disabled(2), the home agent will not respond to * any ICMP Mobile Prefix Solicitation messages. * The state can be changed from enabled(1) to * disabled(2), by operator intervention. Causing * the state to change from enabled(1) to * disabled(2) will result in the home agent not * responding to any ICMP Mobile Prefix * Solicitation messages it receives from the * mobile nodes. * * mip6HaMCastCtlMsgSupport -- read-write * Indicates whether the home agent should enable * support for the processing of the multicast * group membership control messages it receives * from the mobile nodes. By default, the value * will be set to enabled(1). If it is * disabled(2), the home agent will not process * any multicast group control messages it receives * from the mobile nodes. * The state can be changed from enabled(1) to * disabled(2), by operator intervention. Causing * the state to change from enabled(1) to * disabled(2) will result in the home agent * disabling the processing of the multicast group * control messages it received from the mobile * nodes. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6HaConfEntry_get and mip6HaConfEntry_next. * You need to replace the type STRUCT_mip6HaConfEntry with something * appropriate to your system. */ static int mip6HaConfEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6HaConfEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6HaAdvPreference: getproc_got_int32(pktp, vbp, data->mip6HaAdvPreference); /* !!! */ break; case LEAF_mip6HaAdvLifetime: getproc_got_int32(pktp, vbp, data->mip6HaAdvLifetime); /* !!! */ break; case LEAF_mip6HaPrefixAdv: /* Values: * enabled(1) = VAL_mip6HaPrefixAdv_enabled * disabled(2) = VAL_mip6HaPrefixAdv_disabled */ getproc_got_int32(pktp, vbp, data->mip6HaPrefixAdv); /* !!! */ break; case LEAF_mip6HaPrefixSolicitation: /* Values: * enabled(1) = VAL_mip6HaPrefixSolicitation_enabled * disabled(2) = VAL_mip6HaPrefixSolicitation_disabled */ getproc_got_int32(pktp, vbp, data->mip6HaPrefixSolicitation); /* !!! */ break; case LEAF_mip6HaMCastCtlMsgSupport: /* Values: * enabled(1) = VAL_mip6HaMCastCtlMsgSupport_enabled * disabled(2) = VAL_mip6HaMCastCtlMsgSupport_disabled */ getproc_got_int32(pktp, vbp, data->mip6HaMCastCtlMsgSupport); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6HaConfEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaConfEntry data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((data = mip6HaConfEntry_lookup(tcount, tlist)) == 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6HaConfEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6HaConfEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { #define mip6HaConfEntry_INSTANCE_LEN 1 /* !!! */ STRUCT_mip6HaConfEntry *data; /* !!! */ STRUCT_mip6HaConfEntry *best; /* !!! */ OIDC_T tmp_inst[mip6HaConfEntry_INSTANCE_LEN]; OIDC_T best_inst[mip6HaConfEntry_INSTANCE_LEN]; int i; int error; unsigned inst_len; unsigned best_inst_len; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ best = 0; /* This loop needs to iterate over each entry in your table */ for (data = mip6HaConfEntry_first(); data; /* !!! */ data = mip6HaConfEntry_int_next(data)) { /* !!! */ inst_len = mip6HaConfEntry_build_instance(data, tmp_inst); if ((oidcmp2(inst_len, tmp_inst, tcount, tlist) > 0) && ((!best || (oidcmp2(inst_len, tmp_inst, inst_len, best_inst) < 0)))) { best = data; for (i = 0; i < inst_len; i++) best_inst[i] = tmp_inst[i]; best_inst_len = inst_len; } } if (best) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6HaConfEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, best)) == NO_ERROR) nextproc_next_instance(pktp, vbp, best_inst_len, best_inst); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } void mip6HaConfEntry_test(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { /* Change the appropriate definition to 1 if you want row creation * or consistency checking. If you will never need these it's * probably best to just delete the code to make the testproc a * little more readable. */ #define mip6HaConfEntry_CONSISTENCY_CHECK 0 /* !!! */ #define mip6HaConfEntry_ROW_CREATION 0 /* !!! */ STRUCT_mip6HaConfEntry *data; /* !!! */ #if mip6HaConfEntry_CONSISTENCY_CHECK STRUCT_mip6HaConfEntry check_data; /* !!! */ #endif int error; VB_T *group_vbp; if ((data = mip6HaConfEntry_lookup(tcount, tlist)) == 0) { /* !!! */ /* optionally do row creation here !!! */ testproc_error(pktp, vbp, NO_SUCH_NAME); return; } #if mip6HaConfEntry_CONSISTENCY_CHECK /* get a copy of the data to modify for now to see if we end up with * something that's consistent after doing all the sets */ check_data = *data; #endif /* stash the looked up information here for the setproc */ vbp->vb_priv = data; /* find all the varbinds that share the same getproc and instance and * group them together. */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* now check each varbind */ for (group_vbp = vbp; group_vbp; group_vbp = group_vbp->vb_link) { /* !!! Add any value checking you wish to do. */ switch (group_vbp->vb_ml.ml_last_match) { case LEAF_mip6HaAdvPreference: { bits32_t value = VB_GET_INT32(group_vbp); /* !!! These are the ranges from the MIB. Modify if your * implementation differs. */ if (!((value >= MIN_mip6HaAdvPreference) && (value <= MAX_mip6HaAdvPreference))) { testproc_error(pktp, group_vbp, WRONG_VALUE); break; } } #if mip6HaAdvPreference_CONSISTENCY_CHECK check_data.mip6HaAdvPreference = VB_GET_INT32(group_vbp); /* !!! */ #endif testproc_good(pktp, group_vbp); break; case LEAF_mip6HaAdvLifetime: { bits32_t value = VB_GET_INT32(group_vbp); /* !!! These are the ranges from the MIB. Modify if your * implementation differs. */ if (!((value >= MIN_mip6HaAdvLifetime) && (value <= MAX_mip6HaAdvLifetime))) { testproc_error(pktp, group_vbp, WRONG_VALUE); break; } } #if mip6HaAdvLifetime_CONSISTENCY_CHECK check_data.mip6HaAdvLifetime = VB_GET_INT32(group_vbp); /* !!! */ #endif testproc_good(pktp, group_vbp); break; case LEAF_mip6HaPrefixAdv: /* !!! modify this switch to give an error for values your * implementation doesn't allow */ switch (VB_GET_INT32(group_vbp)) { case VAL_mip6HaPrefixAdv_enabled: case VAL_mip6HaPrefixAdv_disabled: break; default: testproc_error(pktp, group_vbp, WRONG_VALUE); continue; } #if mip6HaPrefixAdv_CONSISTENCY_CHECK check_data.mip6HaPrefixAdv = VB_GET_INT32(group_vbp); /* !!! */ #endif testproc_good(pktp, group_vbp); break; case LEAF_mip6HaPrefixSolicitation: /* !!! modify this switch to give an error for values your * implementation doesn't allow */ switch (VB_GET_INT32(group_vbp)) { case VAL_mip6HaPrefixSolicitation_enabled: case VAL_mip6HaPrefixSolicitation_disabled: break; default: testproc_error(pktp, group_vbp, WRONG_VALUE); continue; } #if mip6HaPrefixSolicitation_CONSISTENCY_CHECK check_data.mip6HaPrefixSolicitation = VB_GET_INT32(group_vbp); /* !!! */ #endif testproc_good(pktp, group_vbp); break; case LEAF_mip6HaMCastCtlMsgSupport: /* !!! modify this switch to give an error for values your * implementation doesn't allow */ switch (VB_GET_INT32(group_vbp)) { case VAL_mip6HaMCastCtlMsgSupport_enabled: case VAL_mip6HaMCastCtlMsgSupport_disabled: break; default: testproc_error(pktp, group_vbp, WRONG_VALUE); continue; } #if mip6HaMCastCtlMsgSupport_CONSISTENCY_CHECK check_data.mip6HaMCastCtlMsgSupport = VB_GET_INT32(group_vbp); /* !!! */ #endif testproc_good(pktp, group_vbp); break; default: testproc_error(pktp, group_vbp, GEN_ERR); return; } } #if mip6HaConfEntry_CONSISTENCY_CHECK /* check that the result of all the sets will work */ if (!error && (mip6HaConfEntry_consistency_check(&check_data) != 0)) /* !!! */ testproc_error(pktp, vbp, INCONSISTENT_VALUE); #endif } void mip6HaConfEntry_set(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaConfEntry *data = vbp->vb_priv; /* !!! */ for ( ; vbp; vbp = vbp->vb_link) { switch (vbp->vb_ml.ml_last_match) { case LEAF_mip6HaAdvPreference: data->mip6HaAdvPreference = VB_GET_INT32(vbp); /* !!! */ setproc_good(pktp, vbp); break; case LEAF_mip6HaAdvLifetime: data->mip6HaAdvLifetime = VB_GET_INT32(vbp); /* !!! */ setproc_good(pktp, vbp); break; case LEAF_mip6HaPrefixAdv: data->mip6HaPrefixAdv = VB_GET_INT32(vbp); /* !!! */ setproc_good(pktp, vbp); break; case LEAF_mip6HaPrefixSolicitation: data->mip6HaPrefixSolicitation = VB_GET_INT32(vbp); /* !!! */ setproc_good(pktp, vbp); break; case LEAF_mip6HaMCastCtlMsgSupport: data->mip6HaMCastCtlMsgSupport = VB_GET_INT32(vbp); /* !!! */ setproc_good(pktp, vbp); break; default: setproc_error(pktp, vbp, COMMIT_FAILED); return; } } } /* * Method routines for the mip6HaListTable: * * mip6HaLinkLocalAddressType -- not-accessible * The address type for the link-local address * of the home agent that follows. * * mip6HaLinkLocalAddress -- not-accessible * The link local address of the home agent. * * The type of the address represented by this object * is specified by the corresponding * mip6HaLinkLocalAddressType object. * * mip6HaPreference -- read-only * The preference value of this home agent. * Higher values indicate a more preferable home * agent. The preference value is obtained from * the preference field of the received Router * Advertisement. * * mip6HaRecvLifeTime -- read-only * The lifetime for this home agent. * * mip6HaRecvTimeStamp -- read-only * The time when the home agent advertisement was * received. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6HaListEntry_get and mip6HaListEntry_next. * You need to replace the type STRUCT_mip6HaListEntry with something * appropriate to your system. */ static int mip6HaListEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6HaListEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6HaPreference: getproc_got_int32(pktp, vbp, data->mip6HaPreference); /* !!! */ break; case LEAF_mip6HaRecvLifeTime: getproc_got_uint32(pktp, vbp, data->mip6HaRecvLifeTime, VT_GAUGE); /* !!! */ break; case LEAF_mip6HaRecvTimeStamp: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6HaRecvTimeStamp), data->mip6HaRecvTimeStamp, VT_STRING); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6HaListEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaListEntry data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((data = mip6HaListEntry_lookup(tcount, tlist)) == 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6HaListEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6HaListEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { #define mip6HaListEntry_INSTANCE_LEN 258 /* !!! */ STRUCT_mip6HaListEntry *data; /* !!! */ STRUCT_mip6HaListEntry *best; /* !!! */ OIDC_T tmp_inst[mip6HaListEntry_INSTANCE_LEN]; OIDC_T best_inst[mip6HaListEntry_INSTANCE_LEN]; int i; int error; unsigned inst_len; unsigned best_inst_len; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ best = 0; /* This loop needs to iterate over each entry in your table */ for (data = mip6HaListEntry_first(); data; /* !!! */ data = mip6HaListEntry_int_next(data)) { /* !!! */ inst_len = mip6HaListEntry_build_instance(data, tmp_inst); if ((oidcmp2(inst_len, tmp_inst, tcount, tlist) > 0) && ((!best || (oidcmp2(inst_len, tmp_inst, inst_len, best_inst) < 0)))) { best = data; for (i = 0; i < inst_len; i++) best_inst[i] = tmp_inst[i]; best_inst_len = inst_len; } } if (best) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6HaListEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, best)) == NO_ERROR) nextproc_next_instance(pktp, vbp, best_inst_len, best_inst); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } /* * Method routines for the mip6HaGlAddrTable: * * mip6HaGaAddrSeqNo -- not-accessible * The index that along with ipv6InterfaceIfIndex, * mip6HaLinkLocalAddressType, and * mip6HaLinkLocalAddress uniquely identifies this row. * * mip6HaGaGlobalAddressType -- read-only * The address type for the global address of the * home agent that follows. * * mip6HaGaGlobalAddress -- read-only * A global address of the home agent. * * The type of the address represented by this object * is specified by the corresponding * mip6HaGaGlobalAddressType object. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6HaGlAddrEntry_get and mip6HaGlAddrEntry_next. * You need to replace the type STRUCT_mip6HaGlAddrEntry with something * appropriate to your system. */ static int mip6HaGlAddrEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6HaGlAddrEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6HaGaGlobalAddressType: /* Values: * unknown(0) = VAL_mip6HaGaGlobalAddressType_unknown * ipv4(1) = VAL_mip6HaGaGlobalAddressType_ipv4 * ipv6(2) = VAL_mip6HaGaGlobalAddressType_ipv6 * ipv4z(3) = VAL_mip6HaGaGlobalAddressType_ipv4z * ipv6z(4) = VAL_mip6HaGaGlobalAddressType_ipv6z * dns(16) = VAL_mip6HaGaGlobalAddressType_dns */ getproc_got_int32(pktp, vbp, data->mip6HaGaGlobalAddressType); /* !!! */ break; case LEAF_mip6HaGaGlobalAddress: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6HaGaGlobalAddress), data->mip6HaGaGlobalAddress, VT_STRING); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6HaGlAddrEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaGlAddrEntry data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((data = mip6HaGlAddrEntry_lookup(tcount, tlist)) == 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6HaGlAddrEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6HaGlAddrEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { #define mip6HaGlAddrEntry_INSTANCE_LEN 259 /* !!! */ STRUCT_mip6HaGlAddrEntry *data; /* !!! */ STRUCT_mip6HaGlAddrEntry *best; /* !!! */ OIDC_T tmp_inst[mip6HaGlAddrEntry_INSTANCE_LEN]; OIDC_T best_inst[mip6HaGlAddrEntry_INSTANCE_LEN]; int i; int error; unsigned inst_len; unsigned best_inst_len; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ best = 0; /* This loop needs to iterate over each entry in your table */ for (data = mip6HaGlAddrEntry_first(); data; /* !!! */ data = mip6HaGlAddrEntry_int_next(data)) { /* !!! */ inst_len = mip6HaGlAddrEntry_build_instance(data, tmp_inst); if ((oidcmp2(inst_len, tmp_inst, tcount, tlist) > 0) && ((!best || (oidcmp2(inst_len, tmp_inst, inst_len, best_inst) < 0)))) { best = data; for (i = 0; i < inst_len; i++) best_inst[i] = tmp_inst[i]; best_inst_len = inst_len; } } if (best) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6HaGlAddrEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, best)) == NO_ERROR) nextproc_next_instance(pktp, vbp, best_inst_len, best_inst); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } /* * Method routines for the mip6HaAdvertisement variables: * * mip6HaAdvsRecd -- read-only * Total number of valid Router Advertisements * received with the Home Agent (H) bit set, on * all the links on which it is serving as a Home * Agent. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaAdvsSent -- read-only * Total number of unsolicited multicast Router * Advertisements sent with the Home Agent (H) bit set, * on all the links on which the router is serving as * a Home Agent. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6HaAdvertisement_get and mip6HaAdvertisement_next. * You need to replace the type STRUCT_mip6HaAdvertisement with something * appropriate to your system. */ static int mip6HaAdvertisement_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6HaAdvertisement *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6HaAdvsRecd: getproc_got_uint32(pktp, vbp, data->mip6HaAdvsRecd, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaAdvsSent: getproc_got_uint32(pktp, vbp, data->mip6HaAdvsSent, VT_COUNTER); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6HaAdvertisement_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaAdvertisement data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* check that the instance is exactly .0 */ if (!((tcount == 1) && (*tlist == 0))) for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); /* grab the actual data for this variable. this lookup routine will * probably have to be changed for your system. for scalar variables * there might not even be any lookup routine. */ else if (mip6HaAdvertisement_lookup(&data) != 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_error(pktp, vbp, GEN_ERR); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6HaAdvertisement_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6HaAdvertisement_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaAdvertisement data; /* !!! */ OIDC_T instance = 0; /* the only time there's a next for a scalar is if we're given * no instance at all. */ if (tcount != 0) nextproc_no_next(pktp, vbp); /* grab the data for these variables. you'll probably have to change * this lookup routine for your system. for scalar variables there * might not even be any lookup routine. */ else if (mip6HaAdvertisement_lookup(&data)) /* !!! */ getproc_error(pktp, vbp, GEN_ERR); else { /* find all the varbinds in this group and retrieve their * values from the same data structure */ for (group_by_getproc_and_instance(pktp, vbp, tcount, tlist); vbp; vbp = vbp->vb_link) { nextproc_next_instance(pktp, vbp, 1, &instance); mip6HaAdvertisement_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data); } } } /* * Method routines for the mip6HaGlobalStats variables: * * mip6HaHomeTestInitsRecd -- read-only * Total number of Home Test Init messages received by * the home agent. This will include Home Test Init * messages that failed the validity checks. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaHomeTestsSent -- read-only * Total number of Home Test messages sent by the * home agent. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaBUsRecd -- read-only * Total number of Binding Updates received by the * home agent. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaBUAcksSent -- read-only * Total number of Binding Acknowledgments sent * by the home agent. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaBRAdviceSent -- read-only * Total number of Binding Acknowledgments sent * by the home agent with Binding Refresh Advice * mobility option included. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaBUsAccepted -- read-only * Total number of Binding Updates accepted by this HA. * Binding Acknowledgment with status code of 0 or 1. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaPrefDiscoverReqd -- read-only * The total number of Binding Acknowledgments sent by * the home agent with status code indicating 'accepted * but prefix discovery necessary' (Code 1). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaReasonUnspecified -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'reason * unspecified' (Code 128). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaAdmProhibited -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'administratively * prohibited' (Code 129). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaInsufficientResource -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'insufficient * resources' (Code 130). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaHomeRegnNotSupported -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'home * registration not supported' (Code 131). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaNotHomeSubnet -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'not home subnet' * (Code 132). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaNotHomeAgentForThisMN -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'not home agent * for this mobile node' (Code 133). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaDupAddrDetectionFailed -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'Duplicate * Address Detection failed' (Code 134). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaSeqNumberOutOfWindow -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'sequence number * out of window' (Code 135). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaExpiredHomeNonceIndex -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'expired home * nonce index' (Code 136). * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. * * mip6HaRegTypeChangeDisallowed -- read-only * Total number of Binding Update requests rejected by * the home agent with status code in the Binding * Acknowledgment message indicating 'registration * type change disallowed' (Code 139), i.e., a binding * already exists for the given home address and the * home registration flag has a different value than * the Home Registration (H) bit in the Binding Update. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6CounterDiscontinuityTime. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6HaGlobalStats_get and mip6HaGlobalStats_next. * You need to replace the type STRUCT_mip6HaGlobalStats with something * appropriate to your system. */ static int mip6HaGlobalStats_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6HaGlobalStats *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6HaHomeTestInitsRecd: getproc_got_uint32(pktp, vbp, data->mip6HaHomeTestInitsRecd, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaHomeTestsSent: getproc_got_uint32(pktp, vbp, data->mip6HaHomeTestsSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaBUsRecd: getproc_got_uint32(pktp, vbp, data->mip6HaBUsRecd, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaBUAcksSent: getproc_got_uint32(pktp, vbp, data->mip6HaBUAcksSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaBRAdviceSent: getproc_got_uint32(pktp, vbp, data->mip6HaBRAdviceSent, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaBUsAccepted: getproc_got_uint32(pktp, vbp, data->mip6HaBUsAccepted, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaPrefDiscoverReqd: getproc_got_uint32(pktp, vbp, data->mip6HaPrefDiscoverReqd, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaReasonUnspecified: getproc_got_uint32(pktp, vbp, data->mip6HaReasonUnspecified, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaAdmProhibited: getproc_got_uint32(pktp, vbp, data->mip6HaAdmProhibited, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaInsufficientResource: getproc_got_uint32(pktp, vbp, data->mip6HaInsufficientResource, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaHomeRegnNotSupported: getproc_got_uint32(pktp, vbp, data->mip6HaHomeRegnNotSupported, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaNotHomeSubnet: getproc_got_uint32(pktp, vbp, data->mip6HaNotHomeSubnet, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaNotHomeAgentForThisMN: getproc_got_uint32(pktp, vbp, data->mip6HaNotHomeAgentForThisMN, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaDupAddrDetectionFailed: getproc_got_uint32(pktp, vbp, data->mip6HaDupAddrDetectionFailed, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaSeqNumberOutOfWindow: getproc_got_uint32(pktp, vbp, data->mip6HaSeqNumberOutOfWindow, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaExpiredHomeNonceIndex: getproc_got_uint32(pktp, vbp, data->mip6HaExpiredHomeNonceIndex, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaRegTypeChangeDisallowed: getproc_got_uint32(pktp, vbp, data->mip6HaRegTypeChangeDisallowed, VT_COUNTER); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6HaGlobalStats_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaGlobalStats data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* check that the instance is exactly .0 */ if (!((tcount == 1) && (*tlist == 0))) for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); /* grab the actual data for this variable. this lookup routine will * probably have to be changed for your system. for scalar variables * there might not even be any lookup routine. */ else if (mip6HaGlobalStats_lookup(&data) != 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_error(pktp, vbp, GEN_ERR); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6HaGlobalStats_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6HaGlobalStats_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaGlobalStats data; /* !!! */ OIDC_T instance = 0; /* the only time there's a next for a scalar is if we're given * no instance at all. */ if (tcount != 0) nextproc_no_next(pktp, vbp); /* grab the data for these variables. you'll probably have to change * this lookup routine for your system. for scalar variables there * might not even be any lookup routine. */ else if (mip6HaGlobalStats_lookup(&data)) /* !!! */ getproc_error(pktp, vbp, GEN_ERR); else { /* find all the varbinds in this group and retrieve their * values from the same data structure */ for (group_by_getproc_and_instance(pktp, vbp, tcount, tlist); vbp; vbp = vbp->vb_link) { nextproc_next_instance(pktp, vbp, 1, &instance); mip6HaGlobalStats_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data); } } } /* * Method routines for the mip6HaCounterTable: * * mip6HaBURequestsAccepted -- read-only * Total number of service requests for the mobile node * accepted by the home agent. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6HaCtrDiscontinuityTime. * * mip6HaBURequestsDenied -- read-only * Total number of service requests for the mobile node * rejected by the home agent. * Discontinuities in the value of this counter can * occur at re-initialization of the management system, * and at other times as indicated by the value of * mip6HaCtrDiscontinuityTime. * * mip6HaBCEntryCreationTime -- read-only * The time when the current Binding Cache entry was * created for the mobile node. * * mip6HaBUAcceptedTime -- read-only * The time at which the last Binding Update was * accepted by the home agent for this mobile node. * * mip6HaBURejectionTime -- read-only * The time at which the last Binding Update was * rejected by the home agent for this mobile node. * If there have been no rejections, then this object * will be inaccessible. * * mip6HaRecentBURejectionCode -- read-only * If a Binding Acknowledgment is sent to the mobile * node, this is the status code (> 128) that is * returned in the Binding Acknowledgment. * In case a Binding Acknowledgment is not sent to the * mobile node, then this will be the value of the * status code that corresponds to the reason of the * rejection. * If there have been no rejections, then this object * will be inaccessible. * * mip6HaCtrDiscontinuityTime -- read-only * The value of sysUpTime on the most recent occasion * at which any one or more of counters in this row, * viz., instances of 'mip6HaBURequestsAccepted' and * 'mip6HaBURequestsRejected', suffered a discontinuity. * If no such discontinuities have occurred since the * last re-initialization of the local management * subsystem, then this object will have a zero value. */ /* An internal routine to retrieve the values of the variables, used * by the method routines mip6HaCounterEntry_get and mip6HaCounterEntry_next. * You need to replace the type STRUCT_mip6HaCounterEntry with something * appropriate to your system. */ static int mip6HaCounterEntry_get_value(OIDC_T lastmatch, SNMP_PKT_T *pktp, VB_T *vbp, STRUCT_mip6HaCounterEntry *data) /* !!! */ { switch(lastmatch) { case LEAF_mip6HaBURequestsAccepted: getproc_got_uint32(pktp, vbp, data->mip6HaBURequestsAccepted, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaBURequestsDenied: getproc_got_uint32(pktp, vbp, data->mip6HaBURequestsDenied, VT_COUNTER); /* !!! */ break; case LEAF_mip6HaBCEntryCreationTime: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6HaBCEntryCreationTime), data->mip6HaBCEntryCreationTime, VT_STRING); /* !!! */ break; case LEAF_mip6HaBUAcceptedTime: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6HaBUAcceptedTime), data->mip6HaBUAcceptedTime, VT_STRING); /* !!! */ break; case LEAF_mip6HaBURejectionTime: /* !!! This code uses the getproc_got_octet_string() API, * which always allocates a new buffer to store the data * provided. For more control over memory allocations, * use getproc_got_string() instead. */ getproc_got_octet_string(pktp, vbp, octet_string_length(data->mip6HaBURejectionTime), data->mip6HaBURejectionTime, VT_STRING); /* !!! */ break; case LEAF_mip6HaRecentBURejectionCode: /* Values: * reasonUnspecified(1) = VAL_mip6HaRecentBURejectionCode_reasonUnspecified * admProhibited(2) = VAL_mip6HaRecentBURejectionCode_admProhibited * insufficientResource(3) = VAL_mip6HaRecentBURejectionCode_insufficientResource * homeRegistrationNotSupported(4) = VAL_mip6HaRecentBURejectionCode_homeRegistrationNotSupported * notHomeSubnet(5) = VAL_mip6HaRecentBURejectionCode_notHomeSubnet * notHomeAgentForThisMobileNode(6) = VAL_mip6HaRecentBURejectionCode_notHomeAgentForThisMobileNode * duplicateAddressDetectionFailed(7) = VAL_mip6HaRecentBURejectionCode_duplicateAddressDetectionFailed * sequenceNumberOutOfWindow(8) = VAL_mip6HaRecentBURejectionCode_sequenceNumberOutOfWindow * expiredHomeNonceIndex(9) = VAL_mip6HaRecentBURejectionCode_expiredHomeNonceIndex * expiredCareofNonceIndex(10) = VAL_mip6HaRecentBURejectionCode_expiredCareofNonceIndex * expiredNonces(11) = VAL_mip6HaRecentBURejectionCode_expiredNonces * registrationTypeChangeDisallowed(12) = VAL_mip6HaRecentBURejectionCode_registrationTypeChangeDisallowed */ getproc_got_int32(pktp, vbp, data->mip6HaRecentBURejectionCode); /* !!! */ break; case LEAF_mip6HaCtrDiscontinuityTime: getproc_got_uint32(pktp, vbp, data->mip6HaCtrDiscontinuityTime, VT_TIMETICKS); /* !!! */ break; default: return GEN_ERR; } return NO_ERROR; } void mip6HaCounterEntry_get(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { STRUCT_mip6HaCounterEntry data; /* !!! */ int error; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* use the instance (tcount and tlist) to look up the entry in the * table. This lookup routine will probably have to be changed to * suit your system. */ if ((data = mip6HaCounterEntry_lookup(tcount, tlist)) == 0) /* !!! */ for ( ; vbp; vbp = vbp->vb_link) getproc_nosuchins(pktp, vbp); else { /* retrieve all the values from the same data structure */ for ( ; vbp; vbp = vbp->vb_link) { if ((error = mip6HaCounterEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, &data)) != NO_ERROR) getproc_error(pktp, vbp, error); } } } void mip6HaCounterEntry_next(OIDC_T lastmatch, int tcount, OIDC_T *tlist, SNMP_PKT_T *pktp, VB_T *vbp) { #define mip6HaCounterEntry_INSTANCE_LEN 257 /* !!! */ STRUCT_mip6HaCounterEntry *data; /* !!! */ STRUCT_mip6HaCounterEntry *best; /* !!! */ OIDC_T tmp_inst[mip6HaCounterEntry_INSTANCE_LEN]; OIDC_T best_inst[mip6HaCounterEntry_INSTANCE_LEN]; int i; int error; unsigned inst_len; unsigned best_inst_len; /* find all the varbinds that share the same getproc and instance */ group_by_getproc_and_instance(pktp, vbp, tcount, tlist); /* generate the instance of each table entry and find the * smallest instance that's larger than tcount/tlist */ best = 0; /* This loop needs to iterate over each entry in your table */ for (data = mip6HaCounterEntry_first(); data; /* !!! */ data = mip6HaCounterEntry_int_next(data)) { /* !!! */ inst_len = mip6HaCounterEntry_build_instance(data, tmp_inst); if ((oidcmp2(inst_len, tmp_inst, tcount, tlist) > 0) && ((!best || (oidcmp2(inst_len, tmp_inst, inst_len, best_inst) < 0)))) { best = data; for (i = 0; i < inst_len; i++) best_inst[i] = tmp_inst[i]; best_inst_len = inst_len; } } if (best) { /* we found a next so get the values and set the instance for all * the varbinds for this row of this table. * NOTE: if you allow holes in the table then this code will have to * change significantly to accomodate that. */ for ( ; vbp ; vbp = vbp->vb_link) { if ((error = mip6HaCounterEntry_get_value(vbp->vb_ml.ml_last_match, pktp, vbp, best)) == NO_ERROR) nextproc_next_instance(pktp, vbp, best_inst_len, best_inst); else nextproc_error(pktp, vbp, error); } } else /* there's no more in this table */ for ( ; vbp ; vbp = vbp->vb_link ) nextproc_no_next(pktp, vbp); } #endif /* WRSNMP */ #endif #endif #endif