리눅스로 802.11 드라이버를 고치면 물리(PHY)계층까지 컨트롤 가능할까요?
글쓴이: skylit / 작성시간: 목, 2012/09/13 - 10:55오후
안녕하세요?
제가 지금껏 시뮬레이션 위주로만 네트워크 연구를 했었는데, 실제 장비(e.g. 노트북)를 가지고 802.11 무선랜 환경을 구축해 보려고 합니다. 제가 리눅스에서 드라이버 쪽을 건드린 적은 없고... 시뮬레이션 돌리기 위해서 필요한 리눅스 운용방법 정도만 아는 수준입니다. ㅠㅠ
어쨌든 제가 MAC 계층과 물리 계층에 접근해서 필요한 값을 얻거나(MAC계층의 backoff counter), 변경을 해야 하는데(물리계층의 data rate), 제가 직접 기존의 802.11 드라이버를 고치면 이정도까지 가능한가요?
MAC계층과 물리계층이 무선랜카드 칩에 내장되어 있으면 제가 코드로 고칠 수 없는 부분이지는 않을까 걱정이 되네요..
만약 그렇다면 물리계층까지 접근 가능한 USB 무선랜카드가 따로 있는 건가요?
Forums:
802.3과 크게 다르지 않으니 그 기준으로
802.3과 크게 다르지 않으니 그 기준으로 말씀드립니다.
IEEE에서 나오는 규정은 전자/전기 제조 업자들이 제품을 만들 때 적용되는 것이죠.따라서 물리/링크계층을 동작시키는 모든 코드는 롬바이어스에 찍혀 있습니다.요즘은 롬이 플래시일 경우도 있겠으나 어쨌든 제조회사에서메모리에 심어 부팅시 랜카드 메모리에 상주하는 코드입니다.
IEEE규정에 보면 대부분은 읽기전용 즉 별도의 소켓보드에 꽂거나 공장에서 사용하는 암호루틴을 통과할 때만 코드를 수정할 수 있고 일부 쓰기가 가능한 값은 모두 레지스트 로 디폴트값이 초기 로딩되고 드라이버가 이 레지스터를 변경할 수 있게 되어 있습니다.
읽기전용의 대표적인 값은 맥어드레스고 무작위모드같은 경우 레지스터 로 셋팅될 수 있습니다.(그러나 이마저도 필수가 아닌 옵션으로 랜카드 제조사는 이를 변경불가능한 정적 코딩해도 문제가 없는 값입니다.)
따라서 맥어드레스는 앞서의 특별 루틴을 쓰지않는 한 컴퓨터 시스템이나 기타 상위 모드인 드라이버/커널모드에서는 절대 바뀌지 않는 것입니다.
즉 드라이버나 커널은 장치가 제공하는 각종 읽기 값을 참조하고 일부 쓰기 가능한 값을 셋팅할 수 있는게 전부입니다.
그런데도 커널코드에 보면 많은 링크계층,예를들어 802.1Q 같은게 보이는데 이는 링크계층에서 처리되지 못한 헤더를 버리고 실제 헤더위치를 스캔하는 루틴이거나 아니면 실제 링크 계층이 아닌 3걔층,넷트웍 커널계층에서 부가적인 트릭을 쓰기위한 확장코드일 뿐 절대적으로 아무리 주물럭거려도 링크계층의 작동에 관여하지 못하는 것입니다.
대표적으로 브릿지 관련 코드가 있지요...
랜카드 전송속도같은 경우도 오토네고에 의해 심어진 읽기전용 코드가 상대 랜카드와 통신하면서 자동설정됩니다.
이 말을 살짝 뒤집으면 오토네고에 의해 통신가능한 최저~최고 속도 몇개를 레지스트로 제시하고 이를 드라이버에서 셋팅하게 하는 랜카드제조도 가능합니다.
다만 이런 상상은 IEEE 표준에서 필수 항목을 벗어난 랜카드 제조회사의 확장기능입니다.
즉 오토네고는 필수표준이지만 이를 준수하는 한 옵션표준이나 언급되지 않은 표준외의 기능을 제공하는 랜카드도 얼마든지 제조가능합니다.
드라이버는 주로 이 옵션과 확장기능을 처리하는 루틴에 따라 로직이 다를 뿐 하드코딩된 필수표준에 영향을 주지 못합니다.
펌웨어 수정 말고는 딱히 떠오르질 않는데요...
어떤 칩셋의 어떤 드라이버를 쓰시는지는 모르겠지만 일단 칩셋에 따라서 풀맥 디바이스와 풀맥이 아닌 디바이스로 나뉘는데요, 풀맥 디바이스 같은 경우는 위의 분 말씀과 같이 802.3 과 같이 다루어지게 됩니다. 기기 내부에서 대부분의 일들이 자동으로 이루어져서 마치 802.3을 사용하는 것과 같이 쓸 수 있도록 만들어진 장비들이 풀맥 디바이스고요, 그게 아닌 경우에는 드라이버 내부에서 더 많은 일들이 일어나게 됩니다.
ath9k의 경우에는 백오프 카운터 같은 경우에는 드라이버가 아닌 펌웨어 내부에 있는듯 합니다.(코드를 전부 볼수는 없었지만 백오프 카운터 시의 난수발생 같은 부분을 따로 찾을 수가 없네요)
백오프 카운터에 관한 설정중 일부는 드라이버 내부에 있고요.
쉽게 생각하시면 안됩니다. 코드가 꽤 깁니다(20MB 이상). 전부 읽어보실 수는 없을꺼에요..
일단, 백오프 카운터 같은 경우는 펌웨어를 수정하셔서 펌웨어->드라이버 로 정보를 보내시고 드라이버에서 로그 메시지로 출력하시는 방법 이외에는 떠오르질 않네요.
그리고 물리계층의 data rate 같은 경우는 전송 모드를 드라이버 내부에서 바꾸어 설정해 줄 수 있습니다.
하지만 쉽진 않을것 같네요.
힘내세요
댓글 달기