📄 rtl8019as_net509tag.cpp
字号:
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,ð,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 + -