Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Jul 2002 00:29:39 +0200
From:      Cyrille Lefevre <cyrille.lefevre@laposte.net>
To:        Juan Francisco Rodriguez Hervella <jrh@it.uc3m.es>
Cc:        freebsd-net@FreeBSD.ORG
Subject:   Re: sysctl inferface question
Message-ID:  <20020711222939.GE21234@gits.dyndns.org>
In-Reply-To: <3D2D9D4E.74A1B6F4@it.uc3m.es>
References:  <3D2D9D4E.74A1B6F4@it.uc3m.es>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jul 11, 2002 at 04:59:26PM +0200, Juan Francisco Rodriguez Hervella wrote:
> 
> I'm very confused with the sysctl internals.
> 
> For example, looking at the kernel source code of FreeBSD, I've realized
> 
> of the following:
> 
> netinet/in_proco.c:
>             SYSCTL_NODE(_net_inet6, IPPROTO_DIVERT,     divert,
> CTLFLAG_RW, 0,  "DIVERT");
> netinet/ip_divert.c:
>             SYSCTL_DECL(_net_inet_divert);
> netinet/ip_divert.c:
>             SYSCTL_PROC(_net_inet_divert, OID_AUTO, pcblist, CTLFLAG_RD,
> 0, 0,
>             div_pcblist, "S,xinpcb", "List of active divert sockets");
> 
> Isn't this redundant ? I mean, if there is a "SYSCTL_NODE", there is
> *no* need for having
> "SYSCTL_DECL" in "ip_divert.c"... I am wrong ?

to define a node (pcblist here), you have to declare the node
(_net_inet_divert here) you want attach it before.

> Also, I don't undertand the meaning of the "fmt" field....what is it for
> ? What's the
> meaning of "S,xinpcb" in the above example ?

the format strings isn't used by the kernel but is by the sysctl(1) command.
take a look around lines 556-589 (show_var) in /usr/src/sbin/sysctl/sysctl.c :

        case 'S':
                i = 0;
                if (strcmp(fmt, "S,clockinfo") == 0)
                        func = S_clockinfo;
                else if (strcmp(fmt, "S,timeval") == 0)
                        func = S_timeval;
                else if (strcmp(fmt, "S,loadavg") == 0)
                        func = S_loadavg;
                else if (strcmp(fmt, "T,dev_t") == 0)
                        func = T_dev_t;
                else
                        func = NULL;
                if (func) {
                        if (!nflag)
                                printf("%s%s", name, sep);
                        return ((*func)(len, p));
                }
                /* FALL THROUGH */
        default:
                if (!oflag && !xflag)
                        return (1);
                if (!nflag)
                        printf("%s%s", name, sep);
                printf("Format:%s Length:%d Dump:0x", fmt, len);
                while (len-- && (xflag || p < val + 16))
                        printf("%02x", *p++);
                if (!xflag && len > 16)
                        printf("...");
                return (0);

so, the "S" is required, but, IMHO, ",xinpcb" is just informative for now.

# sysctl net.inet.divert
# sysctl net.inet.divert.pcblist
# sysctl -A net.inet.divert 
net.inet.divert.pcblist: Format:S,xinpcb Length:336 Dump:0x18000000010000000100000000000000...
# sysctl -A net.inet.divert.pcblist
(same)

Cyrille.
-- 
Cyrille Lefevre                 mailto:cyrille.lefevre@laposte.net
12, Rue de Bizerte 75017 Paris  http://clefevre.fr.st
tel/fax: +33 (0)1 45 22 83 85   gsm: +33 (0)6 80 94 76 63

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020711222939.GE21234>