Subject: Re: dynamic sysctl
To: Pavel Cahyna <pavel.cahyna@st.ms.mff.cuni.cz>
From: Andrew Brown <atatat@atatdot.net>
List: tech-kern
Date: 11/14/2003 12:00:47
>> this idea has been bandied about a few times before, and i even started
>> trying to do it about 2.5 years ago (but shortly thereafter, i realized
>> that while i though i knew how i wanted to do it, i was actually not
>> sure). strangely enough, i picked it up again about eight months ago
>> (almost two years to the day after i started the first time), but this
>> time i got it done.
>
>This is very good!
yes. :)
>> my mental list of requirements were:
>>
>> * sysctl(8) no longer has to be recompiled to be able to display new
>> entries (though it still will if the new entry is a "struct", not one of
>> the others, and you want it printed intelligently). it would instead
>
>Why are structs needed? One would think that the sysctl tree is already
>structured enough.
ps, for example, uses sysctl to ask the kernel for a "large binary
bloc that describes a given set of (or all) processes". this is a
"struct". sysctl(8) can print a few of the simpler structs (see
kern.boottime or vm.loadavg for examples), but most of the structs are
for consumption by specific programs.
>> make use of a new sysctlnametomib() function and/or walk the tree by
>> itself, learning it on the fly.
>
>How exacly will the sysctlnametomib() function work? Will it read some
>configuration files with MIB definitions, like in SNMP? How will walking
>the tree work? Will the kernel know the MIB names and present it to the
>userland via some API?
sysctlnametomib() will use sysctl() to ask the kernel for the
name<->number mapping at a given level (eg kern.* or net.inet.*). i
toyed with the idea of "caching" the mapping in a "database", but
never bothered actually to implement it, since sysctlnametomib()
caches the information itself. calling sysctlnametomib() only once
has a certain cost, but as you call it more within a given process,
that cost is amortized. walking the tree merely consists of getting
the top-level mapping, getting the mapping for the subtree you want,
and continuing downwars until you find the node you want, complete
with an expected size (eg ints are 4 bytes, u_quad_ts are 8, etc) and
a simple hint or two about presentation. the kernel knows all the mib
names, except for the user subtree. that's still implemented in libc.
hope this helps. :)
--
|-----< "CODE WARRIOR" >-----|
codewarrior@daemon.org * "ah! i see you have the internet
twofsonet@graffiti.com (Andrew Brown) that goes *ping*!"
werdna@squooshy.com * "information is power -- share the wealth."