Index: Components/PN_Controller/Sources/Pnm_ctlrpc.c =================================================================== --- Components/PN_Controller/Sources/Pnm_ctlrpc.c (revision 74198) +++ Components/PN_Controller/Sources/Pnm_ctlrpc.c (working copy) @@ -2421,28 +2421,31 @@ static void -Pnm_Rpc_Read_cnf(PNM_AR_T *ptAR, PN_PNIOSTATUS_E lPnio) +Pnm_Rpc_Read_cnf(PNM_AR_T *ptAR, PN_PNIOSTATUS_E lStatusPnio) { /* in contrast to default spec we implement pdu checking and data storing in * ctlrpc */ PN_RPC_STATE_T tState; + PN_PNIOSTATUS_E lPnio; - if(PNIO_S_OK == lPnio) - lPnio = Pn_Rpc_ParseResponse(&tState, Pnm_Rpc_Client_byAR(ptAR)); - else - Pnm_AR_LogEvent(ptAR, PNM_LOGBOOK_EVENT_AR_RPC_READ_FAILED, - lPnio); - - if(PNIO_S_OK == lPnio) + lPnio = Pn_Rpc_ParseResponse(&tState, Pnm_Rpc_Client_byAR(ptAR)); + if (lPnio != PNIO_E_RMPM_CONNECT_ARGS_LEN_INVALID) { const PN_BLOCKHEAD_T *ptPdu = Pn_Rpc_Recv_NextPdu(&tState); + PN_PNIOSTATUS_E lBlockHeaderPnio = PNIO_S_OK; + /* TODO: Due to an software architecture incoherency the RPC response status was already previously read. */ + /* First time: Pnm_Rpc_AR_CallCnf_job() */ + /* Second time: Pn_Rpc_ParseResponse() */ + assert(lPnio == lStatusPnio); + /* read response block must be first block */ - if(!ptPdu) - lPnio = PNIO_E_RTA_PROTOCOL_RPC_READ_ERR; - - while(ptPdu && PNIO_S_OK == lPnio) + if (ptPdu == NULL) { + lBlockHeaderPnio = PNIO_E_RTA_PROTOCOL_RPC_READ_ERR; + } + else + { uint16_t usType = NTOH16(ptPdu->usType); switch(usType) @@ -2452,11 +2455,11 @@ * before we can retrieve the data! */ Pn_Rpc_Recv_FinishPdu(&tState, ptPdu); - lPnio = Pnm_Rpc_DecodeIodrResBlock(ptAR, &tState, ptPdu); + lBlockHeaderPnio = Pnm_Rpc_DecodeIodrResBlock(ptAR, &tState, ptPdu); break; default: Pn_Rpc_Recv_FinishPdu(&tState, ptPdu); - lPnio = PNIO_E_RMPM_CONNECT_UNKNOWN_BLOCKS; + lBlockHeaderPnio = PNIO_E_RMPM_CONNECT_UNKNOWN_BLOCKS; break; } @@ -2467,25 +2470,20 @@ ptPdu = Pn_Rpc_Recv_NextPdu(&tState); } - if(PNIO_S_OK != lPnio) - lPnio = PNIO_E_RTA_PROTOCOL_RPC_READ_ERR; + if (lBlockHeaderPnio != PNIO_S_OK) + lPnio = lBlockHeaderPnio; + else + lPnio = lStatusPnio; } - if(PNIO_S_OK != lPnio) - { - PNM_AR_ACYCLIC_SERVICE_RECORD_T *ptService = Pnm_CTLRDI_GetServiceCnf(ptAR); + PNM_AR_ACYCLIC_SERVICE_RECORD_T *ptService = Pnm_CTLRDI_GetServiceCnf(ptAR); + const uint16_t usIndex = ptService ? ptService->usIndex : 0; - if(ptService) - ptService->ulPnio = lPnio; - } - - { /* generate RM Read confirmations */ - const PNM_AR_ACYCLIC_SERVICE_RECORD_T *ptService = Pnm_CTLRDI_GetService(ptAR); - const uint16_t usIndex = ptService ? ptService->usIndex : 0; - - Pnm_CTLSM_RM_ReadWrite_cnf(ptAR, lPnio, usIndex); - Pnm_CTLRDI_RM_Read_cnf(ptAR); - } + /* generate RM Read confirmations */ + if (ptService != NULL) + ptService->ulPnio = lPnio; + Pnm_CTLSM_RM_ReadWrite_cnf(ptAR, lPnio, usIndex); + Pnm_CTLRDI_RM_Read_cnf(ptAR); }