// --------------------------------------------------------------------------- // TCP_RetransmitSrvTcpMsg : ReEnviar mensaje SrvTcp por puerto TCP // UINT8 TCP_RetransmitSrvTcpMsg(UINT8 SocketIdx) { UINT16 i; UINT16 len; UINT8 TimerGetStateId; UINT8* pTxBuffer; UINT8 bTmpToken; UINT8 BufLen; if (tcp_getstate(TcpSockSrv[SocketIdx].TcpSrvTcpSoch) != TCP_STATE_CONNECTED){ return (-1); } if (tcp_checksend(TcpSockSrv[SocketIdx].TcpSrvTcpSoch) < 0) { TcpWhileFlag = 0x01; TimerGetStateId = TMR_SetTimer ( TCP_WAITFORSEND_TOUT , OS_NOT_PROC, TCP_StopWhileProc, FALSE); while (tcp_checksend(TcpSockSrv[SocketIdx].TcpSrvTcpSoch) < 0) { if (!TcpWhileFlag) return (-1); // Cuando vence el timer se resetea TcpWhileFlag } TMR_FreeTimer ( TimerGetStateId ); } bTmpToken = TcpSockSrv[SocketIdx].BufferToken; if (MemGetBufferPtr( bTmpToken , (void**)(&pTxBuffer) ) != OK ){ (void)MemFreeBuffer (bTmpToken); // Liberar por las dudas ? ABR: control de errores return(-1); } BufLen = *pTxBuffer; pTxBuffer++; len = 0; for( i=0 ; i < BufLen ; i++ ){ net_buf[TCP_APP_OFFSET+len] = *pTxBuffer; pTxBuffer++; len++; } if(tcp_send(TcpSockSrv[SocketIdx].TcpSrvTcpSoch, &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, len) == len) { DEBUGOUT("TCP: bytes reply sent!\r\n"); #if DEBUG_AT(DBG_LEVEL_2) if (SYS_ConfigParam.DebugLevel>= DBG_LEVEL_2) { (void)sprintf((char *)udp_buf,"TCP_Sent Len: %d, IP:%d \n", len, (BYTE)TcpSockSrv[SocketIdx].SlaveIpAddress); udp_data_to_send = TRUE; } #endif } else { DEBUGOUT("TCP: error occured while trying to send data!\r\n"); } return (1); }
// --------------------------------------------------------------------------- // Enviar mensaje por puerto TCP con informacion de configuracion // UINT8 TCP_SendCfgBuff(void) { UINT8 i; UINT16 len; UINT8 * pOutCfgMsg; pOutCfgMsg = (UINT8 *)(&CfgMsgFrame); // while(tcp_checksend(TcpConfigSoch) < 0); if (tcp_checksend(TcpConfigSoch) < 0){ return 0x01; } len = 0; for( i=0 ; i < MIN_CFGFRAME_LEN ; i++ ){ net_buf[TCP_APP_OFFSET+len] = *pOutCfgMsg; pOutCfgMsg++; len++; } for( i=0 ; i < CfgMsgFrame.Len ; i++ ){ net_buf[TCP_APP_OFFSET+len] = *pOutCfgMsg; pOutCfgMsg++; len++; } if(tcp_send(TcpConfigSoch, &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, len) == len) { DEBUGOUT("TCP: bytes reply sent!\r\n"); } else { DEBUGOUT("TCP: error occured while trying to send data!\r\n"); } return 0x00; }
// --------------------------------------------------------------------------- // TCP_SendSrvTcpMsg : Enviar mensaje SrvTcp por puerto TCP // //UINT8 TCP_SendSrvTcpMsg (void) UINT8 TCP_SendSrvTcpBuff(UINT8 * Buff, UINT16 BufLen, UINT8 SocketIdx) { UINT16 i; UINT16 len; UINT8 TimerGetStateId; if (tcp_getstate(TcpSockSrv[SocketIdx].TcpSrvTcpSoch) != TCP_STATE_CONNECTED){ return 0x01; } if (tcp_checksend(TcpSockSrv[SocketIdx].TcpSrvTcpSoch) < 0) { TcpWhileFlag = 0x01; TimerGetStateId = TMR_SetTimer ( TCP_WAITFORSEND_TOUT , OS_NOT_PROC, TCP_StopWhileProc, FALSE); while (tcp_checksend(TcpSockSrv[SocketIdx].TcpSrvTcpSoch) < 0) { if (!TcpWhileFlag) return 0x01; // Cuando vence el timer se resetea TcpWhileFlag } TMR_FreeTimer ( TimerGetStateId ); } len = 0; for( i=0 ; i < BufLen ; i++ ){ net_buf[TCP_APP_OFFSET+len] = *Buff; Buff++; len++; } if(tcp_send(TcpSockSrv[SocketIdx].TcpSrvTcpSoch, &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, len) == len) { DEBUGOUT("TCP: bytes reply sent!\r\n"); #if DEBUG_AT(DBG_LEVEL_2) if (SYS_ConfigParam.DebugLevel>= DBG_LEVEL_2) { (void)sprintf((char *)udp_buf,"TCP_Sent Len: %d, IP:%d \n", len, (BYTE)TcpSockSrv[SocketIdx].SlaveIpAddress); udp_data_to_send = TRUE; } #endif } else { DEBUGOUT("TCP: error occured while trying to send data!\r\n"); } return 0x00; }
void send_data(int soc, int event, int len) { int i; __builtin_quad tmp; static int tx_index; static char buffer[4][TX_BUF_SIZE]; switch (event) { case TCP_EVENT_DATA: while (link_available() && (tx_index < TX_BUF_SIZE - 128)) { link_recv(&tmp); if (tx_index < 0 || tx_index >= TX_BUF_SIZE) { tx_index = 0; tx_error_counter++; } link_quad2char(&tmp, 1, &txbuf[tx_index]); tx_index += 16; if (tx_index >= TX_BUF_SIZE) { tx_index = 0; tx_error_counter++; } } break; case TCP_EVENT_REGENERATE: puts("regenerate"); if ((tcp_checksend(socket[soc]) != -1) && (len > 0) && (len < TX_BUF_SIZE)) { memcpy(&net_buf[TCP_APP_OFFSET], buffer[soc], len); tcp_send(socket[soc], &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, len); } break; } if (tx_index > 0) { for (i = 0; i < 4; ++i) { if (tcp_checksend(socket[i]) != -1) { memcpy(&net_buf[TCP_APP_OFFSET], txbuf, tx_index); memcpy(buffer[i], txbuf, tx_index); tcp_send(socket[i], &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, tx_index); tx_index = 0; return; } } } }
// --------------------------------------------------------------------------- // Enviar mensaje por puerto TCP con informacion de CliTcp // UINT8 TCP_SendCliTcpBuff(UINT8 * Buff, UINT16 BufLen) { UINT16 i; UINT16 len; UINT8 TimerGetStateId; // CliTcpIpChar[0] = 192; // CliTcpIpChar[1] = 168; // CliTcpIpChar[2] = 0; // CliTcpIpChar[3] = 32; if (tcp_getstate(TcpCliTcpSoch) != TCP_STATE_CONNECTED){ if ( tcp_connect (TcpCliTcpSoch, CliTcpIp, (UINT16)(CliTcpSockPort), 0 ) == (-1)){ // (UINT16)(DNP_LOCAL_PORT) return 0x01; } } if (tcp_checksend(TcpCliTcpSoch) < 0) { TcpWhileFlag = 0x01; TimerGetStateId = TMR_SetTimer ( TCP_WAITFORSEND_TOUT , OS_NOT_PROC, TCP_StopWhileProc, FALSE); while (tcp_checksend(TcpCliTcpSoch) < 0) { if (!TcpWhileFlag) return 0x01; // Cuando vence el timer se resetea TcpWhileFlag } TMR_FreeTimer ( TimerGetStateId ); } len = 0; for( i=0 ; i < BufLen ; i++ ){ net_buf[TCP_APP_OFFSET+len] = *Buff; Buff++; len++; } if(tcp_send(TcpCliTcpSoch, &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, len) == len) { DEBUGOUT("TCP: bytes reply sent!\r\n"); } else { DEBUGOUT("TCP: error occured while trying to send data!\r\n"); } return 0x00; }
void send_test(int soc) { int i; if (tcp_checksend(soc) < 0) return; for (i = 0; i < 1200; ++i) net_buf[TCP_APP_OFFSET + i] = i + 64; tcp_send(soc, &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, 64); }
void smtpc_run (void) { /* On that function we can send data when called by main loop */ if( smtpc_init_done == 0 ) return; if( smtp_client.state < SMTP_OPEN_REQUESTED) return; /* Is there timeout of some sort? */ if(check_timer(smtp_client.tmrhandle) == 0) { /* Yep */ (void)tcp_abort(smtp_client.sochandle); smtpc_changestate(SMTP_CLOSED); /* Make user callback */ smtpc_error(); return; } if( smtp_client.state == SMTP_OPEN_REQUESTED) { /* We are on this state because user has requested connection */ /* but connection is not yet opened. */ /* Try to get TCP stack to accept our connection request */ (void)tcp_abort(smtp_client.sochandle); /* Release old connection */ if(tcp_connect(smtp_client.sochandle, smtp_client.remip, smtp_client.remport, 0) >= 0) smtpc_changestate(SMTP_CONNECTIONOPEN_SENT); return; } if( tcp_getstate(smtp_client.sochandle) != TCP_STATE_CONNECTED ) { return; } if( tcp_checksend(smtp_client.sochandle) < 0 ) return; /* It's connected and no unacked data so try to send */ if(smtp_client.state == SMTP_SERVER_READY) { /* Send HELO */ smtpc_sendhelo(); smtpc_changestate(SMTP_HELO_SENT); DEBUGOUT("SMTP HELO packet sent\r\n"); return; } if(smtp_client.state == SMTP_HELO_ACKED) { /* Send MAIL FROM */ smtpc_sendmailfrom(); smtpc_changestate(SMTP_MAILFROM_SENT); DEBUGOUT("SMTP MAIL FROM packet sent\r\n"); return; } if(smtp_client.state == SMTP_MAILFROM_ACKED) { /* Send RCPT TO */ smtpc_sendrcptto(); smtpc_changestate(SMTP_RCPTTO_SENT); DEBUGOUT("SMTP RCPT TO packet sent\r\n"); return; } if(smtp_client.state == SMTP_RCPTTO_ACKED) { /* Send DATA */ smtpc_senddatareq(); smtpc_changestate(SMTP_DATAREQ_SENT); DEBUGOUT("SMTP DATA packet sent\r\n"); return; } if(smtp_client.state == SMTP_DATAREQ_ACKED) { /* Send BODY */ smtpc_sendbody(); smtpc_changestate(SMTP_BODY_SENT); DEBUGOUT("SMTP BODY packet sent\r\n"); return; } /* Body is part of plain text so we just make internal state change */ /* when TCP has acked the body packet. This pseudo-state just helps */ /* us to regenerate the body when needed */ if(smtp_client.state == SMTP_BODY_SENT) smtpc_changestate(SMTP_SENDING_DATA); if(smtp_client.state == SMTP_SENDING_DATA) { /* Inform user app that old data is acked now */ smtpc_dataacked(); if (smtpc_senddata() < 0) { /* End of data, send CRLF.CRLF */ DEBUGOUT("SMTP End of data reached\r\n"); smtpc_senddataend(); smtpc_changestate(SMTP_DATAEND_SENT); } return; } if(smtp_client.state == SMTP_DATAEND_ACKED) { /* Send QUIT */ smtpc_sendquit(); smtpc_changestate(SMTP_QUIT_SENT); DEBUGOUT("SMTP QUIT packet sent\r\n"); return; } if(smtp_client.state == SMTP_QUIT_ACKED) { /* Inform application that data is sent OK */ smtpc_allok(); /* Try to close TCP */ if(tcp_close(smtp_client.sochandle) >= 0) { smtpc_changestate(SMTP_CLOSED); DEBUGOUT("SMTP connection closed OK\r\n"); return; } /* Close is not accepted by TCP. See if timeout */ if(check_timer(smtp_client.tmrhandle) == 0) { /* Use brute force */ (void)tcp_abort(smtp_client.sochandle); smtpc_changestate(SMTP_CLOSED); DEBUGOUT("SMTP connection closed by ABORT\r\n"); return; } /* Keep trying untill timeout */ return; } return; }