Int 2F Fn C000 - Novell Odi Link Support Layer (lsl.com) - Installation [N]

AX = C000h

Return: AL = FFh if installed
DX:BX -> FAR entry point (see #2670,#2671,#2672)
ES:SI -> signature string "LINKSUP$"
Range: AH=C0h to AH=FFh, selected by scanning for first free multiplex number

Note: on return, ES = DX for LSL v1.10 and v2.05; LSL makes use of this in
its search for a previous installation

See Also: AX=5100h,AX=C000h"NESL"

(Table 2670)
Call LSL function "Request MLID Registration" with:
BX = 0001h
ES:SI -> registration??? record (see #2674)
DS:DI -> buffer for LSL information block (see #2675)

Return: AX = completion code (0000h,8001h) (see #2673)
DS:DI buffer filled if successful
BX,CX corrupted

Note: see "Novell LAN Driver Developer's Guide, Volume III" for more details

(Table 2671)
Call LSL function "get support entry points" with:
BX = 0002h
ES:SI -> buffer for entry point record (see #2676)

Return: ES:SI buffer filled

(Table 2672)
Call LSL function "Request MLID API entry point" with:
BX = 0003h

Return: ES:SI -> MLID (Multiple Link Interface Driver) API entry point
(call with BX=function 00h-10h, not range-checked)

Note: LSL v1.10 and v2.05 execute BX=0003h for BX=0000h and any BX >= 0003h

(Table 2673)
Values for LSL 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 LSL registration record:
Offset Size Description (Table 2674)
00h DWORD -> ??? FAR function (to be called with ES:SI -> ??? and
returning AX = completion code)
04h DWORD -> ???
08h DWORD -> ??? data (at least 3Eh bytes)

Format of LSL information block:
Offset Size Description (Table 2675)
00h DWORD -> ??? entry point (called with BX=function 00h-11h)
04h WORD ???
06h WORD ???

Note: due to a fencepost error, LSL v2.05 (distributed with Novell DOS 7)
will crash if the above entry point is called with BX=0012h

Format of entry point record:
Offset Size Description (Table 2676)
00h DWORD pointer to protocol support entry point in LSL (see #2677)
04h DWORD pointer to general support entry point in LSL (see #2678)

(Table 2677)
Call protocol support entry point with:
BX = function number
0000h ???
0001h ???
0002h ???
0003h "ScheduleAESEvent"
ES:SI -> AES ECB to be scheduled (see #2681)

Return: ES,SI preserved
0004h "CancelAESEvent"
ES:SI -> ECB to be cancelled (see #2681)

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 #2691)

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 #2692)
0009h "DeRegisterDefaultStack"
AX = logical board number
000Ah "RegisterPrescanStack"
AX = logical board number
ES:SI -> stack info structure (see #2692)
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 #2679) 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 #2680)
0014h "GetLSLStatistics"

Return: AX = 0000h (successful)
ZF set
ES:SI -> LSL statistics table (see #2683)
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 #2682)
001Ah "GetTickMarker"

Return: AX = number of 55ms ticks since LSL loaded
BX destroyed

Return: AX = completion code (see #2673)
ZF set if successful
SS:SP, DS, BP preserved; most other registers may be destroyed

(Table 2678)
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 #2693)
0006h "RemoveGeneralService"
ES:SI -> General Service Control Block (see #2693)
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 #2694)
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 #2673)
ZF set if successful
SS:SP, DS, BP preserved

(Table 2679)
Call MLID control handler with:
AX = logical board number
BX = function number
0000h "GetMLIDConfiguration"

Return: ES:SI -> MLID's configuration table if successful
(see #2686 for format)
0001h "GetMLIDStatistics"

Return: ES:SI -> MLID's statistics table if successful
(see #2686 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)
000Ah "PromiscuousChange"
CX = what to receive promiscuously
bit 0: MAC frames
bit 1: non-MAC frames
000Bh "RegisterReceiveMonitor"
CX = subfunction
0000h disable receive monitoring
else enable receive monitoring
ES:SI -> monitor receive routine
ES:DI -> monitor transmit routine
000Ch "Driver Poll" (obsolete?)
???

Return: AX = completion code (see #2673)
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

(Table 2680)
Call protocol stack control entry point with:
BX = function number
0000h "GetProtocolStackConfiguration"

Return: ES:SI -> protocol stack's configuration table
(see #2685)
0001h "GetProtocolStackStatistics"

Return: ES:SI -> protocol stack's statistics table (see #2684)
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 (Table 2681)
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.

See Also: #2695

Format of LSL Configuration Table:
Offset Size Description (Table 2682)
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 (Table 2683)
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

See Also: #2684,#2690

Format of Protocol Stack Statistics Table:
Offset Size Description (Table 2684)
00h BYTE statistics table major version

.NG limit reached, continued in next section...