📄 traceroutectltable.c
字号:
/* *Copyright(c)2004,Cisco URP imburses and Network Information Center in Beijing University of Posts and Telecommunications researches. * *All right reserved * *File Name:traceRouteCtlTable.c *File Description:Rows of traceRouteCtlTable MIB add delete ans read. * Rows of traceRouteResultsTable MIB add and delete. * Rows of traceRouteProbeHistoryTable MIB add and delete. * Rows of traceRouteHopsTable MIB add and delete. * The main function is also here. * *Current Version:1.0 *Author:ChenJing *Date:2004.8.20 */#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include <pthread.h>#include "traceRouteCtlTable.h"#include "traceRouteResultsTable.h"#include "traceRouteProbeHistoryTable.h"#include "traceRouteHopsTable.h"#include "header_complex.h"oid traceRouteCtlTable_variables_oid[] = { 1, 3, 6, 1, 2, 1, 81, 1, 2 };/* trap */oid traceRoutePathChange[] = { 1, 3, 6, 1, 2, 1, 81, 0, 1 };oid traceRouteTestFailed[] = { 1, 3, 6, 1, 2, 1, 81, 0, 2 };oid traceRouteTestCompleted[] = { 1, 3, 6, 1, 2, 1, 81, 0, 3 };struct variable2 traceRouteCtlTable_variables[] = { /* * magic number , variable type , ro/rw , callback fn , L, oidsuffix */ {COLUMN_TRACEROUTECTLTARGETADDRESSTYPE, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 3}}, {COLUMN_TRACEROUTECTLTARGETADDRESS, ASN_OCTET_STR, RWRITE, var_traceRouteCtlTable, 2, {1, 4}}, {COLUMN_TRACEROUTECTLBYPASSROUTETABLE, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 5}}, {COLUMN_TRACEROUTECTLDATASIZE, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 6}}, {COLUMN_TRACEROUTECTLTIMEOUT, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 7}}, {COLUMN_TRACEROUTECTLPROBESPERHOP, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 8}}, {COLUMN_TRACEROUTECTLPORT, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 9}}, {COLUMN_TRACEROUTECTLMAXTTL, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 10}}, {COLUMN_TRACEROUTECTLDSFIELD, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 11}}, {COLUMN_TRACEROUTECTLSOURCEADDRESSTYPE, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 12}}, {COLUMN_TRACEROUTECTLSOURCEADDRESS, ASN_OCTET_STR, RWRITE, var_traceRouteCtlTable, 2, {1, 13}}, {COLUMN_TRACEROUTECTLIFINDEX, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 14}}, {COLUMN_TRACEROUTECTLMISCOPTIONS, ASN_OCTET_STR, RWRITE, var_traceRouteCtlTable, 2, {1, 15}}, {COLUMN_TRACEROUTECTLMAXFAILURES, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 16}}, {COLUMN_TRACEROUTECTLDONTFRAGMENT, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 17}}, {COLUMN_TRACEROUTECTLINITIALTTL, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 18}}, {COLUMN_TRACEROUTECTLFREQUENCY, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 19}}, {COLUMN_TRACEROUTECTLSTORAGETYPE, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 20}}, {COLUMN_TRACEROUTECTLADMINSTATUS, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 21}}, {COLUMN_TRACEROUTECTLDESCR, ASN_OCTET_STR, RWRITE, var_traceRouteCtlTable, 2, {1, 22}}, {COLUMN_TRACEROUTECTLMAXROWS, ASN_UNSIGNED, RWRITE, var_traceRouteCtlTable, 2, {1, 23}}, {COLUMN_TRACEROUTECTLTRAPGENERATION, ASN_OCTET_STR, RWRITE, var_traceRouteCtlTable, 2, {1, 24}}, {COLUMN_TRACEROUTECTLCREATEHOPSENTRIES, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 25}}, {COLUMN_TRACEROUTECTLTYPE, ASN_OBJECT_ID, RWRITE, var_traceRouteCtlTable, 2, {1, 26}}, {COLUMN_TRACEROUTECTLROWSTATUS, ASN_INTEGER, RWRITE, var_traceRouteCtlTable, 2, {1, 27}}};/* * global storage of our data, saved in and configured by header_complex() */struct header_complex_index *traceRouteCtlTableStorage = NULL;struct header_complex_index *traceRouteResultsTableStorage = NULL;struct header_complex_index *traceRouteProbeHistoryTableStorage = NULL;struct header_complex_index *traceRouteHopsTableStorage = NULL;voidinit_traceRouteCtlTable(void){ DEBUGMSGTL(("traceRouteCtlTable", "initializing... ")); /* * register ourselves with the agent to handle our mib tree */ REGISTER_MIB("traceRouteCtlTable", traceRouteCtlTable_variables, variable2, traceRouteCtlTable_variables_oid); /* * register our config handler(s) to deal with registrations */ snmpd_register_config_handler("traceRouteCtlTable", parse_traceRouteCtlTable, NULL, NULL); /* * we need to be called back later to store our data */ snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA, store_traceRouteCtlTable, NULL); DEBUGMSGTL(("traceRouteCtlTable", "done.\n"));}voidinit_trResultsTable(struct traceRouteCtlTable_data *item){ struct traceRouteResultsTable_data *StorageTmp = NULL; netsnmp_variable_list *vars = NULL; char *host = NULL; host = (char *) malloc(sizeof(char) * (item->traceRouteCtlTargetAddressLen + 1)); if (host == NULL) { DEBUGMSGTL(("traceRouteCtlTable", "host calloc %s\n", strerror(errno))); exit(1); } bzero(host, sizeof(char) * (item->traceRouteCtlTargetAddressLen + 1)); strcpy(host, item->traceRouteCtlTargetAddress); host[item->traceRouteCtlTargetAddressLen] = '\0'; StorageTmp = SNMP_MALLOC_STRUCT(traceRouteResultsTable_data); if (StorageTmp == NULL) { DEBUGMSGTL(("traceRouteCtlTable", "StorageTmp malloc %s\n", strerror(errno))); exit(1); } StorageTmp->traceRouteCtlOwnerIndex = (char *) malloc(sizeof(char) * (item->traceRouteCtlOwnerIndexLen + 1)); if (StorageTmp->traceRouteCtlOwnerIndex == NULL) { DEBUGMSGTL(("traceRouteCtlTable", "traceRouteCtlOwnerIndex malloc %s\n", strerror(errno))); exit(1); } memcpy(StorageTmp->traceRouteCtlOwnerIndex, item->traceRouteCtlOwnerIndex, item->traceRouteCtlOwnerIndexLen + 1); StorageTmp->traceRouteCtlOwnerIndex[item->traceRouteCtlOwnerIndexLen] = '\0'; StorageTmp->traceRouteCtlOwnerIndexLen = item->traceRouteCtlOwnerIndexLen; StorageTmp->traceRouteCtlTestName = (char *) malloc(sizeof(char) * (item->traceRouteCtlTestNameLen + 1)); if (StorageTmp->traceRouteCtlTestName == NULL) { DEBUGMSGTL(("traceRouteCtlTable", "traceRouteCtlTestName malloc %s\n", strerror(errno))); exit(1); } memcpy(StorageTmp->traceRouteCtlTestName, item->traceRouteCtlTestName, item->traceRouteCtlTestNameLen + 1); StorageTmp->traceRouteCtlTestName[item->traceRouteCtlTestNameLen] = '\0'; StorageTmp->traceRouteCtlTestNameLen = item->traceRouteCtlTestNameLen; StorageTmp->traceRouteResultsOperStatus = 1; if (item->traceRouteCtlTargetAddressType == 1 || item->traceRouteCtlTargetAddressType == 16) { struct sockaddr whereto; /* Who to try to reach */ register struct sockaddr_in *to = (struct sockaddr_in *) &whereto; register struct hostinfo *hi = NULL; hi = gethostinfo(host); if (hi == NULL) { DEBUGMSGTL(("traceRouteCtlTable", "hi calloc %s\n", strerror(errno))); exit(1); } setsin(to, hi->addrs[0]); if (inet_ntoa(to->sin_addr) == NULL) { StorageTmp->traceRouteResultsIpTgtAddrType = 0; StorageTmp->traceRouteResultsIpTgtAddr = strdup(""); StorageTmp->traceRouteResultsIpTgtAddrLen = 0; } else { StorageTmp->traceRouteResultsIpTgtAddrType = 1; StorageTmp->traceRouteResultsIpTgtAddr = (char *) malloc(sizeof(char) * (strlen(inet_ntoa(to->sin_addr)) + 1)); if (StorageTmp->traceRouteResultsIpTgtAddr == NULL) { DEBUGMSGTL(("traceRouteCtlTable", "traceRouteResultsIpTgtAddr malloc %s\n", strerror(errno))); exit(1); } memcpy(StorageTmp->traceRouteResultsIpTgtAddr, inet_ntoa(to->sin_addr), strlen(inet_ntoa(to->sin_addr)) + 1); StorageTmp-> traceRouteResultsIpTgtAddr[strlen(inet_ntoa(to->sin_addr))] = '\0'; StorageTmp->traceRouteResultsIpTgtAddrLen = strlen(inet_ntoa(to->sin_addr)); } } if (item->traceRouteCtlTargetAddressType == 2) { struct sockaddr_in6 whereto; /* Who to try to reach */ register struct sockaddr_in6 *to = (struct sockaddr_in6 *) &whereto; struct hostent *hp = NULL; /* struct hostenv hp; */ char pa[64]; bzero(pa, 64); to->sin6_family = AF_INET6; to->sin6_port = htons(33434); if (inet_pton(AF_INET6, host, &to->sin6_addr) > 0) { StorageTmp->traceRouteResultsIpTgtAddrType = 2; StorageTmp->traceRouteResultsIpTgtAddr = (char *) malloc(sizeof(char) * (strlen(host) + 1)); if (StorageTmp->traceRouteResultsIpTgtAddr == NULL) { DEBUGMSGTL(("traceRouteCtlTable", "traceRouteResultsIpTgtAddr malloc %s\n", strerror(errno))); exit(1); } bzero(StorageTmp->traceRouteResultsIpTgtAddr, sizeof(char) * (strlen(host) + 1)); memcpy(StorageTmp->traceRouteResultsIpTgtAddr, host, strlen(host) + 1); StorageTmp->traceRouteResultsIpTgtAddr[strlen(host)] = '\0'; StorageTmp->traceRouteResultsIpTgtAddrLen = strlen(host); } else { hp = gethostbyname2(host, AF_INET6); if (hp != NULL) { const char *hostname; memmove((caddr_t) & to->sin6_addr, hp->h_addr, 16); hostname = inet_ntop(AF_INET6, &to->sin6_addr, pa, 64); StorageTmp->traceRouteResultsIpTgtAddrType = 2; StorageTmp->traceRouteResultsIpTgtAddr = (char *) malloc(sizeof(char) * (strlen(hostname) + 1)); if (StorageTmp->traceRouteResultsIpTgtAddr == NULL) { DEBUGMSGTL(("traceRouteCtlTable", "traceRouteResultsIpTgtAddr malloc %s\n", strerror(errno))); exit(1); } bzero(StorageTmp->traceRouteResultsIpTgtAddr, sizeof(char) * (strlen(host) + 1)); memcpy(StorageTmp->traceRouteResultsIpTgtAddr, hostname, strlen(hostname) + 1); StorageTmp->traceRouteResultsIpTgtAddr[strlen(hostname)] = '\0'; StorageTmp->traceRouteResultsIpTgtAddrLen = strlen(hostname); } else { DEBUGMSGTL(("traceRouteCtlTable", "traceroute: unknown host %s\n", host)); StorageTmp->traceRouteResultsIpTgtAddrType = 0; StorageTmp->traceRouteResultsIpTgtAddr = strdup(""); StorageTmp->traceRouteResultsIpTgtAddrLen = 0; } } } StorageTmp->traceRouteResultsCurHopCount = 0; StorageTmp->traceRouteResultsCurProbeCount = 0; StorageTmp->traceRouteResultsTestAttempts = 0; StorageTmp->traceRouteResultsTestSuccesses = 0; StorageTmp->traceRouteResultsLastGoodPath = strdup(""); StorageTmp->traceRouteResultsLastGoodPathLen = 0; item->traceRouteResults = StorageTmp; snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) item->traceRouteCtlOwnerIndex, item->traceRouteCtlOwnerIndexLen); /* traceRouteCtlOwnerIndex */ snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) item->traceRouteCtlTestName, item->traceRouteCtlTestNameLen); /* traceRouteCtlTestName */ if ((header_complex_get(traceRouteResultsTableStorage, vars)) != NULL) { traceRouteResultsTable_del(item); } snmp_free_varbind(vars); vars = NULL; if (item->traceRouteResults != NULL) { if (traceRouteResultsTable_add(item) != SNMPERR_SUCCESS) { DEBUGMSGTL(("traceRouteResultsTable", "init an entry error\n")); } }}intmodify_trResultsOper(struct traceRouteCtlTable_data *thedata, long val){ netsnmp_variable_list *vars = NULL; struct traceRouteResultsTable_data *StorageTmp = NULL; snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->traceRouteCtlOwnerIndex, thedata->traceRouteCtlOwnerIndexLen); /* traceRouteCtlOwnerIndex */ snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, (char *) thedata->traceRouteCtlTestName, thedata->traceRouteCtlTestNameLen); /* traceRouteCtlTestName */ if ((StorageTmp = header_complex_get(traceRouteResultsTableStorage, vars)) == NULL) { snmp_free_varbind(vars); vars = NULL; return SNMP_ERR_NOSUCHNAME; } else { StorageTmp->traceRouteResultsOperStatus = val; DEBUGMSGTL(("traceRouteResultsOperStatus", "done.\n")); snmp_free_varbind(vars); vars = NULL; return SNMPERR_SUCCESS; }}struct traceRouteCtlTable_data *create_traceRouteCtlTable_data(void){ struct traceRouteCtlTable_data *StorageNew = NULL; StorageNew = SNMP_MALLOC_STRUCT(traceRouteCtlTable_data); if (StorageNew == NULL) { exit(1); } StorageNew->traceRouteCtlTargetAddressType = 1; StorageNew->traceRouteCtlTargetAddress = strdup(""); StorageNew->traceRouteCtlTargetAddressLen = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -