Lines Matching refs:msg

236 snmpe_parse(struct snmp_message *msg)
247 struct sockaddr_storage *ss = &msg->sm_ss;
248 struct ber_element *root = msg->sm_req;
250 msg->sm_errstr = "invalid message";
253 msg->sm_transactionid = arc4random();
254 } while (msg->sm_transactionid == 0 ||
255 RB_INSERT(snmp_messages, &snmp_messages, msg) != NULL);
261 msg->sm_version = ver;
262 switch (msg->sm_version) {
264 if (!(msg->sm_aflags & ADDRESS_FLAG_SNMPV1)) {
265 msg->sm_errstr = "SNMPv1 disabled";
269 if (msg->sm_version == SNMP_V2 &&
270 !(msg->sm_aflags & ADDRESS_FLAG_SNMPV2)) {
271 msg->sm_errstr = "SNMPv2c disabled";
274 if (ober_scanf_elements(a, "seS$", &comn, &msg->sm_pdu) != 0)
276 if (strlcpy(msg->sm_community, comn,
277 sizeof(msg->sm_community)) >= sizeof(msg->sm_community) ||
278 msg->sm_community[0] == '\0') {
280 msg->sm_errstr = "invalid community name";
285 if (!(msg->sm_aflags & ADDRESS_FLAG_SNMPV3)) {
286 msg->sm_errstr = "SNMPv3 disabled";
290 &msg->sm_msgid, &msg->sm_max_msg_size, &flagstr,
291 &msg->sm_secmodel, &a) != 0)
294 msg->sm_flags = *flagstr;
295 if ((a = usm_decode(msg, a, &msg->sm_errstr)) == NULL)
298 if (MSG_SECLEVEL(msg) < env->sc_min_seclevel ||
299 msg->sm_secmodel != SNMP_SEC_USM) {
301 msg->sm_errstr = "unsupported security model";
303 msg->sm_usmerr = OIDVAL_usmErrSecLevel;
308 &engineid, &msg->sm_ctxengineid_len, &ctxname, &len,
309 &msg->sm_pdu) != 0)
311 if (msg->sm_ctxengineid_len > sizeof(msg->sm_ctxengineid))
313 memcpy(msg->sm_ctxengineid, engineid, msg->sm_ctxengineid_len);
316 memcpy(msg->sm_ctxname, ctxname, len);
317 msg->sm_ctxname[len] = '\0';
320 msg->sm_errstr = "unsupported snmp version";
326 if (ober_scanf_elements(msg->sm_pdu, "t{e", &class, &(msg->sm_pdutype),
334 switch (msg->sm_pdutype) {
336 if (msg->sm_version == SNMP_V1) {
338 msg->sm_errstr =
349 if (msg->sm_pdutype == SNMP_C_GETNEXTREQ)
351 if (!(msg->sm_aflags & ADDRESS_FLAG_READ)) {
352 msg->sm_errstr = "read requests disabled";
355 if (msg->sm_version != SNMP_V3 &&
356 strcmp(env->sc_rdcommunity, msg->sm_community) != 0 &&
357 strcmp(env->sc_rwcommunity, msg->sm_community) != 0) {
359 msg->sm_errstr = "wrong read community";
366 if (!(msg->sm_aflags & ADDRESS_FLAG_WRITE)) {
367 msg->sm_errstr = "write requests disabled";
370 if (msg->sm_version != SNMP_V3 &&
371 strcmp(env->sc_rwcommunity, msg->sm_community) != 0) {
372 if (strcmp(env->sc_rdcommunity, msg->sm_community) != 0)
376 msg->sm_errstr = "wrong write community";
383 msg->sm_errstr = "response without request";
387 if (msg->sm_version != SNMP_V1) {
388 msg->sm_errstr = "trapv1 request on !SNMPv1 message";
392 if (msg->sm_pdutype == SNMP_C_TRAPV2 &&
393 !(msg->sm_version == SNMP_V2 ||
394 msg->sm_version == SNMP_V3)) {
395 msg->sm_errstr = "trapv2 request on !SNMPv2C or "
399 if (!(msg->sm_aflags & ADDRESS_FLAG_NOTIFY)) {
400 msg->sm_errstr = "notify requests disabled";
403 if (msg->sm_version == SNMP_V3) {
404 msg->sm_errstr = "SNMPv3 doesn't support traps yet";
407 if (strcmp(env->sc_trcommunity, msg->sm_community) != 0) {
409 msg->sm_errstr = "wrong trap community";
417 if (traphandler_parse(msg) == -1)
422 msg->sm_errstr = "invalid context";
428 &req, &errval, &erridx, &msg->sm_pduend,
429 &msg->sm_varbind) != 0) {
431 msg->sm_errstr = "invalid PDU";
435 for (len = 0, a = msg->sm_varbind; a != NULL; a = a->be_next, len++) {
443 if (msg->sm_pdutype == SNMP_C_GETBULKREQ &&
448 msg->sm_request = req;
449 msg->sm_error = errval;
450 msg->sm_errorindex = erridx;
452 print_host(ss, msg->sm_host, sizeof(msg->sm_host));
453 if (msg->sm_version == SNMP_V3)
456 "request %lld", __func__, msg->sm_host, msg->sm_port,
457 snmpe_pdutype2string(msg->sm_pdutype), msg->sm_flags,
458 msg->sm_secmodel, msg->sm_username,
459 tohexstr(msg->sm_ctxengineid, msg->sm_ctxengineid_len),
460 msg->sm_ctxname, msg->sm_request);
463 __func__, msg->sm_host, msg->sm_port, msg->sm_version + 1,
464 msg->sm_community, snmpe_pdutype2string(msg->sm_pdutype),
465 msg->sm_request);
472 print_host(ss, msg->sm_host, sizeof(msg->sm_host));
473 log_debug("%s: %s:%hd: %s", __func__, msg->sm_host, msg->sm_port,
474 msg->sm_errstr);
479 snmpe_parsevarbinds(struct snmp_message *msg)
481 appl_processpdu(msg, msg->sm_ctxname, msg->sm_version, msg->sm_pdu);
491 struct snmp_message *msg;
510 if ((msg = calloc(1, sizeof(*msg))) == NULL)
513 memcpy(&(msg->sm_ss), &ss, len);
514 msg->sm_slen = len;
515 msg->sm_aflags = h->flags;
516 msg->sm_port = h->port;
517 snmpe_prepare_read(msg, afd);
520 free(msg);
526 snmpe_prepare_read(struct snmp_message *msg, int fd)
528 msg->sm_sock = fd;
529 msg->sm_sock_tcp = 1;
530 event_del(&msg->sm_sockev);
531 event_set(&msg->sm_sockev, fd, EV_READ,
532 snmpe_readcb, msg);
533 event_add(&msg->sm_sockev, &snmpe_tcp_timeout);
537 snmpe_tryparse(int fd, struct snmp_message *msg)
541 ober_set_application(&msg->sm_ber, smi_application);
542 ober_set_readbuf(&msg->sm_ber, msg->sm_data, msg->sm_datalen);
543 msg->sm_req = ober_read_elements(&msg->sm_ber, NULL);
544 if (msg->sm_req == NULL) {
547 snmpe_prepare_read(msg, fd);
553 if (snmpe_parse(msg) == -1) {
554 if (msg->sm_usmerr && MSG_REPORT(msg)) {
555 usm_make_report(msg);
562 snmpe_dispatchmsg(msg);
565 snmp_msgfree(msg);
572 struct snmp_message *msg = arg;
575 if (type == EV_TIMEOUT || msg->sm_datalen >= sizeof(msg->sm_data))
578 len = read(fd, msg->sm_data + msg->sm_datalen,
579 sizeof(msg->sm_data) - msg->sm_datalen);
583 snmpe_prepare_read(msg, fd);
587 msg->sm_datalen += (size_t)len;
588 snmpe_tryparse(fd, msg);
592 snmp_msgfree(msg);
600 struct snmp_message *msg = arg;
604 struct ber *ber = &msg->sm_ber;
624 event_del(&msg->sm_sockev);
625 event_set(&msg->sm_sockev, msg->sm_sock, EV_WRITE,
626 snmpe_writecb, msg);
627 event_add(&msg->sm_sockev, &snmpe_tcp_timeout);
635 memcpy(&(nmsg->sm_ss), &(msg->sm_ss), msg->sm_slen);
636 nmsg->sm_slen = msg->sm_slen;
637 nmsg->sm_aflags = msg->sm_aflags;
638 nmsg->sm_port = msg->sm_port;
644 reqlen = ober_calc_len(msg->sm_req);
645 if (msg->sm_datalen > reqlen) {
646 memcpy(nmsg->sm_data, msg->sm_data + reqlen,
647 msg->sm_datalen - reqlen);
648 nmsg->sm_datalen = msg->sm_datalen - reqlen;
649 snmp_msgfree(msg);
652 snmp_msgfree(msg);
659 snmp_msgfree(msg);
668 struct snmp_message *msg;
670 if ((msg = calloc(1, sizeof(*msg))) == NULL)
673 msg->sm_aflags = h->flags;
674 msg->sm_sock = fd;
675 msg->sm_slen = sizeof(msg->sm_ss);
676 msg->sm_port = h->port;
677 if ((len = recvfromto(fd, msg->sm_data, sizeof(msg->sm_data), 0,
678 (struct sockaddr *)&msg->sm_ss, &msg->sm_slen,
679 (struct sockaddr *)&msg->sm_local_ss, &msg->sm_local_slen)) < 1) {
680 free(msg);
685 msg->sm_datalen = (size_t)len;
687 bzero(&msg->sm_ber, sizeof(msg->sm_ber));
688 ober_set_application(&msg->sm_ber, smi_application);
689 ober_set_readbuf(&msg->sm_ber, msg->sm_data, msg->sm_datalen);
691 msg->sm_req = ober_read_elements(&msg->sm_ber, NULL);
692 if (msg->sm_req == NULL) {
694 snmp_msgfree(msg);
699 fprintf(stderr, "recv msg:\n");
700 smi_debug_elements(msg->sm_req);
703 if (snmpe_parse(msg) == -1) {
704 if (msg->sm_usmerr != 0 && MSG_REPORT(msg)) {
705 usm_make_report(msg);
708 snmp_msgfree(msg);
713 snmpe_dispatchmsg(msg);
717 snmpe_dispatchmsg(struct snmp_message *msg)
719 if (msg->sm_pdutype == SNMP_C_TRAP ||
720 msg->sm_pdutype == SNMP_C_TRAPV2) {
721 snmp_msgfree(msg);
726 (void) snmpe_parsevarbinds(msg);
734 msg->sm_pdutype = SNMP_C_RESPONSE;
735 snmpe_response(msg);
739 snmpe_send(struct snmp_message *msg, enum snmp_pdutype type, int32_t requestid,
742 msg->sm_request = requestid;
743 msg->sm_pdutype = type;
744 msg->sm_error = error;
745 msg->sm_errorindex = index;
746 msg->sm_varbindresp = varbindlist;
748 snmpe_response(msg);
752 snmpe_response(struct snmp_message *msg)
758 if (msg->sm_varbindresp == NULL && msg->sm_pduend != NULL)
759 msg->sm_varbindresp = ober_unlink_elements(msg->sm_pduend);
761 switch (msg->sm_error) {
783 if (snmpe_encode(msg) < 0)
786 len = ober_write_elements(&msg->sm_ber, msg->sm_resp);
787 if (ober_get_writebuf(&msg->sm_ber, (void *)&ptr) == -1)
790 usm_finalize_digest(msg, ptr, len);
791 if (msg->sm_sock_tcp) {
792 msg->sm_ber.br_wptr = msg->sm_ber.br_wbuf;
793 event_del(&msg->sm_sockev);
794 event_set(&msg->sm_sockev, msg->sm_sock, EV_WRITE,
795 snmpe_writecb, msg);
796 event_add(&msg->sm_sockev, &snmpe_tcp_timeout);
799 len = sendtofrom(msg->sm_sock, ptr, len, 0,
800 (struct sockaddr *)&msg->sm_ss, msg->sm_slen,
801 (struct sockaddr *)&msg->sm_local_ss, msg->sm_local_slen);
807 snmp_msgfree(msg);
811 snmp_msgfree(struct snmp_message *msg)
813 if (msg->sm_transactionid != 0)
814 RB_REMOVE(snmp_messages, &snmp_messages, msg);
815 event_del(&msg->sm_sockev);
816 ober_free(&msg->sm_ber);
817 if (msg->sm_req != NULL)
818 ober_free_elements(msg->sm_req);
819 if (msg->sm_resp != NULL)
820 ober_free_elements(msg->sm_resp);
821 free(msg);
825 snmpe_encode(struct snmp_message *msg)
830 msg->sm_resp = ober_add_sequence(NULL);
831 if ((ehdr = ober_add_integer(msg->sm_resp, msg->sm_version)) == NULL)
833 if (msg->sm_version == SNMP_V3) {
834 char f = MSG_SECLEVEL(msg);
836 if ((ehdr = ober_printf_elements(ehdr, "{iixi}", msg->sm_msgid,
837 msg->sm_max_msg_size, &f, sizeof(f),
838 msg->sm_secmodel)) == NULL)
842 if ((ehdr = usm_encode(msg, ehdr)) == NULL)
845 if ((ehdr = ober_add_string(ehdr, msg->sm_community)) == NULL)
850 if (msg->sm_version == SNMP_V3) {
853 msg->sm_ctxname)) == NULL) {
860 msg->sm_pdutype, msg->sm_request,
861 msg->sm_error, msg->sm_errorindex,
862 msg->sm_varbindresp)) {
867 if (MSG_HAS_PRIV(msg))
868 pdu = usm_encrypt(msg, pdu);
872 fprintf(stderr, "resp msg:\n");
873 smi_debug_elements(msg->sm_resp);