📄 dcaptm.c
字号:
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 + -