📄 history.c
字号:
return; } if (RMON1_ENTRY_VALID != hdr_ptr->status) { ag_trace("Err: history_get_backet when entry %d is not valid ?!!", (int) hdr_ptr->ctrl_index); /* * snmp_alarm_print_list (); */ snmp_alarm_unregister(body->timer_id); ag_trace("Err: unregistered %ld", (long) body->timer_id); return; } SYSTEM_get_eth_statistics(&body->data_source, &newSample); bptr = ROWDATAAPI_locate_new_data(&body->scrlr); if (!bptr) { ag_trace ("Err: history_get_backet for %d: empty bucket's list !??\n", (int) hdr_ptr->ctrl_index); return; } bptr->data_index = ROWDATAAPI_get_total_number(&body->scrlr); bptr->start_interval = body->previous_bucket.start_interval; compute_delta(&bptr->EthData, &newSample, &body->previous_bucket.EthData); bptr->utilization = bptr->EthData.octets * 8 + bptr->EthData.packets * (96 + 64); bptr->utilization /= body->coeff; /* * update previous_bucket */ body->previous_bucket.start_interval = AGUTIL_sys_up_time(); memcpy(&body->previous_bucket.EthData, &newSample, sizeof(ETH_STATS_T));}/* * Control Table RowApi Callbacks */inthistory_Create(RMON_ENTRY_T * eptr){ /* create the body: alloc it and set defaults */ CRTL_ENTRY_T *body; eptr->body = AGMALLOC(sizeof(CRTL_ENTRY_T)); if (!eptr->body) return -3; body = (CRTL_ENTRY_T *) eptr->body; /* * set defaults */ body->interval = HIST_DEF_INTERVAL; body->timer_id = 0; memcpy(&body->data_source, &DEFAULT_DATA_SOURCE, sizeof(VAR_OID_T)); ROWDATAAPI_init(&body->scrlr, HIST_DEF_BUCK_REQ, MAX_BUCKETS_IN_CRTL_ENTRY, sizeof(DATA_ENTRY_T), NULL); return 0;}inthistory_Validate(RMON_ENTRY_T * eptr){ /* * T.B.D. (system dependent) check valid inteface in body->data_source; */ return 0;}inthistory_Activate(RMON_ENTRY_T * eptr){ CRTL_ENTRY_T *body = (CRTL_ENTRY_T *) eptr->body; body->coeff = 100000L * (long) body->interval; ROWDATAAPI_set_size(&body->scrlr, body->scrlr.data_requested, (u_char)(RMON1_ENTRY_VALID == eptr->status) ); SYSTEM_get_eth_statistics(&body->data_source, &body->previous_bucket.EthData); body->previous_bucket.start_interval = AGUTIL_sys_up_time(); body->scrlr.current_data_ptr = body->scrlr.first_data_ptr; /* * ag_trace ("Dbg: registered in history_Activate"); */ body->timer_id = snmp_alarm_register(body->interval, SA_REPEAT, history_get_backet, eptr); return 0;}inthistory_Deactivate(RMON_ENTRY_T * eptr){ CRTL_ENTRY_T *body = (CRTL_ENTRY_T *) eptr->body; snmp_alarm_unregister(body->timer_id); /* * ag_trace ("Dbg: unregistered in history_Deactivate timer_id=%d", * (int) body->timer_id); */ /* * free data list */ ROWDATAAPI_descructor(&body->scrlr); return 0;}inthistory_Copy(RMON_ENTRY_T * eptr){ CRTL_ENTRY_T *body = (CRTL_ENTRY_T *) eptr->body; CRTL_ENTRY_T *clone = (CRTL_ENTRY_T *) eptr->tmp; if (body->scrlr.data_requested != clone->scrlr.data_requested) { ROWDATAAPI_set_size(&body->scrlr, clone->scrlr.data_requested, (u_char)(RMON1_ENTRY_VALID == eptr->status) ); } if (body->interval != clone->interval) { if (RMON1_ENTRY_VALID == eptr->status) { snmp_alarm_unregister(body->timer_id); body->timer_id = snmp_alarm_register(clone->interval, SA_REPEAT, history_get_backet, eptr); } body->interval = clone->interval; } if (snmp_oid_compare (clone->data_source.objid, clone->data_source.length, body->data_source.objid, body->data_source.length)) { memcpy(&body->data_source, &clone->data_source, sizeof(VAR_OID_T)); } return 0;}static SCROLLER_T *history_extract_scroller(void *v_body){ CRTL_ENTRY_T *body = (CRTL_ENTRY_T *) v_body; return &body->scrlr;}/* * var_etherHistoryTable(): */unsigned char *var_etherHistoryTable(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method){ static long long_ret; static DATA_ENTRY_T theBucket; RMON_ENTRY_T *hdr; CRTL_ENTRY_T *ctrl; *write_method = NULL; hdr = ROWDATAAPI_header_DataEntry(vp, name, length, exact, var_len, table_ptr, &history_extract_scroller, sizeof(DATA_ENTRY_T), &theBucket); if (!hdr) return NULL; *var_len = sizeof(long); /* default */ ctrl = (CRTL_ENTRY_T *) hdr->body; switch (vp->magic) { case DATA_INDEX: long_ret = hdr->ctrl_index; return (unsigned char *) &long_ret; case DATA_SAMPLEINDEX: long_ret = theBucket.data_index; return (unsigned char *) &long_ret; case DATA_INTERVALSTART: long_ret = 0; return (unsigned char *) &theBucket.start_interval; case DATA_DROPEVENTS: long_ret = 0; return (unsigned char *) &long_ret; case DATA_OCTETS: long_ret = 0; return (unsigned char *) &theBucket.EthData.octets; case DATA_PKTS: long_ret = 0; return (unsigned char *) &theBucket.EthData.packets; case DATA_BROADCASTPKTS: long_ret = 0; return (unsigned char *) &theBucket.EthData.bcast_pkts; case DATA_MULTICASTPKTS: long_ret = 0; return (unsigned char *) &theBucket.EthData.mcast_pkts; case DATA_CRCALIGNERRORS: long_ret = 0; return (unsigned char *) &theBucket.EthData.crc_align; case DATA_UNDERSIZEPKTS: long_ret = 0; return (unsigned char *) &theBucket.EthData.undersize; case DATA_OVERSIZEPKTS: long_ret = 0; return (unsigned char *) &theBucket.EthData.oversize; case DATA_FRAGMENTS: long_ret = 0; return (unsigned char *) &theBucket.EthData.fragments; case DATA_JABBERS: long_ret = 0; return (unsigned char *) &theBucket.EthData.jabbers; case DATA_COLLISIONS: long_ret = 0; return (unsigned char *) &theBucket.EthData.collisions; case DATA_UTILIZATION: long_ret = 0; return (unsigned char *) &theBucket.utilization; default: ag_trace("etherHistoryTable: unknown vp->magic=%d", (int) vp->magic); ERROR_MSG(""); } return NULL;}#if 1 /* debug, but may be used for init. TBD: may be token snmpd.conf ? */intadd_hist_entry(int ctrl_index, int ifIndex, u_long interval, u_long requested){ register RMON_ENTRY_T *eptr; register CRTL_ENTRY_T *body; int ierr; ierr = ROWAPI_new(table_ptr, ctrl_index); if (ierr) { ag_trace("ROWAPI_new failed with %d", ierr); return ierr; } eptr = ROWAPI_find(table_ptr, ctrl_index); if (!eptr) { ag_trace("ROWAPI_find failed"); return -4; } body = (CRTL_ENTRY_T *) eptr->body; /* * set parameters */ body->data_source.objid[body->data_source.length - 1] = ifIndex; body->interval = interval; body->scrlr.data_requested = requested; eptr->new_status = RMON1_ENTRY_VALID; ierr = ROWAPI_commit(table_ptr, ctrl_index); if (ierr) { ag_trace("ROWAPI_commit failed with %d", ierr); } return ierr;}#endif/* * Registration & Initializatio section */oid historyControlTable_variables_oid[] = { 1, 3, 6, 1, 2, 1, 16, 2, 1 };struct variable2 historyControlTable_variables[] = { /* * magic number , variable type, ro/rw , callback fn , L, oidsuffix */ {CTRL_INDEX, ASN_INTEGER, RONLY, var_historyControlTable, 2, {1, 1}}, {CTRL_DATASOURCE, ASN_OBJECT_ID, RWRITE, var_historyControlTable, 2, {1, 2}}, {CTRL_BUCKETSREQUESTED, ASN_INTEGER, RWRITE, var_historyControlTable, 2, {1, 3}}, {CTRL_BUCKETSGRANTED, ASN_INTEGER, RONLY, var_historyControlTable, 2, {1, 4}}, {CTRL_INTERVAL, ASN_INTEGER, RWRITE, var_historyControlTable, 2, {1, 5}}, {CTRL_OWNER, ASN_OCTET_STR, RWRITE, var_historyControlTable, 2, {1, 6}}, {CTRL_STATUS, ASN_INTEGER, RWRITE, var_historyControlTable, 2, {1, 7}},};oid etherHistoryTable_variables_oid[] = { 1, 3, 6, 1, 2, 1, 16, 2, 2 };struct variable2 etherHistoryTable_variables[] = { /* * magic number , variable type , ro/rw , callback fn , L, oidsuffix */ {DATA_INDEX, ASN_INTEGER, RONLY, var_etherHistoryTable, 2, {1, 1}}, {DATA_SAMPLEINDEX, ASN_INTEGER, RONLY, var_etherHistoryTable, 2, {1, 2}}, {DATA_INTERVALSTART, ASN_TIMETICKS, RONLY, var_etherHistoryTable, 2, {1, 3}}, {DATA_DROPEVENTS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 4}}, {DATA_OCTETS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 5}}, {DATA_PKTS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 6}}, {DATA_BROADCASTPKTS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 7}}, {DATA_MULTICASTPKTS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 8}}, {DATA_CRCALIGNERRORS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 9}}, {DATA_UNDERSIZEPKTS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 10}}, {DATA_OVERSIZEPKTS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 11}}, {DATA_FRAGMENTS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 12}}, {DATA_JABBERS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 13}}, {DATA_COLLISIONS, ASN_COUNTER, RONLY, var_etherHistoryTable, 2, {1, 14}}, {DATA_UTILIZATION, ASN_INTEGER, RONLY, var_etherHistoryTable, 2, {1, 15}},};voidinit_history(void){ REGISTER_MIB("historyControlTable", historyControlTable_variables, variable2, historyControlTable_variables_oid); REGISTER_MIB("etherHistoryTable", etherHistoryTable_variables, variable2, etherHistoryTable_variables_oid); ROWAPI_init_table(&HistoryCtrlTable, "History", 0, &history_Create, NULL, /* &history_Clone, */ NULL, /* &history_Delete, */ &history_Validate, &history_Activate, &history_Deactivate, &history_Copy); /* * add_hist_entry (2, 3, 4, 2); */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -