Ejemplo n.º 1
0
/* -----------------------------------------------------------------------------------------------------------*/
int UDP_SendPacket( int socket, int Datalenght, char * UDP_Databuffer )
{
	if ( socket >= MAX_UDP_CONNECTIONS ) return( UDP_SOCKET_ERROR );
		
	LockEthernet();
	
	char * ethernetbuffer;
	ethernetbuffer = (char*) __builtin_alloca (( size_t ) ETHERNET_HEADER_LENGTH + IP_HEADER_LENGHT + UDP_HEADER_LENGHT + Datalenght );

	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];
	IP_packet->IP_Version_Headerlen = 0x45; // Standart IPv4 und Headerlenght 20byte
	struct UDP_header * UDP_packet;		// TCP_struct anlegen
	UDP_packet = ( struct UDP_header *) &ethernetbuffer[ETHERNET_HEADER_LENGTH + ((IP_packet->IP_Version_Headerlen & 0x0f) * 4 )];
		
	int offset = ETHERNET_HEADER_LENGTH + ((IP_packet->IP_Version_Headerlen & 0x0f) * 4 ) + UDP_HEADER_LENGHT;

	memcpy( &ethernetbuffer[ offset ], UDP_Databuffer, Datalenght );
//	for ( i = 0 ; i < Datalenght ; i++ ) ethernetbuffer[ offset + i ] = UDP_Databuffer[ i ];
	
	MakeIPheader( UDP_sockettable[socket].DestinationIP, PROTO_UDP, UDP_HEADER_LENGHT + Datalenght , ethernetbuffer );
	MakeUDPheader( socket, Datalenght, ethernetbuffer );
	MakeETHheader( UDP_sockettable[socket].MACadress, ethernetbuffer );
	sendEthernetframe( ETHERNET_HEADER_LENGTH + IP_HEADER_LENGHT + UDP_HEADER_LENGHT + Datalenght, ethernetbuffer);

	FreeEthernet();
	
	return(0);
}
Ejemplo n.º 2
0
void icmp( unsigned int packet_lenght, unsigned char *buffer)
	{
		unsigned char i;
		unsigned int checksum;
		
		struct ETH_header *ETH_packet; 		// ETH_struct anlegen
		ETH_packet = (struct ETH_header *)&buffer[0];
		struct IP_header *IP_packet;		// IP_struct anlegen
		IP_packet = ( struct IP_header *)&buffer[ETHERNET_HEADER_LENGTH];
		struct ICMP_header *ICMP_packet;	// ICMP_struct anlegen
		ICMP_packet = ( struct ICMP_header *)&buffer[ETHERNET_HEADER_LENGTH + ((IP_packet->IP_Version_Headerlen & 0x0f) * 4 )];

		switch ( ICMP_packet->ICMP_type )
			{
				case ICMP_EchoRequest:			//IP_header unbauen zum versenden 
												IP_packet->IP_DestinationIP = IP_packet->IP_SourceIP;
												IP_packet->IP_SourceIP = myIP;
												//IP_header checksummer ausrechnen
												IP_packet->IP_Headerchecksum = 0x0;
												checksum = Checksum_16( &buffer[14], ((IP_packet->IP_Version_Headerlen & 0x0f) * 4 ) );
												IP_packet->IP_Headerchecksum = ChangeEndian16bit( checksum );
												ICMP_packet->ICMP_type = ICMP_EchoReplay; // auf reply einstellen
												ICMP_packet->ICMP_code = 0x00; 
												//Simple ICMP Checksummenbildung, die Idee stammt von
												//Simon, siehe http://avr.auctionant.de/
												if(ICMP_packet->ICMP_checksumByteOne >  0xFF-0x08)ICMP_packet->ICMP_checksumByteTwo++;
												ICMP_packet->ICMP_checksumByteOne+=0x08;
												// Ethernetframe bauen
												for(i = 0; i < 6 ; i++ ){	
													ETH_packet->ETH_destMac[i] = ETH_packet->ETH_sourceMac[i];	
													ETH_packet->ETH_sourceMac[i] = mymac[i]; }
												// und ab die post
												sendEthernetframe( packet_lenght, buffer); // packet_lenght - 4 weil der Controller die checksumme selber berechnet
												break;

				case ICMP_EchoReplay:			if ( ICMP_packet->ICMP_Identifierer == 0xac1d && ICMP_Replaystate == ICMP_WaitForReplay )
													ICMP_Replaystate = ICMP_ReplayOkay;
												break;
			}
	}