2002-06-10 18:09:57

by Joseph Cheek

[permalink] [raw]
Subject: procedure for creating new ioctl?

hi all,

i'd like to create a new ioctl for use in my kernels [actually i already
have 8-)] but want to make sure that i follow any established procedure
for creating it before requesting it be included in the kernel.
specifically, is there a way to ensure the ioctl number i use isn't in
use by anyone else? is there a central registry?

so far i've just picked an arbitrary number:

sanfrancisco:/usr/src/linux-2.4.17/include/linux# diff -Naur kd.h{.orig,}
--- kd.h.orig Mon Jun 10 11:08:22 2002
+++ kd.h Thu Jun 6 16:00:33 2002
@@ -177,4 +177,6 @@
don't reuse for the time being */
/* note: 0x4B60-0x4B6D, 0x4B70-0x4B72 used above */

+#define KDGETKEYDOWNSTATE 0x4B80 /* read kernel keydown bit */
+
#endif /* _LINUX_KD_H */

any tips, pointers appreciated.

joe

--
Joseph Cheek, CTO and Founder, Lycoris
[email protected], http://www.lycoris.com
Lycoris Desktop/LX: Familiar. Powerful. Open.
+1 425 413-9521 voice, +1 425 671-0504 fax



2002-06-10 18:17:38

by Richard B. Johnson

[permalink] [raw]
Subject: Re: procedure for creating new ioctl?

On Mon, 10 Jun 2002, Joseph Cheek wrote:

> hi all,
>
> i'd like to create a new ioctl for use in my kernels [actually i already
> have 8-)] but want to make sure that i follow any established procedure
> for creating it before requesting it be included in the kernel.
> specifically, is there a way to ensure the ioctl number i use isn't in
> use by anyone else? is there a central registry?
>
> so far i've just picked an arbitrary number:
>
> sanfrancisco:/usr/src/linux-2.4.17/include/linux# diff -Naur kd.h{.orig,}
> --- kd.h.orig Mon Jun 10 11:08:22 2002
> +++ kd.h Thu Jun 6 16:00:33 2002
> @@ -177,4 +177,6 @@
> don't reuse for the time being */
> /* note: 0x4B60-0x4B6D, 0x4B70-0x4B72 used above */
>
> +#define KDGETKEYDOWNSTATE 0x4B80 /* read kernel keydown bit */
> +
> #endif /* _LINUX_KD_H */
>
> any tips, pointers appreciated.
>
> joe
>

I use SIOCDEVPRIVATE as the starting value for new ioctls:

/*
* Interface to the private device functions. User API sees this only.
*/
#define CHEK_SEEPROM SIOCDEVPRIVATE + 0x07
#define READ_SEEPROM SIOCDEVPRIVATE + 0x08
#define WRITE_SEEPROM SIOCDEVPRIVATE + 0x09


I've seen this in several drivers. I think this is the way to do it
so there is no interference with other ioctls.

Cheers,
Dick Johnson

Penguin : Linux version 2.4.18 on an i686 machine (797.90 BogoMips).

Windows-2000/Professional isn't.

2002-06-10 19:58:05

by Andreas Dilger

[permalink] [raw]
Subject: Re: procedure for creating new ioctl?

On Jun 10, 2002 14:17 -0400, Richard B. Johnson wrote:
> I use SIOCDEVPRIVATE as the starting value for new ioctls:
>
> /*
> * Interface to the private device functions. User API sees this only.
> */
> #define CHEK_SEEPROM SIOCDEVPRIVATE + 0x07
> #define READ_SEEPROM SIOCDEVPRIVATE + 0x08
> #define WRITE_SEEPROM SIOCDEVPRIVATE + 0x09
>
>
> I've seen this in several drivers. I think this is the way to do it
> so there is no interference with other ioctls.

Of course there is. That means that a program accidentally running on
the wrong device will get completely unexpected results because the
ioctl numbers will all be some value above SIOCDEVPRIVATE.

Since each of the drivers have (mostly) their own private ioctl handling,
there is less of an issue of actual ioctl number conflicts as there
is an issue that ioctl numbers should be globally unique to avoid
accidental side effects when running on an incorrect device.

Besides which, SIOCDEVPRIVATE is supposed to be for socket (networking)
ioctls and not just random ioctl values. The comment above it also
indicates this value is deprecated...

Cheers, Andreas
--
Andreas Dilger
http://www-mddsp.enel.ucalgary.ca/People/adilger/
http://sourceforge.net/projects/ext2resize/