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

📄 rtl8019as_net509tag.cpp

📁 浙江大学的悟空嵌入式系统模拟器
💻 CPP
📖 第 1 页 / 共 3 页
字号:

		if( acture_len != packet_len)
		{
			printf("tuntap_output,发送失败\n");
			return -1;
		}
		//printf("\n==========recv_flag:0x%x\tnic_state:0x%x=======",recv_flag,nic_state);
		//printf("rtl8019_net.isr:0x%x\n",rtl8019_net.isr);
	
		return 1;
	}


	Core::s8  nic8019::write_to_rtl8019( Core::s8 data)
	{
       // DBG_PRINT("write_to_rtl8019 hasn't been completed!\n");		Core::s32 i=0;		static Core::s32 p=0;
		if(write_offset>=write_total_count)
		{
			printf("写入的数据比实际的多\n");
		}
	

		if( start_page >= 0x46)
		{
			printf("In write_to_rtl8019,写入数据超出缓冲的大小start_page:0x%x\n"\
				,start_page);
			return -1;
		}
	
		rtl8019_net.nic_ram[(start_page-0x40)*PAGE_SIZE+write_offset] = data;       // WUKONG_STDOUT("write:"<<data);	//	printf("%-8d",data);     //   if(++p == 6)     //   {		//	WUKONG_STDOUT("\n");		//	p = 0;	//	}
		write_offset++;

		if( write_offset == write_total_count)
		{
			rtl8019_net.cr &= ~(CR_REMOTE_W);
			rtl8019_net.isr |= ISR_RDC;
			if( (rtl8019_net.imr & IMR_RDC)==IMR_RDC )
			{//机器中断由board设置,attention
				//nic_state |= 1;
				//printf("CR_REMOTE_W finish\n");
			  //	state->io.intsr |= NETCARDINT;
			  //	armulator_update_int( );
			}                           //DBG_PRINT("Remote write completed!\n");            //    p = 0;            //for(i = 0; i<write_total_count; i++)			//{			//	DBG_PRINT("%d\t",rtl8019_net.nic_ram[(start_page-0x40)*PAGE_SIZE+i]);            //            if(++p == 12)		    //     { DBG_PRINT("\n"); p = 0;}			//}
		}

		return 1;
	}




	void nic8019::armulator_update_int()
	{
		//std::cout<<""<<std::endl;	
	}	void nic8019::on_mapped_memory_read(Core::u32 start, size_t size, Core::Bytecode_Type & buffer)	{		char temp=-1;		WUKONG_ASSERT( size==1);//		std::cout<<"address:"<<std::hex<<start<<std::endl;		buffer.resize(1);		buffer[0] = rtl8019_read(start);	}	void nic8019::on_mapped_memory_write(Core::u32 start, size_t  size, Core::Bytecode_Type & buffer)	{		WUKONG_ASSERT( size==1);		rtl8019_write( start,buffer[0]);	}	Core::s32 nic8019::is_nic_input()	{//not complete!!!		return false;	}	Core::s32 nic8019::ethernet_input()	{//not complete !!				return false;	}		Core::s32 nic8019::recv_from_ethernet( Core::u8 *buffer, Core::s32 size)	{//not complete !!		//printf("\n+++++++++++++++\n");		while(!recv_flag);		//printf("\n---------------\n");		//printf("\nrecv_from_ethernet data is:\n");		for(unsigned int i=1;i<recv_flag+1; i++)		{			buffer[i] = pkt_data[i];		}		//recv_flag=0;		return i-1;			}	Core::s32 nic8019::write_to_ethernet(Core::u8  *buffer, Core::s32 size)	{// not complete !!		//std::cout<<"\n\n\n++++write_to_ethernet is not complete!"<<std::endl;		PacketInitPacket(lpPacket,buffer,size);
		if(PacketSendPacket(lpadapter,lpPacket,TRUE)==FALSE)
		{
			printf("PacketSendPacket in getmine Error: %d\n",GetLastError());
			return -1;
		}		//nic_state |= 2;//将来要去掉,输出马上就有输入		return size;	}		Core::u32 nic8019::get_state(Core::u32 state)	{		//如果用select判断出有数据从raw socket过来,则用		//tuntap_input( )取得输入,并存入网卡缓冲,但需要做一些修改		if( ((nic_state&0x02) == 2)&&((nic_state&0x01) != 1)\			&&((rtl8019_net.cr & CR_STOP) != CR_STOP))		{			tuntap_input();			nic_state &= ~(0x02);			recv_flag=0;			//printf("kkkknic_state:0x%x\n",nic_state);		}		if(nic_state)		{			nic_state &= 0x0e;			//printf("------nic_state:%x=-----\n",nic_state);			return 1;		}				return nic_state;	}	DWORD  WINAPI rcv_packet(void * dummy)
	{

		pcap_if_t *alldevs, *d;
		pcap_t *fp;
		u_int inum, i=0;
		char errbuf[PCAP_ERRBUF_SIZE];
		int res;
		struct pcap_pkthdr *header;
		//

	
	

		/* The user didn't provide a packet source: Retrieve the device list */
		if (pcap_findalldevs(&alldevs, errbuf) == -1)
		{
			fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
			exit(1);
		}



		/* Print the list */
		for(d=alldevs; d; d=d->next)
		{
			printf("%d. %s\n", ++i, d->name);
			if (d->description)
				printf(" (%s)\n", d->description);
			else
				printf(" (No description available)\n");
		}

		if(i==0)
		{
			printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
			return -1;
		}

		

		/* Jump to the selected adapter */
		inum = 1;
		for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

		
		/* Open the device */
		if ( (fp= pcap_open_live(d->name, 1500, 1, 5, errbuf) ) == NULL)
		{
			fprintf(stderr,"\nError opening adapter\n");
			return -1;
		}



		
		/* Read the packets */
		while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0){

			if(res == 0)
				/* Timeout elapsed */
				continue;

			/* print pkt timestamp and pkt len */
			//     printf("%ld:%ld (%ld)\n", header->ts.tv_sec, header->ts.tv_usec, header->len);          

			/* Print the packet */

			//if( ((pkt_data[28]==0x0a)&&(pkt_data[29]==0xd6)&&(pkt_data[30]==0x20)&&(pkt_data[31]==0x24)) )
			//arp包也用这个判断
			if( (((pkt_data[30]==0x0a)&&(pkt_data[31]==0xd6)\
				&&(pkt_data[32]==0x21)&&(pkt_data[33]==0x25)\
				&&!((pkt_data[12]==0x08)&&(pkt_data[13]==0x06)))\
				||((pkt_data[38]==0x0a)&&(pkt_data[39]==0xd6)\
				&&(pkt_data[40]==0x21)&&(pkt_data[41]==0x25)\
				&&(pkt_data[12]==0x08)&&(pkt_data[13]==0x06)))\
				&&(((pkt_data[0]==(Core::u8)0xff)&&(pkt_data[1]==(Core::u8)0xff)\
				&&(pkt_data[2]==(Core::u8)0xff)&&pkt_data[3]==(Core::u8)0xff)\
				&&(pkt_data[4]==(Core::u8)0xff)&&(pkt_data[5]==(Core::u8)0xff)\
				||((pkt_data[0]==(Core::u8)0x00)&&(pkt_data[1]==(Core::u8)0x01)\
				&&(pkt_data[2]==(Core::u8)0x02)&&(pkt_data[3]==(Core::u8)0x03)\
				&&(pkt_data[4]==(Core::u8)0x04)&&(pkt_data[5]==(Core::u8)0x05)))
				)
			{
			//	printf("\n\n\n\n in thread+++++\n\n\n");
			//	for (i=1; (i < header->caplen + 1 ) ; i++)
			//	{
			//		printf("%.2x ", pkt_data[i-1]);
			//		if ( (i % LINE_LEN) == 0) printf("\n");
			//	}
			//	printf("\n\n");
				recv_flag = header->caplen;
				nic_state |= 2;
				//printf("++++rcv_packet++++++++\n++nic_state:0x%x++++",\
				//	nic_state);
				//printf("\n");
			}

			//printf("recv_flag block:%d\n\n",recv_flag);
			while(recv_flag)
			{
				;
			}
				
			//printf("recv_flag  continue\n\n");

		}

		/*if(res == -1){
		printf("Error reading the packets: %s\n", pcap_geterr(fp));
		return -1;
		}*/

		return 0;
	}		Core::s32 nic8019::send_init()
	{

		unsigned short    adaptername[8192];
		unsigned short    *name1;
		unsigned long    adapterlength;
		struct   NetType      ntype;
		struct   sockaddr_in  sin;
		struct   npf_if_addr  ipbuff;
		int      adapternum=0,opti=0,open,i,total;
		long     npflen;
		char * adapterlist[10];


		printf("\nWinpcap Libarary Version: %s\n\n\n",PacketGetVersion());

		adapterlength=sizeof(adaptername);
		if(PacketGetAdapterNames((char *)adaptername,&adapterlength)==FALSE)
		{
			printf("PacketGetAdapterNames Error: %d\n\n\n",GetLastError());
			return -1;
		}

		name1 = adaptername;
		total = 0;
		while((*name1 != '\0')&&( *(name1+1)!='\0'))
		{
			adapterlist[total++] = (char*)name1;
			name1 += (wcslen(name1)+1);
		}
		for( i=0; i<total; i++)
		{
			wprintf(L"%d --- %s\n",i,adapterlist[i]);
		}


		//open the adapter 
		open = 0;
		lpadapter=PacketOpenAdapter(adapterlist[open]);
		if(!lpadapter || (lpadapter->hFile==INVALID_HANDLE_VALUE))
		{
			printf("PacketOpenAdapter Error: %d\n",GetLastError());
			return -1;
		}


		//get net type 
		PacketGetNetType(lpadapter,&ntype);
		if(ntype.LinkType != NdisMedium802_3)
		{
			printf("你的网络不是以太网,目前只支持以太网\n");
			exit(1);
		}

		npflen=sizeof(ipbuff);  
		if (PacketGetNetInfoEx(adapterlist[open],&ipbuff,&npflen))
		{
			/*sin=*(struct sockaddr_in *)&(ipbuff.Broadcast);
			printf("[Broadcast:]\t%.16s\t",inet_ntoa(sin.sin_addr));
			sin=*(struct sockaddr_in *)&(ipbuff.SubnetMask);
			printf("[SubnetMask:]\t%.16s\n",inet_ntoa(sin.sin_addr));
			sin=*(struct sockaddr_in *)&(ipbuff.IPAddress);
			printf("[IPAddress:]\t%.16s\n",inet_ntoa(sin.sin_addr));*/
			//myip=ntohl(sin.sin_addr.s_addr);

		}
		else
		{
			printf("\nNot get enough data\n");
			PacketCloseAdapter(lpadapter);
			return -1;
		}

		//初始化packet
		if((lpPacket=PacketAllocatePacket())==FALSE)
		{
			printf("PacketAllocatePacket send Error: %d\n",GetLastError());
			return -1;
		}


		return 0;
	}	Core::s32 nic8019::send_arp()
	{
		char sendbuf[1024];
		int k;
		ETHDR eth;
		ARPHDR arp;


		for(k=0;k<6;k++)
		{
			eth.eh_dst[k]=0xff;
			eth.eh_src[k]=0x82;//以太网头

			arp.arp_sendermac[k]=0x82;
			arp.arp_targetmac[k]=0x00;//arp头
		}
		eth.eh_type=htons(ETH_ARP);


		arp.arp_hardtype=htons(ARP_HARDWARE);
		arp.arp_protype=htons(ETH_IP);
		arp.arp_hardlen=6;
		arp.arp_prolen=4;
		arp.arp_optype=htons(ARP_REQUEST);
		//arp.arp_targetip=htonl(myip);
		arp.arp_targetip = inet_addr("10.214.33.130");
		arp.arp_senderip=inet_addr("10.214.32.39");
		memset(sendbuf,0,sizeof(sendbuf));
		memcpy(sendbuf,&eth,sizeof(eth));
		memcpy(sendbuf+sizeof(eth),&arp,sizeof(arp));
		PacketInitPacket(lpPacket,sendbuf,sizeof(eth)+sizeof(arp));
		if(PacketSendPacket(lpadapter,lpPacket,TRUE)==FALSE)
		{
			printf("PacketSendPacket in getmine Error: %d\n",GetLastError());
			return -1;
		}

		return 0;
	}}

⌨️ 快捷键说明

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