예제 #1
0
/* -----------------------------------------------------------------------------------------------------------*/
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 *) &ethernetbuffer[ETHERNET_HEADER_LENGTH];
	struct UDP_header * UDP_packet;		// TCP_struct anlegen
	UDP_packet = ( struct UDP_header *) &ethernetbuffer[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( &ethernetbuffer[ 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 , &ethernetbuffer[ Offset ] , i );
					/*
					 while ( i-- )
					 {
						 UDP_sockettable[ socket ].Recivebuffer[i] = ethernetbuffer[ Offset + i ];
				}
				*/
				}
			}
		}
	}
	return;
}
예제 #2
0
/* -----------------------------------------------------------------------------------------------------------*/
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 *) &ethernetbuffer[ETHERNET_HEADER_LENGTH];
		struct UDP_header * UDP_packet;		// TCP_struct anlegen
		UDP_packet = ( struct UDP_header *) &ethernetbuffer[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;
}