Category: lwIP
lwIP 카테고리에 작성된 글 목록입니다.
lwIP Roadmap
작은 임베디드 네트워크 스택이 왜 가끔 멈출까. lwIP를 메모리 지도, 타이머, 호출 컨텍스트, 버퍼 수명주기 순서로 읽는 흐름입니다.
자동 생성된 넓은 주제보다 실제 bring-up과 부하 테스트에서 바로 부딪히는 문제만 남겨, 막힌 지점에서 다시 찾기 좋게 정리합니다.
시작과 설정
- lwIP 메모리 옵션 구조 정리: PBUF_POOL, MEM_SIZE, MEMP_NUM_*를 한 번에 보기
lwIP 메모리를 PBUF_POOL, MEM_SIZE, MEMP_NUM_*, OS 큐로 나눠 보는 출발점입니다.
타이머와 상태 관리
- lwIP 타이머가 안 돈다: NO_SYS에서 sys_check_timeouts() 빠지면 생기는 증상
NO_SYS에서 타이머 루프가 빠졌을 때 DHCP/ARP/TCP가 왜 흔들리는지 봅니다.
TCP/IP 코어와 스레드
- lwIP에서 ISR에서 바로 보내면 가끔 터진다: tcpip_thread로 넘기는 패턴 정리
ISR에서 lwIP API를 직접 호출하지 않고 tcpip_thread로 넘겨야 하는 이유를 정리합니다.
- lwIP에서 tcpip_thread 안에서 다시 기다리면 멈춘다: callback 안의 netconn/sockets 호출이 self-deadlock이 되는 이유
tcpip_thread 컨텍스트 안에서 다시 동기 API를 호출해 스스로 기다리며 멈추는 패턴을 정리합니다.
DHCP/ARP/UDP
- lwIP에서 링크는 붙었는데 DHCP가 안 돈다: netif_set_up() / netif_set_link_up() 순서를 같이 보자
링크는 살아있는데 DHCP가 시작되지 않거나 다시 안 붙을 때 netif 상태 전환 순서를 정리합니다.
- lwIP에서 링크 복구 후 UDP가 한동안 죽어 보인다: ARP 캐시와 netif 상태를 같이 보자
링크 복구 뒤 UDP 송신만 한동안 막힐 때 ARP 캐시와 netif 상태를 함께 보는 포인트를 정리합니다.
메모리와 버퍼
- lwIP pbuf가 가끔 터진다: PBUF_REF/POOL/RAM 수명주기와 zero-copy 함정
pbuf 타입과 zero-copy 수명주기를 잘못 다뤘을 때 랜덤 크래시가 나는 패턴을 봅니다.
- lwIP TCP 버퍼 설정 읽는 법: TCP_SND_BUF, TCP_WND, MEM_SIZE, MEMP_NUM_TCP_SEG, PBUF_POOL_SIZE
TCP 송신 버퍼, 수신 윈도우, MEM heap, tcp_seg pool, PBUF_POOL_SIZE를 같은 숫자처럼 보지 않도록 구분합니다.
- lwIP에서 UDP 길이가 가끔 잘못 읽힌다: pbuf 체인에서는 len 말고 tot_len을 봐야 한다
pbuf 체인에서 `len`만 보고 파싱해 UDP payload가 잘리거나 CRC처럼 오해되는 패턴을 정리합니다.
- lwIP RAW UDP callback 뒤에 수신이 멈춘다: pbuf_free를 놓치면 PBUF_POOL이 먼저 마른다
RAW UDP receive callback에서 pbuf 해제를 놓쳐 수신이 몇 분 뒤 멈추는 전형적인 패턴을 정리합니다.
TCP 디버깅
- lwIP RAW TCP가 '가끔 멈춘다': tcp_recved() 안 치면 윈도우가 안 열린다
RAW TCP에서 tcp_recved() 누락으로 receive window가 고정되며 멈추는 증상을 정리합니다.
- lwIP TCP 재시도 루프에서 RTOS delay가 필요한 이유: busy loop를 막고 CPU를 양보하기
TCP 송신 재시도 루프에서 busy loop를 피하기 위해 RTOS delay로 CPU를 양보해야 하는 이유를 정리합니다.
포팅과 성능
- lwIP에서 RX는 되는데 payload가 가끔 깨진다: DMA 버퍼와 D-Cache 순서를 같이 봐야 한다
DMA와 D-Cache 일관성이 맞지 않아 수신 데이터가 가끔 깨지거나 송신이 엉뚱해지는 패턴을 정리합니다.
최근 글
-
lwIP TCP 버퍼 설정 읽는 법: TCP_SND_BUF, TCP_WND, MEM_SIZE, MEMP_NUM_TCP_SEG, PBUF_POOL_SIZE
lwIP의 TCP_SND_BUF, TCP_WND, MEM_SIZE, MEMP_NUM_TCP_SEG, PBUF_POOL_SIZE가 각각 어떤 병목을 만들고 어떤 메모리 예산과 연결되는지 일반화된 예시로 정리한다.
-
lwIP RAW UDP callback 뒤에 수신이 멈춘다: pbuf_free를 놓치면 PBUF_POOL이 먼저 마른다
lwIP에서 UDP는 처음엔 잘 되는데 몇 분 뒤부터 recv callback이 끊기거나 pbuf_alloc 실패가 보이면, 드라이버보다 먼저 RAW UDP callback에서 pbuf_free를 빠뜨린 경로를 확인해야 한다. 작은 누수 하나가 PBUF_POOL 고갈로 이어져 전체 RX 경로를 막을 수 있다.
-
lwIP에서 RX는 되는데 payload가 가끔 깨진다: DMA 버퍼와 D-Cache 순서를 같이 봐야 한다
lwIP 포팅에서 링크는 정상이고 인터럽트도 도는데 UDP payload나 ARP 내용이 가끔 깨져 보이면, pbuf보다 먼저 DMA 버퍼와 CPU D-Cache 일관성을 확인해야 한다. RX 전 invalidate, TX 후 clean 순서가 어긋나면 랜덤 패킷 손상처럼 보이는 증상이 반복된다.
-
-
lwIP TCP 재시도 루프에서 RTOS delay가 필요한 이유: busy loop를 막고 CPU를 양보하기
lwIP 같은 RTOS 기반 TCP/IP stack에서 송신 재시도 루프를 아무 대기 없이 반복하면 busy loop가 되어 오히려 네트워크 thread와 다른 task의 실행을 방해할 수 있다. 짧은 RTOS delay와 timeout을 함께 두면 CPU 양보와 무한 대기 방지를 동시에 챙길 수 있다.
-
lwIP에서 tcpip_thread 안에서 다시 기다리면 멈춘다: callback 안의 netconn/sockets 호출이 self-deadlock이 되는 이유
lwIP에서 tcpip_callback, netif callback, 내부 이벤트 훅 안에서 netconn 또는 sockets API를 다시 호출하면 부하가 낮을 때는 지나가도 어느 순간 전체 네트워크가 멈출 수 있다. 같은 tcpip_thread가 자기 자신에게 일을 보내고 완료를 기다리는 self-deadlock 패턴이라, 호출 컨텍스트를 분리해 두는 편이 안전하다.
-
lwIP에서 UDP 길이가 가끔 잘못 읽힌다: pbuf 체인에서는 len 말고 tot_len을 봐야 한다
lwIP에서 UDP 수신 데이터가 가끔 중간에서 잘리거나 길이가 들쭉날쭉해 보이면 드라이버보다 먼저 pbuf 체인 처리 코드를 확인해야 한다. 첫 pbuf의 len만 보고 전체 길이로 오해하면 큰 프레임, 정렬 차이, pool 분할 상황에서 재현이 애매한 버그가 생긴다.
-
lwIP에서 링크 복구 후 UDP가 한동안 죽어 보인다: ARP 캐시와 netif 상태를 같이 보자
lwIP에서 케이블 재삽입이나 스위치 복구 뒤 링크는 살아 있는데 UDP 송신이 한동안 안 나가거나 첫 패킷만 사라지는 경우가 있다. DHCP보다 아래층인 ARP 캐시와 netif 상태 전환이 어긋나면 생기는 전형적인 증상이라, link up/down 로그와 ARP 해상도 흐름을 같이 보는 편이 빠르다.
-
lwIP에서 링크는 붙었는데 DHCP가 안 돈다: netif_set_up() / netif_set_link_up() 순서를 같이 보자
PHY 링크는 올라왔고 RX/TX 카운터도 움직이는데 lwIP DHCP가 시작되지 않거나 재연결 뒤에 IP를 다시 못 받는 경우가 있다. 대부분은 netif_set_up(), netif_set_link_up(), dhcp_start() 호출 순서와 상태 전환 타이밍 문제다. bring-up 관점에서 자주 틀리는 포인트를 정리한다.
- lwIP
- DHCP
- netif
- Link Status
- +2
-
lwIP RAW TCP가 '가끔 멈춘다': tcp_recved() 안 치면 윈도우가 안 열린다
lwIP RAW TCP에서 전송이 몇 KB/몇 초 뒤에 멈추고 상대는 재전송만 하는데, 링크는 살아있는 경우가 있다. 대부분은 수신 콜백에서 tcp_recved()를 호출하지 않아 TCP receive window가 열리지 않는 문제다. 증상과 수정 포인트를 실무 관점으로 정리한다.
- lwIP
- TCP
- RAW API
- tcp_recved
- +2
-
lwIP 메모리 옵션 구조 정리: PBUF_POOL, MEM_SIZE, MEMP_NUM_*를 한 번에 보기
lwIP 메모리는 PBUF_POOL, MEM_SIZE, MEMP_NUM_*, OS 큐가 각각 다른 역할을 맡는다. FreeRTOS 포팅과 정적 풀 구성을 기준으로 각 옵션이 어디에 쓰이고 어떤 병목으로 이어지는지 구조적으로 정리한다.