반응형

[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>() 내에서 호출될 수 있습니다.

 

 

 

반응형
반응형

[Classic AUTOSAR] Socket Adaptor(SoAd) 2. 기능 사양 (1) Socket Connections

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

TCP/IP 통신은 인터넷 소켓을 기반으로 합니다. 인터넷 소켓은 tuple IP 주소와 포트로 식별되는 통신 링크의 endpoint입니다.

 

전송 프로토콜에 따라 소켓은 연결이 없는 UDP 소켓과 연결 지향 TCP 소켓으로 구분됩니다. TCP는 point-to-point 통신 관계를 기반으로 하며, 브로드캐스트 또는 멀티캐스트가 불가능합니다. 또한 한 쪽이 연결을 설정하고 다른 쪽이 들어오는 요청을 수락해야 합니다. 두 스테이션은 서로 여러 연결을 설정할 수 있으며, 각각은 다른 소켓에 의해 처리되며 사용되는 포트 번호 중 적어도 하나는 달라야 합니다. TCP에서 Source에서 Sink로 전송된 모든 메시지는 순서가 보존된 연속 바이트의 연속 스트림으로 간주됩니다. 모든 메시지에 걸친 바이트 순서를 유지하기 위해 승인 체계가 마련되어 있습니다. Sink가 특정 시간 내에 수신을 확인하지 않으면 Source에서 메시지를 재전송합니다. TCP는 데이터 무결성(체크섬 사용), 바이트 순서 및 완전성을 보장합니다.

 

TCP/IP 통신의 추상화를 위해 SoAd는 소켓 연결을 정의합니다. SoAd 소켓 연결은 로컬 소켓(예: 로컬 주소 식별자 및 로컬 포트)과 원격 소켓(예: 원격 IP 주소 및 포트) 간의 연결은 물론 전송 프로토콜, SoAd PDU 헤더 사용, 버퍼와 같은 연결 매개변수를 지정합니다. 각 소켓 연결은 고유 식별자(SoConId)로 식별할 수 있습니다. 로컬 소켓당 여러 통신 파트너를 동시에 지원하기 위해 동일한 연결 매개변수를 가진 소켓 연결을 소켓 연결 그룹으로 그룹화할 수 있습니다.

 

[SWS_SoAd_00588] SoAd는 각각 SoAd_OpenSoCon() 및 SoAd_CloseSoCon()로 호출될 때 소켓 연결을 열거나 닫는 요청을 저장하지만 연결 설정 및 종료 정책에 따라 SoAd_MainFunction()에서만 요청을 처리합니다.

 

[SWS_SoAd_00743] SoAd는 다음과 같은 상황에서 원격 주소를 lock합니다.
(a) SOAD_SOCON_OFFLINE 상태가 아닌 TCP 소켓 연결,
(b) active 리셉션,
(c) TP-PDU의 보류 중인 수신,
(d) active 전송,
(e) nPdu 기능의 전송 보류,
(f) SoAd_IfRoutingGroupTransmit() 또는 SoAd_IfSpecificRoutingGroupTransmit() 을 통해 시작된 보류 중인 전송. 

 

lock된 원격 주소는 상위 계층에서 수정할 수 없습니다.

 

1. 소켓 연결 Open

[SWS_SoAd_00589] 소켓 연결을 위한 Open 시도 조건

 SoAd_MainFunction()에서 SoAd는 다음 기준을 모두 충족하는 각 소켓 연결을 Open하려고 시도합니다.
(1) 소켓 연결에 할당된 TcpIp 소켓이 없습니다.
(2) Open은 (a) 다음 SoAd_CloseSoCon() 호출에 의해 취소되지 않은 이전 SoAd_OpenSoCon() 호출에 의해 명시적으로 요청되거나 (b) SoAdSocketAutomaticSoConSetup이 TRUE일 때 암시적으로 요청됩니다.
(3) 원격 주소가 설정됨(구성에 의해 지정되거나 SoAd_SetRemoteAddr() 기능을 통해 설정됨)
(4) 로컬 IP 주소가 할당됩니다. 즉, SoAd_LocalIpAddrAssignmentChg()가 관련 LocalAddrId 및 TCPIP_IPADDR_STATE_-ASSIGNED를 State로 사용하여 호출됩니다. 

 

[SWS_SoAd_00590] TCP 소켓 연결 open 과정

SoAd는 SoAd_MainFunction() 내에서 다음 작업을 수행하여 단일 소켓 연결을 포함하는 소켓 연결 그룹의 일부인 UDP 소켓 연결을 open합니다.(즉, 소켓 연결 그룹 구성 컨테이너에 하나의 소켓 연결만 있음). 또는 SoAdSocketTcpInitiate가 TRUE로 설정된 TCP 소켓 연결:
(1) TcpIp_DomainType이 암시적으로 지정된 TcpIp_SoAdGetSocket()을 호출하여 TcpIp에서 적절한 소켓을 가져옵니다.
SoAdSocketLocalAddressRef 및 SoAdSocketProtocol에 의해 지정된 프로토콜 유형.
(2) [SWS_SoAd_00689]에 따라 소켓 특정 매개변수를 변경합니다.
(3) SoAdSocketLocalAddressRef로 지정된 로컬 주소 식별자와 SoAdSocketLocalPort로 지정된 로컬 포트로 TcpIp_Bind()를 호출하여 소켓을 로컬 주소 및 포트에 바인딩합니다.

(4) TCP 소켓의 경우 TcpIp_TcpConnect()를 호출하여 TCP 연결을 시작합니다.

 

[SWS_SoAd_00638] SoAdSocketTcpInitiate가 FALSE로 설정된 TCP 소켓 연결 Open 과정

SoAd는 SoAd_MainFunction() 내에서 다음 작업을 수행하여 SoAdSocketTcpInitiate가 FALSE로 설정된 TCP 소켓 연결을 엽니다.
(1) 소켓 연결에 Listen-Socket이 할당되지 않은 경우:
 (a) SoAdSocketLocalAddressRef에 의해 암시적으로 지정된 TcpIp_DomainType 및 SoAdSocketProtocol에 의해 지정된 프로토콜 유형으로 TcpIp_SoAdGetSocket()을 호출하여 TcpIp에서 적절한 소켓을 가져옵니다.
 (b) [SWS_SoAd_00689]에 따라 소켓 특정 매개변수를 변경합니다.
 (c) SoAdSocketLocalAddressRef에 의해 지정된 로컬 주소 식별자와 SoAdSocketLocalPort에 의해 지정된 로컬 포트로 TcpIp_Bind()를 호출하여 소켓을 로컬 주소 및 포트에 바인딩합니다.
 (d) 소켓 연결 그룹에 Listen-Socket 할당
 (e) 소켓 연결을 활성화하여 원격 노드의 연결을 수락합니다.
 (f) TCP 소켓 연결 그룹의 일부인 소켓 연결 수로 MaxChannels를 설정하고 TcpIp_TcpListen()을 호출하여 Listen-Socket에서 원격 연결 요청을 수신합니다.
(2) Listen-Socket이 소켓 연결에 이미 할당된 경우:
 (a) 소켓 연결을 활성화하여 원격 노드의 연결을 수락합니다.

참고: TCP 소켓 연결 그룹(및 SoAdSocketTcpInitiate가 FALSE로 설정됨)의 모든 소켓 연결은 들어오는 연결 요청("Listen-Socket")에 대해 하나의 TcpIp 소켓을 공유하지만 TcpIp 모듈에서 생성하고 SoAd_TcpAccepted( ) 연결이 설정된 후 Open

 

[SWS_SoAd_00639] UDP소켓 연결 open 과정

SoAd는 SoAd_MainFunction() 내에서 다음 작업을 수행하여 여러 소켓 연결을 포함하는 소켓 연결 그룹의 일부인 UDP 소켓 연결을 엽니다.
(1) 소켓 연결 그룹에 UDP 소켓이 할당되지 않은 경우:
(a) SoAdSocketLocalAddressRef에 의해 암시적으로 지정된 도메인 유형과 SoAdSocketProtocol에 의해 지정된 프로토콜 유형으로 TcpIp_SoAdGetSocket()을 호출하여 TcpIp에서 적절한 소켓을 가져옵니다.
(b) [SWS_SoAd_00689]에 따라 소켓 특정 매개변수를 변경합니다.
(c) SoAdSocketLocalAddressRef에 의해 지정된 로컬 주소 식별자와 SoAdSocketLocalPort에 의해 지정된 로컬 포트로 TcpIp_Bind()를 호출하여 소켓을 로컬 주소 및 포트에 바인딩합니다.
(d) UDP 소켓을 소켓 연결 그룹에 할당합니다.
(e) 소켓 연결 그룹의 공유 UDP 소켓을 통한 통신을 위해 소켓 연결을 활성화합니다.
(2) UDP 소켓이 소켓 연결 그룹에 이미 할당된 경우:
(a) 소켓 연결 그룹의 공유 UDP 소켓을 통한 통신을 위해 소켓 연결을 활성화합니다.

참고: UDP 소켓 연결 그룹의 모든 소켓 연결은 동일한 TcpIp 소켓을 공유합니다.

 

[SWS_SoAd_00689]

소켓 관련 매개변수가 새 소켓 할당의 일부로 변경되어야 하는 경우 SoAd는 아래 지정된 각 관련 절에 대해 ParameterId 및 ParameterValue를 사용하여 TcpIp_ChangeParameter()를 호출하여 연결된 소켓 연결의 구성에 따라 매개변수를 변경합니다. 
(1) TCP 소켓의 경우: TCPIP_PARAMID_TCP_RXWND_MAX 및 선택적 매개변수가 활성화된 경우 SoAdSocketTpRxBufferMin에 의해 지정된 값
(2) TCPIP_PARAMID_FRAMEPRIO 및 선택적 매개변수가 활성화된 경우 SoAdSocketFramePriority에 의해 지정된 값
(3) TCP 소켓의 경우: TCPIP_PARAMID_TCP_NAGLE 및 관련 선택적 매개변수 SoAdSocketTcpNoDelay가 FALSE로 설정된 경우 값 0x01 또는 매개변수가 TRUE로 설정된 경우 0x00입니다.
(4) TCP 소켓의 경우: TCPIP_PARAMID_TCP_KEEPALIVE 및 SoAdSocketTcpKeepAlive에서 지정한 값
(5) TCP 소켓의 경우: TCPIP_PARAMID_TCP_KEEPALIVE_TIME 및 선택적 매개변수가 활성화된 경우 SoAdSocketTcpKeepAliveTime에서 지정한 값
(6) TCP 소켓의 경우: TCPIP_PARAMID_TCP_KEEPALIVE_PROBES_MAX 및 선택적 매개변수가 활성화된 경우 SoAdSocketTcpKeepAliveProbesMax에 의해 지정된 값
(7) TCP 소켓의 경우: TCPIP_PARAMID_TCP_KEEPALIVE_INTERVAL 및 선택적 매개변수가 활성화된 경우 SoAdSocketTcpKeepAliveInterval에 의해 지정된 값.
(8) TCP 소켓의 경우: TCPIP_PARAMID_TCP_OPTIONFILTER 및 선택적 매개변수가 활성화된 경우  SoAdSocketTCPOptionFilterRef에서 참조하는 TcpIpTcpConfigOptionFilter에 지정된 TcpIpTcpConfigOptionFilterId의 값.
(9) TCPIP_PARAMID_PATHMTU_ENABLE 및 선택적 매개변수가 활성화된 경우 oAdSocketPathMTUEnable에 의해 지정된 값.
(10) TCPIP_PARAMID_FLOWLABEL 및 선택적 매개변수가 활성화된 경우 SoAdSocketFlowLabel에 의해 지정된 값.
(11) TCPIP_PARAMID_DSCP 및 선택적 매개변수가 활성화된 경우 SoAdSocketDifferentiatedServicesField에 의해 지정된 값.
(12) UDP 소켓의 경우: TCPIP_PARAMID_UDP_CHECKSUM 및 SoAdSocketUDPChecksumEnabled 값. ()
(13) TCP 소켓의 경우: SoAdSocketTcpTlsConnectionRef가 정의된 경우 이 소켓에 TLS 연결을 할당하기 위해 매개변수 ID TCPIP_PARAMID_TLS_CONNECTION_ASSIGNMENT 및 이 참조의 값을 매개변수 값으로 사용하여 함수를 호출해야 합니다.

 

[SWS_SoAd_00591] SoAd_MainFunction() 내에서 열기 작업을 성공적으로 수행한 후 SoAd는 UDP 소켓의 경우 소켓 연결 상태를 SOAD_SOCON_ONLINE으로 변경하고 SoAdSocketUdpListenOnly가 TRUE로 설정되거나 원격 주소가 다음을 수행하는 값으로 설정됩니다. 와일드카드를 포함하지 않습니다.

 

[SWS_SoAd_00686]⌈ SoAd_MainFunction() 내에서 열기 작업을 성공적으로 수행한 후 SoAd는 다음과 같은 경우 소켓 연결 상태를 SOAD_SOCON_RECONNECT로 변경합니다.
(1) TCP 소켓 연결 또는
(2) 와일드카드가 포함된 원격 주소로 구성된 UDP 소켓 연결.

 

[SWS_SoAd_00592] SoAd_RxIndication() 내에서 메시지 데이터를 분석하거나 전달하기 전에 SoAd는 (a) 와일드카드로 지정된 원격 주소 부분(예: TCPIP_IPADDR_ANY로 설정된 원격 IP 주소)을 수신된 메시지의 관련 소스 주소 부분으로 덮어씁니다. (b) 다음 조건이 모두 참인 경우 소켓 연결 상태를 SOAD_SOCON_ONLINE으로 변경합니다.
(1) 현재 연결 상태가 SOAD_SOCON_ONLINE이 아닙니다.
(2) UDP 소켓
(3) SoAdSocketUdpListenOnly가 FALSE로 설정됩니다.
(4) SoAdSocketMsgAcceptanceFilterEnabled가 TRUE로 설정됨
(5) 원격 주소가 설정되었지만 와일드카드가 포함되어 있습니다.
(6) 수신된 메시지는 메시지 수락 정책에 따라 수락됩니다.

 

[SWS_SoAd_00593]⌈ SoAd_TcpConnected() 내에서 SoAd는 다음 조건이 모두 참인 경우 소켓 연결 상태를 SOAD_SOCON_ONLINE으로 변경합니다.
(1) 현재 연결 상태가 SOAD_SOCON_ONLINE이 아닙니다.
(2) TCP 소켓
(3) SoAdSocketTcpInitiate가 TRUE로 설정됨

 

[SWS_SoAd_00594] SoAd_TcpAccepted()에서 SocketId와 관련된 TCP SoAdSocketConnectionGroup의 SoAdSocketTcpInitiate가 FALSE로 설정된 경우 SoAd는 다음 작업을 수행합니다.
(1) 최상의 일치 알고리즘([SWS_SoAd_00680] 참조)을 사용하여 소켓 연결 중 하나를 선택하고 선택한 소켓 연결을 계속하거나 추가 처리를 건너뛰고 일치 항목을 찾을 수 없으면 E_NOT_OK로 반환합니다.
(2) 소켓 연결을 위해 설정된 원격 주소에 와일드카드가 포함된 경우 와일드카드로 지정된 원격 주소 부분(예: TCPIP_IPADDR_ANY로 설정된 원격 IP 주소)을 수신된 메시지의 관련 소스 주소 부분으로 덮어씁니다.
(3) 설정된 연결에 사용되며 SocketIdConnected 매개변수로 제공된 TcpIp 소켓을 선택한 소켓 연결에 할당합니다.
(4) 이 소켓 연결의 상태를 SOAD_SOCON_ONLINE으로 변경하고 E_OK를 반환합니다.

 

[SWS_SoAd_00636] SoAd_TcpAccepted()에서 SocketId와 관련된 TCP SoAdSocketConnectionGroup이 SoAdSocketTcpInitiate와 SoAdSocketMsgAcceptanceFilterEnabled가 모두 FALSE로 설정되어 있고 온라인이 아닌 경우(즉, 현재 연결 상태가 SOAD_SOCON_ON이 아닌 경우) SoAd는 다음 작업을 수행합니다.
(1) 설정된 연결에 사용되며 SocketIdConnected 매개변수로 제공된 TcpIp 소켓을 소켓 연결에 할당하고
(2) 소켓 연결 상태를 SOAD_SOCON_ONLINE으로 변경하고 E_OK를 반환합니다.

 

[SWS_SoAd_00595]⌈ PDU 헤더 모드가 비활성화된 소켓 연결(SoAdPduHeaderEnable = FALSE) 및 TP-API가 있는 상위 계층의 경우 SoAd는 종료 시 TpSduLength = 0인 <Up>_[SoAd][Tp]StartOfReception()을 호출해야 합니다. 연결 설정.

 

 

2. 소켓 연결 Close

[SWS_SoAd_00604]⌈ SoAd_MainFunction()에서 SoAd는 다음 기준을 모두 충족하는 각 소켓 연결을 닫습니다.
(1) 현재 연결 상태가 SOAD_SOCON_OFFLINE이 아닙니다.
(2) 이전 SoAd_CloseSoCon() 호출에 의해 닫기가 명시적으로 요청됨
(3) SoAd_CloseSoCon() 호출 시 소켓 연결을 열린 상태로 유지하기 위해 요청된 상위 계층이 없습니다(즉, SoAd_OpenSoCon()만큼 자주 SoAd_CloseSoCon()가 호출됨) 또는 중단이 TRUE로 설정된 SoAd_CloseSoCon()이 호출되었습니다.

 

[SWS_SoAd_00637]⌈ SoAd는 SoAd_MainFunction() 내에서 다음 작업을 수행하여 소켓 연결을 닫습니다.
(1) 활성 TP 세션을 종료하고(있는 경우) 상위 계층에 종료에 대해 알립니다.
(2) 이 소켓 연결에 대한 추가 전송 또는 수신을 비활성화합니다. 즉, 새로운 전송 요청은 E_NOT_OK로 거부되고 수신된 메시지는 단순히 폐기됩니다.
(3) 관련 TcpIp 소켓 닫기
(4) SoAd_CloseSoCon() 요청으로 인해 소켓 연결이 닫히면 소켓 연결 상태를 SOAD_SOCON_OFFLINE으로 변경하고 그렇지 않으면 SOAD_SOCON_RECONNECT로 변경합니다.

 

[SWS_SoAd_00640]⌈ SoAd_MainFunction() 내에서 소켓 연결 종료 시 활성 TP 전송 종료를 상위 계층에 알리기 위해 SoAd는 <Up>_[SoAd][Tp]TxConfirmation() 매개변수 결과를 설정하여 호출해야 합니다.
(1) SoAd_CloseSoCon()에 의해 연결 끊김이 발생하고 모든 데이터가 올바르게 전송된 경우 E_OK
(2) 다른 이유로 E_NOT_OK.

[SWS_SoAd_00641]⌈ SoAd_MainFunction() 내에서 소켓 연결 종료 시 활성 TP 수신 종료를 상위 계층에 알리기 위해 SoAd는 <Up>_[SoAd][Tp]RxIndication()을 호출하고 매개변수 결과를 다음으로 설정합니다.
(1) SoAd_CloseSoCon()에 의해 연결이 끊어지고 수신된 모든 데이터가 상위 계층으로 올바르게 전달된 경우 E_OK,
(2) 다른 이유로 E_NOT_OK.

 

[SWS_SoAd_00642] SoAd_MainFunction() 내에서 소켓 연결을 닫을 때 관련 TcpIp 소켓을 닫기 위해 SoAd는 다음 작업을 수행합니다.
(1) TCP 소켓 연결의 경우:
(a) 매개변수 abort를 SoAd_CloseSoCon()에서 제공한 것과 동일한 값으로 설정하거나 SoAd_CloseSoCon()에서 닫기가 시작되지 않은 경우 FALSE로 설정하여 TcpIp_CloseSocket()을 호출하여 관련 소켓을 닫습니다.
(b) TCP 소켓 연결 그룹의 모든 소켓 연결이 SoAd_CloseSoCon()에 의해 닫힌 경우: 매개변수 abort를 SoAd_CloseSoCon()에서 제공한 것과 동일한 값으로 설정하거나 FALSE로 설정하여 TcpIp_CloseSocket()을 호출하여 관련 Listen-Socket을 닫습니다. 닫기가 SoAd_CloseSoCon()에 의해 시작되지 않은 경우.
(2) UDP 소켓 연결의 경우:
(a) 소켓 연결이 소켓 연결 그룹의 일부가 아닌 경우(즉, 소켓 연결 그룹 구성 컨테이너에 소켓 연결이 하나만 있는 경우): abort 매개변수를 다음과 동일한 값으로 설정하고 TcpIp_CloseSocket()을 호출하여 관련 소켓을 닫습니다. SoAd_CloseSoCon()에 의해 제공되거나 SoAd_CloseSoCon()에 의해 닫기가 시작되지 않은 경우 FALSE로 설정됩니다.
(b) UDP 소켓 연결 그룹의 모든 소켓 연결이 SoAd_CloseSoCon()에 의해 닫힌 경우: 매개변수 abort를 SoAd_CloseSoCon()에서 제공한 것과 동일한 값으로 설정하거나 FALSE로 설정하여 TcpIp_CloseSocket()을 호출하여 관련 UDP 소켓을 닫습니다. 케이스 닫기가 SoAd_CloseSoCon()에 의해 시작되지 않았습니다.

 

[SWS_SoAd_00643] 이벤트가 TCPIP_UDP_CLOSED로 설정된 SoAd_TcpIpEvent() 내에서 SoAd는
(1) 관련 UDP 소켓 연결 그룹에서 SocketId로 식별되는 TcpIp 소켓 할당을 제거하고
(2) SOAD_SOCON_ONLINE에 있는 관련 소켓 연결 그룹의 모든 소켓 연결을 닫습니다(즉, 관련 TcpIp 소켓 닫기를 제외하고 지정된 닫기 작업 수행)⌋()

[SWS_SoAd_00645] 이벤트가 Listen-Socket에 대해 TCPIP_TCP_CLOSED로 설정된 SoAd_TcpIpEvent() 내에서 SoAd는 관련 TCP 소켓 연결 그룹에서 SocketId로 식별되는 TcpIp 소켓 할당을 제거해야 합니다.

[SWS_SoAd_00646] 이벤트가 TCPIP_TCP_CLOSED 또는 TCPIP_TCP_RESET으로 설정된 SoAd_TcpIpEvent() 내에서 SoAd는
(1) 관련 소켓 연결에서 SocketId로 식별되는 TcpIp 소켓 할당을 제거하고
(2) SOAD_SOCON_ONLINE에 있는 경우 소켓 연결을 닫습니다(즉, 관련 TcpIp 소켓 닫기를 제외하고 지정된 닫기 작업 수행).

[SWS_SoAd_00688] 이벤트가 TCPIP_TCP_FIN_RECEIVED로 설정된 SoAd_TcpIpEvent() 내에서 SoAd는 중단 매개변수가 FALSE로 설정된 TcpIp_Close()를 호출하여 관련 소켓을 닫습니다.

 

3. 소켓 연결 Open/Close 시퀀스

Scenario 1:
1: Open
2: Main - ONLINE
3: Close
4: Open
5: Main - OFFLINE
6: Main - ONLINE
설명: 닫기 요청(3)이 실행된 후 열기 요청(4)이 실행됩니다.
합리성: 두 개의 통신 세션을 명확하게 분리하려면 닫기가 열기와 이겨야 합니다. 즉, 열기 요청(4)은 닫기 요청(3)을 취소하지 않습니다.

Scenario 2:
1: Open
2: Main - ONLINE
3: Close
4: Open
5: Close
6: Open
7: Close
8: Main - OFFLINE
9: Main, no change
주석: 닫기 요청(5)은 열기 요청(4) 및 (7) 취소(6)를 취소합니다.
합리적: 상위 계층이 활성화되기 전에 취소했으므로 통신 세션이 필요하지 않습니다.

4. 알림

[SWS_SoAd_00597]SoAd는 소켓 연결 상태가 변경될 때마다 구성된 상위 계층 알림 함수 <Up>_SoConModeChg()와 소켓에 대해 SoAdSocketSoConModeChgNotification이 TRUE로 설정된 경우 새로운 상태를 통해 소켓 연결 상태 변경을 상위 계층에 알려야 합니다. 


[SWS_SoAd_00741]소켓 연결 상태가 변경될 때마다 SoAd는 SoAdSocketSoConModeChgNotifUpperLayerRef에 의해 지정된 상위 레이어에 구성된 상위 레이어 알림 기능 <Up>_SoConModeChg()과 소켓 연결에 대한 선택적 참조가 설정된 경우 새로운 상태를 알려야 합니다.(SRS_Eth_00058)


[SWS_SoAd_00598]SoAd는 소켓 연결과 관련된 IP 주소 할당이 변경될 때마다 구성된 상위 계층 알림 기능 <Up>_LocalIpAddrAssignmentChg() 및 SoAdSocketIpAddrAssignmentChgNotification이 다음과 같을 경우 새 주소 상태를 통해 상위 계층에 IP 주소 할당 변경을 알려야 합니다. 소켓 연결에 대해 TRUE로 설정합니다.

반응형

+ Recent posts