Annotation of driverkit/notes/IOStatsMemo, revision 1.1

1.1     ! root        1: {\rtf0\ansi{\fonttbl\f0\fmodern Ohlfs;\f1\fmodern Courier;}
        !             2: \paperw13040
        !             3: \paperh10200
        !             4: \margl120
        !             5: \margr120
        !             6: {\colortbl\red0\green0\blue0;}
        !             7: \pard\tx1152\tx2304\tx3456\tx4608\tx5760\tx6912\tx8064\tx9216\tx10368\tx11520\f0\b0\i0\ul0\fs24 At a meeting last Friday on the general subject of the NRW Token Ring driver, a subject came up which potentially applies to all NRW and IODevice-based drivers. This is the issue of a general "get and set parameters" mechanism which can be used on all drivers - in the Kernel and in user space - from User level Apps and utilities like iostat, netstat, and device-speciifc configuration utilities. iostat needs to get disk tty statistics; network interfaces need to be configured for transfer rate or "which wire" (TPE or thin wire), etc. \
        !             8: \
        !             9: 
        !            10: \f1\b\fs28 The problems:
        !            11: \f0\b0\fs24 \
        !            12: \
        !            13: * There is no unified name space for device drivers in the Kernel. There is\
        !            14:   nmserver for drivers in User space, but that's not really useful for looking\
        !            15:   up devices you don't know anything about, and Kernel drivers can't advertise\
        !            16:   in the nmserver. The name space issue is a hot button for 4.0.\
        !            17:   \
        !            18: * There will be no Remote Object functionality in the 3.0 or 3.1 Kernel.\
        !            19: \
        !            20: 
        !            21: \f1\b\fs28 The goals:
        !            22: \f0\b0\fs24 \
        !            23: \
        !            24: * We want a simple, extensible mechanism by which an App or utility can \
        !            25:   contact any driver and get or set any integer paramater specific to \
        !            26:   that driver. \
        !            27:   \
        !            28: * We want a mechanism which will work the same - from an App's point of \
        !            29:   view - for Kernel drivers and User drivers.\
        !            30:   \
        !            31: 
        !            32: \f1\b\fs28 The Proposal:
        !            33: \f0\b0\fs24 \
        !            34: \
        !            35: * The App/utility API for the proposed mechanism involves three new RPCs. \
        !            36:   These can be executed by any task with root privileges.\
        !            37: \
        !            38: 
        !            39: \fc0   to find out what's there:\
        !            40:   \
        !            41: 
        !            42: \f1   dev_return_t 
        !            43: \b dev_inquire
        !            44: \b0 (\
        !            45:        port_t 
        !            46: \i device_master
        !            47: \i0 ,  \
        !            48:        int 
        !            49: \i devUnit
        !            50: \i0 ,                  // global device "unit num space"\
        !            51:        devtype_t *
        !            52: \i devType
        !            53: \i0 ,          // e.g., "SCSIDisk", "Ethernet", etc.)\
        !            54:        devname_t *
        !            55: \i devName
        !            56: \i0            // e.g., "BlockSCSIDisk0a"\
        !            57:   );\
        !            58: 
        !            59: \f0   \
        !            60:   to get general parameter for devUnit n:\
        !            61:   \
        !            62: 
        !            63: \f1   dev_return_t 
        !            64: \b dev_param
        !            65: \b0 (\
        !            66:        port_t 
        !            67: \i device_master
        !            68: \i0 ,\
        !            69:        int 
        !            70: \i devUnit
        !            71: \i0 ,\
        !            72:        char 
        !            73: \i paramName
        !            74: \i0 [PARAM_NAME_SIZE],\
        !            75:        int *
        !            76: \i parameter
        !            77: \i0 ,                  // returned\
        !            78:   );\
        !            79: 
        !            80: \f0   \
        !            81:   to set general parameter in devUnit n:\
        !            82:   \
        !            83: 
        !            84: \f1   dev_return_t 
        !            85: \b dev_set_param
        !            86: \b0 (\
        !            87:        port_t 
        !            88: \i device_master
        !            89: \i0 ,\
        !            90:        int 
        !            91: \i devUnit
        !            92: \i0 ,\
        !            93:        char 
        !            94: \i paramName
        !            95: \i0 [PARAM_NAME_SIZE],\
        !            96:        int 
        !            97: \i parameter
        !            98: \i0                    // returned\
        !            99:   );\
        !           100: 
        !           101: \f0 \
        !           102: The dev_inquire() call is used to find out what devices are "out there". Once an App finds a devUnit corresponding to a device its interested in dealing with, it uses that devUnit for further operations. \
        !           103: \
        !           104: dev_param() and dev_set_param() are used to get and set any arbitrary parameter for a specified devUnit; the parameter is addressed by string paramName.\
        !           105: \
        !           106: * For IODevice-based drivers, there are two new instance varibales and \
        !           107:   two new methods:\
        !           108:   \
        !           109:   New IODevice instance variables:\
        !           110:   \
        !           111: 
        !           112: \f1   typedef char devType_t[DEV_TYPE_SIZE];\
        !           113:   typedef char devName_t[DEV_NAME_SIZE];\
        !           114:   \
        !           115:   devType_t devType;\
        !           116:   devName_t devName;\
        !           117: 
        !           118: \f0   \
        !           119:   A driver must initialize these instance variables prior to calling the \
        !           120:   existing registerDevice: method.\
        !           121:   \
        !           122:   New IODevice methods:\
        !           123: \
        !           124: 
        !           125: \f1   - (dev_return_t)getParam:(const char *)paramName param:(int *)parameter;\
        !           126:   - (dev_return_t)setParam:(const char *)paramName param:(int)parameter;\
        !           127: 
        !           128: \f0   \
        !           129:   Any subclass can override these to handle new parameters; any not known \
        !           130:   are passed up to [super getParam:]. Thus, standard NetDriver parameters\
        !           131:   like "inPackets" can be handled by the NetDriver superclass, which \
        !           132:   subclasses can implement their own device-specific parameters, leaving \
        !           133:   the standard ones to NetDriver.\
        !           134:     \
        !           135:     e.g. in NetDriver:\
        !           136:     \
        !           137: 
        !           138: \f1     - (int)getParam:(const char *)paramName\
        !           139:     \{\
        !           140:        if(strcmp(paramName, "inPackets"))\
        !           141:                return (if_ipackets([self getNetif]);\
        !           142:        else if (...)\
        !           143:                return whatever;\
        !           144:        else\
        !           145:                return [super getParam:paramName];\
        !           146:     \}\
        !           147: 
        !           148: \f0 \
        !           149: * It's a trivial matter to map devUnit numbers to id's of IODevice instances\
        !           150:   which register themselves via registerDevice:. \
        !           151:   \
        !           152: Note that there will be a separate "devUnit" space for Kernel and User. The Three new RPCs defined above will work the same for both. \
        !           153: \
        !           154: That's my proposal. Some questions:\
        !           155: \
        !           156: * How do people feel about addressing parameters by string rather than by \
        !           157:   #defined or enumerated ints?\
        !           158:   \
        !           159: * Will this "one integer parameter at a time" mechanism be sufficient?\
        !           160: \
        !           161: Comments?\
        !           162: \
        !           163: --dpm
        !           164: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.