hwkim3330의 블로그

View the Project on GitHub hwkim3330/blog

[프로젝트 목표]

[전체 흐름]

  1. FCI API 확장 • include/libfci.h (또는 fci_cs.h)에 FRER 관련 커맨드 코드 추가:
    • FPP_CMD_8021CB_SCH_ADD, FPP_CMD_8021CB_SCH_DEL, FPP_CMD_8021CB_SCH_QUERY • fpp_ext.h에 FFEAT_EXT_FRER 상수 정의
  2. CLI 레이어 수정 • sw/libfci_cli/libfci_cli_cmds_if.c:
    • cli_cmd_8021cb_sch_add(), _del(), _qry() 함수 작성
    • 내부에서 fci_cmd()/fci_query() 호출, 파라미터 변환(htons/htonl) • sw/libfci_cli/libfci_cli.c:
    • demo_features나 commands[] 배열에 “8021cb-sch-add”, “8021cb-sch-del”, “8021cb-sch-qry” 등록 • sw/libfci_cli/Makefile:
    • 신규 소스 파일(libfci_cli_cmds_if.c, libfci_cli_cmds_if.h, demo_feature_sja1110.c 등) 추가
  3. FCI 데몬(엔드포인트) 확장 • daemon/src/fci_daemon.c (또는 netlink 핸들러 파일):
    • case FPP_CMD_8021CB_SCH_ADD 등 추가
    • netlink 메시지 파싱→ sja1110_add_frer_schedule(), _del(), _query() 호출
  4. SJA1110 드라이버 연동 • drivers/net/ethernet/freescale/sja1110.c:
    • sja1110_add_frer_schedule(struct sja1110_switch *sw, uint16_t id, uint32_t cycle_ns) 구현
    • sja1110_del_frer_schedule(), sja1110_query_frer() 등
    • 스위치 칩 레지스터 접근: FRMREPEN, SN_NUM_GREATER, DPI CB_EN, DPI 룰 테이블
  5. Yocto 레시피 패치 • meta-alb-bsp/recipes-support/libfci-cli/libfci-cli_%.bbappend:
    • FILESEXTRAPATHS_prepend, SRC_URI에 새 소스 및 패치 추가
    • Makefile.append.patch로 소스 포함 • meta-alb-bsp/recipes-support/libfci/libfci_%.bbappend:
    • include/libfci.h, fpp_ext.h 변경 반영
  6. FRER 엔진 활성화 & DPI 룰 등록 코드 • enable_frer_engine(cli, true):
      fpp_fwfeat_ext_cmd_t cmd = { .feature_id = htonl(FFEAT_EXT_FRER), .enable = 1 };
      fci_write(cli, FPP_CMD_FWFEAT_EL_SET, sizeof(cmd), (unsigned short*)&cmd);
    

    • enable_rtag_dpi(cli):

      fpp_dpi_filter_cmd_t cmd = { .filter_id=htons(1),
                                   .enable=1,
                                   .match_type=DPI_MATCH_RTAG,
                                   .offset=htons(14),
                                   .offset_from=DPI_OFFSET_FROM_L2,
                                   .mask=htonl(0xFFFFFFFF),
                                   .value=htonl(RTAG_TYPE_8021CB) };
      fci_write(cli, FPP_CMD_DPI_FILTER, sizeof(cmd), (unsigned short*)&cmd);
    
  7. 검증 시나리오
    • libfci_cli: 8021cb-sch-add 1 1000000, 8021cb-sch-qry 1, 8021cb-sch-del 1
    • dmesg 또는 syslog에서 netlink 처리 로그 확인
    • SJA1110 디버그 툴로 FRER 카운터, DPI 테이블 상태 확인
    • 실제 네트워크로 R-TAG 프레임 주입→ 복제·제거 동작 확인

[요청 사항]