network driver의 ioctl

darkblue99의 이미지

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) .. 뭐 이런식..)

그 방법좀 알려주세요.
그리고 주의할 사항도.. 부탁..

skjean의 이미지

network driver는 장치 파일을 가지지 않습니다.
ioctl은 raw socket을 이용해서 작성합니다.

다른 예도 많이 있지만...
아래의 코드를 한번 참조해 보시길 바랍니다.

www.linux.it/kerneldocs/vinter/vinter.html

darkblue99의 이미지

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!

hb_kim의 이미지

정답을 적어주셨네요. 그렇게 하시는게 정석입니다.

SCSI layer 의 sg 드라이버가 그와 같이 하는것으로 알고 있습니다.

darkblue99의 이미지

정답이라니 다행이네요~ :-)
그런데 어떤 드라이버에서 그런 예를 볼수 있는지
조금만 더 -.-;
설명을 부탁드립니다.

Be Postive!

hb_kim의 이미지

darkblue99 wrote:
정답이라니 다행이네요~ :-)
그런데 어떤 드라이버에서 그런 예를 볼수 있는지
조금만 더 -.-;
설명을 부탁드립니다.

drivers/message/fusion 에 보시면 HBA 하나를 여러가지
디바이스로 export 하는것이 나오는데 예제로 쓰기에는 조금
복잡해서 review 를 권해드리고 싶지는 않군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.