network driver의 ioctl
network device 이지만, 기타 다양한 기능을 하는 chip을 쓰는 driver를 구현중입니다.
그런데 network device의 경우
ioctl로 application에서 접근시 그냥 ioctl을 쓸수 있는지,
아니면 dev->do_ioctl 을 통해서만 가능한지..
만약 그렇다면 dev->do_ioctl 을 통해 접근하는 방법은 어떤지(example)
알고 싶습니다.
음.. layer로 그리면
Network Application....................| ioctl로 제어하는 다른 application
=============================================
Linux Network module in kernel |(via ioctl)
------------------------------------------------------------------------------
.......................... . network device driver.
=============================================
................................... network 장치
입니다. 맨위의 socket 으로 접근하는 network program이 있고,
이때 /dev/ethX 로 접근합니다.
그런데 같은 /dev/ethX 로 ioctl로 접근하는 다른 application을 짜고 싶은 겁니다. ( fd = open("/dev/ethX", ..) 한뒤..
ioctl(fd, IOCTL_XXXX, arg) .. 뭐 이런식..)
그 방법좀 알려주세요.
그리고 주의할 사항도.. 부탁..
network driver는 장치 파일을 가지지 않습니다.ioctl은
network driver는 장치 파일을 가지지 않습니다.
ioctl은 raw socket을 이용해서 작성합니다.
다른 예도 많이 있지만...
아래의 코드를 한번 참조해 보시길 바랍니다.
www.linux.it/kerneldocs/vinter/vinter.html
다른 approach
virtual network interface를 읽어보았습니다. 빠르고 좋은 답변 감사합니다.
하지만 그 결과는 좀 실망입니다. 제가 생각했던 방법을 쓰지 못하게 되었네요.. ㅠ.ㅠ
virtual network interface를 사용하면, ioctl을 call하는 건 socket을 통해서만 되고, 또 그 갯수도 제한이 있네요.
하지만 전 socket을 통해 접근하면 힘들어지고 ioctl갯수도 훨씬 많아야 합니다.
그래서
driver를 2개의 layer로 나누는 것에 대해 여쭈어봅니다.
그러니까
Network Application.................| ioctl로 제어하는 다른 application
=============================================
Linux Network module in kernel | ........ (via ioctl)
-----------------------------------------
...........network device driver. |
----------------------------------------------------------------------------------
................................. 장치를 제어하는 device driver...
=============================================
................................... network 장치
위처럼 해서 driver를 두개로 나누어 하위의 layer는 HAL을 지원하고, 또한 network driver가 아닌 char device driver로 등록하여
단독으로 open/close/read/write/ioctl을 구현하며,symbol을 export합니다.
상위의 network device driver는 하위의 driver에서 export된 symbol을 이용해서 network driver로 등록을 하고, kernel의 network module과 연결됩니다.
이런 식으로 구현을 하는 것은 어떨까요?
즉, 2개의 layer로 나뉘어 하위의 드라이버는 따로 장치파일을 가지며, application과 systemcall로 연동되어 동작할 수 있으면서도 export symbol을 통해 다른 driver와 연결되고
상위의 드라이버는 순수한 network driver이지만 실제 buffer등에 접근하는 것은 다른 드라이버에서 export된 symbol을 쓰는 것입니다.
가능할까요? 가능할것 같은데.. -.-? 문제가 있을까나??
부디 빠른 답변 부탁드립니다 ㅠ_ㅠ
Be Postive!
정답을 적어주셨네요. 그렇게 하시는게 정석입니다.SCSI laye
정답을 적어주셨네요. 그렇게 하시는게 정석입니다.
SCSI layer 의 sg 드라이버가 그와 같이 하는것으로 알고 있습니다.
좀더 자세히 부탁드립니다.
정답이라니 다행이네요~ :-)
그런데 어떤 드라이버에서 그런 예를 볼수 있는지
조금만 더 -.-;
설명을 부탁드립니다.
Be Postive!
Re: 좀더 자세히 부탁드립니다.
drivers/message/fusion 에 보시면 HBA 하나를 여러가지
디바이스로 export 하는것이 나오는데 예제로 쓰기에는 조금
복잡해서 review 를 권해드리고 싶지는 않군요.
댓글 달기