hwkim3330의 블로그

View the Project on GitHub hwkim3330/blog

네, 아주 흥미로운 과제입니다. IEEE 802.1CB (Seamless Redundancy)는 고신뢰성 통신을 위한 표준으로, 프레임 복제(Replication)와 중복 제거(Elimination)가 핵심입니다.

libfci_cli의 기능들을 조합하여 802.1CB의 핵심 개념을 하드웨어 가속으로 구현하는 쉘 스크립트를 작성해 보겠습니다. C보다는 일련의 CLI 명령어를 호출하는 쉘 스크립트가 이 작업에 훨씬 적합합니다.


개요 및 핵심 제약사항

1. 목표:

2. 핵심 제약사항 (매우 중요): libfci_cli 도움말만으로는 표준 802.1CB를 100% 완벽하게 구현하는 것은 불가능합니다. 그 이유는 다음과 같습니다.

따라서, 이 스크립트는 libfci_cli의 기능을 최대한 활용하여 “유사 802.1CB” 또는 “단순화된 경로 이중화”를 구현하는 데 초점을 맞춥니다. 특히 복제(Replication) 기능은 하드웨어로 구현 가능성이 매우 높으며, 중복 제거는 제한적인 방법으로 시도합니다.


개념 설계


구현 스크립트 (802.1CB 유사 기능)

이 스크립트는 Talker와 Listener 설정을 포함하며, 하나의 파일(setup_802_1cb_like.sh)로 작성합니다.

#!/bin/bash

# ==============================================================================
# S32G FCI를 이용한 802.1CB 유사 기능 설정 스크립트
# ==============================================================================
#
# 주의: 이 스크립트는 libfci_cli의 기능을 활용하여 802.1CB의 핵심 개념인
#       '프레임 복제'를 하드웨어로 구현하는 예제입니다.
#       '상태 기반 중복 제거'는 CLI만으로 완벽 구현이 어려우므로,
#       L3/L4 Connection Tracking을 이용한 제한적인 방식으로 접근합니다.
#
# 포트 구성:
#   - emac0: Talker 입력 / Listener 출력
#   - emac1: 경로 A
#   - emac2: 경로 B
#
# ==============================================================================

set -e # 오류 발생 시 스크립트 중단
set -x # 실행되는 명령어 출력

# --- 공통: 환경 초기화 ---
# (실제 환경에서는 이 부분을 신중하게 실행해야 합니다.)
# libfci_cli route-and-cntk-reset -a || true
# ... 기타 필요한 초기화 명령어 ...

echo ">>> [Phase 1] Talker (Frame Replication) 설정 시작..."

# 1. Talker를 위한 논리 인터페이스 생성
#    - Talker의 입력 포트인 emac0를 부모로 하는 'talker_lif' 생성
libfci_cli logif-add --interface=talker_lif --parent=emac0

# 2. 복제(Replication) 규칙 설정
#    - 'talker_lif'로 들어온 모든 트래픽을 경로 A(emac1)와 경로 B(emac2)로 복제 전송
#    - --egress 옵션에 여러 인터페이스를 지정하는 것이 핵심
libfci_cli logif-update --interface=talker_lif --egress=emac1,emac2 --promisc=ON

# 3. Talker 인터페이스 활성화
libfci_cli phyif-update --interface=emac0 --enable
libfci_cli phyif-update --interface=emac1 --enable
libfci_cli phyif-update --interface=emac2 --enable
libfci_cli logif-update --interface=talker_lif --enable

echo ">>> [Phase 1] Talker 설정 완료. emac0 입력 -> emac1, emac2로 복제 출력."
sleep 2

# ==============================================================================

echo ">>> [Phase 2] Listener (Frame Elimination) 설정 시작..."
# 중복 제거는 '가장 먼저 도착한 Flow의 패킷만 통과'시키는 방식으로 접근합니다.
# 이는 L3/L4 Connection Tracking(cntk) 기능을 응용하여 구현합니다.
# 제약: 이 방식은 IP 트래픽에만 유효하며, 순수 L2 트래픽에는 동작하지 않습니다.

# 1. Listener 수신 포트(emac1, emac2)를 라우팅 모드로 설정
#    - Connection Tracking을 사용하려면 라우팅 모드가 필요
libfci_cli phyif-update --interface=emac1 --mode=ROUTER
libfci_cli phyif-update --interface=emac2 --mode=ROUTER

# 2. 최종 목적지로 나갈 경로(Route) 생성
#    - Listener를 통과한 트래픽이 최종적으로 나갈 포트(emac0)와 그때 사용할 MAC 주소(Next Hop)를 지정
#    - DST_MAC_ADDR은 실제 다음 장비의 MAC 주소로 변경해야 함
#    - Route ID 100을 'egress_route'로 명명
NEXT_HOP_MAC="00:11:22:AA:BB:CC" # 예시: 다음 라우터 또는 호스트의 MAC
libfci_cli route-add --rt=100 --dmac=$NEXT_HOP_MAC --interface=emac0 -6 # IPv6용 (필요시 -4 사용)

# 3. Connection Tracking을 이용한 중복 흐름 제어 (핵심 아이디어)
#    - 특정 Flow(src_ip, dst_ip, src_port, dst_port)의 첫 패킷이 emac1 또는 emac2로 들어오면,
#      FCI는 해당 Flow에 대한 conntrack(cntk) 항목을 생성하고 'egress_route'(ID 100)로 포워딩.
#    - 아주 짧은 시간 내에 다른 포트로 들어온 '중복' 패킷은 이미 생성된 cntk 항목과 매칭됨.
#    - 기본적으로 cntk에 매칭되면 바로 포워딩되므로, '중복 제거'가 되지 않음.
#    - 여기서 **가정**은, "첫 패킷 처리 후 cntk가 생성되는 데 시간이 걸려서,
#      그 사이에 들어온 중복 패킷은 cntk miss가 되어 CPU로 punt 되거나 drop 된다"는
#      타이밍 기반의 동작을 기대하는 것. 또는, 하드웨어에 중복 패킷을 처리하는
#      별도의 로직이 있다고 가정.
#
#    - **libfci_cli만으로는 'cntk 히트 시 drop' 기능이 명시적으로 없으므로,
#      이 부분은 하드웨어의 암묵적인 동작에 의존하거나 Host CPU의 개입이 필요합니다.**
#      아래는 개념을 보여주기 위한 cntk 타임아웃 설정입니다.
libfci_cli cntk-timeout -p=TCP -w=5 # 5초 후 cntk 항목 삭제
libfci_cli cntk-timeout -p=UDP -w=5

echo ">>> [Phase 2] Listener 설정 완료. 하드웨어 동작 방식에 따라 제한적으로 중복 제거 시도."

echo ">>> 전체 설정이 완료되었습니다."

set +x

스크립트 실행 및 검증 방법

  1. 스크립트 저장 및 권한 부여:
    vi setup_802_1cb_like.sh 
    # (위 내용 붙여넣기 후 저장)
    chmod +x setup_802_1cb_like.sh
    
  2. 스크립트 실행:
    ./setup_802_1cb_like.sh
    
  3. 검증:
    • Talker 검증: 트래픽 생성기를 사용하여 emac0로 패킷을 주입합니다. 동시에 emac1emac2 포트를 모니터링하여 동일한 패킷이 양쪽으로 모두 출력되는지 확인합니다. (예: tcpdump)
    • Listener 검증 (가장 어려운 부분): emac1emac2에 미세한 시간 차를 두고 동일한 IP 패킷 스트림을 주입합니다. emac0에서 출력되는 패킷 수를 확인하여 입력된 패킷 수의 절반에 가까운지 확인합니다. 완벽한 제거는 어려울 수 있으며, 성능은 하드웨어의 구체적인 동작에 따라 달라집니다.

한계 및 진정한 802.1CB를 위한 대안

이 스크립트는 libfci_cli의 가능성과 한계를 동시에 보여주는 좋은 예시가 될 것입니다. 주어진 도구로 복잡한 요구사항을 어떻게 창의적으로 해결해 나가는지를 보여주는 데 중점을 두었습니다.