test public

Fork of Probleme_implementation_lwip by Tom Martins

Committer:
TomTom83
Date:
Mon Jul 02 14:36:46 2018 +0000
Revision:
1:a3ee8cb24540
adaptation de bafian modbus

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TomTom83 1:a3ee8cb24540 1 /*
TomTom83 1:a3ee8cb24540 2 * FreeModbus Libary: lwIP Port
TomTom83 1:a3ee8cb24540 3 * Copyright (C) 2006 Christian Walter <wolti@sil.at>
TomTom83 1:a3ee8cb24540 4 *
TomTom83 1:a3ee8cb24540 5 * This library is free software; you can redistribute it and/or
TomTom83 1:a3ee8cb24540 6 * modify it under the terms of the GNU Lesser General Public
TomTom83 1:a3ee8cb24540 7 * License as published by the Free Software Foundation; either
TomTom83 1:a3ee8cb24540 8 * version 2.1 of the License, or (at your option) any later version.
TomTom83 1:a3ee8cb24540 9 *
TomTom83 1:a3ee8cb24540 10 * This library is distributed in the hope that it will be useful,
TomTom83 1:a3ee8cb24540 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
TomTom83 1:a3ee8cb24540 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
TomTom83 1:a3ee8cb24540 13 * Lesser General Public License for more details.
TomTom83 1:a3ee8cb24540 14 *
TomTom83 1:a3ee8cb24540 15 * You should have received a copy of the GNU Lesser General Public
TomTom83 1:a3ee8cb24540 16 * License along with this library; if not, write to the Free Software
TomTom83 1:a3ee8cb24540 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
TomTom83 1:a3ee8cb24540 18 *
TomTom83 1:a3ee8cb24540 19 * File: $Id: porttcp.c,v 1.2 2006/09/04 14:39:20 wolti Exp $
TomTom83 1:a3ee8cb24540 20 */
TomTom83 1:a3ee8cb24540 21
TomTom83 1:a3ee8cb24540 22 /* ----------------------- System includes ----------------------------------*/
TomTom83 1:a3ee8cb24540 23 #include <stdio.h>
TomTom83 1:a3ee8cb24540 24 #include "string.h"
TomTom83 1:a3ee8cb24540 25
TomTom83 1:a3ee8cb24540 26 #include "port.h"
TomTom83 1:a3ee8cb24540 27
TomTom83 1:a3ee8cb24540 28 /* ----------------------- lwIP includes ------------------------------------*/
TomTom83 1:a3ee8cb24540 29 #include "lwip/api.h"
TomTom83 1:a3ee8cb24540 30 #include "lwip/tcp.h"
TomTom83 1:a3ee8cb24540 31
TomTom83 1:a3ee8cb24540 32 /* ----------------------- Modbus includes ----------------------------------*/
TomTom83 1:a3ee8cb24540 33 #include "mb.h"
TomTom83 1:a3ee8cb24540 34 #include "mbport.h"
TomTom83 1:a3ee8cb24540 35
TomTom83 1:a3ee8cb24540 36 /* ----------------------- MBAP Header --------------------------------------*/
TomTom83 1:a3ee8cb24540 37 #define MB_TCP_UID 6
TomTom83 1:a3ee8cb24540 38 #define MB_TCP_LEN 4
TomTom83 1:a3ee8cb24540 39 #define MB_TCP_FUNC 7
TomTom83 1:a3ee8cb24540 40
TomTom83 1:a3ee8cb24540 41 /* ----------------------- Defines -----------------------------------------*/
TomTom83 1:a3ee8cb24540 42 #define MB_TCP_DEFAULT_PORT 502 /* TCP listening port. */
TomTom83 1:a3ee8cb24540 43 #define MB_TCP_BUF_SIZE ( 256 + 7 ) /* Must hold a complete Modbus TCP frame. */
TomTom83 1:a3ee8cb24540 44
TomTom83 1:a3ee8cb24540 45 /* ----------------------- Prototypes ---------------------------------------*/
TomTom83 1:a3ee8cb24540 46 void vMBPortEventClose( void ){};
TomTom83 1:a3ee8cb24540 47 void vMBPortLog( eMBPortLogLevel eLevel, const CHAR * szModule,
TomTom83 1:a3ee8cb24540 48 const CHAR * szFmt, ... );
TomTom83 1:a3ee8cb24540 49
TomTom83 1:a3ee8cb24540 50 /* ----------------------- Static variables ---------------------------------*/
TomTom83 1:a3ee8cb24540 51 static struct tcp_pcb *pxPCBListen;
TomTom83 1:a3ee8cb24540 52 static struct tcp_pcb *pxPCBClient;
TomTom83 1:a3ee8cb24540 53
TomTom83 1:a3ee8cb24540 54 static UCHAR aucTCPBuf[MB_TCP_BUF_SIZE];
TomTom83 1:a3ee8cb24540 55 static USHORT usTCPBufPos;
TomTom83 1:a3ee8cb24540 56
TomTom83 1:a3ee8cb24540 57 /* ----------------------- Static functions ---------------------------------*/
TomTom83 1:a3ee8cb24540 58 static err_t prvxMBTCPPortAccept( void *pvArg, struct tcp_pcb *pxPCB, err_t xErr );
TomTom83 1:a3ee8cb24540 59 static err_t prvxMBTCPPortReceive( void *pvArg, struct tcp_pcb *pxPCB, struct pbuf *p,
TomTom83 1:a3ee8cb24540 60 err_t xErr );
TomTom83 1:a3ee8cb24540 61 static void prvvMBTCPPortError( void *pvArg, err_t xErr );
TomTom83 1:a3ee8cb24540 62
TomTom83 1:a3ee8cb24540 63 /* ----------------------- Begin implementation -----------------------------*/
TomTom83 1:a3ee8cb24540 64 BOOL
TomTom83 1:a3ee8cb24540 65 xMBTCPPortInit( USHORT usTCPPort )
TomTom83 1:a3ee8cb24540 66 {
TomTom83 1:a3ee8cb24540 67 struct tcp_pcb *pxPCBListenNew, *pxPCBListenOld;
TomTom83 1:a3ee8cb24540 68 BOOL bOkay = FALSE;
TomTom83 1:a3ee8cb24540 69 USHORT usPort;
TomTom83 1:a3ee8cb24540 70
TomTom83 1:a3ee8cb24540 71 if( usTCPPort == 0 )
TomTom83 1:a3ee8cb24540 72 {
TomTom83 1:a3ee8cb24540 73 usPort = MB_TCP_DEFAULT_PORT;
TomTom83 1:a3ee8cb24540 74 }
TomTom83 1:a3ee8cb24540 75 else
TomTom83 1:a3ee8cb24540 76 {
TomTom83 1:a3ee8cb24540 77 usPort = ( USHORT ) usTCPPort;
TomTom83 1:a3ee8cb24540 78 }
TomTom83 1:a3ee8cb24540 79
TomTom83 1:a3ee8cb24540 80 if( ( pxPCBListenNew = pxPCBListenOld = tcp_new( ) ) == NULL )
TomTom83 1:a3ee8cb24540 81 {
TomTom83 1:a3ee8cb24540 82 /* Can't create TCP socket. */
TomTom83 1:a3ee8cb24540 83 bOkay = FALSE;
TomTom83 1:a3ee8cb24540 84 }
TomTom83 1:a3ee8cb24540 85 else if( tcp_bind( pxPCBListenNew, IP_ADDR_ANY, ( u16_t ) usPort ) != ERR_OK )
TomTom83 1:a3ee8cb24540 86 {
TomTom83 1:a3ee8cb24540 87 /* Bind failed - Maybe illegal port value or in use. */
TomTom83 1:a3ee8cb24540 88 ( void )tcp_close( pxPCBListenOld );
TomTom83 1:a3ee8cb24540 89 bOkay = FALSE;
TomTom83 1:a3ee8cb24540 90 }
TomTom83 1:a3ee8cb24540 91 else if( ( pxPCBListenNew = tcp_listen( pxPCBListenNew ) ) == NULL )
TomTom83 1:a3ee8cb24540 92 {
TomTom83 1:a3ee8cb24540 93 ( void )tcp_close( pxPCBListenOld );
TomTom83 1:a3ee8cb24540 94 bOkay = FALSE;
TomTom83 1:a3ee8cb24540 95 }
TomTom83 1:a3ee8cb24540 96 else
TomTom83 1:a3ee8cb24540 97 {
TomTom83 1:a3ee8cb24540 98 /* Register callback function for new clients. */
TomTom83 1:a3ee8cb24540 99 tcp_accept( pxPCBListenNew, prvxMBTCPPortAccept );
TomTom83 1:a3ee8cb24540 100
TomTom83 1:a3ee8cb24540 101 /* Everything okay. Set global variable. */
TomTom83 1:a3ee8cb24540 102 pxPCBListen = pxPCBListenNew;
TomTom83 1:a3ee8cb24540 103
TomTom83 1:a3ee8cb24540 104 #ifdef MB_TCP_DEBUG
TomTom83 1:a3ee8cb24540 105 vMBPortLog( MB_LOG_DEBUG, "MBTCP-ACCEPT", "Protocol stack ready.\r\n" );
TomTom83 1:a3ee8cb24540 106 #endif
TomTom83 1:a3ee8cb24540 107 }
TomTom83 1:a3ee8cb24540 108 bOkay = TRUE;
TomTom83 1:a3ee8cb24540 109 return bOkay;
TomTom83 1:a3ee8cb24540 110 }
TomTom83 1:a3ee8cb24540 111
TomTom83 1:a3ee8cb24540 112 void
TomTom83 1:a3ee8cb24540 113 prvvMBPortReleaseClient( struct tcp_pcb *pxPCB )
TomTom83 1:a3ee8cb24540 114 {
TomTom83 1:a3ee8cb24540 115 if( pxPCB != NULL )
TomTom83 1:a3ee8cb24540 116 {
TomTom83 1:a3ee8cb24540 117 if( tcp_close( pxPCB ) != ERR_OK )
TomTom83 1:a3ee8cb24540 118 {
TomTom83 1:a3ee8cb24540 119 tcp_abort( pxPCB );
TomTom83 1:a3ee8cb24540 120 }
TomTom83 1:a3ee8cb24540 121 // vPortEnterCritical( );
TomTom83 1:a3ee8cb24540 122 if( pxPCB == pxPCBClient )
TomTom83 1:a3ee8cb24540 123 {
TomTom83 1:a3ee8cb24540 124 #ifdef MB_TCP_DEBUG
TomTom83 1:a3ee8cb24540 125 vMBPortLog( MB_LOG_DEBUG, "MBTCP-CLOSE", "Closed connection to %d.%d.%d.%d.\r\n",
TomTom83 1:a3ee8cb24540 126 ip4_addr1( &( pxPCB->remote_ip ) ),
TomTom83 1:a3ee8cb24540 127 ip4_addr2( &( pxPCB->remote_ip ) ),
TomTom83 1:a3ee8cb24540 128 ip4_addr3( &( pxPCB->remote_ip ) ), ip4_addr4( &( pxPCB->remote_ip ) ) );
TomTom83 1:a3ee8cb24540 129 #endif
TomTom83 1:a3ee8cb24540 130 pxPCBClient = NULL;
TomTom83 1:a3ee8cb24540 131 }
TomTom83 1:a3ee8cb24540 132 if( pxPCB == pxPCBListen )
TomTom83 1:a3ee8cb24540 133 {
TomTom83 1:a3ee8cb24540 134 pxPCBListen = NULL;
TomTom83 1:a3ee8cb24540 135 }
TomTom83 1:a3ee8cb24540 136 //vPortExitCritical( );
TomTom83 1:a3ee8cb24540 137 }
TomTom83 1:a3ee8cb24540 138 }
TomTom83 1:a3ee8cb24540 139 void
TomTom83 1:a3ee8cb24540 140 vMBTCPPortClose( )
TomTom83 1:a3ee8cb24540 141 {
TomTom83 1:a3ee8cb24540 142 /* Shutdown any open client sockets. */
TomTom83 1:a3ee8cb24540 143 prvvMBPortReleaseClient( pxPCBClient );
TomTom83 1:a3ee8cb24540 144
TomTom83 1:a3ee8cb24540 145 /* Shutdown or listening socket. */
TomTom83 1:a3ee8cb24540 146 prvvMBPortReleaseClient( pxPCBListen );
TomTom83 1:a3ee8cb24540 147
TomTom83 1:a3ee8cb24540 148 /* Release resources for the event queue. */
TomTom83 1:a3ee8cb24540 149 vMBPortEventClose( );
TomTom83 1:a3ee8cb24540 150 }
TomTom83 1:a3ee8cb24540 151
TomTom83 1:a3ee8cb24540 152 void
TomTom83 1:a3ee8cb24540 153 vMBTCPPortDisable( void )
TomTom83 1:a3ee8cb24540 154 {
TomTom83 1:a3ee8cb24540 155 prvvMBPortReleaseClient( pxPCBClient );
TomTom83 1:a3ee8cb24540 156 }
TomTom83 1:a3ee8cb24540 157
TomTom83 1:a3ee8cb24540 158 err_t
TomTom83 1:a3ee8cb24540 159 prvxMBTCPPortAccept( void *pvArg, struct tcp_pcb *pxPCB, err_t xErr )
TomTom83 1:a3ee8cb24540 160 {
TomTom83 1:a3ee8cb24540 161 err_t error;
TomTom83 1:a3ee8cb24540 162
TomTom83 1:a3ee8cb24540 163 if( xErr != ERR_OK )
TomTom83 1:a3ee8cb24540 164 {
TomTom83 1:a3ee8cb24540 165 return xErr;
TomTom83 1:a3ee8cb24540 166 }
TomTom83 1:a3ee8cb24540 167
TomTom83 1:a3ee8cb24540 168 /* We can handle only one client. */
TomTom83 1:a3ee8cb24540 169 if( pxPCBClient == NULL )
TomTom83 1:a3ee8cb24540 170 {
TomTom83 1:a3ee8cb24540 171 /* Register the client. */
TomTom83 1:a3ee8cb24540 172 pxPCBClient = pxPCB;
TomTom83 1:a3ee8cb24540 173
TomTom83 1:a3ee8cb24540 174 /* Set up the receive function prvxMBTCPPortReceive( ) to be called when data
TomTom83 1:a3ee8cb24540 175 * arrives.
TomTom83 1:a3ee8cb24540 176 */
TomTom83 1:a3ee8cb24540 177 tcp_recv( pxPCB, prvxMBTCPPortReceive );
TomTom83 1:a3ee8cb24540 178
TomTom83 1:a3ee8cb24540 179 /* Register error handler. */
TomTom83 1:a3ee8cb24540 180 tcp_err( pxPCB, prvvMBTCPPortError );
TomTom83 1:a3ee8cb24540 181
TomTom83 1:a3ee8cb24540 182 /* Set callback argument later used in the error handler. */
TomTom83 1:a3ee8cb24540 183 tcp_arg( pxPCB, pxPCB );
TomTom83 1:a3ee8cb24540 184
TomTom83 1:a3ee8cb24540 185 /* Reset the buffers and state variables. */
TomTom83 1:a3ee8cb24540 186 usTCPBufPos = 0;
TomTom83 1:a3ee8cb24540 187
TomTom83 1:a3ee8cb24540 188 #ifdef MB_TCP_DEBUG
TomTom83 1:a3ee8cb24540 189 vMBPortLog( MB_LOG_DEBUG, "MBTCP-ACCEPT", "Accepted new client %d.%d.%d.%d\r\n",
TomTom83 1:a3ee8cb24540 190 ip4_addr1( &( pxPCB->remote_ip ) ),
TomTom83 1:a3ee8cb24540 191 ip4_addr2( &( pxPCB->remote_ip ) ),
TomTom83 1:a3ee8cb24540 192 ip4_addr3( &( pxPCB->remote_ip ) ), ip4_addr4( &( pxPCB->remote_ip ) ) );
TomTom83 1:a3ee8cb24540 193 #endif
TomTom83 1:a3ee8cb24540 194
TomTom83 1:a3ee8cb24540 195 error = ERR_OK;
TomTom83 1:a3ee8cb24540 196 }
TomTom83 1:a3ee8cb24540 197 else
TomTom83 1:a3ee8cb24540 198 {
TomTom83 1:a3ee8cb24540 199 prvvMBPortReleaseClient( pxPCB );
TomTom83 1:a3ee8cb24540 200 error = ERR_OK;
TomTom83 1:a3ee8cb24540 201 }
TomTom83 1:a3ee8cb24540 202 return error;
TomTom83 1:a3ee8cb24540 203 }
TomTom83 1:a3ee8cb24540 204
TomTom83 1:a3ee8cb24540 205 /* Called in case of an unrecoverable error. In any case we drop the client
TomTom83 1:a3ee8cb24540 206 * connection. */
TomTom83 1:a3ee8cb24540 207 void
TomTom83 1:a3ee8cb24540 208 prvvMBTCPPortError( void *pvArg, err_t xErr )
TomTom83 1:a3ee8cb24540 209 {
TomTom83 1:a3ee8cb24540 210 struct tcp_pcb *pxPCB = (struct tcp_pcb *)pvArg;
TomTom83 1:a3ee8cb24540 211
TomTom83 1:a3ee8cb24540 212 if( pxPCB != NULL )
TomTom83 1:a3ee8cb24540 213 {
TomTom83 1:a3ee8cb24540 214 #ifdef MB_TCP_DEBUG
TomTom83 1:a3ee8cb24540 215 vMBPortLog( MB_LOG_DEBUG, "MBTCP-ERROR", "Error with client connection! Droping it.\r\n" );
TomTom83 1:a3ee8cb24540 216 #endif
TomTom83 1:a3ee8cb24540 217 prvvMBPortReleaseClient( pxPCB );
TomTom83 1:a3ee8cb24540 218 }
TomTom83 1:a3ee8cb24540 219 }
TomTom83 1:a3ee8cb24540 220
TomTom83 1:a3ee8cb24540 221 err_t
TomTom83 1:a3ee8cb24540 222 prvxMBTCPPortReceive( void *pvArg, struct tcp_pcb *pxPCB, struct pbuf *p, err_t xErr )
TomTom83 1:a3ee8cb24540 223 {
TomTom83 1:a3ee8cb24540 224 USHORT usLength;
TomTom83 1:a3ee8cb24540 225
TomTom83 1:a3ee8cb24540 226 err_t error = xErr;
TomTom83 1:a3ee8cb24540 227
TomTom83 1:a3ee8cb24540 228 if( error != ERR_OK )
TomTom83 1:a3ee8cb24540 229 {
TomTom83 1:a3ee8cb24540 230 return error;
TomTom83 1:a3ee8cb24540 231 }
TomTom83 1:a3ee8cb24540 232
TomTom83 1:a3ee8cb24540 233 /* If pbuf is NULL then remote end has closed connection. */
TomTom83 1:a3ee8cb24540 234 if( p == NULL )
TomTom83 1:a3ee8cb24540 235 {
TomTom83 1:a3ee8cb24540 236 prvvMBPortReleaseClient( pxPCB );
TomTom83 1:a3ee8cb24540 237 return ERR_OK;
TomTom83 1:a3ee8cb24540 238 }
TomTom83 1:a3ee8cb24540 239
TomTom83 1:a3ee8cb24540 240 /* Acknowledge that we have received the data bytes. */
TomTom83 1:a3ee8cb24540 241 tcp_recved( pxPCB, p->len );
TomTom83 1:a3ee8cb24540 242
TomTom83 1:a3ee8cb24540 243 /* Check for internal buffer overflow. In case of an error drop the
TomTom83 1:a3ee8cb24540 244 * client. */
TomTom83 1:a3ee8cb24540 245 if( ( usTCPBufPos + p->len ) >= MB_TCP_BUF_SIZE )
TomTom83 1:a3ee8cb24540 246 {
TomTom83 1:a3ee8cb24540 247 prvvMBPortReleaseClient( pxPCB );
TomTom83 1:a3ee8cb24540 248 error = ERR_OK;
TomTom83 1:a3ee8cb24540 249 }
TomTom83 1:a3ee8cb24540 250 else
TomTom83 1:a3ee8cb24540 251 {
TomTom83 1:a3ee8cb24540 252 memcpy( &aucTCPBuf[usTCPBufPos], p->payload, p->len );
TomTom83 1:a3ee8cb24540 253 usTCPBufPos += p->len;
TomTom83 1:a3ee8cb24540 254
TomTom83 1:a3ee8cb24540 255 /* If we have received the MBAP header we can analyze it and calculate
TomTom83 1:a3ee8cb24540 256 * the number of bytes left to complete the current request. If complete
TomTom83 1:a3ee8cb24540 257 * notify the protocol stack.
TomTom83 1:a3ee8cb24540 258 */
TomTom83 1:a3ee8cb24540 259 if( usTCPBufPos >= MB_TCP_FUNC )
TomTom83 1:a3ee8cb24540 260 {
TomTom83 1:a3ee8cb24540 261 /* Length is a byte count of Modbus PDU (function code + data) and the
TomTom83 1:a3ee8cb24540 262 * unit identifier. */
TomTom83 1:a3ee8cb24540 263 usLength = aucTCPBuf[MB_TCP_LEN] << 8U;
TomTom83 1:a3ee8cb24540 264 usLength |= aucTCPBuf[MB_TCP_LEN + 1];
TomTom83 1:a3ee8cb24540 265
TomTom83 1:a3ee8cb24540 266 /* Is the frame already complete. */
TomTom83 1:a3ee8cb24540 267 if( usTCPBufPos < ( MB_TCP_UID + usLength ) )
TomTom83 1:a3ee8cb24540 268 {
TomTom83 1:a3ee8cb24540 269 }
TomTom83 1:a3ee8cb24540 270 else if( usTCPBufPos == ( MB_TCP_UID + usLength ) )
TomTom83 1:a3ee8cb24540 271 {
TomTom83 1:a3ee8cb24540 272 #ifdef MB_TCP_DEBUG
TomTom83 1:a3ee8cb24540 273 prvvMBTCPLogFrame( (UCHAR*)"MBTCP-RECV", &aucTCPBuf[0], usTCPBufPos );
TomTom83 1:a3ee8cb24540 274 #endif
TomTom83 1:a3ee8cb24540 275 ( void )xMBPortEventPost( EV_FRAME_RECEIVED );
TomTom83 1:a3ee8cb24540 276 }
TomTom83 1:a3ee8cb24540 277 else
TomTom83 1:a3ee8cb24540 278 {
TomTom83 1:a3ee8cb24540 279 #ifdef MB_TCP_DEBUG
TomTom83 1:a3ee8cb24540 280 vMBPortLog( MB_LOG_DEBUG, "MBTCP-ERROR",
TomTom83 1:a3ee8cb24540 281 "Received to many bytes! Droping client.\r\n" );
TomTom83 1:a3ee8cb24540 282 #endif
TomTom83 1:a3ee8cb24540 283 /* This should not happen. We can't deal with such a client and
TomTom83 1:a3ee8cb24540 284 * drop the connection for security reasons.
TomTom83 1:a3ee8cb24540 285 */
TomTom83 1:a3ee8cb24540 286 prvvMBPortReleaseClient( pxPCB );
TomTom83 1:a3ee8cb24540 287 }
TomTom83 1:a3ee8cb24540 288 }
TomTom83 1:a3ee8cb24540 289 }
TomTom83 1:a3ee8cb24540 290 pbuf_free( p );
TomTom83 1:a3ee8cb24540 291 return error;
TomTom83 1:a3ee8cb24540 292 }
TomTom83 1:a3ee8cb24540 293
TomTom83 1:a3ee8cb24540 294 BOOL
TomTom83 1:a3ee8cb24540 295 xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength )
TomTom83 1:a3ee8cb24540 296 {
TomTom83 1:a3ee8cb24540 297 *ppucMBTCPFrame = &aucTCPBuf[0];
TomTom83 1:a3ee8cb24540 298 *usTCPLength = usTCPBufPos;
TomTom83 1:a3ee8cb24540 299
TomTom83 1:a3ee8cb24540 300 /* Reset the buffer. */
TomTom83 1:a3ee8cb24540 301 usTCPBufPos = 0;
TomTom83 1:a3ee8cb24540 302 return TRUE;
TomTom83 1:a3ee8cb24540 303 }
TomTom83 1:a3ee8cb24540 304
TomTom83 1:a3ee8cb24540 305 BOOL
TomTom83 1:a3ee8cb24540 306 xMBTCPPortSendResponse( const UCHAR * pucMBTCPFrame, USHORT usTCPLength )
TomTom83 1:a3ee8cb24540 307 {
TomTom83 1:a3ee8cb24540 308 BOOL bFrameSent = FALSE;
TomTom83 1:a3ee8cb24540 309
TomTom83 1:a3ee8cb24540 310 if( pxPCBClient )
TomTom83 1:a3ee8cb24540 311 {
TomTom83 1:a3ee8cb24540 312 /* Make sure we can send the packet. */
TomTom83 1:a3ee8cb24540 313 assert( tcp_sndbuf( pxPCBClient ) >= usTCPLength );
TomTom83 1:a3ee8cb24540 314
TomTom83 1:a3ee8cb24540 315 if( tcp_write( pxPCBClient, pucMBTCPFrame, ( u16_t ) usTCPLength, TCP_WRITE_FLAG_COPY ) == ERR_OK )
TomTom83 1:a3ee8cb24540 316 {
TomTom83 1:a3ee8cb24540 317 #ifdef MB_TCP_DEBUG
TomTom83 1:a3ee8cb24540 318 prvvMBTCPLogFrame( (UCHAR*)"MBTCP-SENT", &aucTCPBuf[0], usTCPLength );
TomTom83 1:a3ee8cb24540 319 #endif
TomTom83 1:a3ee8cb24540 320 /* Make sure data gets sent immediately. */
TomTom83 1:a3ee8cb24540 321 ( void )tcp_output( pxPCBClient );
TomTom83 1:a3ee8cb24540 322 bFrameSent = TRUE;
TomTom83 1:a3ee8cb24540 323 }
TomTom83 1:a3ee8cb24540 324 else
TomTom83 1:a3ee8cb24540 325 {
TomTom83 1:a3ee8cb24540 326 /* Drop the connection in case of an write error. */
TomTom83 1:a3ee8cb24540 327 prvvMBPortReleaseClient( pxPCBClient );
TomTom83 1:a3ee8cb24540 328 }
TomTom83 1:a3ee8cb24540 329 }
TomTom83 1:a3ee8cb24540 330 return bFrameSent;
TomTom83 1:a3ee8cb24540 331 }
TomTom83 1:a3ee8cb24540 332