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 + -
显示快捷键?