#include #include #include #include "opentcp.h" #include "datasink.h" #include "debug.h" // Globals int datasink_active=0; INT8 datasink_init (void){ //DBG_PRINTL("datasink initializing..."); printl("datasink initializing..."); if(datasink_initialized) return(1); datasink_sochandle = udp_getsocket(0, datasink_eventlistener, UDP_OPT_SEND_CS | UDP_OPT_CHECK_CS); if(datasink_sochandle < 0) return(-1); if(udp_open(datasink_sochandle, DATASINK_PORT) < 0 ) return(-1); //datasink_tmrhandle = get_timer(); datasink_state = DATASINK_STATE_ENABLED; datasink_remip = 0; datasink_remport = 0; //datasink_retries = 0; //datasink_blocknumber = 0; //datasink_bytecount = 0; datasink_active=0; datasink_initialized = 1; //DBG_PRINTL(" ... done\n"); printl(" ... done\n"); return(1); } void datasink_run (void){ if(!datasink_initialized) return; //if(datasink_state == DATASINK_STATE_CONNECTED){ // if(check_timer(datasink_tmrhandle) == 0){ // datasink_deleteSocket(); // } //} } INT32 datasink_eventlistener (INT8 cbhandle, UINT8 event, UINT32 remip, UINT16 remport, UINT16 bufindex, UINT16 dlen){ DBG_PRINTF("gotdata from %x on port %i, data is ignored", remip, remport); eth_stub_skip_buf(&fec_nif, dlen); } void datasink_sendHello(void){ sprintf(OTCP_TXBUF+UDP_APP_OFFSET, "Hello World"); udp_send(datasink_sochandle, datasink_remip, datasink_remport, &OTCP_TXBUF[UDP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - UDP_APP_OFFSET, 7); } /** * NOTE DATASINK_DATA_OFFSET bytes before ptr will be overwritten * M * Return values: * 0 datasink is not initialized * -1 datasink is not activated * -2 UDP: Error (General error, e.g. parameters) * -3 UDP: ARP or lower layer not ready, try again * -4 UDP: Socket closed or invalid local port * -5 data segment is too long, has to be <65535 **/ int datasink_sendData(char *ptr, int len){ int i=0; int totalSent=0; int packetCount=0; DBG_PRINTL("datasink_sendData called\n"); if(!datasink_initialized) return 0; if(!datasink_active) return -1; if(len>65535) return -5; DBG_PRINTF("Datasinking %d bytes\n", len); /** ptr-=2; *(ptr)=(unsigned short int)len; ptr-=2; *(ptr)=(unsigned short int)packetCount; **/ //ptr--; *(ptr-1) = (len) & 0x000000ff; *(ptr-2) = (len>>8) & 0x000000ff; *(ptr-3) = (packetCount) & 0x000000ff; *(ptr-4) = (packetCount>>8) & 0x000000ff; i=udp_send(datasink_sochandle, datasink_remip, datasink_remport, ptr-4, len+DATASINK_MAX_HEADER_SIZE, DATASINK_MAX_PACKET_SIZE); //TODO on -3 try reinitializing socket if(i<0){ DBG_PRINTL("ERROR: datasink failed to send the first packet\n"); return i-1; } //i-20; totalSent=i-DATASINK_MAX_HEADER_SIZE-4; //TODO: figure out why -4 //ptr+=totalSent; packetCount++; //if(totalSent>=len){ // return totalSent; //} while(totalSent>8) & 0x000000ff; i=udp_send(datasink_sochandle, datasink_remip, datasink_remport, ptr+totalSent-2, len-totalSent+DATASINK_MIN_HEADER_SIZE, DATASINK_MAX_PACKET_SIZE); //i-20; if(i<0){ DBG_PRINTL("ERROR: datasink failed to send packet\n"); return i-1; } totalSent+=i-DATASINK_MIN_HEADER_SIZE; packetCount++; } return totalSent; } void datasink_deleteSocket (void){ //datasink_blocknumber = 0; datasink_state = DATASINK_STATE_ENABLED; //datasink_retries = 0; datasink_remip = 0; datasink_remport = 0; }