asn_t * snmp_get_ifLastChange (snmp_t *snmp, unsigned nif, ...) { if (! find_netif (snmp->ip->route, nif)) return 0; return asn_make_int (snmp->pool, 0, ASN_TIME_TICKS); }
asn_t * snmp_get_ifIndex (snmp_t *snmp, unsigned nif, ...) { if (! find_netif (snmp->ip->route, nif)) return 0; return asn_make_int (snmp->pool, nif, ASN_INTEGER); }
asn_t *snmp_get_udpLocalPort (snmp_t *snmp, unsigned long addr, unsigned port, ...) { if (! find_socket (snmp->ip, addr, port)) return 0; return asn_make_int (snmp->pool, port, ASN_INTEGER); }
asn_t *snmp_get_udpLocalAddress (snmp_t *snmp, unsigned long addr, unsigned port, ...) { if (! find_socket (snmp->ip, addr, port)) return 0; return asn_make_int (snmp->pool, addr, ASN_IP_ADDRESS); }
asn_t * snmp_get_ifOperStatus (snmp_t *snmp, unsigned nif, ...) { if (! find_netif (snmp->ip->route, nif)) return 0; return asn_make_int (snmp->pool, SNMP_IFS_UP, ASN_INTEGER); }
asn_t * snmp_get_ifInDiscards (snmp_t *snmp, unsigned nif, ...) { netif_t *u = find_netif (snmp->ip->route, nif); if (! u) return 0; return asn_make_int (snmp->pool, u->in_discards, ASN_COUNTER); }
asn_t * snmp_get_ifInUnknownProtos (snmp_t *snmp, unsigned nif, ...) { netif_t *u = find_netif (snmp->ip->route, nif); if (! u) return 0; return asn_make_int (snmp->pool, u->in_unknown_protos, ASN_COUNTER); }
asn_t * snmp_get_ifOutErrors (snmp_t *snmp, unsigned nif, ...) { netif_t *u = find_netif (snmp->ip->route, nif); if (! u) return 0; return asn_make_int (snmp->pool, u->out_errors, ASN_COUNTER); }
asn_t * snmp_get_ifOutQLen (snmp_t *snmp, unsigned nif, ...) { netif_t *u = find_netif (snmp->ip->route, nif); if (! u) return 0; return asn_make_int (snmp->pool, u->out_qlen, ASN_GAUGE); }
asn_t * snmp_get_ifOutUcastPkts (snmp_t *snmp, unsigned nif, ...) { netif_t *u = find_netif (snmp->ip->route, nif); if (! u) return 0; return asn_make_int (snmp->pool, u->out_packets - u->out_mcast_pkts, ASN_COUNTER); }
asn_t *asn_make_cnt32as16 (struct _mem_pool_t *pool, unsigned long val) { if (val == -1) return asn_make_null (pool); if (val > (unsigned short) -2) val = (unsigned short) -2; return asn_make_int (pool, val, ASN_INTEGER); }
asn_t * snmp_get_ifType (snmp_t *snmp, unsigned nif, ...) { netif_t *u = find_netif (snmp->ip->route, nif); if (! u) return 0; return asn_make_int (snmp->pool, u->type, ASN_INTEGER); }
asn_t * snmp_get_ifSpeed (snmp_t *snmp, unsigned nif, ...) { netif_t *u = find_netif (snmp->ip->route, nif); if (! u) return 0; return asn_make_int (snmp->pool, u->bps, ASN_GAUGE); }
asn_t * snmp_next_ifLastChange (snmp_t *snmp, bool_t nextflag, unsigned *nif, ...) { if (nextflag) ++*nif; else *nif = 1; if (! find_netif (snmp->ip->route, *nif)) return 0; return asn_make_int (snmp->pool, 0, ASN_TIME_TICKS); }
asn_t * snmp_next_ifIndex (snmp_t *snmp, bool_t nextflag, unsigned *nif, ...) { if (nextflag) ++*nif; else *nif = 1; if (! find_netif (snmp->ip->route, *nif)) return 0; return asn_make_int (snmp->pool, *nif, ASN_INTEGER); }
asn_t * snmp_next_ifAdminStatus (snmp_t *snmp, bool_t nextflag, unsigned *nif, ...) { if (nextflag) ++*nif; else *nif = 1; if (! find_netif (snmp->ip->route, *nif)) return 0; return asn_make_int (snmp->pool, SNMP_IFS_UP, ASN_INTEGER); }
asn_t * snmp_next_ifType (snmp_t *snmp, bool_t nextflag, unsigned *nif, ...) { netif_t *u; if (nextflag) ++*nif; else *nif = 1; u = find_netif (snmp->ip->route, *nif); if (! u) return 0; return asn_make_int (snmp->pool, u->type, ASN_INTEGER); }
asn_t * snmp_next_ifOutQLen (snmp_t *snmp, bool_t nextflag, unsigned *nif, ...) { netif_t *u; if (nextflag) ++*nif; else *nif = 1; u = find_netif (snmp->ip->route, *nif); if (! u) return 0; return asn_make_int (snmp->pool, u->out_qlen, ASN_GAUGE); }
asn_t * snmp_next_ifOutErrors (snmp_t *snmp, bool_t nextflag, unsigned *nif, ...) { netif_t *u; if (nextflag) ++*nif; else *nif = 1; u = find_netif (snmp->ip->route, *nif); if (! u) return 0; return asn_make_int (snmp->pool, u->out_errors, ASN_COUNTER); }
asn_t * snmp_next_ifInNUcastPkts (snmp_t *snmp, bool_t nextflag, unsigned *nif, ...) { netif_t *u; if (nextflag) ++*nif; else *nif = 1; u = find_netif (snmp->ip->route, *nif); if (! u) return 0; return asn_make_int (snmp->pool, u->in_mcast_pkts, ASN_COUNTER); }
asn_t * snmp_next_ifInUnknownProtos (snmp_t *snmp, bool_t nextflag, unsigned *nif, ...) { netif_t *u; if (nextflag) ++*nif; else *nif = 1; u = find_netif (snmp->ip->route, *nif); if (! u) return 0; return asn_make_int (snmp->pool, u->in_unknown_protos, ASN_COUNTER); }
asn_t *snmp_next_udpLocalPort (snmp_t *snmp, bool_t nextflag, unsigned long *addr, unsigned *port, ...) { udp_socket_t *s; if (nextflag) s = find_next_socket (snmp->ip, *addr, *port); else s = find_first_socket (snmp->ip); if (s) { *addr = s->local_ip ? LONG (ipref_as_ucs(s->local_ip)) : 0; *port = s->local_port; } else return 0; return asn_make_int (snmp->pool, *port, ASN_INTEGER); }
IF_VARIABLE_LIST asn_t * snmp_get_ifNumber (snmp_t *snmp, ...) { route_t *r; unsigned count; count = 0; for (r=snmp->ip->route; r; r=r->next) /* Count all interface records. */ if (r->netif && ! r->gateway.ucs[0]) ++count; return asn_make_int (snmp->pool, count, ASN_INTEGER); }
asn_t *snmp_get_udpInErrors (snmp_t *snmp, ...) { return asn_make_int (snmp->pool, snmp->ip->udp_in_errors, ASN_COUNTER); }
asn_t *snmp_get_udpOutDatagrams (snmp_t *snmp, ...) { return asn_make_int (snmp->pool, snmp->ip->udp_out_datagrams, ASN_COUNTER); }
asn_t *snmp_get_udpNoPorts (snmp_t *snmp, ...) { return asn_make_int (snmp->pool, snmp->ip->udp_no_ports, ASN_COUNTER); }
asn_t *snmp_get_icmpOutTimeExcds (snmp_t *snmp, ...) { return asn_make_int (snmp->pool, snmp->ip->icmp_out_time_excds, ASN_COUNTER); }
asn_t *snmp_get_icmpOutParmProbs (snmp_t *snmp, ...) { return asn_make_int (snmp->pool, snmp->ip->icmp_out_parm_probs, ASN_COUNTER); }
UDP_VARIABLE_LIST asn_t *snmp_get_udpInDatagrams (snmp_t *snmp, ...) { return asn_make_int (snmp->pool, snmp->ip->udp_in_datagrams, ASN_COUNTER); }
/* * Send trap, SNMP v1 (RFC 1157). * SEQUENCE { * version: INTEGER [=0] * community: STRING * pdu: SEQUENCE [=TRAP] { * enterprise: OBJECT IDENTIFIER * agent-addr: NetworkAddress * generic-trap: INTEGER * specific-trap: INTEGER * time-stamp: INTEGER * varlist: SEQUENCE { * var1: SEQUENCE { * name: OID * value: ... * } * ... * } } } */ bool_t snmp_trap_v1 (snmp_t *snmp, udp_socket_t *sock, unsigned char *local_ip, unsigned trap_type, asn_t *oid, asn_t *value) { asn_t *pdu, *trap, *varlist, *var1; buf_t *pkt; unsigned char *output, status; unsigned long santisec; /*debug_printf ("snmp_trap(%#x)\n", traptype);*/ if (oid) { var1 = asn_make_seq (snmp->pool, 2, ASN_SEQUENCE); if (! var1) { asn_free (oid); asn_free (value); return 0; } var1->seq.count = 2; var1->seq.arr[0] = oid; var1->seq.arr[1] = value; } else var1 = 0; /* * List of variables. */ varlist = asn_make_seq (snmp->pool, 1, ASN_SEQUENCE); if (! varlist) { asn_free (var1); return 0; } varlist->seq.count = var1 ? 1 : 0; varlist->seq.arr[0] = var1; /* * Protocol data unit. */ pdu = asn_make_seq (snmp->pool, 6, ASN_TRAP); if (! pdu) { asn_free (varlist); return 0; } pdu->seq.count = 6; pdu->seq.arr[5] = varlist; /* Enterprise */ pdu->seq.arr[0] = asn_make_oid (snmp->pool, "1.3.6.1.4.1.20520"); pdu->seq.arr[0]->oid.id[6] = snmp->enterprise; /* Agent IP address */ pdu->seq.arr[1] = asn_make_int (snmp->pool, NTOHL (*(unsigned long*) local_ip), ASN_IP_ADDRESS); /* Generic trap code */ pdu->seq.arr[2] = asn_make_int (snmp->pool, trap_type & 0xff, ASN_INTEGER); /* Specific trap code */ pdu->seq.arr[3] = asn_make_int (snmp->pool, trap_type >> 8, ASN_INTEGER); /* Timestamp */ santisec = 0; if (snmp->ip && snmp->ip->timer) { unsigned long msec; unsigned days = timer_days (snmp->ip->timer, &msec); santisec = msec / 10 + days * 24L * 60 * 60 * 100; } pdu->seq.arr[4] = asn_make_int (snmp->pool, santisec, ASN_TIME_TICKS); /* * Trap. */ trap = asn_make_seq (snmp->pool, 3, ASN_SEQUENCE); if (! trap) { asn_free (pdu); return 0; } trap->seq.count = 3; trap->seq.arr[2] = pdu; /* Version */ trap->seq.arr[0] = asn_make_int (snmp->pool, 0, ASN_INTEGER); /* Community */ trap->seq.arr[1] = asn_make_string (snmp->pool, snmp->trap_community); /* Encode and send */ status = 0; pkt = buf_alloc (snmp->pool, TRAP_PACKET_SIZE, 50); if (pkt) { output = asn_encode (trap, pkt->payload + pkt->len, pkt->len); if (! output) { buf_free (pkt); } else { /* Send */ assert (output >= pkt->payload); buf_add_header (pkt, - (output - pkt->payload)); /* debug_dump ("trap-v1", pkt->payload, pkt->len); */ status = udp_sendto (sock, pkt, snmp->trap_addr, 162); ++snmp->out_traps; ++snmp->out_pkts; } } asn_free (trap); return status; }