//---------------------------------------------------------------------------- //ETH get data void eth_get_data (void) { if(eth.timer) { tcp_timer_call(); arp_timer_call(); eth.timer = 0; } if(eth.data_present) { while( (PINB &(1<<PB2)) == 0) { unsigned int packet_lenght; packet_lenght = ETH_PACKET_RECEIVE(MTU_SIZE,eth_buffer); /*Wenn ein Packet angekommen ist, ist packet_lenght =! 0*/ packet_lenght = packet_lenght - 4; eth_buffer[packet_lenght+1] = 0; check_packet(); } eth.data_present = 0; ETH_INT_ENABLE; } return; }
//---------------------------------------------------------------------------- //ETH get data void eth_get_data (void) { unsigned int packet_lenght; packet_lenght = ETH_PACKET_RECEIVE(MTU_SIZE,eth_buffer); /*Wenn ein Packet angekommen ist, ist packet_lenght =! 0*/ if(packet_lenght > 0) { packet_lenght = packet_lenght - 4; eth_buffer[packet_lenght+1] = 0; eth_len = packet_lenght; // remember length for global access check_packet(); } }
//---------------------------------------------------------------------------- //ETH get data void eth_get_data (void) { if(eth.timer) { tcp_timer_call(); arp_timer_call(); eth.timer = 0; } if(eth.data_present) { #if USE_ENC28J60 while(ETH_INT_ACTIVE) { #endif #if USE_RTL8019 if ( (ReadRTL(RTL_ISR)&(1<<OVW)) != 0) { DEBUG ("Overrun!\n"); } if ( (ReadRTL(RTL_ISR) & (1<<PRX)) != 0) { unsigned char ByteH = 0; unsigned char ByteL = 1; while (ByteL != ByteH) //(!= bedeutet ungleich) { #endif unsigned int packet_length; packet_length = ETH_PACKET_RECEIVE(MTU_SIZE,eth_buffer); if(packet_length > 0) { eth_buffer[packet_length+1] = 0; check_packet(); } #if USE_RTL8019 //auslesen des Empfangsbuffer BNRY = CURR ByteL = ReadRTL(BNRY); //auslesen NIC Register bnry WriteRTL ( CR ,(1<<STA|1<<RD2|1<<PS0)); ByteH = ReadRTL(CURR); //auslesen NIC Register curr WriteRTL ( CR ,(1<<STA|1<<RD2)); } #endif } #if USE_RTL8019 Networkcard_INT_RES(); Networkcard_Start(); #endif eth.data_present = 0; ETH_INT_ENABLE; } return; } //---------------------------------------------------------------------------- //Check Packet and call Stack for TCP or UDP void check_packet (void) { struct Ethernet_Header *ethernet; //Pointer auf Ethernet_Header struct IP_Header *ip; //Pointer auf IP_Header struct TCP_Header *tcp; //Pointer auf TCP_Header struct ICMP_Header *icmp; //Pointer auf ICMP_Header ethernet = (struct Ethernet_Header *)ð_buffer[ETHER_OFFSET]; ip = (struct IP_Header *)ð_buffer[IP_OFFSET]; tcp = (struct TCP_Header *)ð_buffer[TCP_OFFSET]; icmp = (struct ICMP_Header *)ð_buffer[ICMP_OFFSET]; if(ethernet->EnetPacketType == HTONS(0x0806) ) //ARP { arp_reply(); // check arp packet request/reply } else { if( ethernet->EnetPacketType == HTONS(0x0800) ) // if IP { if( ip->IP_Destaddr == *((unsigned long*)&myip[0]) ) // if my IP address { arp_entry_add(); ///Refresh des ARP Eintrages if(ip->IP_Proto == PROT_ICMP) { switch ( icmp->ICMP_Type ) { case (8): //Ping reqest icmp_send(ip->IP_Srcaddr,0,0,icmp->ICMP_SeqNum,icmp->ICMP_Id); break; case (0): //Ping reply if ((*((unsigned long*)&ping.ip1[0])) == ip->IP_Srcaddr) { ping.result |= 0x01; } DEBUG("%i", (ip->IP_Srcaddr&0x000000FF) ); DEBUG(".%i", ((ip->IP_Srcaddr&0x0000FF00)>>8 )); DEBUG(".%i", ((ip->IP_Srcaddr&0x00FF0000)>>16)); DEBUG(".%i :",((ip->IP_Srcaddr&0xFF000000)>>24)); break; } return; } else { if( ip->IP_Proto == PROT_TCP ) tcp_socket_process(); if( ip->IP_Proto == PROT_UDP ) udp_socket_process(); } } else if (ip->IP_Destaddr == (unsigned long)0xffffffff || ip->IP_Destaddr == *((unsigned long*)&broadcast_ip[0]) ) // if broadcast { if( ip->IP_Proto == PROT_UDP ) udp_socket_process(); } }