agent_trap.c
来自「eCos操作系统源码」· C语言 代码 · 共 628 行 · 第 1/2 页
C
628 行
/* find end of provided varbind list, ready to append the enterprise info if necessary */ last_var = vars; while ( last_var && last_var->next_variable ) last_var = last_var->next_variable; memset (&enterprise_var, 0, sizeof (struct variable_list)); snmp_set_var_objid( &enterprise_var, snmptrapenterprise_oid, OID_LENGTH(snmptrapenterprise_oid)); snmp_set_var_value( &enterprise_var, (u_char *)enterprise, enterprise_length*sizeof(oid)); enterprise_var.type = ASN_OBJECT_ID; enterprise_var.next_variable = NULL; v2_vars = &uptime_var; /* * Create a template PDU, ready for sending */ template_pdu = snmp_pdu_create( SNMP_MSG_TRAP ); if ( template_pdu == NULL ) { /* Free memory if value stored dynamically */ snmp_set_var_value( &enterprise_var, NULL, 0); return; } template_pdu->trap_type = trap; template_pdu->specific_type = specific; if ( snmp_clone_mem((void **)&template_pdu->enterprise, enterprise, enterprise_length*sizeof(oid))) { snmp_free_pdu( template_pdu ); snmp_set_var_value( &enterprise_var, NULL, 0); return; } template_pdu->enterprise_length = enterprise_length; template_pdu->flags |= UCD_MSG_FLAG_FORCE_PDU_COPY; pduIp = (struct sockaddr_in *)&template_pdu->agent_addr; pduIp->sin_family = AF_INET; pduIp->sin_len = sizeof(*pduIp); pduIp->sin_addr.s_addr = get_myaddr(); template_pdu->time = uptime; /* * Now use the parameters to determine * which v2 variables are needed, * and what values they should take. */ switch ( trap ) { case -1: /* * SNMPv2 only * Check to see whether the variables provided * are sufficient for SNMPv2 notifications */ if (vars && snmp_oid_compare(vars->name, vars->name_length, sysuptime_oid, OID_LENGTH(sysuptime_oid)) == 0 ) v2_vars = vars; else if (vars && snmp_oid_compare(vars->name, vars->name_length, snmptrap_oid, OID_LENGTH(snmptrap_oid)) == 0 ) uptime_var.next_variable = vars; else { /* Hmmm... we don't seem to have a value - oops! */ snmptrap_var.next_variable = vars; } last_var = NULL; /* Don't need enterprise info */ break; /* "Standard" SNMPv1 traps */ case SNMP_TRAP_COLDSTART: snmp_set_var_value( &snmptrap_var, (u_char *)cold_start_oid, sizeof(cold_start_oid)); break; case SNMP_TRAP_WARMSTART: snmp_set_var_value( &snmptrap_var, (u_char *)warm_start_oid, sizeof(warm_start_oid)); break; case SNMP_TRAP_LINKDOWN: snmp_set_var_value( &snmptrap_var, (u_char *)link_down_oid, sizeof(link_down_oid)); break; case SNMP_TRAP_LINKUP: snmp_set_var_value( &snmptrap_var, (u_char *)link_up_oid, sizeof(link_up_oid)); break; case SNMP_TRAP_AUTHFAIL: if (snmp_enableauthentraps == SNMP_AUTHENTICATED_TRAPS_DISABLED) { snmp_free_pdu( template_pdu ); snmp_set_var_value( &enterprise_var, NULL, 0); return; } snmp_set_var_value( &snmptrap_var, (u_char *)auth_fail_oid, sizeof(auth_fail_oid)); break; case SNMP_TRAP_EGPNEIGHBORLOSS: snmp_set_var_value( &snmptrap_var, (u_char *)egp_xxx_oid, sizeof(egp_xxx_oid)); break; case SNMP_TRAP_ENTERPRISESPECIFIC: memcpy( &temp_oid, (char *)enterprise, (enterprise_length)*sizeof(oid)); temp_oid[ enterprise_length ] = 0; temp_oid[ enterprise_length+1 ] = specific; snmp_set_var_value( &snmptrap_var, (u_char *)&temp_oid, (enterprise_length+2)*sizeof(oid)); snmptrap_var.next_variable = vars; last_var = NULL; /* Don't need version info */ break; } /* * Now loop through the list of trap sinks, * sending an appropriately formatted PDU to each */ for ( sink = sinks ; sink ; sink=sink->next ) { if ( sink->version == SNMP_VERSION_1 && trap == -1 ) continue; /* Skip v1 sinks for v2 only traps */ template_pdu->version = sink->version; template_pdu->command = sink->pdutype; if ( sink->version != SNMP_VERSION_1 ) { template_pdu->variables = v2_vars; if ( last_var ) last_var->next_variable = &enterprise_var; } else template_pdu->variables = vars; pdu = snmp_clone_pdu( template_pdu ); pdu->sessid = sink->sesp->sessid; /* AgentX only ? */ if ( snmp_send( sink->sesp, pdu) == 0 ) { snmp_sess_perror ("snmpd: send_trap", sink->sesp); snmp_free_pdu( pdu ); } else { snmp_increment_statistic(STAT_SNMPOUTTRAPS); snmp_increment_statistic(STAT_SNMPOUTPKTS); } if ( sink->version != SNMP_VERSION_1 && last_var ) last_var->next_variable = NULL; } /* Free memory if values stored dynamically */ snmp_set_var_value( &enterprise_var, NULL, 0); snmp_set_var_value( &snmptrap_var, NULL, 0); /* Ensure we don't free anything we shouldn't */ if ( last_var ) last_var->next_variable = NULL; template_pdu->variables = NULL; snmp_free_pdu( template_pdu );}void send_trap_vars (int trap, int specific, struct variable_list *vars){ if ( trap == SNMP_TRAP_ENTERPRISESPECIFIC ) send_enterprise_trap_vars( trap, specific, objid_enterprisetrap, OID_LENGTH(objid_enterprisetrap), vars ); else send_enterprise_trap_vars( trap, specific, version_id, OID_LENGTH(version_id), vars );}void send_easy_trap (int trap, int specific){ send_trap_vars( trap, specific, NULL );}void send_v2trap ( struct variable_list *vars){ send_trap_vars( -1, -1, vars );}voidsend_trap_pdu(struct snmp_pdu *pdu){ send_trap_vars( -1, -1, pdu->variables );} /******************* * * Config file handling * *******************/void snmpd_parse_config_authtrap(const char *token, char *cptr){ int i; i = atoi(cptr); if ( i == 0 ) { if ( !strcmp( cptr, "enable" )) i = SNMP_AUTHENTICATED_TRAPS_ENABLED; else if ( !strcmp( cptr, "disable" )) i = SNMP_AUTHENTICATED_TRAPS_DISABLED; } if (i < 1 || i > 2) config_perror("authtrapenable must be 1 or 2"); else snmp_enableauthentraps = i;}void snmpd_parse_config_trapsink(const char *token, char *cptr){ char tmpbuf[1024]; char *sp, *cp, *pp = NULL; u_short sinkport; if (!snmp_trapcommunity) snmp_trapcommunity = strdup("public"); sp = strtok(cptr, " \t\n"); cp = strtok(NULL, " \t\n"); if (cp) pp = strtok(NULL, " \t\n"); if (cp && pp) { sinkport = atoi(pp); if ((sinkport < 1) || (sinkport > 0xffff)) { config_perror("trapsink port out of range"); sinkport = SNMP_TRAP_PORT; } } else { sinkport = SNMP_TRAP_PORT; } if (create_v1_trap_session(sp, sinkport, cp ? cp : snmp_trapcommunity) == 0) { sprintf(tmpbuf,"cannot create trapsink: %s", cptr); config_perror(tmpbuf); }}voidsnmpd_parse_config_trap2sink(const char *word, char *cptr){ char tmpbuf[1024]; char *sp, *cp, *pp = NULL; u_short sinkport; if (!snmp_trapcommunity) snmp_trapcommunity = strdup("public"); sp = strtok(cptr, " \t\n"); cp = strtok(NULL, " \t\n"); if (cp) pp = strtok(NULL, " \t\n"); if (cp && pp) { sinkport = atoi(pp); if ((sinkport < 1) || (sinkport > 0xffff)) { config_perror("trapsink port out of range"); sinkport = SNMP_TRAP_PORT; } } else { sinkport = SNMP_TRAP_PORT; } if (create_v2_trap_session(sp, sinkport, cp ? cp : snmp_trapcommunity) == 0) { sprintf(tmpbuf,"cannot create trap2sink: %s", cptr); config_perror(tmpbuf); }}voidsnmpd_parse_config_informsink(const char *word, char *cptr){ char tmpbuf[1024]; char *sp, *cp, *pp = NULL; u_short sinkport; if (!snmp_trapcommunity) snmp_trapcommunity = strdup("public"); sp = strtok(cptr, " \t\n"); cp = strtok(NULL, " \t\n"); if (cp) pp = strtok(NULL, " \t\n"); if (cp && pp) { sinkport = atoi(pp); if ((sinkport < 1) || (sinkport > 0xffff)) { config_perror("trapsink port out of range"); sinkport = SNMP_TRAP_PORT; } } else { sinkport = SNMP_TRAP_PORT; } if (create_v2_inform_session(sp, sinkport, cp ? cp : snmp_trapcommunity) == 0) { sprintf(tmpbuf,"cannot create informsink: %s", cptr); config_perror(tmpbuf); }}voidsnmpd_parse_config_trapcommunity(const char *word, char *cptr){ if (snmp_trapcommunity) free(snmp_trapcommunity); snmp_trapcommunity = malloc (strlen(cptr)+1); copy_word(cptr, snmp_trapcommunity);}void snmpd_free_trapcommunity (void){ if (snmp_trapcommunity) { free(snmp_trapcommunity); snmp_trapcommunity = NULL; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?