/* -----------------------------------------------------------------------------------------------------------*/ 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 *) ðernetbuffer[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 *) ðernetbuffer[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( ðernetbuffer[ 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); }
void unselect_card() { ss_PORT |= (1<<ss_PIN); #if defined(myAVR) if ( test == 1 ) { test = 0; FreeEthernet(); } #endif #if defined(AVRNETIO) && defined(AVRNETIO_ADDON) if ( test == 1 ) { test = 0; SREG = sreg_tmp; } #endif }
void UDP_echo( void ) { // make an static UDPbuffer // warning, do not use an stack-allocated buffer! it will be damage the udp-packet static unsigned char UDPBuffer[ UDP_Bufferlen ]; // if an Socket created or opened, if not, create them ? if ( UDP_Socket == 0xffff ) UDP_Socket = UDP_ListenOnPort( UDPPORT_ECHO, UDP_Bufferlen, UDPBuffer ); else { if ( UDP_GetSocketState( UDP_Socket ) == SOCKET_BUSY ) { LockEthernet(); UDP_SendPacket( UDP_Socket, UDP_GetByteInBuffer( UDP_Socket ), UDPBuffer ); FreeEthernet(); UDP_CloseSocket( UDP_Socket ); UDP_Socket = 0xffff; } } return; }