INT 2F - Novell ODI Link Support Layer (LSL.COM) - INSTALLATION CHECK AX = C000h Return: AL = FFh if installed DX:BX -> FAR entry point (see below) ES:SI -> signature string "LINKSUP$" Notes: LSL.COM may use any multiplex number between C0h and FFh; it searches for itself in that range, and installs using the first free multiplex number in the range if not already loaded. on return, ES = DX for LSL v1.10; LSL makes use of this in its search for a previous installation Call LSL entry point with: BX = 0001h "Request MLID Registration" ES:SI -> ??? ??? Return: AX = completion code (see below) DS:DI -> LSL information block BX = 0002h get support entry points ES:SI -> buffer for entry point record (see below) Return: ES:SI buffer filled BX = 0003h "Request MLID API entry point" Return: ES:SI -> MLID (Multiple Link Interface Driver) API entry point (call with BX=function 00h-10h, not range-checked) Notes: LSL v1.10 executes BX=0003h for all other values of BX see "Novell LAN Driver Developer's Guide, Volume III" for details of function 0001h Values for completion code: 0000h successful 8001h out of resources 8002h bad parameter 8003h no more items 8004h item not present 8005h failed 8006h receive overflow 8007h canceled 8008h bad command 8009h duplicate entry 800Ah no such handler 800Bh no such driver Format of entry point record: Offset Size Description 00h DWORD pointer to protocol support entry point in LSL (see below) 04h DWORD pointer to general support entry point in LSL (see below) Call protocol support entry point with: BX = function number 0000h ??? 0001h ??? 0002h ??? 0003h "ScheduleAESEvent" ES:SI -> AES ECB to be scheduled (see below for format) Return: ES,SI preserved 0004h "CancelAESEvent" ES:SI -> ECB to be cancelled (see below for format) Return: ES,SI preserved 0005h "GetIntervalMarker" Return: DX:AX = current interval marker in milliseconds all other registers preserved 0006h "RegisterStack" AX = logical board number ES:SI -> bound stack info structure (see below) Return: BX = assigned Stack ID if AX=0000h 0007h "DeRegisterStack" AX = protocol stack's assigned Stack ID 0008h "RegisterDefaultStack" AX = logical board number ES:SI -> stack info structure (see below) 0009h "DeRegisterDefaultStack" AX = logical board number 000Ah "RegisterPrescanStack" AX = logical board number ES:SI -> stack info structure (see below) 000Bh "DeRegisterPrescanStack" AX = logical board number 000Ch "SendPacket" ES:SI -> send ECB Return: interrupts disabled 000Dh ??? 000Eh ??? 000Fh ??? 0010h "GetStackIDFromName" ES:SI -> counted NUL-terminated protocol name (max 15 chars) Return: BX = Stack ID if AX=0000h 0011h "GetPIDFromStackIDBoard" AX = Stack ID for protocol CX = logical board number ES:SI -> 6-byte buffer for protocol ID 0012h "GetMLIDControlEntry" AX = logical board number Return: ES:SI -> MLID control handler (see below) if AX=0000h 0013h "GetProtocolControlEntry" AX = Stack ID or FFFEh Prescan stack CX = logical board number FFFFh default protocol CX = logical board number Return: ES:SI -> protocol stack control entry point if AX=0000h (see below) 0014h "GetLSLStatistics" Return: AX = 0000h (successful) ZF set ES:SI -> LSL statistics table (see below) 0015h "BindStack" AX = protocol stack's assigned Stack ID CX = logical board number 0016h "UnbindStack" AX = protocol stack's assigned Stack ID CX = logical board number 0017h "AddProtocolID" AX = frame type ID code ES:SI -> 6-byte protocol ID CX:DI -> counted NUL-terminated short protocol name (max 15 ch) 0018h "RelinquishControl" Return: after LSL performs any necessary background processing 0019h "GetLSLConfiguration" Return: AX = 0000h (successful) ZF set ES:SI -> LSL configuration table (see below) 001Ah "GetTickMarker" Return: AX = number of 55ms ticks since LSL loaded BX destroyed Return: AX = completion code (see above) ZF set if successful SS:SP, DS, BP preserved; most other registers may be destroyed Call general support entry point with: BX = function number 0000h "Allocate Memory" (obsolete) always returns AX=8008h (BAD_COMMAND) 0001h "Free Memory" (obsolete) always returns AX=8008h (BAD_COMMAND) 0002h "Realloc Memory" (obsolete) always returns AX=8008h (BAD_COMMAND) 0003h "Memory Statistics" (obsolete) always returns AX=8008h (BAD_COMMAND) 0004h "Add Memory To Pool" (obsolete) always returns AX=8008h (BAD_COMMAND) 0005h "AddGeneralService" ES:SI -> General Service Control Block (see below) 0006h "RemoveGeneralService" ES:SI -> General Service Control Block (see below) 0007h "GetNETcfgPath" Return: AX = 0000h (successful) DS:DX -> ASCIZ pathname for NET.CFG 0008h U ??? (in LSL 1.10) Return: AX = 0000h ES:SI -> ??? (a 22-byte data area) 000Ah "GetCriticalSectionStatus" Return: BX = total outstanding calls to "StartCriticalSection" 000Bh "ServiceEvents" interrupts disabled Return: interrupts disabled 0010h "GetStackECB" DS:DI -> Lookahead structure (see below) interrupts disabled Return: ES:SI -> ECB if successful (AX=0000h,ZF set) interrupts disabled 8000h-FFFFh reserved for user general service providers Return: AX = completion code (see above) ZF set if successful SS:SP, DS, BP preserved Call MLID control handler with: AX = logical board number BX = function number 0000h "GetMLIDConfiguration" Return: ES:SI -> MLID's configuration table if successful (see below for format) 0001h "GetMLIDStatistics" Return: ES:SI -> MLID's statistics table if successful (see below for format) 0002h "AddMulticastAddress" ES:SI -> 6-byte multicast address to add 0003h "DeleteMulticastAddress" ES:SI -> 6-byte multicast address to delete 0005h "MLIDShutdown" CX = type 0000h permanent (also deregisters from LSL) other temporary (shutdown hardware only) 0006h "MLIDReset" reinitialize board / restart from temp shutdown 0007h "Create Connection" (obsolete?) ??? 0008h "Delete Connection" (obsolete?) ??? 0009h "SetLookAheadSize" CX = requested lookahead size (00h-80h) 0010h "PromiscuousChange" CX = what to receive promiscuously bit 0: MAC frames bit 1: non-MAC frames 0011h "RegisterReceiveMonitor" CX = subfunction 0000h disable receive monitoring else enable receive monitoring ES:SI -> monitor receive routine ES:DI -> monitor transmit routine 0012h "Driver Poll" (obsolete?) ??? Return: AX = completion code (see above) ZF set if successful Note: not all boards/MLIDs support function 0010h; see bit 13 in the MLID mode flags field of the MLID's configuration table Call protocol stack control entry point with: BX = function number 0000h "GetProtocolStackConfiguration" Return: ES:SI -> protocol stack's configuration table (see below) 0001h "GetProtocolStackStatistics" Return: ES:SI -> protocol stack's statistics table (see below) 0002h "BindToMLID" CX = board number to bind to ES:SI -> implementation-dependant parameter string 0003h "UnBindFromMLID" CX = board number from which protocol should unbind ES:SI -> optional implementation-dependant parameter string 0004h "MLIDDeRegistered" CX = board number that has de-registered from LSL Return: AX = status 0000h successful else implementation-dependant error codes ZF set if successful SS:SP, DS, BP preserved Format of AES ECB: Offset Size Description 00h DWORD "AESLink" pointer used by LSL for list management 04h DWORD number of milliseconds to wait 08h DWORD "AESStatus" (is set to 00000000h when AES ESR is invoked) 0Ch DWORD -> function to be invoked when time expires ES:SI will point to this structure on entry, DS, BP, and SS:SP must be preserved. Format of LSL Configuration Table: Offset Size Description 00h BYTE major version of configuration table 01h BYTE minor version of configuration table (decimal, 0-99) 02h 8 BYTEs reserved 0Ah BYTE LSL major version (decimal) 0Bh BYTE LSL minor version (decimal, 0-99) ---LSL 1.0x --- 0Ch 14 BYTEs reserved ---LSL 1.10+ --- 0Ch WORD maximum number of boards which LSL can handle 0Eh WORD maximum number of protocol IDs which LSL can handle 10h 12 BYTEs reserved Format of LSL Statistics Table: Offset Size Description 00h BYTE major version of statistics table format 01h BYTE minor version of statistics table format (decimal, 0-99) 02h WORD "GenericCounters" number of counters in static portion of table 04h DWORD "ValidCountersMask" bit mask indicating which generic counters are actually used. Bit 31 = TotalTxPackets, bit 30 is the next field, etc. 08h DWORD "TotalTxPackets" total SendPacket requests made 0Ch DWORD reserved 10h DWORD reserved 14h DWORD "AESEventsCount" number of completed AES events 18h DWORD "PostponedEvents" number of events postponed due to critical sections inside the MLIDs 1Ch DWORD "CancelAESFailures" number of times CancelAESEvent failed 20h DWORD reserved 24h DWORD reserved 28h DWORD "TotalRxPackets" total number of GetStackECB requests 2ch DWORD "UnclaimedPackets" total number of packets not consumed by a protocol stack 30h WORD "NumberCustom" number of custom variables that follow 32h N DWORDs custom counters N DWORDs -> CustomCounterStrN (one per custom counter) var length-prepended and NULL terminated string for Counter 0 ... var length-prepended and NULL terminated string for Counter N-1 Format of Protocol Stack Statistics Table: Offset Size Description 00h BYTE statistics table major version 01h BYTE statistics table minor version (decimal, 0-99) 02h WORD number of generic counters following 04h DWORD "ValidCountersMask" (bitmask, bit 31 is TotalTxPackets) 08h DWORD TotalTxPackets 0ch DWORD TotalRxPackets 10h DWORD IgnoredRxPackets 14h WORD number of custom counters 16h N DWORDs custom counters N DWORDs -> CustomCounterStrN (one per custom counter) var length-prepended and NULL terminated string for Counter 0 ... var length-prepended and NULL terminated string for Counter N-1 Format of Protocol Stack Configuration Table: Offset Size Description 00h BYTE configuration table major version 01h BYTE configuration table minor version (decimal, 0-99) 02h DWORD -> counted NUL-terminated long descriptive name for protocol 06h DWORD -> counted NUL-terminated short name for protocol (15 chars) 0Ah BYTE protocol stack major version 0Bh BYTE protocol stack minor version (decimal, 0-99) 0Ch 16 BYTEs reserved for future use Format of MLID Configuration Table: Offset Size Description 00h 26 BYTEs signature 'HardwareDriverMLID ' (8 spaces on end) 1ah BYTE configuration table major version 1bh BYTE configuration table minor version (decimal, 0-99) 1ch 6 BYTEs node address 22h WORD MLID mode flags (see below) 24h WORD board number 26h WORD board instance (if more than one of same board installed) 28h WORD maximum packet size 2Ah WORD BestDataSize 2Ch WORD WorstDataSize 2Eh DWORD -> counted NUL-terminated long name for NIC 32h DWORD -> counted NUL-terminated short name for NIC (8 chars max) 36h DWORD -> counted NUL-terminated Frame and Media type 3Ah WORD reserved (0000h) 3Ch WORD frame type ID 3Eh WORD TransportTime (milliseconds) 40h DWORD -> SourceRouteHandler for TokenRing. (Used by ROUTE.COM) 44h WORD lookahead size 46h WORD line speed (Mbps if high bit clear, else Kbps) 48h WORD QueueDepth 4Ch 6 BYTEs reserved (0) 54h BYTE driver major version 55h BYTE driver minor version (decimal, 0-99) 56h WORD flags bits 10-9: specialized multicast support 00 = Group addressing is default for medium 01 = Invalid 10 = Filter group address in MLID. 11 = Adapter filters group address. bit 2: supports Micro Channel cards bit 1: supports ISA cards bit 0: supports EISA cards 58h WORD send retries 5Ah DWORD ConfigTableLink 5Eh WORD MLID sharing flags (see below) 60h WORD slot number 62h WORD I/O address 1 64h WORD I/O range 1 66h WORD I/O address 2 68h WORD I/O range 2 6Ah DWORD memory address 1 6Eh WORD memory size 1 70h DWORD memory address 2 74h WORD memory size 2 76h BYTE interrupt line 1 77h BYTE interrupt line 2 78h BYTE DMA line 1 79h BYTE DMA line 2 Bitfields for MLID mode flags: bit 15 MLID supports Octet Bit Reversal bit 14 node address is non-canonical bit 13 promiscuous mode is supported bit 12-8 reserved bit 7 LDataSize field in LookAhead structure supported bit 6 raw send supported bit 5 MLID needs to be polled by LSL bit 4 reserved (0) bit 3 multicasting is supported bit 2 not currently used by DOS ODI, set to 0. bit 1 network card uses DMA. bit 0 RealDriverBit, always set to 1. Bitfields for MLID sharing flags: bit 8 NIC can share DMA2 bit 7 NIC can share DMA1 bit 6 NIC can share IRQ2 bit 5 NIC can share IRQ1 bit 4 NIC can share Memory2 bit 3 NIC can share Memory1 bit 2 NIC can share IO2 bit 1 NIC can share IO1 bit 0 MLID is currently shut down Format of MLID Statistics Table: Offset Size Description 00h BYTE driver statistics table major version 01h BYTE driver statistics table minor version (decimal, 0-99) 02h WORD number of generic counters (typically 13) 04h DWORD "ValidCountersMask" (bit mask, bit 31 is TotalTxCount) 08h DWORD TotalTxCount 0Ch DWORD TotalRxCount 10h DWORD NoECBAvailableCount 14h DWORD TxTooBigCount 18h DWORD TxTooSmallCount 1ch DWORD RxOverflowCount 20h DWORD RxTooBigCount 24h DWORD RxTooSmallCount 28h DWORD TxMiscCount 2ch DWORD RxMiscCount 30h DWORD TxRetryCount 34h DWORD RxChecksumErrorCount 38h DWORD RxMismatchCount 3Ch WORD number of custom counters 3Eh N DWORDs custom counters N DWORDs -> CustomCounterStrN (one per custom counter) var length-prepended and NULL terminated string for Counter 0 ... var length-prepended and NULL terminated string for Counter N-1 Format of bound stack info structure: Offset Size Description 00h DWORD -> protocol stack's short name (counted, NUL-terminated) 04h DWORD -> receive handler 08h DWORD -> control handler Format of stack info structure: Offset Size Description 00h DWORD -> receive handler 04h DWORD -> control handler Format of General Service Control Block: Offset Size Description 00h DWORD -> next GSCB (maintained internally by LSL) 04h DWORD -> entry point for general service handler 08h WORD command code for this general service (8000h-FFFFh) Note: the control block must not be altered or deallocated until the general service is removed Format of Lookahead structure: Offset Size Description 00h DWORD -> Media header 04h DWORD -> lookahead buffer 08h WORD length of lookahead buffer 0Ah 6 BYTEs protocol ID 10h WORD logical board number 12h WORD lookahead size .