Exemplo n.º 1
0
/*------------------------------------------------------------------------
 * 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;
}
Exemplo n.º 2
0
/*------------------------------------------------------------------------
 * 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;
}
Exemplo n.º 3
0
/*------------------------------------------------------------------------
 * 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;
}
Exemplo n.º 4
0
/*------------------------------------------------------------------------
 * 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;
}
Exemplo n.º 5
0
/*------------------------------------------------------------------------
 * 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;
}