/* -----------------------------------------------------------------------------------------------------------*/ void udp( int packet_lenght, char * ethernetbuffer ) { int i, socket , Offset; struct ETH_header * ETH_packet; // ETH_struct anlegen ETH_packet = (struct ETH_header *) ethernetbuffer; struct IP_header * IP_packet; // IP_struct anlegen IP_packet = ( struct IP_header *) ðernetbuffer[ETHERNET_HEADER_LENGTH]; struct UDP_header * UDP_packet; // TCP_struct anlegen UDP_packet = ( struct UDP_header *) ðernetbuffer[ETHERNET_HEADER_LENGTH + ((IP_packet->IP_Version_Headerlen & 0x0f) * 4 )]; #ifdef _DEBUG_ printf_P( PSTR("UDP-Packet empfangen") , packet_lenght ); #endif socket = UDP_GetSocket( ethernetbuffer ); // Socket zugeordnet ? if ( socket != UDP_SOCKET_ERROR ) { // Hat Socket Daten ? if ( ( ntohs( UDP_packet->UDP_Datalenght ) - UDP_HEADER_LENGHT ) != 0 ) { // Offset für UDP-Daten im Ethernetframe berechnen Offset = ETHERNET_HEADER_LENGTH + ((IP_packet->IP_Version_Headerlen & 0x0f) * 4 ) + UDP_HEADER_LENGHT; if( UDP_sockettable[ socket ].UDPcallback != NULL ) { // ruf mal die Callback auf und übergebe den Puffer und deren länge UDP_sockettable[ socket ].UDPcallback( ðernetbuffer[ Offset ], ntohs( UDP_packet->UDP_Datalenght ) - UDP_HEADER_LENGHT ); UDP_sockettable[ socket ].Socketstate = UDP_SOCKET_READY; UDP_sockettable[ socket ].DestinationPort = 0 ; UDP_sockettable[ socket ].DestinationIP = 0 ; UDP_sockettable[ socket ].Bufferfill = 0; } else { // Socket schon mit daten belegt ? if ( UDP_sockettable[ socket ].Socketstate == UDP_SOCKET_READY ) { // Größe der Daten limitieren auf Puffergröße i = MIN( ntohs( UDP_packet->UDP_Datalenght ) - UDP_HEADER_LENGHT , UDP_sockettable[ socket ].Bufferlenght ); // Größe der Daten eintragen UDP_sockettable[ socket ].Bufferfill = i; // Socket als belegt melden UDP_sockettable[ socket ].Socketstate = UDP_SOCKET_BUSY; // Daten kopieren, aber flott memcpy( UDP_sockettable[ socket ].Recivebuffer , ðernetbuffer[ Offset ] , i ); /* while ( i-- ) { UDP_sockettable[ socket ].Recivebuffer[i] = ethernetbuffer[ Offset + i ]; } */ } } } } return; }
/* -----------------------------------------------------------------------------------------------------------*/ void udp( unsigned int packet_lenght, unsigned char * ethernetbuffer ) { unsigned int i, SOCKET , Offset; struct ETH_header * ETH_packet; // ETH_struct anlegen ETH_packet = (struct ETH_header *) ethernetbuffer; struct IP_header * IP_packet; // IP_struct anlegen IP_packet = ( struct IP_header *) ðernetbuffer[ETHERNET_HEADER_LENGTH]; struct UDP_header * UDP_packet; // TCP_struct anlegen UDP_packet = ( struct UDP_header *) ðernetbuffer[ETHERNET_HEADER_LENGTH + ((IP_packet->IP_Version_Headerlen & 0x0f) * 4 )]; #ifdef _DEBUG_ printf_P( PSTR("UDP-Packet empfangen") , packet_lenght ); #endif SOCKET = UDP_GetSocket( ethernetbuffer ); // Socket zugeordnet ? if ( SOCKET == 0xffff ) return; // Socket schon mit daten belegt ? if ( UDP_sockettable[ SOCKET ].Socketstate == SOCKET_BUSY ) return ; // Hat Socket Daten ? if ( ( ChangeEndian16bit( UDP_packet->UDP_Datalenght ) - UDP_HEADER_LENGHT ) == 0 ) return ; // Größe der Daten limitieren auf Puffergröße i = MIN( ChangeEndian16bit( UDP_packet->UDP_Datalenght) - UDP_HEADER_LENGHT , UDP_sockettable[ SOCKET ].Bufferlenght ); // Größe der Daten eintragen UDP_sockettable[ SOCKET ].Bufferfill = i; // Socket als belegt melden UDP_sockettable[ SOCKET ].Socketstate = SOCKET_BUSY; // ttl wieder richtig setzen UDP_sockettable[SOCKET].ttl = UDP_Default_ttl; // Offset für UDP-Daten im Ethernetfrane berechnen Offset = ETHERNET_HEADER_LENGTH + ((IP_packet->IP_Version_Headerlen & 0x0f) * 4 ) + UDP_HEADER_LENGHT; // Daten kopieren while ( i-- ) { UDP_sockettable[ SOCKET ].Recivebuffer[i] = ethernetbuffer[ Offset + i ]; } return; }