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

📄 rvsubagentif.c

📁 h.248协议源码
💻 C
字号:
#if (0)
******************************************************************************
Filename   :	rvsubagentif.c
Description:	rv socket interface for snmp message get(getnext), set 
******************************************************************************
                Copyright (c) 1999 RADVision Inc.
******************************************************************************
NOTICE:
This document contains information that is proprietary to RADVision LTD.
No part of this publication may be reproduced in any form whatsoever 
without written prior approval by RADVision LTD..

RADVision LTD. reserves the right to revise this publication and make 
changes without obligation to notify any person of such revisions or 
changes.
******************************************************************************
$Revision:$
$Date:$
$Author:$
******************************************************************************
#endif

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "rvlog.h"
#include "rvsnmpif.h"
#include "rvsubagentif.h"
#include "rvsocket.h"
#include "rvthread.h"
#include "rvtimer.h"

#define		RV_SNMP_BUFSIZE			512
static		RvBool done;
RvThread	listenThread;
RvTimer		rvTimer;
static		RvSocket	rvSnmpSubagent;
int			rvSnmpTxPort;
int			rvSnmpRxPort;
int			rvSaSnmpTrapTxPort = 65430;	
RvUint		rvPort[] = { 1, 0 };
RvUint		rvPortLen = sizeof(rvPort) / sizeof(RvUint);


static	void	rvSnmpTimer(RvTimer *timer, void *data);
static	void	rvInsSubagentThread(RvThread *thread, void *data);
static	void	rvSnmpStackMsg(char *stackMsg);

#if defined(RV_OS_WIN32)
static	RvBool	rvSubagentMsgProc(char *recvMsg, char *sendMsg);
#endif
static	int		rvSubagentMsgProcFnc(char *recvMsg, char *sendMsg);

#if defined (RV_OS_SOLARIS)
static	void	rvRegPortMsgSend(char *regMsg);
#endif


void	rvSnmpSubagentEnd( void ) {
	rvTimerDestruct(&rvTimer);
	done = rvTrue;
	rvSocketDestruct(&rvSnmpSubagent);
	rvThreadDestruct(&listenThread);
}

/*
 *		rvSnmpSubagentInit( void )
 */
RvBool	rvSnmpSubagentInit( void )
{	
	char	regPortMsg[300];
	char	stackMsg[200];

	rvLogEnter(&rvLog, "rvSnmpSubagentInit");

	/* socket init, register Rx port number to rvsubagent */
	rvSocketConstructUdpAnyPort(&rvSnmpSubagent);		/* get random socket port number assigned */
	rvSnmpRxPort = rvSocketGetPort(&rvSnmpSubagent);
	memset(regPortMsg, 0, sizeof(regPortMsg));

	rvSnmpStackMsg(stackMsg);
    sprintf(regPortMsg, "%d,0,%s,\0", rvSnmpRxPort, stackMsg);

#	if defined(RV_OS_WIN32)
    rvSnmpIfTrap.func( rvPort, rvPortLen, 4,        	/* register type    */
                       (char *)regPortMsg,          	/* register message */
                       strlen(regPortMsg));

#	elif defined (RV_OS_SOLARIS)
	rvRegPortMsgSend(regPortMsg);
#	endif

	/* timer init, keep update the instance stack size */
	rvTimerConstruct(&rvTimer, 60000, rvSnmpTimer, NULL);		/* 60000, 1 min */
	rvTimerStart(&rvTimer);										/*  5000, 5 sec */

	/* rx port init */
	done = rvFalse;
	rvThreadConstruct(&listenThread, "RvSnmpSubAgent", RV_PRIORITYVALUE_NORMAL, 30000, rvInsSubagentThread, &rvSnmpSubagent);
	rvThreadStart(&listenThread);

	rvLogLeave(&rvLog, "rvSnmpSubagentInit");

	return rvTrue;
}


/*
 *		rvInsSubagentThread(RvThread *thread, void *data)
 */

static	void	rvInsSubagentThread(RvThread *thread, void *data)
{ 
	char	szReadBuffer[RV_SNMP_BUFSIZE]; 
    char	szWriteBuffer[RV_SNMP_BUFSIZE]; 
	int		bytesRcvd;
	RvHost	host;
	RvSocketAddr	socketAddr;
	RvSocketAddr	fromAddr;

	/* rvLogEnter(&rvLog, "rvInsSubagentThread"); */

	while(!done)	
	{
		memset(szReadBuffer, 0, sizeof(szReadBuffer));
		memset(szWriteBuffer, 0, sizeof(szWriteBuffer));

		bytesRcvd = rvSocketRecvFrom(&rvSnmpSubagent, szReadBuffer, sizeof(szReadBuffer), &fromAddr);
		if (bytesRcvd > 0)
		{	

#if defined(RV_OS_WIN32)
			rvSubagentMsgProc(szReadBuffer, szWriteBuffer);
#elif defined (RV_OS_SOLARIS)
			rvSubagentMsgProcFnc(szReadBuffer, szWriteBuffer);
#endif
				/* send data to rvsubagent */
			if (rvHostConstructLocal(&host) != NULL) {
				if (rvSocketAddrConstructInet(&socketAddr, &host, 0, (const RvInetPort)rvSnmpTxPort) != NULL)
					rvSocketSendTo(&rvSnmpSubagent, szWriteBuffer, strlen(szWriteBuffer), &socketAddr) ;
			}

		}
	}

	/*	rvLogLeave(&rvLog, "rvInsSubagentThread"); */
} 

/*
 *		rvSubagentMsgProc(char *recMsg, char *sendMsg)
 */
#if defined(RV_OS_WIN32)
static	RvBool	rvSubagentMsgProc(char *recMsg, char *sendMsg)
{
	RvUint	rxMib[256];
	int		msgType, datatype, rtStatus;
	size_t	msgSize, datalen, i;
	static	long	rvValue;
	static	unsigned char databuf[512];
	char	mibTmp[100], *datapt, *sizept;
	RvBool	fresult;


	rvLogEnter(&rvLog, "rvSubagentMsgProc");
	fresult = rvTrue;
	memset(databuf, 0, sizeof(databuf));

	rvSnmpTxPort = atoi(strtok(recMsg, ","));
	msgType = atoi(strtok(NULL, ","));
	msgSize = atoi(strtok(NULL, ","));
	for (i = 0; i < msgSize; i++ ) 
		rxMib[i] = atoi(strtok(NULL, ","));


	switch (msgType) {
		case	RV_SNMP_MIBACTION_GETNEXT:
			rtStatus = rvSnmpIfGetNext(&rxMib[0], &msgSize, &datatype, &databuf, &datalen);

			if (rtStatus == RV_SNMPSTATUS_NOERROR) 
			{
				sprintf(sendMsg, "%d,%d,", datatype, msgSize);

				for (i = 0 ; i < msgSize; ++i) {
					sprintf(mibTmp, "%d,", rxMib[i]);
					strcat(sendMsg, mibTmp);
				}
			
				memset(mibTmp, 0, sizeof(mibTmp));
				switch (datatype) {
					case	RV_SNMPTYPE_INTEGER:
						sprintf(mibTmp, "%d,", *(int *)databuf);
						break;

					case	RV_SNMPTYPE_OCTETSTRING:
					case	RV_SNMPTYPE_IPADDRESS:
						sprintf(mibTmp, "%s,%d", (char *)databuf, datalen);
						break;

					default:
						break;
				}
				strcat(sendMsg, mibTmp);
			}
			else {
				sprintf(sendMsg, "0,%d", rtStatus);
			}
		
			break;
	
		case	RV_SNMP_MIBACTION_GET:
			rtStatus = rvSnmpIfGet(&rxMib[0], msgSize, &datatype, &databuf, &datalen);

			sprintf(sendMsg, "0,%d", RV_SNMPSTATUS_GENERR);
			if (rtStatus == RV_SNMPSTATUS_NOERROR) 
			{
				switch (datatype) 
				{
					case	RV_SNMPTYPE_INTEGER:
						sprintf(sendMsg, "%d,%d", datatype, *(int *)databuf);
						break;

					case	RV_SNMPTYPE_OCTETSTRING:
					case    RV_SNMPTYPE_IPADDRESS:
						sprintf(sendMsg, "%d,%s,%d", datatype, (char *)databuf, datalen);
						break;

					default:
						break;
				}
			}
			break;
		
		
		case	RV_SNMP_MIBACTION_SET:
			datapt = NULL;
			datatype = atoi(strtok(NULL, ","));
			switch (datatype) {
				case	RV_SNMPTYPE_INTEGER:
					rvValue = atoi(strtok(NULL, ","));
					rtStatus = rvSnmpIfSet(&rxMib[0], msgSize, datatype, &rvValue, sizeof(rvValue));
					break;

				case	RV_SNMPTYPE_OCTETSTRING:
				case    RV_SNMPTYPE_IPADDRESS:
					datapt = strtok(NULL, ",");
					sizept = strtok(NULL, ",");
					if (sizept)
						datalen = (size_t)atoi(sizept);
					else
						datalen = 0;

					if (datalen > 0) {
						strncpy((char *)databuf, datapt, datalen);
						rtStatus = rvSnmpIfSet(&rxMib[0], msgSize, datatype, &databuf[0], datalen);
						break;
					}
					else {		/* null string */
						rtStatus = rvSnmpIfSet(&rxMib[0], msgSize, datatype, &databuf[0], 0);
						break;
					}
				default:
					break;
			}
			
			if (rtStatus == RV_SNMPSTATUS_NOERROR) 
				sprintf(sendMsg, "%d,%s", datatype, "ack");	
			else
				sprintf(sendMsg, "0,%d", RV_SNMPSTATUS_GENERR);
			
			break;

		case	RV_SNMP_MIBACTION_STACK:	/* special, get stack instance */
			rtStatus = rvSnmpIfGet(&rxMib[0], msgSize, &datatype, &databuf, &datalen);
			if (rtStatus == RV_SNMPSTATUS_NOERROR) 
				sprintf(sendMsg, "%d,%d\0", rvSnmpRxPort, *(int *)databuf);
			else
				sprintf(sendMsg, "%d,%d\0", rvSnmpRxPort, 0);

			fresult = rvFalse;
			break;


		default:
			sprintf(sendMsg, "0,%d", RV_SNMPSTATUS_GENERR);
			break;
	}
	

	rvLogLeave(&rvLog, "rvSubagentMsgProc");
	return (fresult);
}
#endif

static	int    rvSubagentMsgProcFnc(char *recvMsg, char *sendMsg)
{
    int     actType, datatype, offset1, offset2, index;
    size_t  datalen;
    static  long    rvValue;
    static  unsigned char databuf[512];
	int		rtStatus = RV_SNMPSTATUS_GENERR;
	char	*datapt, *sizept;

    memset(databuf, 0, sizeof(databuf));

    rvSnmpTxPort = atoi(strtok(recvMsg, ","));
    actType = atoi(strtok(NULL, ","));
    offset1 = atoi(strtok(NULL, ","));
    offset2 = atoi(strtok(NULL, ","));
	index =   atoi(strtok(NULL, ","));
	/* next two items datatype and rvValue only for set func */
			
	switch(actType) {
        case    RV_SNMP_MIBACTION_GET:
            rtStatus = rvSnmpIfGetFnc(offset1, offset2, index, &datatype, &databuf, &datalen);

           	sprintf(sendMsg, "%d,0,%d", rvSnmpRxPort, RV_SNMPSTATUS_GENERR);
            if (rtStatus == RV_SNMPSTATUS_NOERROR)
            {
                switch (datatype)
                {
                    case    RV_SNMPTYPE_INTEGER:
                        sprintf(sendMsg, "%d,%d,%d", rvSnmpRxPort, datatype, *(int *)databuf);
                        break;

                    case    RV_SNMPTYPE_OCTETSTRING:
                    case    RV_SNMPTYPE_IPADDRESS:
                        sprintf(sendMsg, "%d,%d,%s,%d", rvSnmpRxPort, datatype, (char *)databuf, datalen);
                        break;
                }
            }
            break;

        case    RV_SNMP_MIBACTION_SET:
            datatype = atoi(strtok(NULL, ","));
            switch (datatype) {
                case    RV_SNMPTYPE_INTEGER:
                    rvValue = atoi(strtok(NULL, ","));
                    rtStatus = rvSnmpIfSetFnc(offset1, offset2, index, datatype, &rvValue, sizeof(rvValue));
                    break;

                case    RV_SNMPTYPE_OCTETSTRING:
                case    RV_SNMPTYPE_IPADDRESS:
					datapt = strtok(NULL, ",");
					sizept = strtok(NULL, ",");
					if (sizept)
						datalen = (size_t)atoi(sizept);
					else
						datalen = 0;

					if (datalen > 0) {
						strncpy((char *)databuf, datapt, datalen);
						rtStatus = rvSnmpIfSetFnc(offset1, offset2, index, datatype, &databuf[0], datalen);
						break;
					}
					else {		/* null string */
						rtStatus = rvSnmpIfSetFnc(offset1, offset2, index, datatype, &databuf[0], 0);
						break;
					}
                default:
                    break;
            }
            sprintf(sendMsg, "%d,%d,%d", rvSnmpRxPort, datatype, rtStatus);
            break;
	}

	return rtStatus;
}

static	void	rvSnmpStackMsg(char *stackMsg)
{
	int		i;
	int		stackSize, stackType;
	char	tmpStr[60], stackName[50];

	rvSnmpGetStackSize(0, &stackSize);

	if (stackSize == 0) {
		strcpy(stackMsg, "0,0");
	}
	else {
		sprintf(stackMsg, "%d", stackSize);
		for (i = 0; i < stackSize; i++) {
			rvSnmpSetActiveStack(0, &i);
			rvSnmpGetStackType(0, &stackType);
			rvSnmpGetStackName(0, &stackName);
			sprintf(tmpStr, ",%d,%s", stackType, stackName);
			strcat(stackMsg, tmpStr);
		}	
	}
}


static	void	rvSnmpTimer(RvTimer *timer, void *data)
{
	rvLogEnter(&rvLog, "rvSnmpTimer");

	rvSnmpSubagentRefresh();
	/*rvTimerReset(&rvTimer, 60000);*/				/* 60000, 1 min */

	rvLogLeave(&rvLog, "rvSnmpTimer");
}


void	rvSnmpSubagentRefresh()
{ 
#if defined (RV_SNMP_SUBAGENT)	
#if defined (RV_OS_WIN32)
	RvUint	rvPort[] = {1, 0};
#endif
	char	regPortMsg[300];
	char	stackMsg[200];

	rvLogEnter(&rvLog, "rvSnmpSubagentRefresh");
	rvSnmpStackMsg(stackMsg);
	sprintf(regPortMsg, "%d,0,%s,\0", rvSnmpRxPort, stackMsg);

#if defined (RV_OS_WIN32)
    rvSnmpIfTrap.func( rvPort, rvPortLen, 4,    /* register type    */
                       (char *)regPortMsg,      /* register port message     */
                       strlen(regPortMsg));
#elif defined (RV_OS_SOLARIS)
	rvRegPortMsgSend(regPortMsg);
#endif

	rvLogLeave(&rvLog, "rvSnmpSubagentRefresh");
#endif
} 

#if defined (RV_OS_SOLARIS)
static	void	rvRegPortMsgSend(char *regMsg)
{
	RvHost  host;
    RvSocketAddr    socketAddr;
	char	tmpMsg[120];

	memset(tmpMsg, 0, sizeof(tmpMsg));
	sprintf(tmpMsg, "5|%s", regMsg);
    if (rvHostConstructLocal(&host) != NULL) {
        if (rvSocketAddrConstructInet(&socketAddr, &host, 0, 
						(const RvInetPort)rvSaSnmpTrapTxPort) != NULL)
           rvSocketSendTo(&rvSnmpSubagent, tmpMsg, strlen(tmpMsg), &socketAddr) ;
    }
}
#endif

⌨️ 快捷键说明

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