반응형

[Classic AUTOSAR] Socket Adaptor(SoAd) 2. 기능 사양 (3) PDU 헤더 옵션

참조 : https://www.autosar.org/fileadmin/user_upload/standards/classic/20-11/AUTOSAR_SWS_SocketAdaptor.pdf

 

[SWS_SoAd_00197] 소켓 연결 및 PDU 전송을 위해 PDU 헤더 옵션이 활성화된 경우(SoAdPduHeaderEnable이 TRUE임), SoAd는 구성된 HeaderId와 실제 PDU 길이가 있는 PDU 헤더를 PDU 데이터 바로 앞에 삽입해야 합니다.  즉, TcpIp_UdpTransmit() 또는 TcpIp_TcpTransmit ()는 PDU 헤더 길이만큼 증가된 TotalLength 또는 AvailableLength로 호출되어야 하며, PDU 헤더는 PDU 데이터 이전에 SoAd UDP 전송 버퍼(있는 경우) 및 PDU 데이터의 시작을 요청하는 SoAd_CopyTxData() 내의 TcpIp에 의해 지정된 메모리로 복사되어야 합니다. 


[SWS_SoAd_00198] SoAd PDU 헤더는 수신기에서 PDU의 고유 식별을 위한 4바이트 ID 필드와 PDU의 데이터 길이를 지정하는 4바이트 길이 필드로 구성되어야 합니다. 둘 다 BigEndian 바이트 순서입니다.

반응형
반응형

[Classic AUTOSAR] Socket Adaptor(SoAd) 2. 기능 사양 (2) PDU 전송

참조 : https://www.autosar.org/fileadmin/user_upload/standards/classic/20-11/AUTOSAR_SWS_SocketAdaptor.pdf

 

UDP 또는 TCP 소켓을 통한 상위 계층 모듈 PDU 전송의 경우 SoAd 구성은 소켓 연결에 연결된 PDU 경로를 지정합니다. PDU 경로(SoAdPduRoute, SoAdPduRouteDest)는 SoAd의 상위 계층 모듈에서 소켓 연결(SoAdSocketConnection, SoAdSocketConnectionGroup)로 설명되는 TcpIp 스택의 관련 소켓으로의 경로를 설명합니다.
SoAd의 상위 계층 모듈은 전송 요청 및 데이터 제공을 위해 IF(Interface) API 또는 TP(Transport Protocol) API를 사용할 수 있습니다.

 

1. IF-API를 통한 PDU 전송

[SWS_SoAd_00539]⌈ IF-API를 사용하여 상위 계층에서 요청한 PDU의 전송을 위해 SoAd는
(1) SoAd_IfTransmit()에서 제공하는 TxPduId를 이용하여 관련 소켓 연결 및 PDU 경로를 식별합니다.
(2) PDU 길이 > 0 또는 SoAdPduHeaderEnable이 TRUE이면 연결 유형에 따라 관련 TcpIp 전송 기능을 호출하고, 그렇지 않으면 SoAd는 추가 처리를 건너뛰고 E_NOT_OK로 반환합니다.

[SWS_SoAd_00738]⌈개발 오류 감지가 활성화된 경우: SOCKET_CONNECTION_ID_16 유형의 MetaDataItem으로 구성된 글로벌 PDU 구조를 참조하고 포함된 SoAdPduRouteDest가 소켓 연결 그룹을 참조하는 SoAdPduRoute에 대한 전송 요청의 경우, SoAd는 개발 오류 SOAD_E_INV_METADATA, PduInfoType.MetaDataPtr에 의해 식별된 소켓 연결이 관련 SoAdPduRouteDest.⌋의 소켓 연결 그룹의 일부가 아닌 경우(SRS_Eth_00124)

[SWS_SoAd_00739]⌈SOCKET_CONNECTION_ID_16 유형의 MetaDataItem으로 구성된 전역 PDU 구조를 참조하는 SoAdPduRoute에 대한 전송 요청이 있고 포함된 SoAdPduRouteDest가 소켓 연결 그룹을 참조하는 경우, 전체 그룹 대신 PduInfoType.MetaDataPtr에 의해 SoAd는 식별된 소켓 연결에서만 전송을 수행해야 합니다. (SRS_Eth_00124)

[SWS_SoAd_00540]⌈ UDP 소켓 연결의 경우 SoAd는 (달리 지정되지 않은 경우) SocketId 및 원격 주소가 SocketConnection에 지정되고 SoAd_IfTransmit() 호출에 지정된 PDU 길이를 TotalLength로 사용하여 TcpIp_UdpTransmit()를 호출해야 합니다.

 

[SWS_SoAd_00542]⌈ TCP 소켓 연결의 경우 SoAd는 SocketConnection에 지정된 SocketId, SoAd_IfTransmit() 호출에 지정된 PDU 길이로 TcpIp_TcpTransmit()를 호출해야 합니다. AvailableLength 및 ForceRetrieve는 TRUE로 설정되어 있습니다.⌋()

참고: TxPduId는 SoAdSocketConnection을 참조하는 하나 이상의 SoAdPduRouteDest 컨테이너를 포함하는 SoAd 구성에서 SoAdPduRoute를 식별합니다.

[SWS_SoAd_00543]⌈ TcpIp 모듈은 SoAd_CopyTxData()를 사용하여 TcpIp 전송 호출 컨텍스트 내에서 PDU 데이터를 검색합니다. 여기서 SoAd는 PDU를 매개변수 BufPtr.⌋()에 의해 지정된 메모리에 복사합니다.

[SWS_SoAd_00731]⌈ PduInfoPtr->SduDataPtr이 NULL_PTR로 설정된 상태에서 SoAd_IfTransmit이 호출되면 SoAd는 <Up>_[SoAd][If]TriggerTransmit>()를 사용하여 상위 계층에서 PDU 데이터를 검색합니다.⌋()

[SWS_SoAd_00544]⌈ UDP 소켓 연결의 경우 SoAd는 다음 SoAd_MainFunction( ) 마지막 TcpIp_UdpTransmit() 호출이 성공적으로 반환된 후.⌋()

[SWS_SoAd_00545]⌈ TCP 소켓 연결의 경우 SoAd는 구성된 전송 확인 기능(<Up>_[SoAd][If]TxConfirmation>())으로 상위 계층을 호출하고 결과는 SoAd_TxConfirmation() 내에서 E_OK로 설정됩니다. 모든 PDU 데이터(하나 이상의 전송 요청)가 전송을 위해 확인된 후 콜백 함수.⌋()

참고: 동일한 PDU에 대한 여러 전송 요청의 경우에도 단일 확인만 있습니다. 즉, 마지막 요청이 완료되기 전에 TCP 소켓 연결에서 동일한 PDU에 대해 추가 전송이 요청되는 경우에 대한 별도의 확인이 없습니다. 마지막 요청이지만 모든 PDU 데이터에 대한 최종 확인일 뿐입니다.

 

2. IF-API 및 nPduUdpTxBuffer를 통한 PDU 전송

[SWS_SoAd_00546] 소켓 연결과 관련된 모든 PDU 경로(SoAdPduRouteDest)에 대해 SoAdTxUdpTriggerMode가 TRIGGER_NEVER로 설정되고 관련 소켓 연결에 속하는 모든 상위 계층에 "IF"로 설정된 SoAdTxUpperLayerType이 있는 경우 SoAd는 이 소켓 연결에 대해 nPdu 기능을 사용해야 합니다.  (SRS_Eth_00116)

 

[SWS_SoAd_00547]소켓 연결에 nPdu 기능을 사용하고 실제 PDU(SoAdPduRouteDest)에 대해 TriggerMode를 TRIGGER_NEVER로 설정한 경우 SoAd는 소켓 연결에 대한 PDU를 저장해야 합니다(TcpIp_UdpTransmit()를 호출하는 대신).

 

[SWS_SoAd_00747] 소켓 연결에 nPdu 기능을 사용하고 관련 PDU 파라미터인 SoAdTxPduCollectionSemantics를 SOAD_COLLECT_LAST_IS_BEST로 설정한 경우 SoAd는 PDU 데이터 대신 전송 요청만 저장합니다. SoAd가 PDU 데이터를 제공해야 하는 경우 SoAd는 <Up>_[SoAd][If]TriggerTransmit().⌋(SRS_Eth_00116)를 호출하여 상위 계층에서 데이터를 검색합니다.

[SWS_SoAd_00734]소켓 연결을 위해 nPdu 기능을 사용하는 경우 관련 PDU 매개변수인 SoAdTxPduCollectionSemantics가 SOAD_COLLECT_LAST_IS_BEST로 설정되고 상위 계층이 <Up>_[SoAd][If]TriggerTransmit( ) SoAd_CopyTxData의 컨텍스트에서 SoAd는 전송을 중단하고 E_NOT_OK를 반환합니다.
(SRS_Eth_00116)


[SWS_SoAd_00548]소켓 연결을 위해 nPdu 기능을 사용하고 현재 PDU(SoAdPduRouteDest)에 대해 TriggerMode가 TRIGGER_ALWAYS로 설정되어 있고 결과 PDU 데이터 및 헤더가 SoAdSocketnPduUdpTxBufferMin을 초과하지 않는 경우 SoAd는 소켓에 대해 저장된 모든 PDU를 전송해야 합니다. TcpIp_UdpTransmit()를 호출하여 연결(있는 경우) 및 현재 PDU.(SRS_Eth_00116)

[SWS_SoAd_00685]소켓 연결에 nPdu 기능을 사용하고 현재 PDU(SoAdPduRouteDest)에 대해 TriggerMode가 TRIGGER_ALWAYS로 설정되어 있고 결과 PDU 데이터 및 헤더가 SoAdSocketnPduUdpTxBufferMin을 초과하는 경우 SoAd는 소켓 연결을 위해 저장된 모든 PDU를 먼저 전송해야 합니다. (있는 경우) TcpIp_UdpTransmit()를 호출한 다음 TcpIp_UdpTransmit()를 한 번 더 호출하여 현재 PDU를 호출합니다.SRS_Eth_00116)

[SWS_SoAd_00549]소켓 연결에 nPdu 기능을 사용하고 현재 PDU(SoAdPduRouteDest)에 대해 TriggerMode가 TRIGGER_NEVER로 설정되어 있고 결과 PDU 데이터 및 헤더가 SoAdSocketnPduUdpTxBufferMin을 초과하는 경우 SoAd는 먼저 소켓 연결을 위해 저장된 모든 PDU를 전송해야 합니다. TcpIp_UdpTransmit()를 호출한 다음 소켓 연결을 위한 PDU를 저장합니다. (SRS_Eth_00116)

[SWS_SoAd_00690]⌈ SoAd는 nPdu 기능을 사용하는 소켓 연결을 통해 전송되는 PDU의 순서를 유지해야 합니다. 발신자 측에서 먼저 수집된 Pdus를 먼저 추출하여 수신 측 수신자에게도 먼저 표시합니다.⌋(SRS_Eth_00116)

 

[SWS_SoAd_00691]nPdu 기능이 소켓 연결에 사용되고 모든 PDU가 SOAD_COLLECT_QUEUED로 설정된 SoAdTxPduCollectionSemantics로 구성된 경우 SoAd는 모든 PDU를 개별적으로 전송하며 동일한 PduId를 가진 PDU도 전송합니다.(SRS116)_00

[SWS_SoAd_00735]nPdu 기능이 소켓 연결에 사용되고 모든 PDU가 SOAD_COLLECT_LAST_IS_BEST로 설정된 SoAdTxPduCollectionSemantics로 구성된 경우 SoAd는 첫 번째 인스턴스가 전송을 위해 요청된 순서대로 동일한 PduId를 가진 각 PDU의 마지막 인스턴스만 전송합니다. (SRS_Eth_00116)

[SWS_SoAd_00736]⌈SoAd는 전송 속성이 소켓 연결에 할당된 PDU의 (SoAdTxPduCollectionSemantics 참조) 혼합됩니다. 또한 소켓 연결 그룹의 모든 소켓 연결은 SOAD_COLLECT_LAST_IS_BEST가 있는 PDU 또는 SOAD_COLLECT_QUEUED 의미 체계가 있는 PDU에 의해 단독으로 참조됩니다.⌋ (SRS_Eth_00116)

[SWS_SoAd_00696]⌈ SoAd는 nPdu 기능을 사용하여 각 소켓 연결에 대해 nPdu 특정 타이머를 유지해야 합니다.⌋(SRS_Eth_00116)

[SWS_SoAd_00550]⌈ SoAd_MainFunction() 내 SoAd는 nPdu 특정 타이머가 만료된 경우 TcpIp_UdpTransmit()를 호출하여 소켓 연결(있는 경우)을 위해 저장된 모든 PDU를 전송해야 합니다.⌋(SRS_Eth_00116)

[SWS_SoAd_00697]⌈ 특정 SoAdTxUdpTriggerTimeout과 함께 TriggerMode가 TRIGGER_NEVER로 설정된 PDU가 버퍼링되면 SoAd는 nPdu 특정 타이머를 SoAdTxUdpTriggerTimeout 값으로 설정해야 합니다. 타이머가 실행 중이 아니거나 현재 nPdu 특정 타이머 값보다 낮은 경우입니다. ⌋(SRS_Eth_00116)

[SWS_SoAd_00683]⌈ 특정 SoAdTxUdpTriggerTimeout 없이 TriggerMode가 TRIGGER_NEVER로 설정된 PDU가 버퍼링되면 SoAd는 타이머가 실행되고 있지 않거나 현재 nPdu 특정 타이머 값보다 낮은 경우 nPdu 특정 타이머를 SoAdSocketUdpTriggerTimeout 값으로 설정해야 합니다. ⌋ (SRS_Eth_00116)

[SWS_SoAd_00684]⌈ 소켓 연결을 위해 저장된 PDU가 전송되면 SoAd는 nPdu 특정 타이머를 중지합니다⌋  (SRS_Eth_00116)

[SWS_SoAd_00737]⌈ nPdu 기능을 사용하여 소켓 연결을 위해 저장된 모든 PDU에 대해 SoAd는 관련 전송 확인 기능(<Up>_[SoAd][If]TxConfirmation>())으로 상위 계층을 호출합니다. SoAd_MainFunction()의 컨텍스트 및 결과 설정
(1) 관련 TcpIp_UdpTransmit() 호출이 성공하면 E_OK,
(2) E_NOT_OK 전송이 성공하지 못했거나 다른 이유로 취소된 경우.⌋()

 

3 IfRoutingGroupTransmit API를 통한 PDU 전송

[SWS_SoAd_00662] SoAd_IfRoutingGroupTransmit()에서 SoAd는 SoAd_MainFunction()에서 전송을 위한 매개변수 id로 식별된 라우팅 그룹에 대한 참조를 포함하는 각 SoAdPduRouteDest에 대한 트리거 전송 요청을 저장해야 합니다.

[SWS_SoAd_00720]⌈ SoAd_IfSpecificRoutingGroupTransmit()에서 SoAd는 SoAd_MainFunction()의 매개변수 SoConId로 식별된 소켓 연결에서 전송을 위한 매개변수 id로 식별된 라우팅 그룹에 대한 참조를 포함하는 각 SoAdPduRouteDest에 대한 트리거 전송 요청을 저장해야 합니다.⌋( )

[SWS_SoAd_00665]⌈ SoAd_MainFunction()에서 SoAd는 SoAdPduRouteDest에 대한 보류 중인 트리거 전송 요청을 확인하고 모든 관련 IFPDU를 식별해야 합니다. 식별된 각 IF-PDU에 대해 SoAd는 아래에 지정된 대로 처리해야 합니다.
(1) <Up>_[SoAd][If]-TriggerTransmit()를 호출하여 관련 상위 계층에서 데이터를 검색하고
(2) 관련 소켓 연결을 통해 데이터를 전송합니다.

[SWS_SoAd_00728]⌈ 상위 계층에서 PDU 데이터를 트리거하려면 SoAd는 PduInfoType.SduDataPtr을 데이터가 복사될 버퍼의 위치로 설정하고 PduInfoType.SduDataLength를 이 버퍼의 길이로 설정한 다음 <Up>_[SoAd를 호출합니다. ][If]-TriggerTransmit().⌋()

 

4. TP-API를 통한 PDU 전송

[SWS_SoAd_00551]⌈ TP-API를 사용하여 상위 계층에서 요청한 PDU 전송을 위해 SoAd는
(1) PDU 길이가 0이면 추가 처리를 건너뛰고 E_NOT_OK로 반환합니다.
(2) SoAd_TpTransmit()에서 제공하는 TxPduId를 이용하여 관련 소켓 연결 및 PDU 경로를 식별합니다.
(3) 추가 처리를 위해 TP 전송 요청을 SoAd_MainFunction()에 저장합니다.

참고: TxPduId는 SoAdSocketConnection을 참조하는 하나 이상의 SoAdPduRouteDest 컨테이너를 포함하는 SoAd 구성에서 SoAdPduRoute를 식별합니다.

[SWS_SoAd_00552]SoAd_MainFunction()에서 SoAd는 보류 중인 TP 전송 요청을 확인하고 아래와 같이 보류 중인 요청을 처리해야 합니다.
(1) 구성 가능한 콜백 함수 <Up>_[SoAd][Tp]CopyTxData()를 PduInfoType.SduLength = 0으로 호출하여 상위 계층에서 사용 가능한 데이터 양을 쿼리합니다.
(2) 연결 유형에 따라: 데이터를 검색하고 관련 TcpIp 전송 기능을 호출합니다.

[SWS_SoAd_00553]⌈ UDP 소켓 연결의 경우 SoAd는
(1) PduInfoType.SduLength가 이전 호출의 availableDataPtr에 의해 반환된 값으로 설정된 구성 가능한 콜백 함수 <Up>_[SoAd][Tp]CopyTxData()를 통해 상위 계층에서 SoAd TP 전송 버퍼로 사용 가능한 모든 데이터를 검색합니다. 그리고
(2) 하나 이상의 SoAd 기본 기능 실행 주기 내에서 모든 데이터가 성공적으로 검색된 후 SocketConnection에 지정된 SocketId 및 원격 주소와 TotalLength로 SoAd_TpTransmit() 호출에 지정된 PDU 길이를 사용하여 TcpIp_UdpTransmit()를 호출합니다.

참고: 소켓 연결에 필요한 TP 버퍼 크기는 관련 TP PDU의 길이에서 파생될 수 있습니다.

[SWS_SoAd_00652]⌈ UDP 소켓 연결에 대해 <Up>_[SoAd][Tp]CopyTxData()가 BUFREQ_E_NOT_OK와 함께 반환되면 SoAd는 즉시 TP 전송 세션을 종료하고 구성된 전송 확인 기능(<Up> _[SoAd][Tp]TxConfirmation>()) E_NOT_OK 결과. (참고: 관련 소켓 연결은 이 항목에서 닫히지 않습니다.
사례.)

[SWS_SoAd_00554]⌈ TCP 소켓 연결의 경우 SoAd는 SocketConnection에 지정된 SocketId와 함께 TcpIp_TcpTransmit()를 호출해야 하며, PDU 길이는 <Up>_[SoAd][Tp]에 대한 이전 호출의 availableDataPtr에 의해 반환된 값으로 설정됩니다. CopyTxData()를 AvailableLength로, ForceRetrieve를 FALSE로 설정합니다.⌋()

TcpIp 모듈은 SoAd_CopyTxData()를 사용하여 TcpIp 전송 호출 컨텍스트 내에서 SoAd에서 PDU 데이터를 검색합니다.

 

[SWS_SoAd_00556] TCP 소켓 연결의 경우 SoAd는 <Up>_[SoAd][Tp]CopyTxData()를 호출하여 관련 상위 레이어에 요청
SoAd_CopyTxData() 내의 매개변수 BufPtr에 의해 지정된 메모리에 PDU(요청된 부분)를 복사합니다.


[SWS_SoAd_00651]⌈ TCP 소켓 연결에 대해 <Up>_[SoAd][Tp]CopyTxData()가 BUFREQ_E_NOT_OK와 함께 반환되면 SoAd는 (a) 이 소켓 연결에 대한 추가 전송 또는 수신을 비활성화해야 합니다(즉, 새 전송 요청은 E_NOT_OK 및 수신된 메시지는 단순히 폐기됩니다) 및 (b) 다음 SoAd_MainFunction()에서 소켓 연결을 닫습니다.⌋()

[SWS_SoAd_00557]⌈ UDP 소켓 연결의 경우 SoAd는 구성된 전송 확인 기능(<Up>_[SoAd][Tp]TxConfirmation>())을 사용하여 상위 계층을 호출하고 이후 SoAd_MainFunction() 내 결과로 E_OK를 호출합니다. TcpIp_UdpTransmit()는 TCPIP_OK와 함께 반환됩니다.⌋()

[SWS_SoAd_00667]⌈ SoAdSocketTcpImmediateTpTxConfirmation이 TRUE로 설정된 TCP 소켓 연결의 경우 SoAd는 구성된 전송 확인 기능으로 상위 계층을 호출합니다.(<Up>_[SoAd][Tp]TxConfirmation>()) 및 E_OK는 TcpIp_TcpTransmit()가 E_OK를 반환한 후 SoAd_MainFunction() 내 결과입니다.⌋()

[SWS_SoAd_00670]⌈ TCP 소켓 연결의 경우 SoAd는 구성된 전송 확인 기능(<Up>_[SoAd][Tp]TxConfirmation>())을 사용하여 상위 계층을 호출하고 다음 SoAd_MainFunction() 내 결과로 E_NOT_OK를 호출합니다. TcpIp_TcpTransmit()는 E_NOT_OK와 함께 반환됩니다.⌋()

[SWS_SoAd_00558]⌈ SoAdSocketTcpImmediateTpTxConfirmation이 FALSE로 설정된 TCP 소켓 연결의 경우 SoAd는 구성된 전송 확인 기능(<Up>_[SoAd][Tp]TxConfirmation>())으로 상위 계층을 호출하고 결과적으로 E_OK 모든 TP PDU 데이터 전송이 확인된 후 SoAd_TxConfirmation() 콜백 함수 내에서.⌋()

참고: 동일한 PDU를 가진 새 TP 세션에 대한 SoAd_TpTransmit()는 <Up>_[SoAd][Tp]TxConfirmation>() 내에서 호출될 수 있습니다.

 

 

 

반응형

+ Recent posts