📄 rvsubagentif.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 + -