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

📄 dcaptm.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
📖 第 1 页 / 共 2 页
字号:
    if ((local = MibRmon (Obj, BufferList, IdLen, BUFFERSIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, BUFFERSIZE, NULL) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        data = (DNPAP_BUFFER *) local->Data;        Obj->Syntax.LngInt = data->CapturedPkts;        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DBufferControlTurnOnTime (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL  *local = NULL;    DNPAP_BUFFER     *data;    if ((local = MibRmon (Obj, BufferList, IdLen, BUFFERSIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, BUFFERSIZE, NULL) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        data = (DNPAP_BUFFER *) local->Data;        Obj->Syntax.LngUns = data->TurnOnTime;        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DBufferControlOwner (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL  *local = NULL;    DNPAP_BUFFER     *data;    if ((local = MibRmon(Obj, BufferList, IdLen, BUFFERSIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, BUFFERSIZE, NULL) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        data = (DNPAP_BUFFER *) local->Data;		if (BeholderStrictRMON && !BooleanCheck(data->ObjectSet, CAPTURE_BOOLEAN_OWNER))			return SNMP_NOSUCHNAME;        memcpy (Obj->Syntax.BufChr, data->Owner, data->OwnerLen);        Obj->SyntaxLen = data->OwnerLen;        return SNMP_NOERROR;    case SNMP_PDU_SET:        data = (DNPAP_BUFFER *) local->Data;        if (data->Status != SNMP_UNDERCREATION)            return SNMP_READONLY;        memcpy (data->Owner, Obj->Syntax.BufChr, Obj->SyntaxLen);        data->OwnerLen = Obj->SyntaxLen;		BooleanSetTrue(data->ObjectSet, CAPTURE_BOOLEAN_OWNER);        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DBufferControlStatus (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL  *local = NULL;    DNPAP_BUFFER     *data;    local = MibRmon(Obj, BufferList, IdLen, BUFFERSIZE);    switch (Obj->Request)    {    case SNMP_PDU_GET:        if (local == NULL)        {            Obj->Syntax.LngInt = SNMP_INVALID;            return SNMP_NOSUCHNAME;        }        data = (DNPAP_BUFFER *) local->Data;        Obj->Syntax.LngInt = data->Status;        return SNMP_NOERROR;    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, BUFFERSIZE, NULL) == FALSE)        {            Obj->Syntax.LngInt = SNMP_INVALID;            return SNMP_NOSUCHNAME;        }        data = (DNPAP_BUFFER *) local->Data;        Obj->Syntax.LngInt = data->Status;        return SNMP_NOERROR;    case SNMP_PDU_SET:        if (local == NULL)        {            switch (Obj->Syntax.LngInt)            {            case SNMP_CREATEREQUEST:                if ((local = MibInsert(Obj, &BufferList, IdLen, BUFFERSIZE)) == NULL)                    return SNMP_GENERROR;                if ((local->Data = DnpapMalloc(sizeof(DNPAP_BUFFER))) == NULL)                    return SNMP_GENERROR;                data = (DNPAP_BUFFER *) local->Data;                memset(data, 0, sizeof(DNPAP_BUFFER));                if (DnpapCaptureInit(data) == TRUE)                {                    data->Status = SNMP_UNDERCREATION;                    DnpapMessage(DMC_MESSAGE, DCAPTURE_CREATE, "dcapture: collector %ld created", local->Index);                    return SNMP_NOERROR;                }                DnpapFree(local->Data);                MibRemove (Obj, &BufferList, IdLen, BUFFERSIZE);                return SNMP_GENERROR;            default:                return SNMP_NOSUCHNAME;            }        }        data = (DNPAP_BUFFER *) local->Data;        switch (data->Status)        {        case SNMP_UNDERCREATION:            switch (Obj->Syntax.LngInt)            {            case SNMP_VALID:                if (DnpapCaptureStart(data) == TRUE)                {                    data->Status = SNMP_VALID;                    DnpapMessage(DMC_MESSAGE, DCAPTURE_ACTIVE, "dcapture: collector %ld active", local->Index);                    return SNMP_NOERROR;                }                else                    return SNMP_BADVALUE;            case SNMP_INVALID:                if (DnpapCaptureStop(data) == TRUE)                {                    DnpapFree(local->Data);                    DnpapMessage(DMC_MESSAGE, DCAPTURE_DESTROY, "dcapture: collector %ld destroyed", local->Index);                    if (MibRemove (Obj, &BufferList, IdLen, BUFFERSIZE) == TRUE)                        return SNMP_NOERROR;                }                return SNMP_GENERROR;            default:                return SNMP_BADVALUE;            }        case SNMP_VALID:            switch (Obj->Syntax.LngInt)            {            case SNMP_INVALID:                if (DnpapCaptureStop(data) == TRUE)                {                    DnpapFree(local->Data);                    DnpapMessage(DMC_MESSAGE, DCAPTURE_DESTROY, "dcapture: collector %ld destroyed", local->Index);                    if (MibRemove (Obj, &BufferList, IdLen, BUFFERSIZE) == TRUE)                        return SNMP_NOERROR;                }                return SNMP_GENERROR;            case SNMP_VALID:                return SNMP_NOERROR;            default:                return SNMP_BADVALUE;            }        }    }        return SNMP_GENERROR;}WORD DnpapCaptureBufferControlIndex (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL  *local = NULL;    LONG index = -1;    if ((local = MibRmon (Obj, BufferList, IdLen, CAPTURESIZE)) == NULL)        return SNMP_NOSUCHNAME;		    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, CAPTURESIZE, &index) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        if (index == -1 && (index = CaptureSearch (CAPTURE_GET, Obj, local, IdLen)) == -1)            return SNMP_NOSUCHNAME;        Obj->Syntax.LngInt = local->Index;        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DnpapCaptureBufferIndex (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL   *local = NULL;    LONG index = -1;    if ((local = MibRmon (Obj, BufferList, IdLen, CAPTURESIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, CAPTURESIZE, &index) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        if (index == -1 && (index = CaptureSearch (CAPTURE_GET, Obj, local, IdLen)) == -1)            return SNMP_NOSUCHNAME;        Obj->Syntax.LngInt = Obj->Id[IdLen+1];        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DnpapCaptureBufferPacketID (SNMP_OBJECT *Obj, WORD IdLen) {    MIB_LOCAL  *local = NULL;    LONG index = -1;    DNPAP_BUFFER *data;    DNPAP_CAPTURE info;    BYTE *p;    if ((local = MibRmon (Obj, BufferList, IdLen, CAPTURESIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, CAPTURESIZE, &index) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        if (index == -1 && (index = CaptureSearch (CAPTURE_GET, Obj, local, IdLen)) == -1)            return SNMP_NOSUCHNAME;        data = (DNPAP_BUFFER *)local->Data;        if (RingPeekMem(data->RingBuf, index, 0, &p, (BYTE *) &info, NULL) == FALSE)            DnpapMessage(DMC_FATAL, DCAPTURE_RING, "dcapture: missing expected ring buffer element");        Obj->Syntax.LngInt = info.ID;        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DnpapCaptureBufferPacketData (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL  *local = NULL;    LONG        index = -1;    DNPAP_BUFFER     *data;    BYTE	   *p;    LONG        len;    if ((local = MibRmon (Obj, BufferList, IdLen, CAPTURESIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, CAPTURESIZE, &index) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        if (index == -1 && (index = CaptureSearch (CAPTURE_GET, Obj, local, IdLen)) == -1)            return SNMP_NOSUCHNAME;        data = (DNPAP_BUFFER *)local->Data;        if (RingPeekMem(data->RingBuf, index+1, 0, &p, NULL, &len) == FALSE)            DnpapMessage(DMC_FATAL, DCAPTURE_RING, "dcapture: missing expected ring buffer element");                    if (data->DownloadOffset + data->DownloadSliceSize <= len)            Obj->SyntaxLen = len = data->DownloadSliceSize;        else 		if (data->DownloadOffset <= len)            Obj->SyntaxLen = len = len - data->DownloadOffset;		else	        Obj->SyntaxLen = 0;        RingPeekMem(data->RingBuf, index+1, data->DownloadOffset, &p, Obj->Syntax.BufChr, &len);                    return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DnpapCaptureBufferPacketLength (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL  *local = NULL;    LONG index = -1;    DNPAP_BUFFER *data;    BYTE *p;    DNPAP_CAPTURE info;    if ((local = MibRmon (Obj, BufferList, IdLen, CAPTURESIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, CAPTURESIZE, &index) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        if (index == -1 && (index = CaptureSearch (CAPTURE_GET, Obj, local, IdLen)) == -1)            return SNMP_NOSUCHNAME;        data = (DNPAP_BUFFER *)local->Data;        if (RingPeekMem(data->RingBuf, index, 0, &p, (BYTE *) &info, NULL) == FALSE)            DnpapMessage(DMC_FATAL, DCAPTURE_RING, "dcapture: missing expected ring buffer element");        Obj->Syntax.LngInt = info.Len;        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DnpapCaptureBufferPacketTime (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL   *local = NULL;    LONG index = -1;    DNPAP_BUFFER *data;    BYTE *p;    DNPAP_CAPTURE info;    if ((local = MibRmon (Obj, BufferList, IdLen, CAPTURESIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, CAPTURESIZE, &index) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        if (index == -1 && (index = CaptureSearch (CAPTURE_GET, Obj, local, IdLen)) == -1)            return SNMP_NOSUCHNAME;        data = (DNPAP_BUFFER *)local->Data;        if (RingPeekMem(data->RingBuf, index, 0, &p, (BYTE *) &info, NULL) == FALSE)            DnpapMessage(DMC_FATAL, DCAPTURE_RING, "dcapture: missing expected ring buffer element");        Obj->Syntax.LngInt = info.Time;        return SNMP_NOERROR;    }    return SNMP_GENERROR;}WORD DnpapCaptureBufferPacketStatus (SNMP_OBJECT *Obj, WORD IdLen){    MIB_LOCAL  *local = NULL;    LONG index = -1;    if ((local = MibRmon (Obj, BufferList, IdLen, CAPTURESIZE)) == NULL)        return SNMP_NOSUCHNAME;    switch (Obj->Request)    {    case SNMP_PDU_NEXT:        if (RmonNext (Obj, &local, IdLen, CAPTURESIZE, &index) == FALSE)            return SNMP_NOSUCHNAME;    case SNMP_PDU_GET:        if (index == -1 && (index = CaptureSearch (CAPTURE_GET, Obj, local, IdLen)) == -1)            return SNMP_NOSUCHNAME;        Obj->Syntax.LngInt = 0;        return SNMP_NOERROR;    }    return SNMP_GENERROR;}VOID DnpapCaptureChannelStop(LONG channelIndex){MIB_LOCAL    *local;DNPAP_BUFFER *data;    for (local = BufferList; local != NULL; local = local->Next)    {        data = (DNPAP_BUFFER *) local->Data;        if (data->Status == SNMP_VALID &&             data->ChannelIndex == channelIndex &&			data->ChannelAccept == TRUE)			data->ChannelAccept = FALSE;	}}/******************************************************************* NAME:        DnpapCapturePkt** SYNOPSIS:    VOID CapturePkt (LONG channelIndex,**                  			 PROT_PKT *pkt)** PARAMETERS:  channelIndex: the index of the channel that calls**                  		  this function**              frame: the frame received from the channel** DESCRIPTION: searches all buffer instances and captures packet.** REMARKS:     ONLY FOR INTERNAL USE** RETURNS:     VOID*******************************************************************/VOID DnpapCapturePkt (LONG channelIndex, PROT_PKT *pkt){    MIB_LOCAL    *local;    DNPAP_BUFFER *data;    LONG          octetsCopied;    PROT_OBJ      id =    {0, {1,3}};    PROT_OBJ      len =   {0, {1,5}};    PROT_OBJ      time =  {0, {1,6}};    PROT_OBJ      packet= {0, {1,7}};    DNPAP_CAPTURE info;    if (ProtGetField(pkt, &id) == FALSE ||		ProtGetField(pkt, &len) == FALSE ||        ProtGetField(pkt, &time) == FALSE ||        ProtGetField(pkt, &packet) == FALSE)     {        DnpapMessage(DMC_ERROR, DCAPTURE_BADPACKET, "dcapture: bad packet");        return;    }    for (local = BufferList; local != NULL; local = local->Next)    {        data = (DNPAP_BUFFER *) local->Data;        if (data->Status == SNMP_VALID &&             data->ChannelIndex == channelIndex &&			data->ChannelAccept == TRUE)        {            if (data->FullStatus == 2 && data->FullAction == 1)                continue;									 /* full & lock */            if (data->CaptureSliceSize == 0 ||                 len.Syntax.LngInt < data->CaptureSliceSize)  /* snap packet */                octetsCopied = len.Syntax.LngInt;            else                octetsCopied = data->CaptureSliceSize;                                                if (octetsCopied + sizeof(DNPAP_CAPTURE) > RingAvailMem(data->RingBuf) ||            	(RingGetElems(data->RingBuf) == RingGetMaxElems(data->RingBuf) &&             	 RingSetMaxElems(data->RingBuf, RingGetMaxElems(data->RingBuf) + 10) == FALSE))				data->FullStatus = 2;            				if (data->FullStatus == 2 && data->FullAction == 1)				continue;				            if (octetsCopied + sizeof(DNPAP_CAPTURE) > data->MaxOctetsAvailable)            	octetsCopied = data->MaxOctetsAvailable - sizeof(DNPAP_CAPTURE);                                                                    while (RingAvailMem(data->RingBuf) < octetsCopied + sizeof(DNPAP_CAPTURE) ||            	   RingGetElems(data->RingBuf) == RingGetMaxElems(data->RingBuf))            {                if (RingGetMem(data->RingBuf, NULL, NULL) == FALSE)                {   /* header */                    DnpapMessage(DMC_FATAL, DCAPTURE_SYNC, "dcapture: ring buffer out of sync");                    DnpapExit(1);                }                if (RingGetMem(data->RingBuf, NULL, NULL) == FALSE)                {   /* packet */                    DnpapMessage(DMC_FATAL, DCAPTURE_SYNC, "dcapture: ring buffer out of sync");                    DnpapExit(1);                }                data->CapturedPkts--;            }                        info.Time = TimeMsec() - data->TurnOnTimeMsec;            info.ID = id.Syntax.LngUns;                            info.Len = (WORD) len.Syntax.LngInt+4;								            if (RingPutMem(data->RingBuf, (BYTE *) &info, sizeof(info)) == FALSE)            {                DnpapMessage(DMC_FATAL, DCAPTURE_RING, "dcapture: ring buffer out of space");                DnpapExit(1);            }            if (RingPutMem(data->RingBuf, packet.Syntax.Ptr, octetsCopied) == FALSE)            {                DnpapMessage(DMC_FATAL, DCAPTURE_RING, "dcapture: ring buffer out of space");                DnpapExit(1);            }            			data->CapturedPkts++;                    }    }    return;}

⌨️ 快捷键说明

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