Tom Martins
/
Probleme_implementation_lwip2
test public
Fork of Probleme_implementation_lwip by
porttcp.cpp@2:9e76d51d9fb6, 2018-07-02 (annotated)
- Committer:
- TomTom83
- Date:
- Mon Jul 02 15:18:18 2018 +0000
- Revision:
- 2:9e76d51d9fb6
- Parent:
- 1:a3ee8cb24540
probl?mes d'adaptation
Who changed what in which revision?
User | Revision | Line number | New 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 |