//---------------------------------------------------------------------------- //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 ) // if broadcast
//---------------------------------------------------------------------------- //Check Packet and call Stack for TCP or UDP void check_packet (void) { //Pointer auf Ethernet_Header struct Ethernet_Header *ethernet; ethernet = (struct Ethernet_Header *)ð_buffer[ETHER_OFFSET]; //Pointer auf IP_Header struct IP_Header *ip; ip = (struct IP_Header *)ð_buffer[IP_OFFSET]; #if USE_PING //Pointer auf ICMP_Header struct ICMP_Header *icmp; icmp = (struct ICMP_Header *)ð_buffer[ICMP_OFFSET]; #endif if(ETHERNET_ARP_DATAGRAMM) { //Erzeugt ein ARP Reply Packet arp_reply(); } else { if(ETHERNET_IP_DATAGRAMM && IF_MYIP) { arp_entry_add(); //Refresh des ARP Eintrages #if USE_PING //Ist protokoll Byte = 1 dann ist es ein ICMP Packet if(IP_ICMP_PACKET) { switch ( icmp->ICMP_Type ) { case (0x08): //Echo-Request empfangen, erzeugen eines ICMP Reply Packet (PING Echo) icmp_send(ip->IP_Srcaddr,0x00,0x00,icmp->ICMP_SeqNum,icmp->ICMP_Id); break; case (0x00): //Echo-Reply Packet empfangen, Empfang melden //TODO: Erst Sequenznummer vergleichen?, Zeitmessung? DEBUG_WRITE("%i",(ip->IP_Srcaddr&0x000000FF)); DEBUG_WRITE(".%i",((ip->IP_Srcaddr&0x0000FF00)>>8)); DEBUG_WRITE(".%i",((ip->IP_Srcaddr&0x00FF0000)>>16)); DEBUG_WRITE(".%i",((ip->IP_Srcaddr&0xFF000000)>>24)); DEBUG_WRITE(": PONG!\r\n"); break; } return; } else #endif { if(IP_UDP_PACKET) udp_socket_process(); } }
//---------------------------------------------------------------------------- //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(); } }