/*------------------------------------------------------------------------ * sat_get - do a get on a variable in the Address Translation Table *------------------------------------------------------------------------ */ int sat_get(struct snbentry *bindl, int numifaces) { int iface, entry, field; if (sat_match(bindl, &iface, &entry, &field, numifaces) == SYSERR) return SERR_NO_SUCH; switch(field) { case 1: /* atIfIndex */ SVTYPE(bindl) = ASN1_INT; SVINT(bindl) = iface; return SNMP_OK; case 2: /* atPhysAddress */ SVTYPE(bindl) = ASN1_OCTSTR; SVSTR(bindl) = (char *) getmem(EP_ALEN); memcpy(SVSTR(bindl), arptable[entry].ae_hwa, EP_ALEN); SVSTRLEN(bindl) = EP_ALEN; return SNMP_OK; case 3: /* atNetAddress */ SVTYPE(bindl) = ASN1_IPADDR; memcpy(&SVIPADDR(bindl), arptable[entry].ae_pra, IP_ALEN); return SNMP_OK; default: break; } return SERR_NO_SUCH; }
/*------------------------------------------------------------------------ * sud_get - perform a get on a variable in the UDP listener table *------------------------------------------------------------------------ */ int sud_get(struct snbentry *bindl, int numifaces) { int field, udpn; if (sud_match(bindl, &field, &udpn) == SYSERR) return SERR_NO_SUCH; switch (field) { case 1: /* udpLocalAddress */ { IPaddr ip_allzero = 0; SVTYPE(bindl) = ASN1_IPADDR; SVIPADDR(bindl)=ip_allzero; /* accept any, rfc 1213 */ } break; case 2: /* udpLocalPort */ SVTYPE(bindl) = ASN1_INT; SVINT(bindl) = upqs[udpn].up_port; break; default: return SERR_NO_SUCH; } return SNMP_OK; }
/*------------------------------------------------------------------------ * snm_get - do a get on a variable in the IP NetToMedia Table *------------------------------------------------------------------------ */ int snm_get(struct snbentry *bindl, int numifaces) { int iface, entry, field; if (snm_match(bindl, &iface, &entry, &field, numifaces) == SYSERR) return SERR_NO_SUCH; switch(field) { case 1: /* ipNetToMediaIfIndex */ SVTYPE(bindl) = ASN1_INT; SVINT(bindl) = iface; return SNMP_OK; case 2: /* ipNetToMediaPhysAddress */ SVTYPE(bindl) = ASN1_OCTSTR; SVSTR(bindl) = (char *) getmem(EP_ALEN); memcpy(SVSTR(bindl), arptable[entry].ae_hwa, EP_ALEN); SVSTRLEN(bindl) = EP_ALEN; return SNMP_OK; case 3: /* ipNetToMediaNetAddress */ SVTYPE(bindl) = ASN1_IPADDR; memcpy(&SVIPADDR(bindl), arptable[entry].ae_pra, IP_ALEN); return SNMP_OK; case 4: /* ipNetToMediaType */ SVTYPE(bindl) = ASN1_INT; if (arptable[entry].ae_state == AS_FREE) SVINT(bindl) = 2; /* invalid(2) */ else SVINT(bindl) = 3; /* dynamic(3) */ return SNMP_OK; default: break; } return SERR_NO_SUCH; }
/*------------------------------------------------------------------------ * parsevalue - parse the type and value of variable to set *------------------------------------------------------------------------ */ LOCAL int parsevalue(char **word, struct snbentry *bl) { if (strequ(*word, "int")) SVTYPE(bl) = ASN1_INT; else if (strequ(*word, "counter")) SVTYPE(bl) = ASN1_COUNTER; else if (strequ(*word, "gauge")) SVTYPE(bl) = ASN1_GAUGE; else if (strequ(*word, "timeticks")) SVTYPE(bl) = ASN1_TIMETICKS; else if (strequ(*word, "str")) SVTYPE(bl) = ASN1_OCTSTR; else if (strequ(*word, "objid")) SVTYPE(bl) = ASN1_OBJID; else if (strequ(*word, "ipaddr")) SVTYPE(bl) = ASN1_IPADDR; else return SYSERR; getword(word); if (**word == NULLCH) return SYSERR; switch (SVTYPE(bl)) { case ASN1_INT: case ASN1_COUNTER: case ASN1_GAUGE: case ASN1_TIMETICKS: SVINT(bl) = atoi(*word); break; case ASN1_OCTSTR: SVSTRLEN(bl) = strlen(*word); SVSTR(bl) = (char *) getmem(SVSTRLEN(bl)); memcpy(SVSTR(bl), *word, SVSTRLEN(bl)); break; case ASN1_OBJID: SVOIDLEN(bl) = dot2oid(SVOID(bl), *word); break; case ASN1_IPADDR: SVIPADDR(bl) = dot2ip(*word); break; default: return SYSERR; } return OK; }
/*------------------------------------------------------------------------ * a1writeval - convert the value of a variable into ASN.1 equivalent. *------------------------------------------------------------------------ */ int a1writeval(struct snbentry *bl, u_char *bp) { u_char *origbp; origbp = bp; *bp++ = SVTYPE(bl); switch(SVTYPE(bl)) { case ASN1_INT: case ASN1_COUNTER: case ASN1_GAUGE: case ASN1_TIMETICKS: bp += a1writeint(SVINT(bl), bp, SVTYPE(bl)); break; case ASN1_NULL: *bp++ = (u_char) 0; break; case ASN1_OCTSTR: bp += a1writelen(bp, SVSTRLEN(bl)); memcpy(bp, SVSTR(bl), SVSTRLEN(bl)); bp += SVSTRLEN(bl); freemem(SVSTR(bl), SVSTRLEN(bl)); break; case ASN1_IPADDR: *bp++ = IP_ALEN; memcpy(bp, &SVIPADDR(bl), IP_ALEN); bp += IP_ALEN; break; case ASN1_OBJID: bp += a1writeoid(bp, &bl->sb_val.sv_val.sv_oid); break; default: break; } return bp - origbp; }
/*------------------------------------------------------------------------ * snleaf - perform the requested operation on the leaf SNMP variable *------------------------------------------------------------------------ */ int snleaf(struct snbentry *bindl, struct mib_info *mip, int op) { int len; char *strp; struct oid *oip; if (op == SOP_GETN) { if (mip->mi_next) return((*mip->mi_next->mi_func) (bindl, mip->mi_next, SOP_GETF)); return SERR_NO_SUCH; } if (op == SOP_SET) { if (! mip->mi_writable) return SERR_NO_SUCH; switch(mip->mi_vartype) { case ASN1_INT: if (SVTYPE(bindl) != ASN1_INT) return SERR_BAD_VALUE; if (mip->mi_param == 0) return SERR_NO_SUCH; *((int *) mip->mi_param) = SVINT(bindl); break; case ASN1_OCTSTR: if (SVTYPE(bindl) != ASN1_OCTSTR) return SERR_BAD_VALUE; strp = (char *) mip->mi_param; memcpy(strp, SVSTR(bindl), SVSTRLEN(bindl)); *(strp + SVSTRLEN(bindl)) = '\0'; break; case ASN1_OBJID: if (SVTYPE(bindl) != ASN1_OBJID) return SERR_BAD_VALUE; oip = (struct oid *) mip->mi_param; oip->len = SVSTRLEN(bindl); memcpy(oip->id, SVSTR(bindl), oip->len * 2); break; } return SNMP_OK; } if (op == SOP_GETF) { /* put the correct objid into the binding list. */ bindl->sb_oid.len = mip->mi_objid.len; memcpy(bindl->sb_oid.id, mip->mi_objid.id, mip->mi_objid.len * 2); } SVTYPE(bindl) = mip->mi_vartype; switch(mip->mi_vartype) { case ASN1_INT: case ASN1_TIMETICKS: case ASN1_GAUGE: case ASN1_COUNTER: /* kprintf("snleaf: grabbed %d\n", *((int *) mip->mi_param)); */ SVINT(bindl) = *((int *) mip->mi_param); break; case ASN1_OCTSTR: strp = mip->mi_param; if (strp == NULL) { SVSTRLEN(bindl) = 0; SVSTR(bindl) = NULL; break; } len = SVSTRLEN(bindl) = strlen(strp); SVSTR(bindl) = (char *) getmem(len); memcpy(SVSTR(bindl), strp, len); break; case ASN1_OBJID: oip = (struct oid *) mip->mi_param; SVOIDLEN(bindl) = oip->len; memcpy(SVOID(bindl), oip->id, oip->len * 2); break; } return SNMP_OK; }