//---------------------------------------------------------------------------- VOID ReadParameters( IN tNBTCONFIG *pConfig, IN HANDLE ParmHandle ) /*++ Routine Description: This routine is called to read various parameters from the parameters section of the NBT section of the registry. Arguments: pConfig - A pointer to the configuration data structure. ParmHandle - a handle to the parameters Key under Nbt Return Value: Status --*/ { ULONG NodeSize; ULONG Refresh; CTEPagedCode(); ReadParameters2(pConfig, ParmHandle); pConfig->NameServerPort = (USHORT)CTEReadSingleIntParameter(ParmHandle, WS_NS_PORT_NUM, NBT_NAMESERVER_UDP_PORT, 0); #ifdef VXD pConfig->DnsServerPort = (USHORT)CTEReadSingleIntParameter(ParmHandle, WS_DNS_PORT_NUM, NBT_DNSSERVER_UDP_PORT, 0); pConfig->lRegistryMaxNames = (USHORT)CTEReadSingleIntParameter( NULL, VXD_NAMETABLE_SIZE_NAME, VXD_DEF_NAMETABLE_SIZE, VXD_MIN_NAMETABLE_SIZE ) ; pConfig->lRegistryMaxSessions = (USHORT)CTEReadSingleIntParameter( NULL, VXD_SESSIONTABLE_SIZE_NAME, VXD_DEF_SESSIONTABLE_SIZE, VXD_MIN_SESSIONTABLE_SIZE ) ; #endif pConfig->RemoteHashTimeout = CTEReadSingleIntParameter(ParmHandle, WS_CACHE_TIMEOUT, DEFAULT_CACHE_TIMEOUT, MIN_CACHE_TIMEOUT); pConfig->InitialRefreshTimeout = CTEReadSingleIntParameter(ParmHandle, WS_INITIAL_REFRESH, NBT_INITIAL_REFRESH_TTL, NBT_INITIAL_REFRESH_TTL); // retry timeouts and number of retries for both Broadcast name resolution // and Name Service resolution // pConfig->uNumBcasts = (USHORT)CTEReadSingleIntParameter(ParmHandle, WS_NUM_BCASTS, DEFAULT_NUMBER_BROADCASTS, 1); pConfig->uBcastTimeout = CTEReadSingleIntParameter(ParmHandle, WS_BCAST_TIMEOUT, DEFAULT_BCAST_TIMEOUT, MIN_BCAST_TIMEOUT); pConfig->uNumRetries = (USHORT)CTEReadSingleIntParameter(ParmHandle, WS_NAMESRV_RETRIES, DEFAULT_NUMBER_RETRIES, 1); pConfig->uRetryTimeout = CTEReadSingleIntParameter(ParmHandle, WS_NAMESRV_TIMEOUT, DEFAULT_RETRY_TIMEOUT, MIN_RETRY_TIMEOUT); pConfig->KeepAliveTimeout = CTEReadSingleIntParameter(ParmHandle, WS_KEEP_ALIVE, DEFAULT_KEEP_ALIVE, MIN_KEEP_ALIVE); pConfig->SelectAdapter = (BOOLEAN)CTEReadSingleIntParameter(ParmHandle, WS_RANDOM_ADAPTER, 0, 0); pConfig->SingleResponse = (BOOLEAN)CTEReadSingleIntParameter(ParmHandle, WS_SINGLE_RESPONSE, 0, 0); pConfig->ResolveWithDns = (BOOLEAN)CTEReadSingleIntParameter(ParmHandle, WS_ENABLE_DNS, 0, 0); pConfig->TryAllAddr = (BOOLEAN)CTEReadSingleIntParameter(ParmHandle, WS_TRY_ALL_ADDRS, 1, 1); // enabled by default pConfig->LmHostsTimeout = CTEReadSingleIntParameter(ParmHandle, WS_LMHOSTS_TIMEOUT, DEFAULT_LMHOST_TIMEOUT, MIN_LMHOST_TIMEOUT); pConfig->MaxDgramBuffering = CTEReadSingleIntParameter(ParmHandle, WS_MAX_DGRAM_BUFFER, DEFAULT_DGRAM_BUFFERING, DEFAULT_DGRAM_BUFFERING); pConfig->EnableProxyRegCheck = (BOOLEAN)CTEReadSingleIntParameter(ParmHandle, WS_ENABLE_PROXY_REG_CHECK, 0, 0); pConfig->WinsDownTimeout = (ULONG)CTEReadSingleIntParameter(ParmHandle, WS_WINS_DOWN_TIMEOUT, DEFAULT_WINS_DOWN_TIMEOUT, MIN_WINS_DOWN_TIMEOUT); pConfig->MaxBackLog = (ULONG)CTEReadSingleIntParameter(ParmHandle, WS_MAX_CONNECTION_BACKLOG, DEFAULT_CONN_BACKLOG, MIN_CONN_BACKLOG); pConfig->SpecialConnIncrement = (ULONG)CTEReadSingleIntParameter(ParmHandle, WS_CONNECTION_BACKLOG_INCREMENT, DEFAULT_CONN_BACKLOG_INCREMENT, MIN_CONN_BACKLOG_INCREMENT); // // Cap the upper limit // if (pConfig->MaxBackLog > MAX_CONNECTION_BACKLOG) { pConfig->MaxBackLog = MAX_CONNECTION_BACKLOG; } if (pConfig->SpecialConnIncrement > MAX_CONNECTION_BACKLOG_INCREMENT) { pConfig->SpecialConnIncrement = MAX_CONNECTION_BACKLOG_INCREMENT; } // // Since UB chose the wrong opcode (9) we have to allow configuration // of that opcode incase our nodes refresh to their NBNS // Refresh = (ULONG)CTEReadSingleIntParameter(ParmHandle, WS_REFRESH_OPCODE, REFRESH_OPCODE, REFRESH_OPCODE); if (Refresh == UB_REFRESH_OPCODE) { pConfig->OpRefresh = OP_REFRESH_UB; } else { pConfig->OpRefresh = OP_REFRESH; } #ifndef VXD pConfig->EnableLmHosts = (BOOLEAN)CTEReadSingleIntParameter(ParmHandle, WS_ENABLE_LMHOSTS, 0, 0); #endif #ifdef PROXY_NODE { ULONG Proxy; Proxy = CTEReadSingleIntParameter(ParmHandle, WS_IS_IT_A_PROXY, IS_NOT_PROXY, //default value IS_NOT_PROXY); // // If the returned value is greater than IS_NOT_PROXY, it is a proxy // (also check that they have not entered an ascii string instead of a // dword in the registry // if ((Proxy > IS_NOT_PROXY) && (Proxy < ('0'+IS_NOT_PROXY))) { NodeType |= PROXY; } } #endif NodeSize = CTEReadSingleIntParameter(ParmHandle, WS_NODE_SIZE, NodeType & PROXY ? LARGE : DEFAULT_NODE_SIZE, NodeType & PROXY ? LARGE : SMALL); switch (NodeSize) { default: case SMALL: pConfig->uNumLocalNames = NUMBER_LOCAL_NAMES; pConfig->uNumRemoteNames = NUMBER_REMOTE_NAMES; pConfig->uNumBucketsLocal = NUMBER_BUCKETS_LOCAL_HASH_TABLE; pConfig->uNumBucketsRemote = NUMBER_BUCKETS_REMOTE_HASH_TABLE; pConfig->iMaxNumBuff[eNBT_DGRAM_TRACKER] = NBT_NUM_DGRAM_TRACKERS; pConfig->iMaxNumBuff[eNBT_TIMER_ENTRY] = TIMER_Q_SIZE; #ifndef VXD pConfig->iMaxNumBuff[eNBT_FREE_IRPS] = NBT_NUM_IRPS; pConfig->iMaxNumBuff[eNBT_DGRAM_MDLS] = NBT_NUM_DGRAM_MDLS; pConfig->iMaxNumBuff[eNBT_FREE_SESSION_MDLS] = NBT_NUM_SESSION_MDLS; #else pConfig->iMaxNumBuff[eNBT_SESSION_HDR] = NBT_NUM_SESSION_HDR ; pConfig->iMaxNumBuff[eNBT_SEND_CONTEXT] = NBT_NUM_SEND_CONTEXT ; pConfig->iMaxNumBuff[eNBT_RCV_CONTEXT] = NBT_NUM_RCV_CONTEXT ; #endif break; case MEDIUM: pConfig->uNumLocalNames = MEDIUM_NUMBER_LOCAL_NAMES; pConfig->uNumRemoteNames = MEDIUM_NUMBER_REMOTE_NAMES; pConfig->uNumBucketsLocal = MEDIUM_NUMBER_BUCKETS_LOCAL_HASH_TABLE; pConfig->uNumBucketsRemote = MEDIUM_NUMBER_BUCKETS_REMOTE_HASH_TABLE; pConfig->iMaxNumBuff[eNBT_DGRAM_TRACKER] = MEDIUM_NBT_NUM_DGRAM_TRACKERS; pConfig->iMaxNumBuff[eNBT_TIMER_ENTRY] = MEDIUM_TIMER_Q_SIZE; #ifndef VXD pConfig->iMaxNumBuff[eNBT_FREE_IRPS] = MEDIUM_NBT_NUM_IRPS; pConfig->iMaxNumBuff[eNBT_DGRAM_MDLS] = MEDIUM_NBT_NUM_DGRAM_MDLS; pConfig->iMaxNumBuff[eNBT_FREE_SESSION_MDLS] = MEDIUM_NBT_NUM_SESSION_MDLS; #else pConfig->iMaxNumBuff[eNBT_SESSION_HDR] = MEDIUM_NBT_NUM_SESSION_HDR ; pConfig->iMaxNumBuff[eNBT_SEND_CONTEXT] = MEDIUM_NBT_NUM_SEND_CONTEXT ; pConfig->iMaxNumBuff[eNBT_RCV_CONTEXT] = MEDIUM_NBT_NUM_RCV_CONTEXT ; #endif break; case LARGE: pConfig->uNumLocalNames = LARGE_NUMBER_LOCAL_NAMES; pConfig->uNumRemoteNames = LARGE_NUMBER_REMOTE_NAMES; pConfig->uNumBucketsLocal = LARGE_NUMBER_BUCKETS_LOCAL_HASH_TABLE; pConfig->uNumBucketsRemote = LARGE_NUMBER_BUCKETS_REMOTE_HASH_TABLE; pConfig->iMaxNumBuff[eNBT_DGRAM_TRACKER] = LARGE_NBT_NUM_DGRAM_TRACKERS; pConfig->iMaxNumBuff[eNBT_TIMER_ENTRY] = LARGE_TIMER_Q_SIZE; #ifndef VXD pConfig->iMaxNumBuff[eNBT_FREE_IRPS] = LARGE_NBT_NUM_IRPS; pConfig->iMaxNumBuff[eNBT_DGRAM_MDLS] = LARGE_NBT_NUM_DGRAM_MDLS; pConfig->iMaxNumBuff[eNBT_FREE_SESSION_MDLS] = LARGE_NBT_NUM_SESSION_MDLS; #else pConfig->iMaxNumBuff[eNBT_SESSION_HDR] = LARGE_NBT_NUM_SESSION_HDR ; pConfig->iMaxNumBuff[eNBT_SEND_CONTEXT] = LARGE_NBT_NUM_SEND_CONTEXT ; pConfig->iMaxNumBuff[eNBT_RCV_CONTEXT] = LARGE_NBT_NUM_RCV_CONTEXT ; #endif break; } ReadLmHostFile(pConfig,ParmHandle); }
signed function (struct plc * plc, char const * socket) { struct channel * channel = (struct channel *)(plc->channel); struct message * message = (struct message *)(plc->message); static char const * actions [] = { "start device", "store firmware", "store parameters", "update host", "config memory", "restore defaults", "unknown" }; #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_host_action_ind { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MACTION; uint8_t MAJOR_VERSION; uint8_t MINOR_VERSION; } * indicate = (struct vs_host_action_ind *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif signed fd = opensocket (socket); char firmware [PLC_VERSION_STRING]; char const * FactoryNVM = plc->NVM.name; char const * FactoryPIB = plc->PIB.name; signed action; signed status; write (fd, MESSAGE, strlen (MESSAGE)); while (!done) { status = ReadMME (plc, 0, (VS_HOST_ACTION | MMTYPE_IND)); if (status < 0) { break; } if (status < 1) { continue; } action = indicate->MACTION; if (action < SIZEOF (actions)) { fprintf(stderr, "plchostd2: action = %s\n", actions[action]); } else { fprintf(stderr, "plchostd2: action = %d\n", action); } memcpy (channel->peer, indicate->ethernet.OSA, sizeof (channel->peer)); if (HostActionResponse (plc)) { return (-1); } if (action == 0x00) { if (BootDevice2 (plc)) { return (-1); } if (WaitForStart (plc, firmware, sizeof (firmware))) { return (-1); } if (_anyset (plc->flags, PLC_FLASH_DEVICE)) { FlashDevice2 (plc, (PLC_COMMIT_FORCE | PLC_COMMIT_NORESET | PLC_COMMIT_FACTPIB)); } continue; } if (action == 0x01) { close (plc->NVM.file); if (ReadFirmware2 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } continue; } if (action == 0x02) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x03) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } close (plc->NVM.file); if (ReadFirmware2 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x04) { if (InitDevice2 (plc)) { return (-1); } continue; } if (action == 0x05) { close (plc->NVM.file); if ((plc->NVM.file = open (plc->NVM.name = FactoryNVM, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } close (plc->PIB.file); if ((plc->PIB.file = open (plc->PIB.name = FactoryPIB, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x06) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } continue; } error (0, ENOSYS, "Host Action 0x%02X", action); } close (fd); return (0); }
signed function (struct plc * plc) { struct channel * channel = (struct channel *)(plc->channel); struct message * message = (struct message *)(plc->message); #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_host_action_ind { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MACTION; uint8_t MAJOR_VERSION; uint8_t MINOR_VERSION; } * indicate = (struct vs_host_action_ind *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif char firmware [PLC_VERSION_STRING]; char const * FactoryNVM = plc->NVM.name; char const * FactoryPIB = plc->PIB.name; signed status; while (true) { status = ReadMME (plc, 0, (VS_HOST_ACTION | MMTYPE_IND)); if (status < 0) { break; } if (status > 0) { signed action = indicate->MACTION; memcpy (channel->peer, indicate->ethernet.OSA, sizeof (channel->peer)); if (HostActionResponse (plc)) { return (-1); } if (action == 0x00) { if (BootDevice2 (plc)) { return (-1); } if (WaitForStart (plc, firmware, sizeof (firmware))) { return (-1); } if (_anyset (plc->flags, PLC_FLASH_DEVICE)) { FlashDevice2 (plc, (PLC_COMMIT_FORCE | PLC_COMMIT_NORESET | PLC_COMMIT_FACTPIB)); } continue; } if (action == 0x01) { close (plc->NVM.file); if (ReadFirmware2 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } continue; } if (action == 0x02) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x03) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } close (plc->NVM.file); if (ReadFirmware2 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x04) { if (InitDevice2 (plc)) { return (-1); } continue; } if (action == 0x05) { close (plc->NVM.file); if ((plc->NVM.file = open (plc->NVM.name = FactoryNVM, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } close (plc->PIB.file); if ((plc->PIB.file = open (plc->PIB.name = FactoryPIB, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x06) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } continue; } error (0, ENOSYS, "Host Action 0x%02X", action); } } return (0); }