Commit 45acaef2 authored by Stewart Brodie's avatar Stewart Brodie
Browse files

Implemented h/w multicast filtering.

  Uses our DCI4 header file.
Detail:
  Now uses DCI4 MulticastRequest SWIs to selectively receive NetBEUI specific
    multicast IEEE frames.
  LLC_AttachDriver now takes an additional multicast MAC address parameter
    which is automatically claimed when the frames are claimed.
  Uses sys/dcistructs.h instead of its private ancient DCI4.h.  Some of the
    constants are different (old header shifted some numbers into correct
    positions for various calls - notably FRMLVL_* definitions).  Code modified
    to use the proper macros to construct these constants.
Admin:
  Build and tested briefly.  EHInfo reports MAR for IEEE frames has been set
    as expected, and *LanMan:LMLogon seems to work.

Version 1.87, 1.1.1.1.2.1. Tagged as 'LanManFS-1_87-1_1_1_1_2_1'
parent 79e90f66
......@@ -4,11 +4,11 @@
*
*/
#define Module_MajorVersion_CMHG 1.87
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 26 Aug 1998
#define Module_MinorVersion_CMHG 1.1.1.1.2.1
#define Module_Date_CMHG 04 Dec 1998
#define Module_MajorVersion "1.87"
#define Module_Version 187
#define Module_MinorVersion ""
#define Module_Date "26 Aug 1998"
#define Module_MinorVersion "1.1.1.1.2.1"
#define Module_Date "04 Dec 1998"
......@@ -38,12 +38,14 @@
#include "stdtypes.h"
#include "mbuf.h"
#include "dci4.h"
#include "sys/dcistructs.h"
#include "buflib.h"
#include "llc.h"
#include "stats.h"
#include "lanman.h" /* For LM_pw value */
#include "LanMan_MH.h"
#ifdef DEBUG
#ifdef TML
#include "debug:tml.h"
......@@ -123,10 +125,10 @@ typedef struct
static bool CallbackSet = false;
extern void LLC_CallbackFn(void);
int LLC_CallbackFn_handler(void)
int LLC_CallbackFn_handler(_kernel_swi_regs *r, void *pw)
{
(void) r;
(void) pw;
CallbackSet = false;
LLC_BackgroundProcess();
return 1;
......@@ -276,7 +278,7 @@ restart:
interrupting anything until the callback is complete.
*/
int TickerFn_handler ( _kernel_swi_regs *R, int pw )
int TickerFn_handler ( _kernel_swi_regs *R, void *pw )
{
struct Timer *pT;
......@@ -331,6 +333,9 @@ static BUFQUEUE LLC_RxRawQueue;
static int Net_DriverSWIbase;
static int Net_DriverUnitNo;
static bool Net_Attached=false;
static unsigned Net_DriverFlags;
static NETADDR Net_MultiAddr;
static const NETADDR *Net_MultiPtr;
/* -------------------------------- */
......@@ -345,7 +350,7 @@ int LLC_GetMTU ( void ) /* Returns LLC layer's maximum packet size */
R.r[0] = 0;
R.r[1] = Net_DriverUnitNo;
_kernel_swi ( Net_DriverSWIbase+DCI_GetNetworkMTU, &R, &R );
_kernel_swi ( Net_DriverSWIbase+DCI4GetNetworkMTU, &R, &R );
return R.r[2]-4;
}
......@@ -380,7 +385,7 @@ static bool TxSend ( NETADDR *dest, BUFCHAIN pB, bool DeleteAfterUse )
if ( DeleteAfterUse )
{
pB->m_list = NULL;
_swi(Net_DriverSWIbase+DCI_Transmit,
_swi(Net_DriverSWIbase+DCI4Transmit,
_INR(0,5),
0, /* Flags */
Net_DriverUnitNo,
......@@ -394,9 +399,9 @@ static bool TxSend ( NETADDR *dest, BUFCHAIN pB, bool DeleteAfterUse )
struct mbuf *pBsave = pB->m_list;
pB->m_list = NULL; /* Save m_list value */
_swi(Net_DriverSWIbase+DCI_Transmit,
_swi(Net_DriverSWIbase+DCI4Transmit,
_INR(0,5),
Transmit_ProtocolFrees, /* Flags */
TX_PROTOSDATA, /* Flags */
Net_DriverUnitNo,
bytecount, /* FrameType */
(int) pB,
......@@ -412,8 +417,6 @@ static bool TxSend ( NETADDR *dest, BUFCHAIN pB, bool DeleteAfterUse )
/* Receive handler --------- */
extern void ReceiveFn ( struct dib *pDib, struct mbuf *pData );
/* This module maintains a 'raw' receive queue, which is
filled up with Rx data at interrupt time. This is then
processed with LLC_RcvProcess() at a safe later time
......@@ -421,7 +424,7 @@ extern void ReceiveFn ( struct dib *pDib, struct mbuf *pData );
manually).
*/
int ReceiveFn_handler ( _kernel_swi_regs *R, int pw )
int ReceiveFn_handler ( _kernel_swi_regs *R, void *pw )
{
struct mbuf *pData = (struct mbuf *) R->r[1];
struct mbuf *pDnext;
......@@ -448,11 +451,11 @@ int ReceiveFn_handler ( _kernel_swi_regs *R, int pw )
/* ---------------------- */
static dci4_dib *FindDCIDriver ( char *name, int unit )
static Dib *FindDCIDriver ( char *name, int unit )
{
_kernel_swi_regs R;
dci4_chaindib *pCD, *pCD2;
dci4_dib *pD;
ChDib *pCD, *pCD2;
Dib *pD;
/* Get list of network drivers -------------- */
......@@ -463,13 +466,13 @@ static dci4_dib *FindDCIDriver ( char *name, int unit )
/* Search for correct one --------- */
pCD = (dci4_chaindib *)R.r[0];
pCD = (ChDib *)R.r[0];
pD = NULL;
while ( pCD != NULL )
{
if ( unit == pCD->chd_dib->dib_unit &&
strcmp ( name, pCD->chd_dib->dib_name ) == 0 )
strcmp ( name, (char *) pCD->chd_dib->dib_name ) == 0 )
{
pD = pCD->chd_dib;
}
......@@ -486,11 +489,18 @@ static dci4_dib *FindDCIDriver ( char *name, int unit )
/* DCI4 initialisation ----------- */
err_t LLC_AttachDriver( char *name )
#if DCIVERSION < 404
# error "Multicast filtering requires DCI v4.04 or later (TCPIPLibs-5_01 or later)"
#endif
static void DetachDriver(void);
err_t LLC_AttachDriver( char *name, const NETADDR *Multi_Addr )
{
_kernel_swi_regs R;
dci4_dib *pD;
Dib *pD;
char dname[20];
int filter_flags = FILTER_NO_UNSAFE | FILTER_CLAIM;
if ( name == NULL ||
sscanf( name, "%[^0123456789]%d", dname, &Net_DriverUnitNo) != 2 )
......@@ -518,7 +528,7 @@ err_t LLC_AttachDriver( char *name )
/* Get driver interface version: must be major version 4 */
R.r[0] = 0;
_kernel_swi ( Net_DriverSWIbase+DCI_DCIversion, &R, &R );
_kernel_swi ( Net_DriverSWIbase+DCI4Version, &R, &R );
debug1(" Driver version %d\n", R.r[1]);
......@@ -529,31 +539,69 @@ err_t LLC_AttachDriver( char *name )
R.r[0] = 0;
R.r[1] = Net_DriverUnitNo;
_kernel_swi ( Net_DriverSWIbase+DCI_Inquire, &R, &R );
_kernel_swi ( Net_DriverSWIbase+DCI4Inquire, &R, &R );
Net_DriverFlags = R.r[2];
debug1(" Driver flags: %Xh\n", R.r[2] );
if ( (R.r[2] & (Feature_Multicast | Feature_HardwareAddress) )
!= (Feature_Multicast | Feature_HardwareAddress) )
if ( (R.r[2] & (INQ_MULTICAST | INQ_HWADDRVALID) )
!= (INQ_MULTICAST | INQ_HWADDRVALID) )
return EDRIVERTYPE;
/* Save address */
memcpy ( LLC_MachineAddress.b, pD->dib_address, 6 );
/* Can the driver perform h/w multicast filtering? */
if (Net_DriverFlags & INQ_FILTERMCAST) {
filter_flags |= FILTER_SPECIFIC_MCAST;
}
else {
filter_flags |= FILTER_ALL_MCAST;
}
/* Now request ISO packets */
R.r[0] = Filter_MustEnsureSafe; /* Flags */
R.r[0] = filter_flags; /* Flags */
R.r[1] = Net_DriverUnitNo;
R.r[2] = FRMLVL_IEEE; /* Need 802.3 frames */
R.r[2] = 0;
SET_FRAMELEVEL(R.r[2], FRMLVL_IEEE); /* Need 802.3 frames */
R.r[3] = ADDRLVL_MULTICAST;
R.r[4] = ERRLVL_NO_ERRORS;
R.r[5] = LM_pw; /* Protocol handle (our PW) */
R.r[6] = (int) ReceiveFn; /* Receive handler function */
if ( _kernel_swi ( Net_DriverSWIbase + DCI_Filter, &R, &R ) != NULL )
if ( _kernel_swi ( Net_DriverSWIbase + DCI4Filter, &R, &R ) != NULL ) {
debug1(" Filter fail: %s\n", _kernel_last_oserror()->errmess);
return EPACKETTYPE;
}
Net_Attached = true;
if (Net_DriverFlags & INQ_FILTERMCAST) {
if (Multi_Addr) {
Net_MultiAddr = *Multi_Addr;
Net_MultiPtr = &Net_MultiAddr;
R.r[4] = R.r[3] = (int) Net_MultiPtr;
R.r[0] = MULTICAST_ADDR_REQ | MULTICAST_SPECIFIC_ADDR;
}
else {
Net_MultiPtr = NULL;
R.r[0] = MULTICAST_ADDR_REQ | MULTICAST_ALL_ADDR;
R.r[4] = R.r[3] = 0;
}
R.r[1] = Net_DriverUnitNo;
R.r[2] = 0;
SET_FRAMELEVEL(R.r[2], FRMLVL_IEEE); /* Need 802.3 frames */
R.r[5] = LM_pw;
R.r[6] = (int) ReceiveFn;
if ( _kernel_swi ( Net_DriverSWIbase + DCI4MulticastRequest, &R, &R) != NULL ) {
DetachDriver();
Net_Attached = false;
return EPACKETTYPE;
}
}
return OK;
}
......@@ -565,16 +613,39 @@ static void DetachDriver()
if ( Net_Attached )
{
int filter_flags = FILTER_NO_UNSAFE | FILTER_RELEASE;
/* Was the driver performing h/w multicast filtering? Release claims! */
if (Net_DriverFlags & INQ_FILTERMCAST) {
R.r[0] = MULTICAST_ADDR_REL | (Net_MultiPtr ? MULTICAST_SPECIFIC_ADDR : MULTICAST_ALL_ADDR);
R.r[1] = Net_DriverUnitNo;
R.r[2] = 0;
SET_FRAMELEVEL(R.r[2], FRMLVL_IEEE); /* Need 802.3 frames */
R.r[3] = (int) Net_MultiPtr;
R.r[4] = (int) Net_MultiPtr;
R.r[5] = LM_pw;
R.r[6] = (int) ReceiveFn;
debug0(" Releasing driver multicast filter\n");
(void) _kernel_swi ( Net_DriverSWIbase + DCI4MulticastRequest, &R, &R);
filter_flags |= FILTER_SPECIFIC_MCAST;
}
else {
filter_flags |= FILTER_ALL_MCAST;
}
debug0(" Releasing driver claim\n");
Net_Attached = false;
R.r[0] = Filter_ClaimRelease | Filter_MustEnsureSafe; /* Flags */
R.r[0] = filter_flags; /* Flags */
R.r[1] = Net_DriverUnitNo;
R.r[2] = FRMLVL_IEEE; /* Need 802.3 frames */
R.r[2] = 0;
SET_FRAMELEVEL(R.r[2], FRMLVL_IEEE); /* Need 802.3 frames */
R.r[3] = ADDRLVL_MULTICAST;
R.r[4] = ERRLVL_NO_ERRORS;
R.r[5] = LM_pw; /* Protocol handle (our PW) */
R.r[6] = (int) ReceiveFn; /* Receive handler function */
_kernel_swi ( Net_DriverSWIbase + DCI_Filter, &R, &R );
_kernel_swi ( Net_DriverSWIbase + DCI4Filter, &R, &R );
}
}
......@@ -1132,11 +1203,11 @@ static void LLC_RcvProcess( NETADDR *src, BUFCHAIN pB )
static void ReceiveProcess (BUFCHAIN pB)
{
BUFCHAIN pB2;
struct rx_hdr *pRH;
RxHdr *pRH;
NETADDR srcaddr;
int len;
pRH = mtod ( pB, struct rx_hdr *);
pRH = mtod ( pB, RxHdr *);
/* Extract source address & length */
memcpy ( srcaddr.b, pRH->rx_src_addr, 6 );
......
......@@ -47,12 +47,14 @@
#include "RPC.h"
#include "stats.h"
#include "logon.h"
#include "DCI4.h"
#include "sys/dcistructs.h"
#include "sys/types.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "LanMan_MH.h"
/* ---------------------------------- */
......@@ -62,6 +64,7 @@ extern char *LM_Status(void);
#define DEFAULT_ETHER_TYPE "eh0"
typedef void (*pfnShutdown)(void);
typedef void (*pfnTransportInit)(void);
enum {
LMInitState_Uninitialised,
......@@ -76,6 +79,7 @@ static _kernel_oserror *LM_init_phase_2(void);
int LM_pw; /* Our module's private word */
struct NETBIOS_TRANSPORT *NB_ActiveTransport; /* Selected net transport */
static pfnTransportInit NB_InitedTransport; /* Identify active transport */
static bool LM_Declared; /* True if we're registered as a filing system */
/* ------------------------------- */
......@@ -110,7 +114,7 @@ int RdCMOS ( int addr )
/* ------------------ */
static void WrCMOS ( int addr, int data )
static void WrCMOS ( int addr, unsigned int data )
{
_kernel_osbyte ( 162, addr, data );
}
......@@ -141,6 +145,10 @@ static void GetFSName ( char *buf_out )
{
int i;
if (!_kernel_getenv("Inet$ServerName", buf_out, CMOS_FSERVER)) {
return;
}
if ( RdCMOS ( CMOS_FSSTAT ) == 0 )
{
/* NAS 11/Feb/97 */
......@@ -236,7 +244,7 @@ static char Cmdbuf[ MAX_CMDLEN ];
/* --------------------- */
static int GetArgs ( char *args, char *argv_out[], int maxargs )
static int GetArgs ( const char *args, char *argv_out[], int maxargs )
{
/* Splits "args" into a number of separate arguments. Each one is
copied into Cmdbuf so it is held statically. Pointers to the
......@@ -278,7 +286,7 @@ static int GetArgs ( char *args, char *argv_out[], int maxargs )
/* --------------------- */
static _kernel_oserror *Cmd_LANMAN ( char *args )
static _kernel_oserror *Cmd_LANMAN ( const char *args )
{
/* No args! */
_kernel_swi_regs r;
......@@ -292,7 +300,7 @@ static _kernel_oserror *Cmd_LANMAN ( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_CONNECT ( char *args )
static _kernel_oserror *Cmd_CONNECT ( const char *args )
{
char *argv[5];
err_t res;
......@@ -321,7 +329,7 @@ static _kernel_oserror *Cmd_CONNECT ( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_DISCONNECT ( char *args )
static _kernel_oserror *Cmd_DISCONNECT ( const char *args )
{
char *argv[1];
int mountID;
......@@ -344,6 +352,12 @@ struct LMvars LM_Vars;
/* --------------------- */
static void LanMan_InitTransport(pfnTransportInit i)
{
NB_InitedTransport = i;
(*i)();
}
static void SetDefaultVars ( void )
{
char *name;
......@@ -386,17 +400,13 @@ static void SetDefaultVars ( void )
LM_Vars.namemode = NM_FIRSTCAPS;
/* Set transport type from CMOS, unless overridden on command line */
if ( RdCMOS ( CMOS_NB_TYPE ) & NBTYPE_IP_BIT )
NB_NBIP_Setup();
else
NB_NetBEUI_Setup();
LanMan_InitTransport(RdCMOS ( CMOS_NB_TYPE ) & NBTYPE_IP_BIT ?
NB_NBIP_Setup : NB_NetBEUI_Setup);
}
/* --------------------- */
static _kernel_oserror *Cmd_LOGOFF( char *args )
static _kernel_oserror *Cmd_LOGOFF( const char *args )
{
(void) args;
Lgn_Logoff();
......@@ -405,7 +415,7 @@ static _kernel_oserror *Cmd_LOGOFF( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_LOGON( char *args )
static _kernel_oserror *Cmd_LOGON( const char *args )
{
char *argv[3];
if ( GetArgs(args, argv, 3) < 2 )
......@@ -419,7 +429,7 @@ static _kernel_oserror *Cmd_LOGON( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_LMINFO ( char *args )
static _kernel_oserror *Cmd_LMINFO ( const char *args )
{
(void) args;
Omni_Debug();
......@@ -430,7 +440,7 @@ static _kernel_oserror *Cmd_LMINFO ( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_LMNAMEMODE ( char *args )
static _kernel_oserror *Cmd_LMNAMEMODE ( const char *args )
{
char *argv[1];
int tmp;
......@@ -448,7 +458,7 @@ static _kernel_oserror *Cmd_LMNAMEMODE ( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_LMSERVER ( char *args )
static _kernel_oserror *Cmd_LMSERVER ( const char *args )
{
char *argv[MAX_ARGS];
int i;
......@@ -472,7 +482,7 @@ static _kernel_oserror *Cmd_LMSERVER ( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_LMPRINTERS ( char *args )
static _kernel_oserror *Cmd_LMPRINTERS ( const char *args )
{
char *argv[MAX_ARGS];
int i;
......@@ -497,7 +507,7 @@ static _kernel_oserror *Cmd_LMPRINTERS ( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_LMSTATS ( char *args )
static _kernel_oserror *Cmd_LMSTATS ( const char *args )
{
(void) args;
Stat_Show();
......@@ -506,7 +516,7 @@ static _kernel_oserror *Cmd_LMSTATS ( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_FS ( char *args )
static _kernel_oserror *Cmd_FS ( const char *args )
{
/* This is a *Configure/Status command handler - it's therefore unusual */
char *argv[1];
......@@ -533,7 +543,7 @@ static _kernel_oserror *Cmd_FS ( char *args )
/* --------------------- */
static _kernel_oserror *Cmd_LMTRANSPORT ( char *args )
static _kernel_oserror *Cmd_LMTRANSPORT ( const char *args )
{
/* This is a *Configure/Status command handler */
char *argv[1];
......@@ -566,7 +576,7 @@ static _kernel_oserror *Cmd_LMTRANSPORT ( char *args )
}
/* --------------------- */
static _kernel_oserror *Cmd_NBNSIP(char *args)
static _kernel_oserror *Cmd_NBNSIP( const char *args )
{
/* This is a *Configure/Status command handler - it's therefore unusual */
char *argv[1];
......@@ -602,7 +612,7 @@ static _kernel_oserror *Cmd_NBNSIP(char *args)
result = inet_aton(argv[0],&address);
if (result)
{
int b0, b1, b2, b3;
unsigned long b0, b1, b2, b3;
b0 = (address.s_addr & 0x000000ff);
b1 = (address.s_addr & 0x0000ff00) >> 8;
......@@ -611,10 +621,10 @@ static _kernel_oserror *Cmd_NBNSIP(char *args)
if ( ((b0 != 127) && (b0 <= 223)) && ((b3 != 255)) )
{
WrCMOS(NBNSIPCMOS0,b0);
WrCMOS(NBNSIPCMOS1,b1);
WrCMOS(NBNSIPCMOS2,b2);
WrCMOS(NBNSIPCMOS3,b3);
WrCMOS(NBNSIPCMOS0,(int) b0);
WrCMOS(NBNSIPCMOS1,(int) b1);
WrCMOS(NBNSIPCMOS2,(int) b2);
WrCMOS(NBNSIPCMOS3,(int) b3);
return NULL;
}
}
......@@ -624,7 +634,7 @@ static _kernel_oserror *Cmd_NBNSIP(char *args)
/* --------------------- */
typedef _kernel_oserror * (*CommandFnPtr) ( char *args );
typedef _kernel_oserror * (*CommandFnPtr) ( const char *args );
#define MAX_CMDS 13
static CommandFnPtr Cmd_Dispatch[MAX_CMDS] =
......@@ -646,7 +656,7 @@ static CommandFnPtr Cmd_Dispatch[MAX_CMDS] =
/* --------------------- */
_kernel_oserror *LM_Command ( char *args, int argc, int cmd_no, void *pw )
_kernel_oserror *LM_Command ( const char *args, int argc, int cmd_no, void *pw )
{
(void) pw;
(void) argc;
......@@ -659,6 +669,7 @@ _kernel_oserror *LM_Command ( char *args, int argc, int cmd_no, void *pw )
/* Service call handler --------------------------------- */
static void LM_check_driver_status(_kernel_swi_regs *r);
static void LM_check_internet_status(_kernel_swi_regs *r);
void LM_Service ( int service_number, _kernel_swi_regs *r, void *pw )
{
......@@ -680,7 +691,15 @@ void LM_Service ( int service_number, _kernel_swi_regs *r, void *pw )
break;
case Service_DCIDriverStatus:
LM_check_driver_status(r);
if (NB_InitedTransport == NB_NetBEUI_Setup) {
LM_check_driver_status(r);
}
break;
case Service_InternetStatus:
if (NB_InitedTransport == NB_NBIP_Setup) {
LM_check_internet_status(r);
}
break;
default:
......@@ -693,23 +712,23 @@ void LM_Service ( int service_number, _kernel_swi_regs *r, void *pw )
_kernel_oserror *LM_Swi( int swi_ofs, _kernel_swi_regs *r, void *pw )
{
(void) pw; /* Not used */
switch ( LanMan_SWI_base + swi_ofs )
switch ( swi_ofs )
{
case SWI_LanMan_OmniOp:
case LanMan_OmniOp - LanMan_00:
return OmniOp_SWI(r);
case SWI_LanMan_LogonOp:
case LanMan_LogonOp - LanMan_00:
return Lgn_LogonOp_SWI(r);
case SWI_LanMan_FreeOp:
case LanMan_FreeOp - LanMan_00:
return Omni_FreeOp_SWI(r);
case SWI_LanMan_NameOp:
case LanMan_NameOp - LanMan_00:
return Xlt_Error(RPC_NameOp(r->r[0], /* reason code */
(char *)(r->r[1]), /* name in */
(char *)(r->r[2]) /* buffer out */
));
case SWI_LanMan_Transact:
case LanMan_Transact - LanMan_00:
return Xlt_Error(RPC_Transact((char *)(r->r[0]), /* server */
(char *)(r->r[1]), /* share name */
(void *)(r->r[2]) /* params */
......@@ -739,17 +758,18 @@ static char *copy_space ( char *dst, char *src, int maxlen )
/* ------------------------------- */
static err_t ProcessCmdLine ( char *line )
static err_t ProcessCmdLine ( const char *_line )
{
char cli[256];
char *end = line;
char *end;
char *line;
/* This code relies on NB_xxx_Setup() only setting variables, not
allocating anything. Multiple NB_xxx_Setup()'s may be called if
the user is being perverse */
/* NAS 20/3/97 - RO doesn't pass a 0-terminated string, but a ctrl-terminated one */
strncpy(cli, line, 255);
strncpy(cli, _line, 255);
line = end = cli;
while (*end >= ' ') end++;
*end = '\0';
......@@ -790,11 +810,11 @@ static err_t ProcessCmdLine ( char *line )
break;
case 'I':
NB_NBIP_Setup();
LanMan_InitTransport(NB_NBIP_Setup);
break;
case 'T':
NB_NetBEUI_Setup();
LanMan_InitTransport(NB_NetBEUI_Setup);
break;
default:
......@@ -899,7 +919,7 @@ void LM_Boot(void)
*
*/
_kernel_oserror *LM_Initialise(char *cmd_tail, int pod_base, void *pw)
_kernel_oserror *LM_Initialise(const char *cmd_tail, int pod_base, void *pw)
{
_kernel_oserror *err;
_kernel_swi_regs R;
......@@ -1049,7 +1069,7 @@ abort:
static void LM_check_driver_status(_kernel_swi_regs *r)
{
char if_name[16];
dci4_dib *dib = (dci4_dib *) (r->r[0]);
Dib *dib = (Dib *) (r->r[0]);
sprintf(if_name, "%-.8s%d", dib->dib_name, dib->dib_unit);
......@@ -1082,6 +1102,27 @@ static void LM_check_driver_status(_kernel_swi_regs *r)
}
}
/* SNB 981029 added this function to verify the contents of the Service_InternetStatus
* service call to determine whether we were waiting for the interface to go up so
* that we could boot