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