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

📄 ipreas.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details   */#include <dnpap.h>#include <timer.h>#include <memory.h>#include "ip.h"#define IP_REAS_TIMEOUT 60000Ltypedef struct _IP_REAS_FRAG    IP_REAS_FRAG;typedef struct _IP_REAS_DESCR   IP_REAS_DESCR;struct _IP_REAS_FRAG{    IP_REAS_FRAG    *next;    WORD            offset;    WORD            length;    BYTE            data[1];};struct _IP_REAS_DESCR{    TIMER_DESCR     *timer;    IP_HDR          hdr;    WORD            lengthReceived;    WORD            lengthTotal;    IP_REAS_FRAG    *fragList;    IP_REAS_DESCR   *next;};IP_REAS_FRAG    *FragCreate(IP_REAS_DESCR *descr, CHAIN *chain, IP_HDR *hdr);CHAIN           *FragList2Chain(IP_REAS_DESCR *descr);IP_REAS_DESCR   *DescrCreate(IP_HDR *hdr);IP_REAS_DESCR   *DescrFind(IP_HDR *hdr);void            DescrRemove(IP_REAS_DESCR *descr);void            DescrTimeout(TIMER_DESCR *timer, ULONG now, void *parm);IP_REAS_DESCR *ipReasList = 0;BOOLEAN IpReas(CHAIN *chain, CHAIN **reas, IP_HDR *hdr){    BYTE            *options;    IP_REAS_DESCR   *descr;    IP_REAS_FRAG    *frag;    BOOLEAN         success = FALSE;    descr = DescrFind(hdr);    if (descr == 0)    {        descr = DescrCreate(hdr);        if (descr == 0)            return 0;    }    frag = FragCreate(descr, chain, hdr);    if (frag != 0)    {        if (hdr->offset==0)        {            memcpy(&(descr->hdr), hdr, sizeof(*hdr));            if (hdr->iol != 0)            {                options             = DnpapMalloc(hdr->iol);                memcpy(options, hdr->options, hdr->iol);                descr->hdr.options  = options;            }        }        if ((hdr->flags & IP_FLAG_MORE_FRAGMENTS) != IP_FLAG_MORE_FRAGMENTS)        {            descr->lengthTotal = frag->offset + frag->length;        }        descr->lengthReceived += frag->length;        if (descr->lengthReceived >= descr->lengthTotal)        {            if (descr->lengthReceived == descr->lengthTotal)            {                memcpy(hdr, &(descr->hdr), sizeof(*hdr));                hdr->offset = 0;                hdr->flags &= ~IP_FLAG_MORE_FRAGMENTS;                hdr->length = descr->lengthReceived + descr->hdr.ihl;                *reas       = FragList2Chain(descr);                success     = TRUE;            }            DescrRemove(descr);        }    }    else    {        DescrRemove(descr);    }    return success;}IP_REAS_FRAG *FragCreate(IP_REAS_DESCR *descr, CHAIN *chain, IP_HDR *hdr){    IP_REAS_FRAG *frag;    WORD         length;        length = ChainLength(chain);    frag = DnpapMalloc(sizeof(IP_REAS_FRAG)-1+length);    if (frag==0)        return 0;    ChainCopy(chain, frag->data, length);    frag->offset    = hdr->offset * 8;    frag->length    = length;    frag->next      = descr->fragList;    descr->fragList = frag;    return frag;}CHAIN *FragList2Chain(IP_REAS_DESCR *descr){    CHAIN           *chain;    IP_REAS_FRAG    *frag;    chain = ChainAlloc(0, 0, descr->lengthTotal, descr->lengthTotal, 0, 0);    if (chain == 0)        return 0;    for (frag = descr->fragList; frag != 0; frag=frag->next)    {        if ((frag->offset + frag->length) > descr->lengthTotal)        {            ChainFree(chain);            return 0;        }        memcpy(chain->buffer + frag->offset, frag->data, frag->length);    }    return chain;}IP_REAS_DESCR *DescrCreate(IP_HDR *hdr){    IP_REAS_DESCR *descr;       descr = DnpapMalloc(sizeof(IP_REAS_DESCR));    if (descr == 0)        return 0;        descr->timer = TimerRegister(DescrTimeout, descr,        IP_REAS_TIMEOUT, TIMER_FOREVER, TIMER_TYPE_SKIP);        memcpy(&(descr->hdr), hdr, sizeof(*hdr));    descr->hdr.iol = 0;    descr->lengthTotal      = 0xffff;    descr->lengthReceived   = 0;    descr->fragList = 0;    descr->next = ipReasList;    ipReasList  = descr;    return descr;}IP_REAS_DESCR *DescrFind(IP_HDR *hdr){    IP_REAS_DESCR *descr;    for (descr=ipReasList; descr!=0; descr=descr->next)    {        if (descr->hdr.src  == hdr->src  &&            descr->hdr.dst  == hdr->dst  &&            descr->hdr.prot == hdr->prot &&            descr->hdr.id   == hdr->id)        break;    }    return descr;}void DescrRemove(IP_REAS_DESCR *descr){    IP_HDR          *h;    IP_REAS_FRAG    *f, *frag;    IP_REAS_DESCR   **d;        TimerRemove(descr->timer);    h=&(descr->hdr);    if (h->iol!=0)    {        DnpapFree(h->options);    }    f=descr->fragList;    while (f!=0)    {        frag = f;        f = f->next;        DnpapFree(frag);    }    for (d=&ipReasList; *d!=0 && *d!=descr; d=&(*d)->next);    if (*d==descr)    {        *d = (*d)->next;    }    DnpapFree(descr);}void DescrTimeout(TIMER_DESCR *timer, ULONG now, void *parm){    IP_REAS_DESCR *descr;    descr = parm;    DescrRemove(descr);}

⌨️ 快捷键说明

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