00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <pro/snmp.h>
00035 #include <pro/snmp_api.h>
00036
00060 CONST u_char *SnmpVarParse(CONST u_char * data, size_t * dlen, OID * name, size_t * nlen, u_char * type,
00061 u_char ** value, size_t * vlen)
00062 {
00063 CONST u_char *dp;
00064 u_char vtype = ASN_SEQUENCE | ASN_CONSTRUCTOR;
00065 size_t len = *dlen;
00066
00067
00068 if ((dp = AsnSequenceParse(data, &len, vtype)) == NULL) {
00069 return NULL;
00070 }
00071
00072 if ((dp = AsnOidParse(dp, &len, &vtype, name, nlen)) == NULL) {
00073 return NULL;
00074 }
00075
00076 if (vtype != (u_char) (ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OBJECT_ID)) {
00077 return NULL;
00078 }
00079
00080 *value = (u_char *) dp;
00081
00082 if ((dp = AsnHeaderParse(dp, &len, type)) == NULL) {
00083 return NULL;
00084 }
00085 *vlen = len;
00086 dp += *vlen;
00087 *dlen -= dp - data;
00088
00089 return dp;
00090 }
00091
00109 u_char *SnmpVarBuild(u_char * data, size_t * dlen, CONST OID * name, size_t nlen, u_char type, CONST u_char * value, size_t vlen)
00110 {
00111 size_t headerLen = 4;
00112 u_char *dp;
00113
00114
00115
00116
00117
00118 if (*dlen < headerLen) {
00119 SnmpStatsInc(SNMP_STAT_OUTTOOBIGS);
00120 return NULL;
00121 }
00122 *dlen -= headerLen;
00123 dp = data + headerLen;
00124
00125
00126 if ((dp = AsnOidBuild(dp, dlen, ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OBJECT_ID, name, nlen)) == NULL) {
00127 SnmpStatsInc(SNMP_STAT_OUTTOOBIGS);
00128 return NULL;
00129 }
00130
00131 switch (type) {
00132 case ASN_INTEGER:
00133 dp = AsnIntegerBuild(dp, dlen, type, (long *) value);
00134 break;
00135 case ASN_GAUGE:
00136 case ASN_COUNTER:
00137 case ASN_TIMETICKS:
00138 case ASN_UINTEGER:
00139 dp = AsnUnsignedBuild(dp, dlen, type, (u_long *) value);
00140 break;
00141 case ASN_COUNTER64:
00142 dp = AsnUnsigned64Build(dp, dlen, type, (UNSIGNED64 *) value);
00143 break;
00144 case ASN_OCTET_STR:
00145 case ASN_IPADDRESS:
00146 case ASN_OPAQUE:
00147 case ASN_NSAP:
00148 dp = AsnOctetStringBuild(dp, dlen, type, value, vlen);
00149 break;
00150 case ASN_OBJECT_ID:
00151 dp = AsnOidBuild(dp, dlen, type, (OID *) value, vlen / sizeof(OID));
00152 break;
00153 case ASN_NULL:
00154 dp = AsnNullBuild(dp, dlen, type);
00155 break;
00156 case ASN_BIT_STR:
00157 dp = AsnBitStringBuild(dp, dlen, type, value, vlen);
00158 break;
00159 case SNMP_NOSUCHOBJECT:
00160 case SNMP_NOSUCHINSTANCE:
00161 case SNMP_ENDOFMIBVIEW:
00162 dp = AsnNullBuild(dp, dlen, type);
00163 break;
00164 default:
00165 SnmpStatsInc(SNMP_STAT_OUTBADVALUES);
00166 return NULL;
00167 }
00168
00169 if (dp) {
00170 size_t dummyLen = (dp - data) - headerLen;
00171 AsnSequenceBuild(data, &dummyLen, ASN_SEQUENCE | ASN_CONSTRUCTOR, dummyLen);
00172 } else {
00173 SnmpStatsInc(SNMP_STAT_OUTTOOBIGS);
00174 }
00175 return dp;
00176 }