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

📄 moip.cpp

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 CPP
字号:
/*!    \file   MoIp.cpp    \brief  IP僾儘僩僐儖幚憰僋儔僗    Copyright (c) 2004 Yamami    All rights reserved.    License=MIT/X License    \author  Yamami    \version $Revision: 1.2 $    \date   create:2004/09/20 update:$Date: 2004/10/31 14:29:43 $*//*! \class MoIp *  \brief IP僾儘僩僐儖幚憰僋儔僗 */#include "MoIp.h"#include "MonesConfig.h"#include "MonesGlobal.h"/*!    \brief initialize         MoIp 僐儞僗僩儔僋僞    \author Yamami    \date   create:2004/09/20 update:*/MoIp::MoIp(){}/*!    \brief initialize         MoIp initIp    \author Yamami    \param  AbstractMonic *pminsNic [in] NIC僋儔僗傊偺億僀儞僞    \date   create:2004/09/20 update:*/void MoIp::initIp(AbstractMonic *pminsNic ) {    //NIC僋儔僗傪曐帩    insAbstractNic = pminsNic;    return;}/*!    \brief initialize         MoIp 僨僗僋僩儔僋僞    \author Yamami    \date   create:2004/08/20 update:*/MoIp::~MoIp() {}/*!    \brief receiveIp         IP僾儘僩僐儖庴怣 張棟    \param  IP_HEADER *ipHead [in] IP僿僢僟傊偺億僀儞僞    \return int 寢壥             \author Yamami    \date   create:2004/09/20 update:2004/09/20*/int MoIp::receiveIp(IP_HEADER *ipHead){    /* 僠僃僢僋僒儉偺妋擣丅 */    if(MoPacUtl::calcCheckSum((dword*)ipHead,(ipHead->verhead&0xf)*4)){        return 0;    }    /* 忋埵僾儘僩僐儖傊搉偡丅 */    switch(ipHead->prot)    {        //case IPPROTO_TCP:        //  return g_MoIcmp->receiveTcp(ipHead);        //case IPPROTO_UDP:        //  return g_MoIcmp->receiveUdp(ipHead);        case IPPROTO_ICMP:          return g_MoIcmp->receiveIcmp(ipHead);    }    return 0;}/*!    \brief transIp         IP僾儘僩僐儖憲怣 張棟    \param  TRANS_BUF_INFO *tbi [in] 憲怣僶僢僼傽峔憿懱傊偺億僀儞僞    \param  dword dstip [in] 憲怣愭IP傾僪儗僗    \param  byte tos [in] 僒乕價僗僞僀僾    \param  int flag [in] 僼儔僌    \return int 寢壥     \author Yamami    \date   create:2004/09/20 update:2004/09/20*/int MoIp::transIp(TRANS_BUF_INFO *tbi, dword dstip, byte tos, int flag){    byte *transPacket; //僷働僢僩憲怣僶僢僼傽    char dstmac[6];    dword transip;    //int num;    int rest;    IP_HEADER ipHead;    int max,total;    //int trans;    //Yamami 偙偙偱儖乕僥傿儞僌夝寛丠丠 偲傝偁偊偢丄dst = trans偲偡傞丅    transip = dstip;    // 憲怣愭 MAC傾僪儗僗庢摼(ARP夝寛)    if((rest=g_MoArp->getMac(transip,dstmac))<0){        return rest;    }    //IP僿僢僟傪嶌惉偡傞丅    ipHead.verhead=IP_HEAD_VERSION|(sizeof(IP_HEADER)/4);    ipHead.tos=tos;        //GET_ID(ipHead.id);    //Yamami 偙偙偼僗儗僢僪僙乕僼偵偡傞昁梫偑偁傞丠    ipHead.id++;        ipHead.ttl=255;    ipHead.prot=tbi->ipType;    ipHead.srcip=MoPacUtl::swapLong(G_MonesCon.getGl_myIpAdr());    ipHead.dstip=dstip;    ipHead.chksum=0;    //憲怣TBL    tbi->type=ETHER_PROTO_IP;    tbi->data[0]=(char*)&ipHead;    tbi->size[0]=sizeof(IP_HEADER);         // IP header size.    //max=ethDev[num].mtu-sizeof(IP_HEADER);  // 僨乕僞嵟戝憲怣僒僀僘丅    max=G_MonesCon.getGl_myMTU()-sizeof(IP_HEADER);  // 僨乕僞嵟戝憲怣僒僀僘丅    total=tbi->size[1]+tbi->size[2];        // 僨乕僞僩乕僞儖僒僀僘丅    if(total<=max)    {                        //憲怣梫媮僷働僢僩僒僀僘偑MTU埲壓側傜偽        //IP僒僀僘        ipHead.len=MoPacUtl::swapShort(tbi->size[0]+total);        //僼儔僌        ipHead.frag=MoPacUtl::swapShort(flag<<14);        //僠僃僢僋僒儉        ipHead.chksum=MoPacUtl::calcCheckSum((dword*)&ipHead,tbi->size[0]);                //拪徾NIC傪巊偭偰憲怣!        //ethDev[num].dev->write(ethDev[num].dev->linf,(size_t)tbi,(size_t)dstmac);        //memcpy(ipHead.dstMac,tbi->data[1],tbi->size[1]);                //僷働僢僩嶌惉        transPacket = (byte *)malloc(sizeof(IP_HEADER) + total);        memcpy(transPacket,(byte *)&ipHead,sizeof(ipHead));        memcpy(transPacket + sizeof(ipHead),tbi->data[1],tbi->size[1]);                insAbstractNic->frame_output(transPacket , (byte *)dstmac , sizeof(IP_HEADER) + total , ETHER_PROTO_IP);                //僷働僢僩僶僢僼傽夝曻        free(transPacket);    }/*    else    {        //憲怣梫媮僷働僢僩僒僀僘偑MTU埲忋側傜偽  枹幚憰        ipHead.len=swapWord(tbi->size[0]+max);        ipHead.frag=swapWord(IP_HEAD_FRAG_ON);        tbi->size[2]=max-tbi->size[1];        ipHead.chksum=calcSum((uint*)&ipHead,tbi->size[0]);        ethDev[num].dev->write(ethDev[num].dev->linf,(size_t)tbi,(size_t)dstmac);        trans=max;                      // 憲怣嵪僒僀僘        tbi->data[2]+=max-tbi->size[1];        tbi->size[1]=0;        for(;;)        {            ipHead.chksum=0;            if(total-trans<=max)            {                ipHead.len=swapWord(tbi->size[0]+total-trans);                ipHead.frag=swapWord(trans);                GET_ID(ipHead.id);                ipHead.chksum=calcSum((uint*)&ipHead,tbi->size[0]);                tbi->size[2]=total-trans;                ethDev[num].dev->write(ethDev[num].dev->linf,(size_t)tbi,(size_t)dstmac);                break;            }            else            {                ipHead.len=swapWord(tbi->size[0]+max);                ipHead.frag=swapWord(trans|IP_HEAD_FRAG_ON);                GET_ID(ipHead.id);                ipHead.chksum=calcSum((uint*)&ipHead,tbi->size[0]);                tbi->size[2]=max;                ethDev[num].dev->write(ethDev[num].dev->linf,(size_t)tbi,(size_t)dstmac);            }            trans+=max;            tbi->data[2]+=max;        }    }*/    return 0;} /*!    \brief ipRouting         IP儖乕僥傿儞僌 張棟    \param  word ip [in] 憲怣愭IP傾僪儗僗    \param  dword dstip [in] 揮憲愭IP傾僪儗僗(懠偺僒僽僱僢僩側傜儖乕僞偲側傞)    \return int 寢壥     \author Yamami    \date   create:2004/10/30 update:2004/10/30*/int MoIp::ipRouting(dword ip,dword *transip){    //int i;    //摨堦僒僽僱僢僩撪偐僠僃僢僋偡傞丅    if((ip & G_MonesCon.getGl_mySubnet()) == (G_MonesCon.getGl_myIpAdr() & G_MonesCon.getGl_mySubnet()))    {        *transip=ip;        return 0;    }    /* 僨僼僅儖僩僎乕僩僂僃僀傊丅 */    *transip=G_MonesCon.getGl_myGw();    return 0;}

⌨️ 快捷键说明

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