There isn't a standard way to configure the kernel and we have:

    ioctls
        ioctl(fd,....). I.E. you must get a file descriptor.
        So to configure global networking parameters, you
        create a socket and operate on that. A major wart IMHO,
        and not at all intuitive.
    sysctls
        sysctl() or the /proc/sys mirror (why use sysctl()?)
    /proc/files
        various non standard placed/named/format files.
    /dev/files
        /dev/inet/* /dev/route ... used to configure various things.

I think any configuration can be presented/performed adequately
using a file based interface, which has the advantage that
scripts can use it, and is much simpler. But most importantly is
generic, so generic abstraction code can be written between the
kernel and userspace.

Since ioctls and sysctls do everything, they have no type
checking, and return non standard parameters, i.e. completely
negating any advantage over a file based interface that they
could possibly have.

(look back at MAC address code to see how complex ioctls are).

Also configuration for specific files (streams of data) is
done using fcntl which is fine. But what about the setsockopt() wart?