반응형

[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로 설정합니다.

반응형
반응형

[Classic AUTOSAR] Socket Adaptor(SoAd) 1. 소개 및 기능 개요

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

 

AUTOSAR 기본 소프트웨어 모듈 소켓 어댑터(SoAd)의 기능, API 및 구성을 알아보겠습니다. 

 

이더넷을 물리 계층으로 사용하는 데이터 전송의 TCP/IP 개념은 컴퓨팅 및 통신 환경에서 사실상의 표준으로 확립되었습니다. 응용 프로그램의 주소 지정, end points의 논리적 주소 지정 및 물리적 주소 지정은 모두 계층화된 프로토콜 및 번호 할당 제품군에서 다룹니다. 동적 구성 및 라우팅은 여기에서 구현된 개념의 핵심입니다.

 

AUTOSAR는 컴파일 타임에 미리 결정되고, 런타임 동안 고정된 정적 통신 관계의 개념을 따릅니다. 전송된 데이터는 데이터가 이동해야 하는 소스 및 싱크만큼 미리 결정된 것으로 간주됩니다. 소켓 어댑터 모듈(SoAd)은 이 두 개념 간의 격차를 해소하는 것을 목표로 합니다. AUTOSAR에 필요한 정보를 포함하는 사전 결정된 구성을 설정하고 런타임 동안 업데이트되도록 일부 항목을 열어 두어 상충되는 개념을 활용합니다. 또한 SoAd는 TCP/IP에서 소켓 기반 통신 처리에서 콜백 기반 소프트웨어 아키텍처를 분리합니다.

 

SoAd 모듈의 주요 목적은 PDU(예: PDU 라우터)를 사용하는 AUTOSAR 통신 서비스 모듈과 소켓 기반 TCP/IP 스택 간의 인터페이스를 생성하는 것입니다. I-PDU ID를 소켓 연결에 매핑하거나 그 반대로 매핑합니다. TCP/IP 프로토콜 스택은 그림 1과 같이 TcpIp SWS에 지정됩니다. TCP/IP 스택의 내부 기능 구조는 정보 제공을 위해 개략적으로 표시됩니다. SoAd 모듈 및 이에 따른 이더넷 통신 스택은 AUTOSAR R4.0.1에서 처음 도입되었으며 AUTOSAR R4.0과 AUTOSAR R4.1.1 사이에 몇 가지 주요 개념적 변경 사항이 적용되었습니다.

반응형
반응형

[리눅스 기반 브릿지] 3. 브리지 및 라우터로 사용되는  machine

참조 : https://ebtables.netfilter.org/br_fw_ia/br_fw_ia.html#section3

 

ebtables/iptables interaction on a Linux-based bridge

ebtables/iptables interaction on a Linux-based bridge 1. Introduction This document describes how iptables and ebtables filtering tables interact on a Linux-based bridge. Getting a bridging firewall on a 2.4.x kernel consists of patching the kernel source

ebtables.netfilter.org

IP 코드가 통과되는 부분입니다.

그림 3a. IP 코드 관문

다음은 iptables 패킷 탐색 방식입니다.

그림 3b. 라우팅 테이블(iptables) 탐색 프로세스

iptables NAT OUTPUT 체인은 라우팅 결정 후에 위치합니다. 이 부분은  DNAT에 대해 너무 늦습니다. IP 패킷이 DNAT된 경우 경로를 다시 지정하여 해결됩니다. 이것은 Linux 커널의 표준 동작입니다.

 

그림 3a와 3b는 iptables 체인이 IP 후크에 연결된 위치를 명확하게 보여줍니다. 브릿지 코드와 netfilter가 커널에서 활성화되면 iptables 체인도 브리징 코드의 후크에 연결됩니다. 그러나 이것이 더 이상 표준 IP 코드 후크에 연결되지 않는다는 의미는 아닙니다. 브리징 코드와 접촉하는 IP 패킷의 경우 br-nf 코드는 iptables 체인이 통과할 네트워크 코드의 위치를 ​​결정합니다. 분명히 동일한 패킷이 체인을 두 번 통과하지 않는다는 것이 보장됩니다. 브리지 코드와 접촉하지 않는 모든 패킷은 그림 3b와 같이 표준 방식으로 iptables 체인을 통과합니다.

단일 IP 패킷/프레임이 NAT PREROUTING, FILTER INPUT, NAT OUTPUT, FILTER OUTPUT 및 NAT POSTROUTING ebtables 체인을 통과하는 것을 볼 수 있습니다.

 

이것은 브리지가 라우터로도 사용될 때 발생할 수 있습니다. 해당 IP 패킷을 포함하는 이더넷 프레임은 브리지의 대상 MAC 주소를 가지지만 목적지 IP 주소는 브리지의 주소가 아닙니다. iptables 체인을 포함하여 다음은 IP 패킷이 브리지/라우터를 통해 실행되는 방식입니다.

 

그림 3. 브리지/라우터는 패킷을 브리지 인터페이스로 라우팅함

이것은 라우팅 결정이 패킷을 브리지 인터페이스로 보낸다고 가정합니다. 라우팅 결정이 패킷을 브릿지가 아닌 인터페이스로 보내는 경우 다음과 같은 현상이 발생합니다.

그림 3d. 브리지/라우터는 패킷을 브리지가 아닌 인터페이스로 라우팅

그림 3c와 3d는 IP 패킷이 브리지 포트에 도착했다고 가정합니다. 여기에서 분명히 "비대칭"인 것은 iptables PREROUTING 체인이 ebtables INPUT 체인보다 먼저 탐색되지만 기능을 희생하지 않고는 도움이 될 수 없다는 것입니다. 

반응형
반응형

[리눅스 기반 브릿지] 2. 이더넷 프레임이 ebtables 체인을 통과하는 방법

참조 : http://ebtables.netfilter.org/br_fw_ia/br_fw_ia.html#section2

 

ebtables/iptables interaction on a Linux-based bridge

ebtables/iptables interaction on a Linux-based bridge 1. Introduction This document describes how iptables and ebtables filtering tables interact on a Linux-based bridge. Getting a bridging firewall on a 2.4.x kernel consists of patching the kernel source

ebtables.netfilter.org

 

ebtables는 TCP/IP 네트워크 모델에 의한 OSI 계층 2(데이터 링크 계층) 또는 계층 1(링크 계층, 네트워크 액세스 계층)에 에서 동작합니다. 

이더넷 계층에서 작동하는 브리지에 따라 로컬 컴퓨터로 향하는 패킷이 반드시 IP 레이어에 따라 로컬 컴퓨터로 향하는 것은 아닙니다. 이것은 라우팅이 작동하는 방식입니다(MAC 대상은 라우터이고 IP 대상은 통신하려는 실제 대상자입니다).

그림 2a. 일반 프레임 통과 방식

 

Linux 브리징 코드에는 6개의 관문이 정의되어 있으며, 그 중 ebtables용으로 BROUTING 관문이 추가되었습니다.

그림 2b. 이더넷 브리징 관문

관문은 소프트웨어가 해당 위치를 통과하는 패킷/프레임을 처리하기 위해 자체적으로 연결할 수 있는 네트워크 코드의 특정 위치를 말합니다. 예를 들어, ebtables FORWARD 체인을 담당하는 커널 모듈은 브리지 FORWARD 관문에 연결됩니다. 이것은 모듈이 커널에 로드되거나 부팅될 때 수행됩니다.

ebtables BROUTING 및 PREROUTING 체인은 브리징 결정 전에 통과하므로 이러한 체인은 브리지에서 무시할 프레임도 볼 수 있습니다. 이 체인을 사용할 때 이를 고려해야 합니다. 또한 체인은 전달되지 않는 브리지 포트로 들어오는 프레임을 볼 수 없습니다.
프레임에 대한 브리지의 결정(그림 2b 참조)은 다음 중 하나일 수 있습니다.

1) 대상 MAC 주소가 브리지의 다른 쪽에 있는 경우 브리지합니다.
2) 대상 MAC이 있는 상자의 위치가 브리지에 알려지지 않은 경우 모든 포워딩 브리지 포트에 플러딩합니다.
3) 목적지 MAC 주소가 브리지 또는 포트 중 하나의 주소인 경우 상위 프로토콜 코드(IP 코드)로 전달합니다.
4) 대상 MAC 주소가 브리지의 같은 쪽에 있으면 무시합니다.

 

그림 2c. 브리징 테이블(ebtables) 통과 프로세스

Ebtables에는 그림 2c와 같이 filter, nat 및 broute의 세 가지 테이블이 있습니다.

broute 테이블에는 BROUTING 체인이 있습니다.
filter 테이블에는 FORWARD, INPUT 및 OUTPUT 체인이 있습니다.
nat 테이블에는 PREROUTING, OUTPUT 및 POSTROUTING 체인이 있습니다.

filter OUTPUT과 nat OUTPUT 체인은 분리되어 사용됩니다.

 

그림 2b와 2c는 ebtables 체인이 브리지 관문에 부착된 위치를 명확하게 보여줍니다.

브리지에 종속된 NIC가 프레임을 수신하면 프레임은 먼저 BROUTING 체인을 거칩니다. 이 체인에서는 프레임을 Routing할지 브리지할지 여부를 선택할 수 있어 brouter를 만들 수 있습니다. 

BROUTING은 라우터가 일부 프레임/패킷을 연결하고(즉, 링크 계층 정보를 기반으로 전달) 다른 프레임/패킷을 라우팅(즉, 네트워크 계층 정보를 기반으로 전달)하는 장치입니다. 브리지/Route 결정은 구성 정보를 기반으로 합니다.
예를 들어, Router는 두 네트워크 사이의 특정 트래픽(NetBEUI, ARP 등)을 브리징하는 동안 2개의 네트워크 사이의 IP 트래픽에 대한 일반 Router 역할을 하는 데 사용할 수 있습니다. IP 라우팅 테이블은 브리지 논리 장치를 사용하지 않으며 대신 상자에는 브리지 포트(브리지 종속 NIC)이기도 한 물리적 네트워크 장치에 할당된 IP 주소가 있습니다.
BROUTING 체인의 기본 결정은 브리징입니다.

다음으로 프레임은 PREROUTING 체인을 통과합니다. 이 체인에서 프레임의 대상 MAC 주소(DNAT)를 변경할 수 있습니다. 프레임이 이 체인을 통과하면 브리징 코드가 프레임을 보낼 위치를 결정합니다. 브리지는 대상 MAC 주소를 보고 이를 수행하며 네트워크 계층 주소(예: IP 주소)는 신경 쓰지 않습니다.

브리지가 프레임이 로컬 컴퓨터를 대상으로 한다고 결정하면 프레임은 INPUT 체인을 통과합니다. 이 체인에서 브리지 상자로 향하는 프레임을 필터링할 수 있습니다. INPUT 체인을 통과한 후 프레임은 네트워크 계층 코드(예: IP 코드)로 전달됩니다. 따라서 라우팅된 IP 패킷은 ebtables FORWARD 체인이 아니라 ebtables INPUT 체인을 통과합니다. 이것은 논리적입니다.

 

그림 2d. 들어오는 프레임의 체인 통과

그렇지 않으면 프레임이 브리지의 다른 쪽으로 보내질 수 있습니다. 그렇다면 프레임은 FORWARD 체인과 POSTROUTING 체인을 통과합니다. 브리지된 프레임은 FORWARD 체인에서 필터링할 수 있습니다. POSTROUTING 체인에서 MAC 소스 주소(SNAT)를 변경할 수 있습니다.

 

그림 2e. 전달된 프레임의 체인 통과

로컬에서 생성된 프레임은 브리징 결정 후 nat OUTPUT, filter OUTPUT 및 nat POSTROUTING 체인을 통과합니다. NAT OUTPUT 체인은 대상 MAC 주소를 변경할 수 있도록 하고 filter OUTPUT 체인은 브리지 박스에서 발생하는 프레임을 필터링할 수 있습니다. nat OUTPUT 체인은 브리징 결정 후에 탐색되므로 실제로는 너무 늦습니다. 속도를 빠르게 하려면, 이 부분을 변경해야 합니다. nat POSTROUTING 체인은 위에서 설명한 것과 동일합니다.

 

그림 2f. 나가는 프레임의 체인 통과

대상 장치가 논리적 브리지 장치인 경우 라우팅된 프레임이 이 세 가지 체인을 통과할 수도 있습니다.

반응형

+ Recent posts