📄 rtl8019as_net420.cpp
字号:
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 + -