2012-11-01 6 views
0

패킷이 이더넷 PHY에 들어오지 않는 상황이 있습니다. DMA 링 버퍼를 사용하고 있습니다. 데이터가 실제 와이어에서 링 버퍼로 복사 된 다음 상위 레이어 스택으로 복사됩니다. DMA 링 버퍼에는 두 개의 카운터 소비자 인덱스와 생산자 인덱스가 있으며 두 개의 포인터 읽기 포인터와 라이터 포인터가 있습니다. 카운터는 물리 계층에서 얼마나 많은 패킷이 왔는지를 나타내지 만 소비자 버퍼는 상위 계층으로 푸시 된 소비 된 버퍼의 인덱스를 유지하는 데 사용됩니다. 읽기 및 쓰기 포인터는 데이터를 선택하는 데 사용됩니다.갑자기 패킷이 이더넷 PHY에 도착하지 않습니다.

내 생산자와 소비자 색인이 비슷 해지면 DMA 링 버퍼에 패킷이 들어오지 않는 반면 패킷은 PC에 연결된 장치로 계속 펌핑됩니다 (wireshark 로그는 패킷이 라우팅 중임을 확인합니다). .)

우리는 우리의 부트 로더를 독립적으로 만들고 있습니다. 그래서 우리의 구현은 (타이머를 도입 한) 단일 실행 내내 많은 것들을 수행합니다 (흐름 관리, 초기 패킷을 파싱하고 그것을 상위 레이어로 푸시). 이전 구현 인 VxWorks는 여러 스레드에서 상황이 발생하고 IP 스택을 사용하고있었습니다. 문제를 추가로 디버깅 한 후 RX_BUFFER 오버플로로 인해 패킷이 삭제되는 것을 관찰했습니다. 하드웨어 레벨의 필터에 MAC 멀티 캐스트 주소를 설정하는 데 문제가 있다는 것을 발견했습니다. 그 이유는 동일한 이유 일 수 있습니다. 나의 관찰은 처음에는 그 일이 잘되었다. 그러나 소프트 리셋 후에 나는 필터를 다시 넣을 수 없습니다. 나는 두 가지 문제에 대해 의심의 여지가 있으며 똑같은 것을 조사하고있다.

1> 이더넷 드라이버를 초기화하십시오.
2> LWIP (IP 스택) 초기화.
3> 콜백 함수 등록.
4> 이더넷 PHY 드라이버를 시작하십시오.
5> 양식 DHCP 연결.
6 이더넷 드라이버가 폴링을 유지하면서 DHCP 제안을 수락합니다.
7>
9>는
10> 다시 멀티 캐스트 패킷에 대한 폴링을 시작할 다른 멀티 캐스트 그룹에 패킷을 파싱하고 가입 멀티 캐스트 패킷에 대한 IGMP
8> 설문 조사 참여. 여기 4 단계 후에 임의로 RX_BUFFER 오버 플로우 메시지를 수신하고 있습니다. 최대 MTU 크기 집합은 1500 바이트이며, 버퍼 크기는 2K입니다.

문제를 정렬/좁히기위한 제안 사항이 있으십니까?

+0

일부 코드가 필요합니다. 어떤 OS를 사용하고 있습니까? –

+0

@Mike : 여기에서는 OS를 사용하지 않고 etherenet 드라이버는 SOC 공급 업체 (Broadcom)에서 제공합니다. 좀 더 자세히 설명해 드리겠습니다. 이것은 임베디드 디바이스 용 booltloader 구현의 일부입니다. 우리의 목표는 부트 로더 OS를 독립적으로 만드는 것입니다. 이전에는 이더넷 스택에 VxWorks를 사용했습니다. – rspr

+0

@Mike : 질문을 편집 할 때의 구현/현재 관찰에 대해 설명했습니다. – rspr

답변

0

위의 문제에 대해 Broadcom과 연락을하고 문제를 해결하고 테스트했습니다. 완료된 수정 사항을 업데이트하고 싶습니다.

  • PHY 계층에서 데이터 패킷을 수신 한 후 PHY RX 버퍼를 비 웁니다. 이 섹션은 이미 PHY 레이어로 관리되기 때문에 제거되었습니다.

  • 우리는 또한 LWIP 스택의 흐름에 약간의 수정을가했습니다.

관련 문제