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

📄 rtl8019as_net420.cpp

📁 浙江大学的悟空嵌入式系统模拟器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if( (rtl8019_net.cr&CR_SEND) == CR_SEND)		
		{//remote read (command send)                			if( read_after_receive)			{				WUKONG_STDOUT("++++++++++read_from_rtl8019++++++");				read_after_receive=0;			}
			if( rtl8019_net.bnry == rtl8019_net.curr)
			{
				//DBG_PRINT("read_from_rtl8019.01\n");				WUKONG_STDOUT("The receive buffer is empty!bnry:0x"\					<<std::hex<<rtl8019_net.bnry<<"curr:0x"<<std::hex<<rtl8019_net.curr);			    exit(-1);
				data = -1;
			}

			/*	if(read_offset>=read_total_count)
			{
				DBG_PRINT("");
				
			}
			*/

			//映射关系,必须减去0x40
			data = rtl8019_net.nic_ram[(rtl8019_net.bnry - 0x40)*PAGE_SIZE+read_offset];
			read_offset++;
            printf("%-8d",data);            if( read_offset %6 ==0)            {				printf("\n");            }                
			if( (read_offset%PAGE_SIZE)==0 || (read_offset + page_to_read*PAGE_SIZE)==read_total_count)
			{
				rtl8019_net.bnry = (rtl8019_net.bnry+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)\							+rtl8019_net.pstart;
				read_offset = 0;
				page_to_read++; 
			}
			//
			if( page_to_read == read_total_page)
			{//remote read (command send)

				rtl8019_net.cr |=CR_FINISH;
				rtl8019_net.cr &=(~CR_SEND);

				//if( (read_offset%PAGE_SIZE)!=0)
				//{
				//	rtl8019_net.bnry = (rtl8019_net.bnry+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)\				//				+rtl8019_net.pstart;
				//}
				rtl8019_net.isr |= ISR_RDC;//remote DMAsend command
				if( (rtl8019_net.imr & IMR_RDC))
				{//中断由board设置,attention
				//	state->io.intsr |= NETCARDINT;
                //    armulator_update_int( );				//	WUKONG_STDOUT("read_form_rtl8019,CR_SEND OVER.intsr:0x"<<std::hex\
				//		<<state->io.intsr);
					nic_state |= 1;
				}				//DBG_PRINT("\nfffffCR_SEND OVER.imr:0x%x\n",rtl8019_net.imr & IMR_RDC);
			}
		
		 
		}

		return data;

	}


	Core::s32 nic8019::tuntap_input( )
	{
		Core::s32 tuntap_packet_count = 0;
		Core::s32 rtl8019as_packet_count = 0;
		Core::u8 buffer[6*PAGE_SIZE]={0,};
		Core::s32 rtl8019as_write_count=0;        Core::s32 buffer_count = 0;        Core::s32 i = 0;
	

			if( (rtl8019_net.cr & CR_STOP) == CR_STOP)
			{
				WUKONG_STDOUT("nic is stop\n");
				return -1;
			}

			//attention
//			tuntap_packet_count = read(tuntap_fd, &buffer[4], sizeof(buffer));
			// was replaced by next statement
			tuntap_packet_count = recv_from_ethernet( &buffer[4], sizeof(buffer));

			rtl8019as_packet_count = tuntap_packet_count + 4;		  //DBG_PRINT("rtl8019as_packet_count:%d\n",rtl8019as_packet_count);		  //for( i = 0; i< tuntap_packet_count ; i++)		  // {			//printf("%d   ",buffer[4+i]);		    //      if( (i%12==0) && i!=0)		     //        printf("\n");		  //}

			if(rtl8019as_packet_count > (6*PAGE_SIZE))
			{
				WUKONG_STDOUT("tuntap_input, the packet received is more than"<<6*PAGE_SIZE);
				return -1;
			}

			if( (buffer[4]==(char)0xff) && (buffer[5]==(char)0xff) && (buffer[6]==(char)0xff)\			    &&  (buffer[7]==(char)0xff) && (buffer[8]==(char)0xff) && (buffer[9]==(char)0xff))
			{//判断是否是广播
			//DBG_PRINT("tuntap_input,multi-broadcast address.\n");
			}
			else if((buffer[4]!=0x00) || (buffer[5]!=0x01) || (buffer[6]!=0x02) || (buffer[7]!=0x03)\
				||(buffer[8]!=0x04) || (buffer[9]!=0x05))
			{//检查mac地址是否匹配
				WUKONG_STDOUT("tuntap_input, mac address isn't match\n");
				return -1;
			}

			//8019as 特有的4个字节的头
			buffer[0] = 80;//用来指明是8019
			buffer[1] = 19;
			buffer[2] = (Core::u8)(tuntap_packet_count&0x00ff);
			buffer[3] = (Core::u8)((tuntap_packet_count>>8)&0x0ff);//big-endian         			for( i = 0; i< tuntap_packet_count+4 ; i++)			{				printf("%-8d",buffer[i]);				if( (i%11==0) && i!=0)                   printf("\n");			 }

			rtl8019as_write_count = 0;			buffer_count = 0;      
			while (rtl8019as_packet_count--)
			{
				//				//DBG_PRINT("pstart:0x%x\t bnry:0x%x\n curr:0x%x\t pstop:0x%x\n\n",\                 //                rtl8019_net.pstart, rtl8019_net.bnry, rtl8019_net.curr, rtl8019_net.pstop);
				if( ((rtl8019_net.curr+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)+rtl8019_net.pstart)==rtl8019_net.bnry)
				{//判断缓冲区是否溢出
					WUKONG_STDOUT("The receive buffer overflow.rtl8019_net.isr=0x"\						<<std::hex<<rtl8019_net.isr<<"rtl8019_net.imr=0x"\						<<std::hex<<rtl8019_net.imr);                     //   state->io.intsr |= NETCARDINT;                      //  armulator_update_int(state);                      //  DBG_PRINT("state->io.intsr=0x%x\n",state->io.intsr);
				rtl8019_net.isr |= (ISR_OVW | ISR_RST);//具体要看驱动的处理,两者应该有区别
				if((rtl8019_net.imr & IMR_OVW) || (rtl8019_net.imr & IMR_RST))
				{ //机器中断由board设置,attention
				   nic_state |= 1;
				//	state->io.intsr |= NETCARDINT;
				//    armulator_update_int( );
				}
				//rtl8019_net.isr |= ISR_PRX;
				//if((rtl8019_net.imr & IMR_PRX) == IMR_PRX)
				//{
				//	state->io.intsr |= NETCARDINT;
		        //	armulator_update_int(state);
				//}
				return -1;
			}

			//                // printf("buffer:%x\t",buffer[buffer_count++]);
			rtl8019_net.nic_ram[(rtl8019_net.curr-0x40)*PAGE_SIZE+rtl8019as_write_count]=buffer[buffer_count++];			//if( buffer_count % 6 == 0 )			//	printf("\n");               
			rtl8019as_write_count++;

			if( (rtl8019as_write_count%PAGE_SIZE) == 0)
			{
				rtl8019_net.curr = (rtl8019_net.curr+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)+rtl8019_net.pstart;
				rtl8019as_write_count = 0;
			}		

		}

		//DBG_PRINT("curr:0x%x\n",rtl8019_net.curr);
		if( (rtl8019as_write_count%PAGE_SIZE) != 0)
		{//
			rtl8019_net.curr = (rtl8019_net.curr+1-rtl8019_net.pstart)%(rtl8019_net.pstop-rtl8019_net.pstart)+rtl8019_net.pstart;
	
		}
			   //DBG_PRINT("curr:0x%x\n",rtl8019_net.curr);
		//          		     //DBG_PRINT("ISR=0x%x, IMR=0x%x\n\n",rtl8019_net.isr,rtl8019_net.imr);
		rtl8019_net.isr |= ISR_PRX;
		if((rtl8019_net.imr & IMR_PRX) == IMR_PRX)
		{//机器中断由board设置,attention

			nic_state |= 1;
			//state->io.intsr |= NETCARDINT;
        	//armulator_update_int( );			WUKONG_STDOUT("this is imr:0x"<<std::hex<<rtl8019_net.imr);                //DBG_PRINT("intsr=0x%x, intmr=0x%x\n",state->io.intsr , state->io.intmr);                //DBG_PRINT("fiq=0x%x, irq=0x%x\n",state->NfiqSig, state->NirqSig);
		}
	        read_after_receive = 1;		printf("tuntap_input ,bnry:0x%x,curr:0x%x",rtl8019_net.bnry,rtl8019_net.curr);
		return 1;

	}

	Core::s32 nic8019::tuntap_output( )
	{// write_cr CR_TXP

		Core::s32 packet_len;
		Core::s32 acture_len;        Core::s32 i,p;

		if( (rtl8019_net.cr&CR_STOP) )
		{
			printf("In tuntap_output,网卡处于停止状态\n");
			return -1;
		}


		 packet_len = rtl8019_net.tbcr0 + (((Core::s32)rtl8019_net.tbcr1<<8));
		 //attention
//		 acture_len = write( tuntap_fd,&rtl8019_net.nic_ram[(rtl8019_net.tpsr - 0x40)*PAGE_SIZE],packet_len);		 //was replaced by net statement		 acture_len = write_to_ethernet( &rtl8019_net.nic_ram[(rtl8019_net.tpsr - 0x40)*PAGE_SIZE],packet_len);		 p = 0;         WUKONG_STDOUT("in tuntap_output:\n");         for(i = 0; i<write_total_count; i++)		{			printf("%-8d",rtl8019_net.nic_ram[(rtl8019_net.tpsr-0x40)*PAGE_SIZE+i]);            if(++p == 6)		    {				printf("\n"); 				p = 0;			}		}		WUKONG_STDOUT("acture_len:"<<acture_len<<" packet_len:"<<packet_len);

		if( acture_len != packet_len)
		{
			WUKONG_STDOUT("tuntap_output,发送失败\n");
			return -1;
		}
	
		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)
		{
			WUKONG_STDOUT("写入的数据比实际的多\n");
		}
	

		if( start_page >= 0x46)
		{
			WUKONG_STDOUT("In write_to_rtl8019,写入数据超出缓冲的大小start_page:0x"\
				<<std::hex<<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;
			  //	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;	}	unsigned short check_sum( unsigned short *data, unsigned int size)
	{
		unsigned int chksum;

		chksum = 0;
		while( size > 1)
		{
			chksum += *data;
			data++;
			size -= 2;
		}

		if(size)
		{
			chksum += *(char*)data;
		}
		chksum = (chksum>>16) + chksum&0x0ffff;
		chksum += (chksum>>16);

		return (unsigned short)(~chksum);
	}	Core::s32 nic8019::recv_from_ethernet( Core::u8 *buffer, Core::s32 size)	{//not complete !!		pcap_if_t *alldevs, *d;
    pcap_t *fp;
    u_int inum, i=0;
    char errbuf[PCAP_ERRBUF_SIZE];
    int res;
    struct pcap_pkthdr *header;
    u_char *pkt_data;

    printf("pktdump_ex: prints the packets of the network using WinPcap.\n");
    printf("\t Usage: pktdump_ex [-n adapter] | [-f file_name]\n\n");

  

        /* 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", ++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;
        }
        
        printf("Enter the interface number (1-%d):",i);
        scanf("%d", &inum);
        
        if(inum < 1 || inum > i)
        {
            printf("\nInterface number out of range.\n");
            /* Free the device list */
            pcap_freealldevs(alldevs);
            return -1;
        }
        
        /* Jump to the selected adapter */
        for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
        
        /* Open the device */
        if ( (fp= pcap_open_live(d->name, 100, 1, 20, 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[38]==0x0a)&&(pkt_data[39]==0xd6)\
			&&(pkt_data[40]==0x20)&&(pkt_data[41]==0x24))\
			||((pkt_data[30]==0x0a)&&(pkt_data[31]==0xd6)\
			&&(pkt_data[32]==0x20)&&(pkt_data[33]==0x24))
		  )
		{
			for (i=1; (i < header->caplen + 1 ) ; i++)
			{
				printf("%.2x ", pkt_data[i-1]);
				buffer[i-1] = pkt_data[i-1];
				if ( (i % LINE_LEN) == 0) printf("\n");
			}
			printf("\n\n");
			return i-1;
		}
             
    }

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

    return 0;	}	Core::s32 nic8019::write_to_ethernet(Core::u8  *buffer, Core::s32 size)	{// not complete !!		std::cout<<"write_to_ethernet is not complete!"<<std::endl;		nic_state |= 2;//将来要去掉,输出马上就有输入		return size;	}		Core::u32 nic8019::get_state(Core::u32 state)	{		//如果用select判断出有数据从raw socket过来,则用		//tuntap_input( )取得输入,并存入网卡缓冲,但需要做一些修改		if( (nic_state&0x02) == 2)		{			tuntap_input();			nic_state &= ~(0x02);		}		if(nic_state)		{			nic_state = 0;			return 1;		}		return nic_state;	}	}

⌨️ 快捷键说明

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