⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmodem.cpp

📁 cmdiag-0.2.tar.gz ( Diagnostic source )
💻 CPP
字号:
/*# Docsis cable modem diagnostics (cmdiag)## Copyright (C) 2006-2007 Emil Penchev## This program is free software, distributed under the terms of# the GNU General Public License 2.0#*/#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <string.h>#include "cmodem.h"#include "globals.h"char retdata[500];char oid_sid_data[100];char cable_parameter[10];char channel_par[20];int hex_char_to_value( char val ){	if ( val >= '0' && val <= '9' ) { return val - '0'; }	if ( val >= 'a' && val <= 'f' ) { return (val - 'a') + 10; }	if ( val >= 'A' && val <= 'F' ) { return (val - 'A') + 10; } 	return -1;}int hex_to_int( const char* buffer ){	int value = 0;	int curval;	int curpos = 0;		while ( (curval = hex_char_to_value(buffer[curpos++])) != -1 )		value = (value<<4) | curval;		return value;}CModem::CModem(char * cmip, char * cmtsip, char * community_str, char * ctstring) {	cm_state = 1;	cmts_state = 1;	ip = new char[strlen(cmip) + 1];	strcpy(ip, cmip);	cmts_ip = new char[strlen(cmtsip) + 1];	strcpy(cmts_ip, cmtsip);	community_string = new char[strlen(community_str) + 1];	strcpy(community_string, community_str);	cmts_community_string = new char[strlen(ctstring) + 1];	strcpy(cmts_community_string, ctstring);}// Create SNMP session and assemble packetchar *  CModem::snmp_session_init(const char * docsis_oid, char * device_ip, char * community_str){	struct snmp_session session;	struct snmp_session * sess_handle = NULL;	u_char * comm_string;	struct snmp_pdu * pdu = NULL; 	struct snmp_pdu * response = NULL;	struct variable_list * vars = NULL;	int status = 0;	if (!docsis_oid || !device_ip || !community_str)		return NULL;	comm_string = (u_char *) community_str;	oid id_oid[MAX_OID_LEN];	size_t id_len = MAX_OID_LEN;	init_snmp("APC Check");	char * snmp_oid = (char *) docsis_oid;	char * snmp_host = (char *) device_ip;	snmp_sess_init( &session );	session.version = SNMP_VERSION_1;	session.community = comm_string;	session.community_len = strlen(community_str);	session.peername = snmp_host; 	sess_handle = snmp_open(&session);	if (!sess_handle) {		if (strcmp(device_ip, ip) == 0)			cm_state = 0;		else 			cmts_state = 0;		return NULL;	}	pdu = snmp_pdu_create(SNMP_MSG_GET);	read_objid(snmp_oid, id_oid, &id_len);	snmp_add_null_var(pdu, id_oid, id_len); 	status = snmp_synch_response(sess_handle, pdu, &response);	if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {		vars = response->variables;		memset(retdata, '\0', 500);		snprint_value(retdata, 500, vars->name, vars->name_length, vars);	}	else {		if (response)			snmp_free_pdu(response); 		snmp_close(sess_handle);		if (strcmp(device_ip, ip) == 0)			cm_state = 0;		else			cmts_state = 0;		return NULL;	}	if (response)		snmp_free_pdu(response); 	snmp_close(sess_handle);	if (strcmp(device_ip, ip) == 0)		cm_state = 1;		else 			cmts_state = 1;	return retdata;}// Parse return SNMP datachar * CModem::get_cable_parameter(const char * docsis_oid, char * dev_ip){	char part_cable_parameter[10];	char * snmp_retdata = NULL;		if (strcmp(dev_ip, ip) == 0) {		snmp_retdata = snmp_session_init(docsis_oid, dev_ip, community_string);	}	else {		snmp_retdata = snmp_session_init(docsis_oid, dev_ip, cmts_community_string);	}	if (!snmp_retdata)		return NULL;	char * numeric_part = strstr(snmp_retdata, " ");	if (!numeric_part)		return NULL;	memset(cable_parameter, '\0', 10);	memset(part_cable_parameter, '\0', 10);		// Convert the return data from string to integer	int numpart = atoi(numeric_part);	int npart = numpart / 10;	sprintf(cable_parameter, "%d", npart);		// get rest of the data	npart = numpart % 10;	if (npart < 0) 		npart = 0;	// assemble the two parts	sprintf(part_cable_parameter, ".%d", npart);	strcat(cable_parameter, part_cable_parameter); 	return cable_parameter;}char * CModem::get_cm_oidsid(char * cm_ip, char * cmts_ip, char * docsis_oid){	char dec_mac[50];	char buf[5];	int  count = 0;	int  octs = 0;	char tmp_buf[10];	char oid_dec_mac[100];	char tmp_str_sid[100]; 	/* get MAC from Modem */	char * snmp_retdata = snmp_session_init(CM_MAC, cm_ip, community_string);	//CM is offline	if (!snmp_retdata) 		return NULL;	char * temp_mac = strstr(snmp_retdata, " ");	if (!temp_mac) 		return NULL;	strcat(temp_mac, ":");	memset(buf, '\0', 5);	memset(dec_mac, '\0', 50);	memset(oid_dec_mac, '\0', 100);	memset(oid_sid_data, '\0', 100);	memset(tmp_str_sid, '\0', 100);		int len = strlen(temp_mac);	for (int i = 0; i <= len; i++) {		if (temp_mac[i] != ':') {			buf[count] = temp_mac[i];			count++;		}		else {			count = 0;			octs = hex_to_int(buf);			sprintf(tmp_buf, ".%d", octs);			strcat(dec_mac, tmp_buf);			memset(buf, '\0', 5);		}	}	strcpy(oid_dec_mac, CM_SID);	strcat(oid_dec_mac, dec_mac);		// Get SiD from CMTS	snmp_retdata = snmp_session_init(oid_dec_mac, cmts_ip, cmts_community_string);	if (!snmp_retdata) 		return NULL;	char * sid = strstr(snmp_retdata, " ");	int nsid = atoi(sid);	sprintf(tmp_str_sid, "%d", nsid); 	//Convert SID to OID to make query to CMTS	strcpy(oid_sid_data, docsis_oid);	strcat(oid_sid_data, ".");	strcat(oid_sid_data, tmp_str_sid); 	return oid_sid_data;}char * CModem::get_channel_parameter(const char * docsis_oid){	memset(channel_par, '\0', 20);	char * snmp_retdata = snmp_session_init(docsis_oid, ip, community_string);	if (!snmp_retdata) 		return NULL;	char * paramt = strstr(snmp_retdata, " ");	float fparamt = ((atof(paramt)) / 1000000);	sprintf(channel_par, "%f MHz", fparamt);		return channel_par;}// Member function to get cable modem downstream power levelstring * CModem::Get_Ds_Power(){	char * ds_level = get_cable_parameter(CM_DS_LEVEL, ip);	if (!ds_level)		return NULL;	ds_power.assign(ds_level);		return &ds_power;}// Member function to get cable modem upstream power levelstring * CModem::Get_Us_Power(){	char * us_level = get_cable_parameter(CM_US_LEVEL, ip);	if (!us_level)		return NULL;	us_power.assign(us_level);		return &us_power;}// Member function to get cable modem downstream snrstring * CModem::Get_Ds_Snr(){	char * snr_ds = get_cable_parameter(CM_DS_SNR, ip);	if (!snr_ds)		return NULL;	snr_downstream.assign(snr_ds);		return &snr_downstream;}// Member function to get cable modem upstream snr// This is pull out from the CMTSstring * CModem::Get_Us_Snr(){	char * oid_sid = get_cm_oidsid(ip, cmts_ip, CM_US_SNR);	if (!oid_sid)		return NULL;		char * snr_us = get_cable_parameter(oid_sid, cmts_ip);	if (!snr_us)		return NULL;		snr_upstream.assign(snr_us);		return &snr_upstream;}// Get downstream cable rf flowstring * CModem::Get_RfDs_Data(){	char * snmp_rdata = snmp_session_init(CM_DS_RF_BYTES, ip, community_string);	if (!snmp_rdata) 		return NULL;		char * numeric_part = strstr(snmp_rdata, " ");	if (!numeric_part)		return NULL;		rf_downstrem_flow.assign(numeric_part);		return &rf_downstrem_flow;}// Get upstream cable rf flowstring * CModem::Get_RfUs_Data(){	char * snmp_rdata = snmp_session_init(CM_US_RF_BYTES, ip, community_string);	if (!snmp_rdata) 		return NULL;		char * numeric_part = strstr(snmp_rdata, " ");	if (!numeric_part) 		return NULL;		rf_upsteam_flow.assign(numeric_part);		return &rf_upsteam_flow;}// Get downstream cable rf error bytesstring * CModem::Get_RfDs_Err(){	char * snmp_rdata = snmp_session_init(CM_DS_RF_ERR_BYTES, ip, community_string);	if (!snmp_rdata) 		return NULL;		char * numeric_part = strstr(snmp_rdata, " ");	if (!numeric_part) 		return NULL;		rf_downstrem_err.assign(numeric_part);		return &rf_downstrem_err;}// Get upstream cable rf error bytesstring * CModem::Get_RfUs_Err(){	char * snmp_rdata = snmp_session_init(CM_US_RF_ERR_BYTES, ip, community_string);	if (!snmp_rdata)		return NULL;		char * numeric_part = strstr(snmp_rdata, " ");	if (!numeric_part)		return NULL;		rf_upstream_err.assign(numeric_part);		return &rf_upstream_err;}// Get CMTS RX power for the cable modemstring * CModem::Get_CMTS_Rx_Power(){	char * oid_sid = get_cm_oidsid(ip, cmts_ip, CMTS_CM_RX_POWER);	if (!oid_sid)		return NULL;		char * rx_power = get_cable_parameter(oid_sid, cmts_ip);	if (!rx_power)		return NULL;		receive_power_at_cmts.assign(rx_power);		return &receive_power_at_cmts;}// Get downstream Frequencystring * CModem::Get_Ds_Freq(){	char * d_freq = get_channel_parameter(CM_DS_FREQ);	if (!d_freq)		return NULL;	freq_downstream.assign(d_freq);		return &freq_downstream;}// Get upstream Frequencystring * CModem::Get_Us_Freq(){	char * u_freq = get_channel_parameter(CM_US_FREQ);	if (!u_freq)		return NULL;	freq_upstream.assign(u_freq);		return &freq_upstream;}// Get downstream channel widthstring * CModem::Get_Ds_Width(){	char * d_width = get_channel_parameter(CM_DS_CHANNEL_WIDTH);	if (!d_width)		return NULL;    channel_width_downstream.assign(d_width);		return &channel_width_downstream;}// Get upstream channel widthstring * CModem::Get_Us_Width(){	char * u_width = get_channel_parameter(CM_US_CHANNEL_WIDTH);	if (!u_width)		return NULL;	channel_width_upstream.assign(u_width);		return &channel_width_upstream;}// Get cable modem uptimestring * CModem::Get_Uptime(){	char * snmp_retdata = snmp_session_init(CM_UPTIME, ip, community_string);	if (!snmp_retdata) 		return NULL;		char * up_time = strstr(snmp_retdata, ") ");	if (up_time[0] == ')')		up_time[0] = ' ';		uptime.assign(up_time);		return &uptime;}int CModem::CM_Online(){	return cm_state;}int CModem::CMTS_Online(){	return cmts_state;}// Get cable modem macstring * CModem::Get_Mac(){	int chc = 0;	int colon_count = 0;		char * snmp_retdata = snmp_session_init(CM_MAC, ip, community_string);	if (!snmp_retdata)		return NULL;	char * ptmac = strstr(snmp_retdata, " ");	char * tmac = new char[strlen(snmp_retdata)];	if (ptmac)		strcpy(tmac, ptmac);		mac.clear();		while (tmac[chc] != '\0') {		if (tmac[chc] == ':') {			colon_count++;					if ( (tmac[chc-2] == ' ') || (tmac[chc-2] == ':')) {				mac.append("0");				mac.append(1, tmac[chc-1]);				mac.append(":");			}			else {				mac.append(1, tmac[chc-2]);				mac.append(1, tmac[chc-1]);				mac.append(":");			}			if (colon_count == 5) {				if (tmac[chc+2] == '\0') {					mac.append("0");					mac.append(1, tmac[chc+1]);				}				else {					mac.append(1, tmac[chc+1]);					mac.append(1, tmac[chc+2]);				}			} 		}		chc++;	}				delete tmac;	return &mac;}// Get sys descriptionstring * CModem::Get_SysDesc(){	char * snmp_retdata = snmp_session_init(CM_VER, ip, community_string);	if (!snmp_retdata) 		return NULL;	char * ver = strstr(snmp_retdata, ": ");	if (ver[0] == ':')		ver[0] = ' ';	sys_descrpition.assign(ver);		return &sys_descrpition;}	//Get number of times the CM reset or initialized RF interfacestring * CModem::Get_CM_Resets(){	char * snmp_retdata = snmp_session_init(CM_RF_RESETS, ip, community_string);	if (!snmp_retdata)		return NULL;	char * counter_resets = strstr(snmp_retdata, " ");	if (!counter_resets)		return NULL;	resets.assign(counter_resets);		return &resets;}	// Get number of times the CM received invalid registration response messagesstring * CModem::Get_Recv_Inv_Reg(){	char * snmp_retdata = snmp_session_init(CM_RECV_INVALID_REGISTRATION_RESPONSES, ip, community_string);	if (!snmp_retdata)		return NULL;	char * recv_reg_resp = strstr(snmp_retdata, " ");	if (!recv_reg_resp)		return NULL;	received_inv_reg_resp.assign(recv_reg_resp);		return &received_inv_reg_resp;}// Get number of times the CM received invalid ranging response messagesstring * CModem::Get_Recv_Inv_Rang(){	char * snmp_retdata = snmp_session_init(CM_RECV_INVALID_RANGING_RESPONSES, ip, community_string);	if (!snmp_retdata)		return NULL;	char * recv_rang_resp = strstr(snmp_retdata, " ");	if (!recv_rang_resp)		return NULL;	received_inv_rang_resp.assign(recv_rang_resp);		return &received_inv_rang_resp;}//Get number of times the ranging process was aborted by the CMTSstring * CModem::Get_Abort_Rang(){	char * snmp_retdata = snmp_session_init(CM_CMTS_ABORTED_RANGINGS, ip, community_string);	if (!snmp_retdata)		return NULL;	char * aborted_rang = strstr(snmp_retdata, " ");	if (!aborted_rang)		return NULL;	aborted_rangings.assign(aborted_rang);		return &aborted_rangings;}// Get the number of codewords received without errorstring * CModem::Get_Unerror_Words(){	char * snmp_retdata = snmp_session_init(SIGQ_UNERROREDS, ip, community_string);	if (!snmp_retdata)		return NULL;	char * sig_unerr = strstr(snmp_retdata, " ");	if (!sig_unerr)		return NULL;	sig_unerroreds.assign(sig_unerr);		return &sig_unerroreds;}// Get the number of codewords received with correctable errorsstring * CModem::Get_Corerror_Words(){		char * snmp_retdata = snmp_session_init(SIGQ_CORRECTEDS, ip, community_string);	if (!snmp_retdata)		return NULL;	char * sig_corerr = strstr(snmp_retdata, " ");	if (!sig_corerr)		return NULL;	sig_correcteds.assign(sig_corerr);		return &sig_correcteds;}// Get the number of codewords received with uncorrectable errorsstring * CModem::Get_Uncorerror_Words(){	char * snmp_retdata = snmp_session_init(SIGQ_UNCORRECTEDS, ip, community_string);	if (!snmp_retdata)		return NULL;	char * sig_uncorerr = strstr(snmp_retdata, " ");	if (!sig_uncorerr)		return NULL;	sig_uncorrecteds.assign(sig_uncorerr);		return &sig_uncorrecteds;}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -