Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2294 lines
68 KiB

  1. /*++
  2. Copyright (c) 1995 Microsoft Corporation
  3. Module Name:
  4. ipxifs.c
  5. Abstract:
  6. IPX Router Console Monitoring and Configuration tool.
  7. IPX Interface configuration and monitoring.
  8. Author:
  9. Vadim Eydelman 06/07/1996
  10. --*/
  11. #include "precomp.h"
  12. #pragma hdrstop
  13. DWORD
  14. MIBGetIpxIf(
  15. PWCHAR InterfaceNameA
  16. );
  17. DWORD
  18. CfgGetIpxIf(
  19. LPWSTR InterfaceNameW
  20. );
  21. DWORD
  22. MIBEnumIpxIfs(
  23. BOOL bDump
  24. );
  25. DWORD
  26. CfgEnumIpxIfs(
  27. BOOL bDump
  28. );
  29. DWORD
  30. CfgSetIpxIf(
  31. LPWSTR InterfaceNameW,
  32. PULONG pAdminState OPTIONAL,
  33. PULONG pWANProtocol OPTIONAL
  34. );
  35. DWORD
  36. AdmSetIpxIf(
  37. LPWSTR InterfaceNameW,
  38. PULONG pAdminState OPTIONAL,
  39. PULONG pWANProtocol OPTIONAL
  40. );
  41. DWORD
  42. GetIpxClientIf(
  43. PWCHAR InterfaceNameW,
  44. UINT msg,
  45. BOOL bDump
  46. );
  47. DWORD
  48. CfgGetFltNames(
  49. LPWSTR InterfaceNameW,
  50. LPWSTR *FltInNameW,
  51. LPWSTR *FltOutNameW
  52. );
  53. PIPX_IF_INFO
  54. GetIpxNbInterface(
  55. HANDLE hIf,
  56. LPBYTE *pIfBlock,
  57. PIPXWAN_IF_INFO *ppIfWanBlock
  58. );
  59. DWORD
  60. APIENTRY
  61. HelpIpxIf(
  62. IN DWORD argc,
  63. IN LPCWSTR *argv
  64. )
  65. /*++
  66. Routine Description :
  67. This function displays help for NETSH IPX interface commands
  68. Arguments :
  69. argc - Number of arguments
  70. argv - Argument array
  71. Return value :
  72. 0 - success
  73. --*/
  74. {
  75. DisplayIPXMessage (g_hModule, MSG_IPX_HELP_IPXIF );
  76. return 0;
  77. }
  78. DWORD
  79. APIENTRY
  80. ShowIpxIf (
  81. IN DWORD argc,
  82. IN LPCWSTR *argv,
  83. IN BOOL bDump
  84. )
  85. /*++
  86. Routine Description :
  87. This routine displays IPX interface information
  88. Arguments :
  89. argc - Number of arguments
  90. argv - Argument array
  91. Return value :
  92. --*/
  93. {
  94. DWORD rc;
  95. PWCHAR buffer = NULL;
  96. //
  97. // if interface name specified
  98. //
  99. if ( argc < 1 )
  100. {
  101. PWCHAR buffer;
  102. if ( g_hMIBServer )
  103. {
  104. //
  105. // enumerate and display the interface via the MIB server
  106. //
  107. rc = MIBEnumIpxIfs ( bDump );
  108. if ( rc == NO_ERROR )
  109. {
  110. //
  111. // Display RAs server interface IPX info.
  112. //
  113. rc = GetIpxClientIf(
  114. VAL_DIALINCLIENT, MSG_CLIENT_IPXIF_MIB_TABLE_FMT,
  115. bDump
  116. );
  117. }
  118. else
  119. {
  120. //
  121. // Router not running ? Fallback to router config
  122. //
  123. DisplayIPXMessage (g_hModule, MSG_REGISTRY_FALLBACK );
  124. goto EnumerateThroughCfg;
  125. }
  126. }
  127. else
  128. {
  129. EnumerateThroughCfg:
  130. //
  131. // enumerate and display the interface via the router config
  132. //
  133. rc = CfgEnumIpxIfs ( bDump );
  134. if ( rc == NO_ERROR )
  135. {
  136. //
  137. // Display RAs server interface IPX info.
  138. //
  139. rc = GetIpxClientIf(
  140. VAL_DIALINCLIENT, MSG_CLIENT_IPXIF_CFG_TABLE_FMT,
  141. bDump
  142. );
  143. }
  144. }
  145. }
  146. else
  147. {
  148. //
  149. // Display IPX info for a specific interface
  150. //
  151. WCHAR InterfaceName[ MAX_INTERFACE_NAME_LEN + 1 ];
  152. DWORD dwSize = sizeof(InterfaceName);
  153. if ( !_wcsicmp( argv[0], VAL_DIALINCLIENT ) )
  154. {
  155. //
  156. // Display RAs server interface IPX info.
  157. //
  158. rc = GetIpxClientIf( VAL_DIALINCLIENT, MSG_CLIENT_IPXIF_CFG_SCREEN_FMT, bDump );
  159. }
  160. else if ( g_hMIBServer)
  161. {
  162. //======================================
  163. // Translate the Interface name
  164. //======================================
  165. rc = IpmontrGetIfNameFromFriendlyName(
  166. argv[ 0 ], InterfaceName, &dwSize
  167. );
  168. if ( rc != NO_ERROR )
  169. {
  170. DisplayError( g_hModule, rc );
  171. }
  172. else
  173. {
  174. rc = MIBGetIpxIf ( InterfaceName );
  175. if ( rc != NO_ERROR )
  176. {
  177. goto GetIfFromCfg;
  178. }
  179. }
  180. }
  181. else
  182. {
  183. GetIfFromCfg:
  184. //======================================
  185. // Translate the Interface Name
  186. //======================================
  187. rc = IpmontrGetIfNameFromFriendlyName(
  188. argv[ 0 ], InterfaceName, &dwSize
  189. );
  190. if ( rc != NO_ERROR )
  191. {
  192. DisplayError( g_hModule, rc );
  193. }
  194. else
  195. {
  196. rc = CfgGetIpxIf ( InterfaceName );
  197. }
  198. }
  199. }
  200. return rc;
  201. }
  202. DWORD
  203. APIENTRY
  204. SetIpxIf(
  205. IN DWORD argc,
  206. IN LPCWSTR *argv
  207. )
  208. /*++
  209. Routine Description :
  210. This routine update the IPX settings for an interface.
  211. Arguments :
  212. argc - Number of arguments
  213. argv - Argument array
  214. Return value :
  215. --*/
  216. {
  217. DWORD rc;
  218. PWCHAR buffer = NULL;
  219. WCHAR InterfaceName[ MAX_INTERFACE_NAME_LEN + 1 ];
  220. DWORD dwSize = sizeof(InterfaceName);
  221. //
  222. // If interface name is specified
  223. //
  224. if ( argc >= 1 )
  225. {
  226. unsigned count;
  227. BOOLEAN client = FALSE;
  228. //
  229. // Check if the dial in interface is specified
  230. //
  231. if ( !_wcsicmp( argv[0], VAL_DIALINCLIENT ) )
  232. {
  233. client = TRUE;
  234. }
  235. else
  236. {
  237. count = wcslen( argv[ 0 ] );
  238. }
  239. if ( client ||
  240. ( ( count > 0 ) && ( count <= MAX_INTERFACE_NAME_LEN ) ) )
  241. {
  242. DWORD i;
  243. ULONG adminState, WANProtocol;
  244. PULONG pAdminState = NULL, pWANProtocol = NULL;
  245. LPBYTE pFltInBlock, pFltOutBlock;
  246. for ( i = 1; i < argc; i++ )
  247. {
  248. //
  249. // get admin state value if specified
  250. //
  251. if ( !_wcsicmp( argv[ i ], TOKEN_ADMINSTATE ) )
  252. {
  253. if ( ( pAdminState == NULL ) && ( i < argc - 1 ) &&
  254. !MatchEnumTag(
  255. g_hModule, argv[ i + 1 ],
  256. NUM_TOKENS_IN_TABLE( AdminStates ),
  257. AdminStates, &adminState
  258. ) )
  259. {
  260. i += 1;
  261. pAdminState = &adminState;
  262. }
  263. else
  264. {
  265. break;
  266. }
  267. }
  268. //
  269. // get WAN protocol value if specified
  270. //
  271. else if ( !_wcsicmp( argv[ i ], TOKEN_WANPROTOCOL ) )
  272. {
  273. if ( ( pWANProtocol == NULL ) && ( i < argc - 1 ) &&
  274. !MatchEnumTag(
  275. g_hModule, argv[ i + 1 ],
  276. NUM_TOKENS_IN_TABLE( WANProtocols ),
  277. WANProtocols, &WANProtocol
  278. ) )
  279. {
  280. i += 1;
  281. pWANProtocol = &WANProtocol;
  282. }
  283. else
  284. {
  285. break;
  286. }
  287. }
  288. //
  289. // Not a tag. if Adminstate not specified then the first
  290. // option is Admin State
  291. //
  292. else if ( pAdminState == NULL )
  293. {
  294. if ( !MatchEnumTag(
  295. g_hModule, argv[ i ],
  296. NUM_TOKENS_IN_TABLE( AdminStates ),
  297. AdminStates, &adminState
  298. ) )
  299. {
  300. pAdminState = &adminState;
  301. }
  302. else
  303. {
  304. break;
  305. }
  306. }
  307. //
  308. // Try WAN protocol last
  309. //
  310. else if ( pWANProtocol == NULL )
  311. {
  312. if ( !MatchEnumTag(
  313. g_hModule, argv[ i ],
  314. NUM_TOKENS_IN_TABLE( AdminStates ),
  315. WANProtocols, &WANProtocol
  316. ) )
  317. {
  318. pWANProtocol = &WANProtocol;
  319. }
  320. else
  321. {
  322. break;
  323. }
  324. }
  325. //
  326. // If none of these, quit
  327. //
  328. else
  329. {
  330. break;
  331. }
  332. }
  333. if ( i == argc )
  334. {
  335. if ( !client )
  336. {
  337. DWORD rc2;
  338. //======================================
  339. // Translate the Interface Name
  340. //======================================
  341. rc = IpmontrGetIfNameFromFriendlyName(
  342. argv[ 0 ], InterfaceName, &dwSize
  343. );
  344. if ( rc == NO_ERROR )
  345. {
  346. //
  347. // Set to router config
  348. //
  349. rc2 = CfgSetIpxIf(
  350. InterfaceName, pAdminState, pWANProtocol
  351. );
  352. if ( rc2 == NO_ERROR )
  353. {
  354. DisplayIPXMessage (g_hModule, MSG_IPXIF_SET_CFG, argv[0] );
  355. //
  356. // set to router service
  357. //
  358. if ( g_hMprAdmin )
  359. {
  360. rc = AdmSetIpxIf(
  361. InterfaceName, pAdminState, pWANProtocol
  362. );
  363. if ( rc == NO_ERROR )
  364. {
  365. DisplayIPXMessage (g_hModule, MSG_IPXIF_SET_ADM, argv[0] );
  366. }
  367. }
  368. }
  369. else
  370. {
  371. rc = rc2;
  372. }
  373. }
  374. }
  375. else
  376. {
  377. //
  378. // set to router config and then to router service
  379. //
  380. if ( ( rc = CfgSetIpxIf( NULL, pAdminState, pWANProtocol ) )
  381. == NO_ERROR )
  382. {
  383. DisplayIPXMessage (g_hModule, MSG_CLIENT_IPXIF_SET_CFG );
  384. if ( g_hMprAdmin )
  385. {
  386. rc = AdmSetIpxIf(
  387. NULL, pAdminState, pWANProtocol
  388. );
  389. if ( rc == NO_ERROR )
  390. {
  391. DisplayIPXMessage (g_hModule, MSG_CLIENT_IPXIF_SET_ADM );
  392. }
  393. }
  394. }
  395. }
  396. }
  397. else
  398. {
  399. DisplayIPXMessage (g_hModule, MSG_IPX_HELP_IPXIF );
  400. rc = ERROR_INVALID_PARAMETER;
  401. }
  402. }
  403. else
  404. {
  405. DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME );
  406. rc = ERROR_INVALID_PARAMETER;
  407. }
  408. }
  409. else
  410. {
  411. DisplayIPXMessage (g_hModule, MSG_IPX_HELP_IPXIF );
  412. rc = ERROR_INVALID_PARAMETER;
  413. }
  414. if ( buffer )
  415. {
  416. FreeString( buffer );
  417. }
  418. return rc;
  419. }
  420. DWORD
  421. APIENTRY
  422. InstallIpx(
  423. IN DWORD argc,
  424. IN LPCWSTR *argv
  425. )
  426. /*++
  427. Routine Description :
  428. This routine adds IPX interface configuration to an interface
  429. Arguments :
  430. argc - Number of arguments
  431. argv - Argument array
  432. Return value :
  433. --*/
  434. {
  435. DWORD rc;
  436. if ( argc >= 1 )
  437. {
  438. WCHAR InterfaceName[ MAX_INTERFACE_NAME_LEN + 1 ];
  439. unsigned count = sizeof(InterfaceName);
  440. //
  441. // Get If name
  442. //
  443. rc = IpmontrGetIfNameFromFriendlyName( argv[ 0 ], InterfaceName, &count );
  444. if ( rc != NO_ERROR )
  445. {
  446. count = 0;
  447. }
  448. if ( ( count > 0 ) &&
  449. ( count <= (MAX_INTERFACE_NAME_LEN+1)*sizeof(WCHAR) ) )
  450. {
  451. //
  452. // default interface info consists of
  453. // - IPX_IF_INFO
  454. // - IPXWAN_IF_INFO
  455. // - IPX_ADAPTER_INFO
  456. // - RIP_IF_CONFIG
  457. // - SAP_IF_CONFIG
  458. //
  459. LPBYTE block;
  460. ULONG blockSize =
  461. FIELD_OFFSET (IPX_INFO_BLOCK_HEADER, TocEntry)
  462. + sizeof (IPX_TOC_ENTRY)*5
  463. + sizeof (IPX_IF_INFO)
  464. + sizeof (IPXWAN_IF_INFO)
  465. + sizeof (IPX_ADAPTER_INFO)
  466. + FIELD_OFFSET (RIP_IF_CONFIG, RipIfFilters.RouteFilter)
  467. + FIELD_OFFSET (SAP_IF_CONFIG, SapIfFilters.ServiceFilter);
  468. block = (LPBYTE) GlobalAlloc( GPTR, blockSize );
  469. if ( block != NULL )
  470. {
  471. HANDLE hIfCfg;
  472. PIPX_INFO_BLOCK_HEADER hdr = (PIPX_INFO_BLOCK_HEADER)block;
  473. PIPX_IF_INFO ipx = (PIPX_IF_INFO)&hdr->TocEntry[5];
  474. PIPXWAN_IF_INFO wan = (PIPXWAN_IF_INFO)&ipx[1];
  475. PIPX_ADAPTER_INFO adp = (PIPX_ADAPTER_INFO)&wan[1];
  476. PRIP_IF_CONFIG rip = (PRIP_IF_CONFIG)&adp[1];
  477. PSAP_IF_CONFIG sap =
  478. (PSAP_IF_CONFIG)&rip->RipIfFilters.RouteFilter;
  479. //
  480. // build infoblock for IPX interface info, with default values
  481. //
  482. hdr->Version = IPX_ROUTER_VERSION_1;
  483. hdr->Size = blockSize;
  484. hdr->TocEntriesCount = 5;
  485. hdr->TocEntry[0].InfoType = IPX_INTERFACE_INFO_TYPE;
  486. hdr->TocEntry[0].InfoSize = sizeof (IPX_IF_INFO);
  487. hdr->TocEntry[0].Count = 1;
  488. hdr->TocEntry[0].Offset = (ULONG) ((LPBYTE)ipx-block);
  489. ipx->AdminState = ADMIN_STATE_ENABLED;
  490. ipx->NetbiosAccept = ADMIN_STATE_DISABLED;
  491. ipx->NetbiosDeliver = ADMIN_STATE_DISABLED;
  492. hdr->TocEntry[1].InfoType = IPXWAN_INTERFACE_INFO_TYPE;
  493. hdr->TocEntry[1].InfoSize = sizeof (IPXWAN_IF_INFO);
  494. hdr->TocEntry[1].Count = 1;
  495. hdr->TocEntry[1].Offset = (ULONG) ((LPBYTE)wan-block);
  496. wan->AdminState = ADMIN_STATE_DISABLED;
  497. hdr->TocEntry[2].InfoType = IPX_ADAPTER_INFO_TYPE;
  498. hdr->TocEntry[2].InfoSize = sizeof (IPX_ADAPTER_INFO);
  499. hdr->TocEntry[2].Count = 1;
  500. hdr->TocEntry[2].Offset = (ULONG) ((LPBYTE)adp-block);
  501. adp->PacketType = AUTO_DETECT_PACKET_TYPE;
  502. adp->AdapterName[0] = 0;
  503. hdr->TocEntry[3].InfoType = IPX_PROTOCOL_RIP;
  504. hdr->TocEntry[3].InfoSize = FIELD_OFFSET (RIP_IF_CONFIG, RipIfFilters.RouteFilter);
  505. hdr->TocEntry[3].Count = 1;
  506. hdr->TocEntry[3].Offset = (ULONG) ((LPBYTE)rip-block);
  507. rip->RipIfInfo.AdminState = ADMIN_STATE_ENABLED;
  508. rip->RipIfInfo.UpdateMode = IPX_NO_UPDATE;
  509. rip->RipIfInfo.PacketType = IPX_STANDARD_PACKET_TYPE;
  510. rip->RipIfInfo.Supply = ADMIN_STATE_ENABLED;
  511. rip->RipIfInfo.Listen = ADMIN_STATE_ENABLED;
  512. rip->RipIfInfo.PeriodicUpdateInterval = 0;
  513. rip->RipIfInfo.AgeIntervalMultiplier = 0;
  514. rip->RipIfFilters.SupplyFilterCount = 0;
  515. rip->RipIfFilters.SupplyFilterAction = IPX_ROUTE_FILTER_DENY;
  516. rip->RipIfFilters.ListenFilterCount = 0;
  517. rip->RipIfFilters.ListenFilterAction = IPX_ROUTE_FILTER_DENY;
  518. hdr->TocEntry[4].InfoType = IPX_PROTOCOL_SAP;
  519. hdr->TocEntry[4].InfoSize = FIELD_OFFSET (SAP_IF_CONFIG, SapIfFilters.ServiceFilter);
  520. hdr->TocEntry[4].Count = 1;
  521. hdr->TocEntry[4].Offset = (ULONG) ((LPBYTE)sap-block);
  522. sap->SapIfInfo.AdminState = ADMIN_STATE_ENABLED;
  523. sap->SapIfInfo.UpdateMode = IPX_NO_UPDATE;
  524. sap->SapIfInfo.PacketType = IPX_STANDARD_PACKET_TYPE;
  525. sap->SapIfInfo.Supply = ADMIN_STATE_ENABLED;
  526. sap->SapIfInfo.Listen = ADMIN_STATE_ENABLED;
  527. sap->SapIfInfo.GetNearestServerReply = ADMIN_STATE_ENABLED;
  528. sap->SapIfInfo.PeriodicUpdateInterval = 0;
  529. sap->SapIfInfo.AgeIntervalMultiplier = 0;
  530. sap->SapIfFilters.SupplyFilterCount = 0;
  531. sap->SapIfFilters.SupplyFilterAction = IPX_SERVICE_FILTER_DENY;
  532. sap->SapIfFilters.ListenFilterCount = 0;
  533. sap->SapIfFilters.ListenFilterAction = IPX_SERVICE_FILTER_DENY;
  534. //
  535. // Get handle to interface config
  536. //
  537. rc = MprConfigInterfaceGetHandle(
  538. g_hMprConfig, InterfaceName, &hIfCfg
  539. );
  540. if ( rc == NO_ERROR )
  541. {
  542. PMPR_INTERFACE_0 pRi0;
  543. DWORD sz;
  544. //
  545. // retrieve interface info from handle
  546. //
  547. rc = MprConfigInterfaceGetInfo(
  548. g_hMprConfig, hIfCfg, 0, (LPBYTE *)&pRi0, &sz
  549. );
  550. if ( rc == NO_ERROR )
  551. {
  552. //
  553. // IPX is always present on LAN interfaces. It can
  554. // only be added to WAN interfaces
  555. //
  556. if ( pRi0->dwIfType == ROUTER_IF_TYPE_FULL_ROUTER )
  557. {
  558. HANDLE hIfTrCfg;
  559. //
  560. // Add IPX to interface config
  561. //
  562. rc = MprConfigInterfaceTransportAdd (
  563. g_hMprConfig,
  564. hIfCfg,
  565. PID_IPX,
  566. NULL,
  567. block, blockSize,
  568. &hIfTrCfg
  569. );
  570. if ( rc == NO_ERROR )
  571. {
  572. DisplayIPXMessage(
  573. g_hModule, MSG_IPXIF_ADD_CFG, InterfaceName
  574. );
  575. if ( g_hMprAdmin )
  576. {
  577. HANDLE hIfAdm;
  578. //
  579. // Router service is up. DO the same
  580. // for it
  581. //
  582. rc = MprAdminInterfaceGetHandle(
  583. g_hMprAdmin, InterfaceName,
  584. &hIfAdm, FALSE
  585. );
  586. if ( rc == NO_ERROR )
  587. {
  588. rc = MprAdminInterfaceTransportAdd(
  589. g_hMprAdmin,
  590. hIfAdm,
  591. PID_IPX,
  592. block, blockSize
  593. );
  594. if ( rc == NO_ERROR )
  595. {
  596. DisplayIPXMessage(
  597. g_hModule,
  598. MSG_IPXIF_ADD_ADM,
  599. InterfaceName
  600. );
  601. }
  602. else
  603. {
  604. DisplayError( g_hModule, rc );
  605. }
  606. }
  607. else
  608. {
  609. DisplayError( g_hModule, rc );
  610. }
  611. }
  612. }
  613. else
  614. {
  615. DisplayError( g_hModule, rc );
  616. }
  617. }
  618. else
  619. {
  620. DisplayIPXMessage (g_hModule, MSG_IPXIF_NOT_ROUTER );
  621. rc = ERROR_INVALID_PARAMETER;
  622. }
  623. MprConfigBufferFree( pRi0 );
  624. }
  625. else
  626. {
  627. DisplayError( g_hModule, rc );
  628. }
  629. }
  630. else
  631. if ( ( rc == ERROR_FILE_NOT_FOUND ) ||
  632. ( rc == ERROR_NO_MORE_ITEMS ) )
  633. {
  634. DisplayError( g_hModule, ERROR_NO_SUCH_INTERFACE);
  635. }
  636. else
  637. {
  638. DisplayError( g_hModule, rc );
  639. }
  640. GlobalFree (block);
  641. }
  642. else
  643. {
  644. rc = GetLastError ();
  645. if (rc != NO_ERROR )
  646. {
  647. rc = ERROR_NOT_ENOUGH_MEMORY;
  648. }
  649. DisplayError( g_hModule, rc );
  650. }
  651. }
  652. else
  653. {
  654. DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME );
  655. rc = ERROR_INVALID_PARAMETER;
  656. }
  657. }
  658. else
  659. {
  660. DisplayIPXMessage (g_hModule, MSG_IPX_HELP_IPXIF );
  661. rc = ERROR_INVALID_PARAMETER;
  662. }
  663. return rc;
  664. }
  665. DWORD
  666. APIENTRY
  667. RemoveIpx(
  668. IN DWORD argc,
  669. IN LPCWSTR *argv
  670. )
  671. /*++
  672. Routine Description :
  673. This routine removes IPX from a demand dial interface
  674. Arguments :
  675. argc - Number of arguments
  676. argv - Argument array
  677. Return value :
  678. --*/
  679. {
  680. DWORD rc;
  681. if ( argc >= 1 )
  682. {
  683. WCHAR InterfaceName[ MAX_INTERFACE_NAME_LEN + 1 ];
  684. unsigned count = sizeof(InterfaceName);
  685. //
  686. // Get interface name
  687. //
  688. rc = IpmontrGetIfNameFromFriendlyName( argv[ 0 ], InterfaceName, &count );
  689. if ( rc != NO_ERROR )
  690. {
  691. count = 0;
  692. }
  693. if ( ( count > 0 ) &&
  694. ( count <= (MAX_INTERFACE_NAME_LEN+1)*sizeof(WCHAR) ) )
  695. {
  696. //
  697. // remove IPX from demand-dial interface config
  698. //
  699. HANDLE hIfCfg;
  700. rc = MprConfigInterfaceGetHandle(
  701. g_hMprConfig, InterfaceName, &hIfCfg
  702. );
  703. if ( rc == NO_ERROR )
  704. {
  705. PMPR_INTERFACE_0 pRi0;
  706. DWORD sz;
  707. rc = MprConfigInterfaceGetInfo(
  708. g_hMprConfig,
  709. hIfCfg,
  710. 0,
  711. (LPBYTE *)&pRi0,
  712. &sz
  713. );
  714. if ( rc == NO_ERROR )
  715. {
  716. if ( pRi0->dwIfType == ROUTER_IF_TYPE_FULL_ROUTER )
  717. {
  718. HANDLE hIfTrCfg;
  719. rc = MprConfigInterfaceTransportGetHandle(
  720. g_hMprConfig,
  721. hIfCfg,
  722. PID_IPX,
  723. &hIfTrCfg
  724. );
  725. if ( rc == NO_ERROR )
  726. {
  727. rc = MprConfigInterfaceTransportRemove(
  728. g_hMprConfig,
  729. hIfCfg,
  730. hIfTrCfg
  731. );
  732. if ( rc == NO_ERROR )
  733. {
  734. DisplayIPXMessage(
  735. g_hModule, MSG_IPXIF_DEL_CFG, InterfaceName
  736. );
  737. if ( g_hMprAdmin )
  738. {
  739. //
  740. // remove IPX from demand-dial interface
  741. // in the router service
  742. //
  743. HANDLE hIfAdm;
  744. rc = MprAdminInterfaceGetHandle(
  745. g_hMprAdmin, InterfaceName,
  746. &hIfAdm, FALSE
  747. );
  748. if ( rc == NO_ERROR )
  749. {
  750. rc = MprAdminInterfaceTransportRemove(
  751. g_hMprAdmin, hIfAdm, PID_IPX
  752. );
  753. if ( rc == NO_ERROR )
  754. {
  755. DisplayIPXMessage(
  756. g_hModule, MSG_IPXIF_DEL_ADM,
  757. InterfaceName
  758. );
  759. }
  760. else
  761. {
  762. DisplayError( g_hModule, rc);
  763. }
  764. }
  765. else if ( ( rc == ERROR_FILE_NOT_FOUND ) ||
  766. ( rc == ERROR_NO_MORE_ITEMS ) )
  767. {
  768. DisplayIPXMessage(
  769. g_hModule,
  770. MSG_NO_IPX_ON_INTERFACE_ADM
  771. );
  772. }
  773. else
  774. {
  775. DisplayError( g_hModule, rc );
  776. }
  777. }
  778. }
  779. else
  780. {
  781. DisplayError( g_hModule, rc );
  782. }
  783. }
  784. else
  785. if ( ( rc == ERROR_FILE_NOT_FOUND ) ||
  786. ( rc == ERROR_NO_MORE_ITEMS ) )
  787. {
  788. DisplayIPXMessage (g_hModule, MSG_NO_IPX_ON_INTERFACE_CFG );
  789. }
  790. else
  791. {
  792. DisplayError( g_hModule, rc);
  793. }
  794. }
  795. else
  796. {
  797. DisplayIPXMessage ( g_hModule, MSG_IPXIF_NOT_ROUTER );
  798. rc = ERROR_INVALID_PARAMETER;
  799. }
  800. MprConfigBufferFree( pRi0 );
  801. }
  802. else
  803. {
  804. DisplayError( g_hModule, rc);
  805. }
  806. }
  807. else if ( ( rc == ERROR_FILE_NOT_FOUND ) ||
  808. ( rc == ERROR_NO_MORE_ITEMS ) )
  809. {
  810. DisplayError( g_hModule, ERROR_NO_SUCH_INTERFACE );
  811. }
  812. else
  813. {
  814. DisplayError( g_hModule, rc);
  815. }
  816. }
  817. else
  818. {
  819. DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME );
  820. rc = ERROR_INVALID_PARAMETER;
  821. }
  822. }
  823. else
  824. {
  825. DisplayIPXMessage (g_hModule, MSG_IPX_HELP_IPXIF );
  826. rc = ERROR_INVALID_PARAMETER;
  827. }
  828. return rc;
  829. }
  830. PIPX_IF_INFO
  831. GetIpxInterface(
  832. HANDLE hIf,
  833. LPBYTE *pIfBlock
  834. )
  835. /*++
  836. Routine Description :
  837. This routine retrieves the IPX_INTERFACE_INFO_TYPE block in the
  838. interface configuration. The interface conf. is retrieved from
  839. the router.
  840. Arguments :
  841. hIf - Handle to the interface config.
  842. pIfBlock - Buffer to return requested info.
  843. Return value :
  844. --*/
  845. {
  846. DWORD dwSize;
  847. DWORD dwErr;
  848. PIPX_TOC_ENTRY pIpxToc;
  849. dwErr = MprAdminInterfaceTransportGetInfo(
  850. g_hMprAdmin, hIf, PID_IPX, pIfBlock, &dwSize
  851. );
  852. if ( dwErr != NO_ERROR )
  853. {
  854. return NULL;
  855. }
  856. pIpxToc = GetIPXTocEntry (
  857. (PIPX_INFO_BLOCK_HEADER)( *pIfBlock ),
  858. IPX_INTERFACE_INFO_TYPE
  859. );
  860. if ( !pIpxToc )
  861. {
  862. return NULL;
  863. }
  864. return (PIPX_IF_INFO)( ( *pIfBlock ) + ( pIpxToc->Offset ) );
  865. }
  866. BOOL
  867. IsIpxInterface(
  868. HANDLE hIf,
  869. LPDWORD lpdwEnabled
  870. )
  871. /*++
  872. Routine Description :
  873. This routine checks if the specified interface is enabled for IPX
  874. on the router.
  875. Arguments :
  876. hIf - Handle to the interface config.
  877. lpdwEnabled - On return contains the admin state.
  878. Return value :
  879. --*/
  880. {
  881. PIPX_INTERFACE pIf;
  882. DWORD dwSize;
  883. DWORD dwErr;
  884. BOOL ret;
  885. dwErr = MprAdminInterfaceTransportGetInfo(
  886. g_hMprAdmin, hIf, PID_IPX, (LPBYTE*)&pIf, &dwSize
  887. );
  888. if ( dwErr == NO_ERROR )
  889. {
  890. ret = TRUE;
  891. if ( lpdwEnabled )
  892. {
  893. *lpdwEnabled = pIf->AdminState;
  894. }
  895. }
  896. else
  897. {
  898. ret = FALSE;
  899. }
  900. MprAdminBufferFree( (LPBYTE) pIf );
  901. return ret;
  902. }
  903. DWORD
  904. MIBGetIpxIf (
  905. PWCHAR InterfaceName
  906. )
  907. /*++
  908. Routine Description :
  909. This routine retrives the interface configuration for the specified
  910. interface from the router.
  911. Arguments :
  912. InterfaceName - Name of interface for which config is requested.
  913. Return value :
  914. --*/
  915. {
  916. INT i;
  917. DWORD rc;
  918. DWORD sz;
  919. IPX_MIB_GET_INPUT_DATA MibGetInputData;
  920. PIPX_INTERFACE pIf;
  921. WCHAR IfDisplayName[ MAX_INTERFACE_NAME_LEN + 1 ];
  922. MibGetInputData.TableId = IPX_INTERFACE_TABLE;
  923. rc = GetIpxInterfaceIndex(
  924. g_hMIBServer, InterfaceName,
  925. &MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex
  926. );
  927. if ( rc == NO_ERROR )
  928. {
  929. rc = MprAdminMIBEntryGet(
  930. g_hMIBServer, PID_IPX, IPX_PROTOCOL_BASE, &MibGetInputData,
  931. sizeof( IPX_MIB_GET_INPUT_DATA ), (LPVOID *)&pIf, &sz
  932. );
  933. if ( rc == NO_ERROR && pIf)
  934. {
  935. PWCHAR buffer[4];
  936. //======================================
  937. // Translate the Interface Name
  938. //======================================
  939. sz = sizeof(IfDisplayName);
  940. rc = IpmontrGetFriendlyNameFromIfName(
  941. InterfaceName, IfDisplayName, &sz
  942. );
  943. if ( rc == NO_ERROR )
  944. {
  945. buffer[ 0 ] = GetEnumString(
  946. g_hModule, pIf->InterfaceType,
  947. NUM_VALUES_IN_TABLE( IpxInterfaceTypes ),
  948. IpxInterfaceTypes
  949. );
  950. buffer[ 1 ] = ( pIf-> InterfaceType == IF_TYPE_LAN ) ||
  951. ( pIf-> InterfaceType == IF_TYPE_INTERNAL ) ?
  952. VAL_NA :
  953. GetEnumString(
  954. g_hModule, pIf->EnableIpxWanNegotiation,
  955. NUM_VALUES_IN_TABLE( WANProtocols ),
  956. WANProtocols
  957. );
  958. buffer[ 2 ] = GetEnumString(
  959. g_hModule, pIf->AdminState,
  960. NUM_VALUES_IN_TABLE( AdminStates ),
  961. AdminStates
  962. );
  963. buffer[ 3 ] = GetEnumString(
  964. g_hModule, pIf->IfStats.IfOperState,
  965. NUM_VALUES_IN_TABLE( OperStates ),
  966. OperStates
  967. );
  968. if ( buffer[ 0 ] && buffer[ 1 ] && buffer[ 2 ] && buffer[ 3 ] )
  969. {
  970. DisplayIPXMessage(
  971. g_hModule, MSG_IPXIF_MIB_SCREEN_FMT, IfDisplayName,
  972. buffer[ 0 ], buffer[ 1 ], buffer[ 2 ], buffer[3],
  973. pIf->NetNumber[0], pIf->NetNumber[1],
  974. pIf->NetNumber[2], pIf->NetNumber[3],
  975. pIf->MacAddress[0], pIf->MacAddress[1],
  976. pIf->MacAddress[2], pIf->MacAddress[3],
  977. pIf->MacAddress[4], pIf->MacAddress[5],
  978. pIf->IfStats.InHdrErrors,
  979. pIf->IfStats.InFiltered,
  980. pIf->IfStats.InNoRoutes,
  981. pIf->IfStats.InDiscards,
  982. pIf->IfStats.InDelivers,
  983. pIf->IfStats.OutFiltered,
  984. pIf->IfStats.OutDiscards,
  985. pIf->IfStats.OutDelivers
  986. );
  987. }
  988. MprAdminMIBBufferFree (pIf);
  989. }
  990. else
  991. {
  992. DisplayError( g_hModule, rc );
  993. }
  994. }
  995. else
  996. {
  997. DisplayError( g_hModule, rc);
  998. }
  999. }
  1000. else
  1001. {
  1002. DisplayError( g_hModule, rc);
  1003. }
  1004. return rc;
  1005. }
  1006. DWORD
  1007. CfgGetIpxIf(
  1008. LPWSTR InterfaceNameW
  1009. )
  1010. /*++
  1011. Routine Description :
  1012. This routine retrives the interface configuration for the specified
  1013. interface from the router configuration.
  1014. Arguments :
  1015. InterfaceName - Name of interface for which config is requested.
  1016. Return value :
  1017. --*/
  1018. {
  1019. DWORD rc, i;
  1020. DWORD sz;
  1021. HANDLE hIfCfg;
  1022. WCHAR IfDisplayName[ MAX_INTERFACE_NAME_LEN + 1 ];
  1023. //
  1024. // get handle to interface config
  1025. //
  1026. rc = MprConfigInterfaceGetHandle (
  1027. g_hMprConfig, InterfaceNameW, &hIfCfg
  1028. );
  1029. if ( rc == NO_ERROR )
  1030. {
  1031. PMPR_INTERFACE_0 pRi0;
  1032. rc = MprConfigInterfaceGetInfo(
  1033. g_hMprConfig, hIfCfg, 0, (LPBYTE *)&pRi0, &sz
  1034. );
  1035. if ( rc == NO_ERROR )
  1036. {
  1037. HANDLE hIfTrCfg;
  1038. rc = MprConfigInterfaceTransportGetHandle(
  1039. g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg
  1040. );
  1041. if ( rc == NO_ERROR )
  1042. {
  1043. LPBYTE pIfBlock;
  1044. rc = MprConfigInterfaceTransportGetInfo (
  1045. g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
  1046. );
  1047. if (rc == NO_ERROR)
  1048. {
  1049. PIPX_TOC_ENTRY pIpxToc;
  1050. PIPX_TOC_ENTRY pIpxWanToc;
  1051. pIpxToc = GetIPXTocEntry(
  1052. (PIPX_INFO_BLOCK_HEADER)pIfBlock,
  1053. IPX_INTERFACE_INFO_TYPE
  1054. );
  1055. pIpxWanToc = GetIPXTocEntry(
  1056. (PIPX_INFO_BLOCK_HEADER)pIfBlock,
  1057. IPXWAN_INTERFACE_INFO_TYPE
  1058. );
  1059. if ( ( pIpxToc != NULL ) && ( pIpxWanToc != NULL ) )
  1060. {
  1061. PIPX_IF_INFO pIpxInfo;
  1062. PIPXWAN_IF_INFO pIpxWanInfo;
  1063. PWCHAR buffer[3];
  1064. pIpxInfo = (PIPX_IF_INFO)
  1065. (pIfBlock+pIpxToc->Offset);
  1066. pIpxWanInfo = (PIPXWAN_IF_INFO)
  1067. (pIfBlock+pIpxWanToc->Offset);
  1068. //======================================
  1069. // Translate the Interface Name
  1070. //======================================
  1071. sz = sizeof(IfDisplayName);
  1072. rc = IpmontrGetFriendlyNameFromIfName(
  1073. InterfaceNameW, IfDisplayName, &sz
  1074. );
  1075. if ( rc == NO_ERROR )
  1076. {
  1077. buffer[ 0 ] = GetEnumString(
  1078. g_hModule, pRi0->dwIfType,
  1079. NUM_VALUES_IN_TABLE( RouterInterfaceTypes ),
  1080. RouterInterfaceTypes
  1081. );
  1082. buffer[ 1 ] = GetEnumString(
  1083. g_hModule, pIpxInfo->AdminState,
  1084. NUM_VALUES_IN_TABLE( AdminStates ),
  1085. AdminStates
  1086. );
  1087. buffer[ 2 ] = ( pRi0-> dwIfType == ROUTER_IF_TYPE_DEDICATED ) ?
  1088. VAL_NA :
  1089. GetEnumString(
  1090. g_hModule, pIpxWanInfo->AdminState,
  1091. NUM_VALUES_IN_TABLE( WANProtocols ),
  1092. WANProtocols
  1093. );
  1094. if ( buffer[ 0 ] && buffer[ 1 ] && buffer[ 2 ] )
  1095. {
  1096. //======================================
  1097. DisplayIPXMessage (g_hModule,
  1098. MSG_IPXIF_CFG_SCREEN_FMT, IfDisplayName,
  1099. buffer[0], buffer[1], buffer[2]
  1100. );
  1101. }
  1102. }
  1103. }
  1104. else
  1105. {
  1106. DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED );
  1107. rc = ERROR_INVALID_DATA;
  1108. }
  1109. }
  1110. else
  1111. {
  1112. DisplayError( g_hModule, rc );
  1113. }
  1114. MprConfigBufferFree( pIfBlock );
  1115. }
  1116. else if ( ( rc == ERROR_FILE_NOT_FOUND ) ||
  1117. ( rc == ERROR_NO_MORE_ITEMS ) )
  1118. {
  1119. DisplayIPXMessage (g_hModule, MSG_NO_IPX_ON_INTERFACE_CFG );
  1120. }
  1121. else
  1122. {
  1123. DisplayError( g_hModule, rc );
  1124. }
  1125. MprConfigBufferFree (pRi0);
  1126. }
  1127. }
  1128. else if ( ( rc == ERROR_FILE_NOT_FOUND ) ||
  1129. ( rc == ERROR_NO_MORE_ITEMS ) )
  1130. {
  1131. DisplayError( g_hModule, ERROR_NO_SUCH_INTERFACE );
  1132. }
  1133. else
  1134. {
  1135. DisplayError( g_hModule, rc );
  1136. }
  1137. return rc;
  1138. }
  1139. DWORD
  1140. GetIpxClientIf (
  1141. PWCHAR InterfaceName,
  1142. UINT msg,
  1143. BOOL bDump
  1144. )
  1145. /*++
  1146. Routine Description :
  1147. This routine retrives the interface configuration for the dialin
  1148. interface from the router service/config as specified.
  1149. Arguments :
  1150. InterfaceName - Name of interface for which config is requested.
  1151. msg - Format of display output
  1152. Return value :
  1153. --*/
  1154. {
  1155. DWORD rc, i;
  1156. LPBYTE pClBlock = NULL, pAdmClBlock = NULL;
  1157. LPWSTR FltInNameW = NULL, FltOutNameW = NULL;
  1158. HANDLE hTrCfg;
  1159. rc = MprConfigTransportGetHandle( g_hMprConfig, PID_IPX, &hTrCfg );
  1160. if ( rc == NO_ERROR )
  1161. {
  1162. DWORD sz;
  1163. rc = MprConfigTransportGetInfo(
  1164. g_hMprConfig, hTrCfg, NULL, NULL, &pClBlock, &sz, NULL
  1165. );
  1166. if ( rc == NO_ERROR )
  1167. {
  1168. PIPX_TOC_ENTRY pIpxToc;
  1169. PIPX_TOC_ENTRY pIpxWanToc;
  1170. if ( g_hMprAdmin )
  1171. {
  1172. DWORD rc1;
  1173. DWORD sz;
  1174. rc1 = MprAdminTransportGetInfo(
  1175. g_hMprAdmin, PID_IPX, NULL, NULL, &pAdmClBlock, &sz
  1176. );
  1177. if ( rc1 == NO_ERROR )
  1178. {
  1179. MprConfigBufferFree( pClBlock );
  1180. pClBlock = pAdmClBlock;
  1181. }
  1182. else
  1183. {
  1184. pAdmClBlock = NULL;
  1185. DisplayError( g_hModule, rc1 );
  1186. }
  1187. }
  1188. pIpxToc = GetIPXTocEntry(
  1189. (PIPX_INFO_BLOCK_HEADER) pClBlock, IPX_INTERFACE_INFO_TYPE
  1190. );
  1191. pIpxWanToc = GetIPXTocEntry (
  1192. (PIPX_INFO_BLOCK_HEADER)pClBlock, IPXWAN_INTERFACE_INFO_TYPE
  1193. );
  1194. if ( ( pIpxToc != NULL ) && ( pIpxWanToc != NULL ) )
  1195. {
  1196. PIPX_IF_INFO pIpxInfo;
  1197. PIPXWAN_IF_INFO pIpxWanInfo;
  1198. PWCHAR buffer[3];
  1199. pIpxInfo = ( PIPX_IF_INFO ) ( pClBlock + pIpxToc-> Offset );
  1200. pIpxWanInfo = ( PIPXWAN_IF_INFO ) ( pClBlock + pIpxWanToc-> Offset );
  1201. buffer[ 2 ] = GetEnumString(
  1202. g_hModule, pIpxInfo->AdminState,
  1203. NUM_VALUES_IN_TABLE( AdminStates ), AdminStates
  1204. );
  1205. buffer[ 0 ] = GetEnumString(
  1206. g_hModule, ROUTER_IF_TYPE_CLIENT,
  1207. NUM_VALUES_IN_TABLE( RouterInterfaceTypes ),
  1208. RouterInterfaceTypes
  1209. );
  1210. buffer[ 1 ] = GetEnumString(
  1211. g_hModule, pIpxWanInfo->AdminState,
  1212. NUM_VALUES_IN_TABLE( WANProtocols ),
  1213. WANProtocols
  1214. );
  1215. if ( bDump )
  1216. {
  1217. DisplayMessageT(
  1218. DMP_IPX_SET_WAN_INTERFACE, InterfaceName, buffer[ 2 ],
  1219. buffer[ 1 ]
  1220. );
  1221. }
  1222. else
  1223. {
  1224. DisplayIPXMessage(
  1225. g_hModule, msg, buffer[2], buffer[ 0 ], buffer[ 1 ],
  1226. InterfaceName
  1227. );
  1228. }
  1229. }
  1230. else
  1231. {
  1232. if ( !bDump )
  1233. {
  1234. DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED );
  1235. }
  1236. rc = ERROR_INVALID_DATA;
  1237. }
  1238. if ( pAdmClBlock != NULL )
  1239. {
  1240. MprAdminBufferFree( pClBlock );
  1241. }
  1242. else
  1243. {
  1244. MprConfigBufferFree( pClBlock );
  1245. }
  1246. }
  1247. else
  1248. {
  1249. if ( !bDump )
  1250. {
  1251. DisplayError( g_hModule, rc );
  1252. }
  1253. }
  1254. }
  1255. else if ( ( rc == ERROR_FILE_NOT_FOUND ) ||
  1256. ( rc == ERROR_NO_MORE_ITEMS ) )
  1257. {
  1258. if ( !bDump )
  1259. {
  1260. DisplayIPXMessage (g_hModule, MSG_NO_IPX_IN_ROUTER_CFG );
  1261. }
  1262. }
  1263. else
  1264. {
  1265. if ( !bDump )
  1266. {
  1267. DisplayError( g_hModule, rc );
  1268. }
  1269. }
  1270. return rc;
  1271. }
  1272. // Error reporting
  1273. void PrintErr(DWORD err)
  1274. {
  1275. WCHAR buf[1024];
  1276. FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,NULL,err,0,buf,1024,NULL);
  1277. wprintf(buf);
  1278. wprintf(L"\n");
  1279. }
  1280. DWORD
  1281. MIBEnumIpxIfs(
  1282. BOOL bDump
  1283. )
  1284. /*++
  1285. Routine Description :
  1286. This routine enumerates the interfaces from the router service and
  1287. displays them.
  1288. Arguments :
  1289. InterfaceName - Name of interface for which config is requested.
  1290. msg - Format of display output
  1291. Return value :
  1292. --*/
  1293. {
  1294. PMPR_INTERFACE_0 IfList=NULL;
  1295. DWORD dwErr=0, dwRead, dwTot,i, j;
  1296. PWCHAR buffer[4];
  1297. LPBYTE pszBuf = NULL;
  1298. WCHAR IfDisplayName[ MAX_INTERFACE_NAME_LEN + 1 ];
  1299. PIPX_IF_INFO pIf;
  1300. PIPXWAN_IF_INFO pWanIf;
  1301. DWORD dwSize = sizeof(IfDisplayName);
  1302. if ( !bDump )
  1303. {
  1304. DisplayIPXMessage (g_hModule, MSG_IPXIF_MIB_TABLE_HDR );
  1305. }
  1306. dwErr = MprAdminInterfaceEnum(
  1307. g_hMprAdmin, 0, (unsigned char **)&IfList, MAXULONG, &dwRead,
  1308. &dwTot,NULL
  1309. );
  1310. if ( dwErr != NO_ERROR )
  1311. {
  1312. return dwErr;
  1313. }
  1314. if ( dwRead && bDump )
  1315. {
  1316. //
  1317. // If interface are present and this is a dump command
  1318. // display dump header.
  1319. //
  1320. DisplayIPXMessage (g_hModule, MSG_IPX_DUMP_IF_HEADER);
  1321. }
  1322. for ( i = 0; i < dwRead; i++ )
  1323. {
  1324. if ( ( pIf = GetIpxNbInterface( IfList[i].hInterface, &pszBuf, &pWanIf ) )
  1325. != NULL )
  1326. {
  1327. //======================================
  1328. // Translate the Interface Name
  1329. //======================================
  1330. dwErr = IpmontrGetFriendlyNameFromIfName(
  1331. IfList[i].wszInterfaceName,
  1332. IfDisplayName, &dwSize
  1333. );
  1334. if ( dwErr == NO_ERROR )
  1335. {
  1336. buffer[ 0 ] = GetEnumString(
  1337. g_hModule, IfList[i].dwIfType,
  1338. NUM_VALUES_IN_TABLE( InterfaceTypes ),
  1339. InterfaceTypes
  1340. );
  1341. buffer[ 1 ] = GetEnumString(
  1342. g_hModule, pIf->AdminState,
  1343. NUM_VALUES_IN_TABLE( AdminStates ),
  1344. AdminStates
  1345. );
  1346. buffer[ 2 ] = GetEnumString(
  1347. g_hModule, IfList[i].dwConnectionState,
  1348. NUM_VALUES_IN_TABLE( InterfaceStates ),
  1349. InterfaceStates
  1350. );
  1351. if ( bDump )
  1352. {
  1353. if ( IfList[i].dwIfType == ROUTER_IF_TYPE_FULL_ROUTER )
  1354. {
  1355. DisplayMessageT(
  1356. DMP_IPX_ADD_INTERFACE, IfDisplayName
  1357. );
  1358. //
  1359. // Whistler bug 299007 ipxmontr.dll prefast warnings
  1360. //
  1361. buffer[ 3 ] = GetEnumString(
  1362. g_hModule, pWanIf->AdminState,
  1363. NUM_VALUES_IN_TABLE( WANProtocols ),
  1364. WANProtocols
  1365. );
  1366. DisplayMessageT(
  1367. DMP_IPX_SET_WAN_INTERFACE, IfDisplayName, buffer[ 1 ],
  1368. buffer[ 3 ]
  1369. );
  1370. }
  1371. else
  1372. {
  1373. DisplayMessageT(
  1374. DMP_IPX_SET_INTERFACE, IfDisplayName, buffer[ 1 ]
  1375. );
  1376. }
  1377. }
  1378. else
  1379. {
  1380. DisplayIPXMessage(
  1381. g_hModule, MSG_IPXIF_MIB_TABLE_FMT,
  1382. buffer[2], buffer[1], L"", buffer[0],
  1383. IfDisplayName
  1384. );
  1385. }
  1386. }
  1387. }
  1388. MprAdminBufferFree (pszBuf);
  1389. }
  1390. MprAdminBufferFree( IfList );
  1391. return NO_ERROR;
  1392. }
  1393. DWORD
  1394. CfgEnumIpxIfs (
  1395. BOOL bDump
  1396. )
  1397. /*++
  1398. Routine Description :
  1399. This routine enumerates the interfaces from the router configuration and
  1400. displays them.
  1401. Arguments :
  1402. Return value :
  1403. --*/
  1404. {
  1405. DWORD rc = NO_ERROR;
  1406. DWORD read, total, processed=0, i, j;
  1407. DWORD hResume = 0;
  1408. DWORD sz;
  1409. WCHAR IfDisplayName[ MAX_INTERFACE_NAME_LEN + 1 ];
  1410. PMPR_INTERFACE_0 pRi0;
  1411. DWORD dwSize = sizeof(IfDisplayName);
  1412. if ( !bDump )
  1413. {
  1414. DisplayIPXMessage (g_hModule, MSG_IPXIF_CFG_TABLE_HDR );
  1415. }
  1416. do
  1417. {
  1418. rc = MprConfigInterfaceEnum(
  1419. g_hMprConfig, 0, (LPBYTE *)&pRi0, MAXULONG, &read, &total,
  1420. &hResume
  1421. );
  1422. if ( rc == NO_ERROR )
  1423. {
  1424. if ( read && bDump )
  1425. {
  1426. //
  1427. // If interface are present and this is a dump command
  1428. // display dump header.
  1429. //
  1430. DisplayIPXMessage (g_hModule, MSG_IPX_DUMP_IF_HEADER);
  1431. }
  1432. for ( i = 0; i < read; i++ )
  1433. {
  1434. HANDLE hIfTrCfg;
  1435. rc = MprConfigInterfaceTransportGetHandle (
  1436. g_hMprConfig, pRi0[i].hInterface, PID_IPX,
  1437. &hIfTrCfg
  1438. );
  1439. if ( rc == NO_ERROR )
  1440. {
  1441. LPBYTE pIfBlock;
  1442. rc = MprConfigInterfaceTransportGetInfo(
  1443. g_hMprConfig, pRi0[i].hInterface, hIfTrCfg,
  1444. &pIfBlock, &sz
  1445. );
  1446. if (rc == NO_ERROR)
  1447. {
  1448. PIPX_TOC_ENTRY pIpxToc;
  1449. PIPX_TOC_ENTRY pIpxWanToc;
  1450. pIpxToc = GetIPXTocEntry(
  1451. (PIPX_INFO_BLOCK_HEADER)pIfBlock,
  1452. IPX_INTERFACE_INFO_TYPE
  1453. );
  1454. pIpxWanToc = GetIPXTocEntry (
  1455. (PIPX_INFO_BLOCK_HEADER)pIfBlock,
  1456. IPXWAN_INTERFACE_INFO_TYPE
  1457. );
  1458. if ( ( pIpxToc != NULL ) && ( pIpxWanToc != NULL ) )
  1459. {
  1460. PIPX_IF_INFO pIpxInfo;
  1461. PIPXWAN_IF_INFO pIpxWanInfo;
  1462. PWCHAR buffer[3];
  1463. pIpxInfo = (PIPX_IF_INFO) (pIfBlock+pIpxToc->Offset);
  1464. pIpxWanInfo = (PIPXWAN_IF_INFO) (pIfBlock+pIpxWanToc->Offset);
  1465. //======================================
  1466. // Translate the Interface Name
  1467. //======================================
  1468. rc = IpmontrGetFriendlyNameFromIfName(
  1469. pRi0[i].wszInterfaceName,
  1470. IfDisplayName, &dwSize
  1471. );
  1472. if ( rc == NO_ERROR )
  1473. {
  1474. //======================================
  1475. buffer[ 0 ] = GetEnumString(
  1476. g_hModule, pRi0[i].dwIfType,
  1477. NUM_VALUES_IN_TABLE( RouterInterfaceTypes ),
  1478. RouterInterfaceTypes
  1479. );
  1480. buffer[ 2 ] = GetEnumString(
  1481. g_hModule, pIpxInfo->AdminState,
  1482. NUM_VALUES_IN_TABLE( AdminStates ),
  1483. AdminStates
  1484. );
  1485. buffer[ 1 ] = ( pRi0[i].dwIfType == ROUTER_IF_TYPE_DEDICATED ) ||
  1486. ( pRi0[i].dwIfType == ROUTER_IF_TYPE_INTERNAL ) ?
  1487. VAL_NA :
  1488. GetEnumString(
  1489. g_hModule, pIpxWanInfo->AdminState,
  1490. NUM_VALUES_IN_TABLE( WANProtocols ),
  1491. WANProtocols
  1492. );
  1493. if ( buffer[ 0 ] && buffer[ 1 ] && buffer[ 2 ] )
  1494. {
  1495. if ( bDump )
  1496. {
  1497. if ( pRi0[i].dwIfType == ROUTER_IF_TYPE_FULL_ROUTER )
  1498. {
  1499. DisplayMessageT(
  1500. DMP_IPX_ADD_INTERFACE, IfDisplayName
  1501. );
  1502. DisplayMessageT(
  1503. DMP_IPX_SET_WAN_INTERFACE, IfDisplayName, buffer[ 2 ],
  1504. buffer[ 1 ]
  1505. );
  1506. }
  1507. else
  1508. {
  1509. DisplayMessageT(
  1510. DMP_IPX_SET_INTERFACE, IfDisplayName, buffer[ 2 ]
  1511. );
  1512. }
  1513. }
  1514. else
  1515. {
  1516. DisplayIPXMessage(
  1517. g_hModule, MSG_IPXIF_CFG_TABLE_FMT,
  1518. buffer[2], buffer[0], buffer[1],
  1519. IfDisplayName
  1520. );
  1521. }
  1522. }
  1523. }
  1524. }
  1525. else
  1526. {
  1527. rc = ERROR_INVALID_DATA;
  1528. if ( !bDump )
  1529. {
  1530. DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED );
  1531. }
  1532. }
  1533. }
  1534. else if ( rc != ERROR_NO_MORE_ITEMS )
  1535. {
  1536. if ( !bDump )
  1537. {
  1538. DisplayError( g_hModule, rc);
  1539. }
  1540. }
  1541. }
  1542. else
  1543. {
  1544. //DisplayError( g_hModule, rc); // This is not needed
  1545. }
  1546. }
  1547. processed += read;
  1548. MprConfigBufferFree( pRi0 );
  1549. }
  1550. else
  1551. {
  1552. DisplayError( g_hModule, rc );
  1553. break;
  1554. }
  1555. } while ( processed < total );
  1556. return rc;
  1557. }
  1558. DWORD
  1559. CfgSetIpxIf (
  1560. LPWSTR InterfaceNameW,
  1561. PULONG pAdminState OPTIONAL,
  1562. PULONG pWANProtocol OPTIONAL
  1563. )
  1564. /*++
  1565. Routine Description :
  1566. This routine updates the interface setting in the router configuration.
  1567. Arguments :
  1568. InterfaceNameW - Name of interface being updated
  1569. pAdminState - New value for adminstate
  1570. pWANProtocol - New value for WAN protocol
  1571. Return value :
  1572. --*/
  1573. {
  1574. DWORD rc;
  1575. DWORD sz;
  1576. HANDLE hTrCfg;
  1577. HANDLE hIfCfg;
  1578. HANDLE hIfTrCfg;
  1579. LPBYTE pIfBlock;
  1580. if ( InterfaceNameW != NULL )
  1581. {
  1582. rc = MprConfigInterfaceGetHandle(
  1583. g_hMprConfig, InterfaceNameW, &hIfCfg
  1584. );
  1585. if ( rc == NO_ERROR )
  1586. {
  1587. rc = MprConfigInterfaceTransportGetHandle(
  1588. g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg
  1589. );
  1590. if ( rc == NO_ERROR )
  1591. {
  1592. rc = MprConfigInterfaceTransportGetInfo(
  1593. g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz
  1594. );
  1595. }
  1596. }
  1597. }
  1598. else
  1599. {
  1600. rc = MprConfigTransportGetHandle( g_hMprConfig, PID_IPX, &hTrCfg );
  1601. if ( rc == NO_ERROR )
  1602. {
  1603. rc = MprConfigTransportGetInfo(
  1604. g_hMprConfig, hTrCfg, NULL, NULL, &pIfBlock, &sz, NULL
  1605. );
  1606. }
  1607. }
  1608. if ( rc == NO_ERROR )
  1609. {
  1610. PIPX_TOC_ENTRY pIpxToc;
  1611. PIPX_TOC_ENTRY pIpxWanToc;
  1612. pIpxToc = GetIPXTocEntry(
  1613. (PIPX_INFO_BLOCK_HEADER)pIfBlock,
  1614. IPX_INTERFACE_INFO_TYPE
  1615. );
  1616. pIpxWanToc = GetIPXTocEntry(
  1617. (PIPX_INFO_BLOCK_HEADER)pIfBlock,
  1618. IPXWAN_INTERFACE_INFO_TYPE
  1619. );
  1620. if ( ( pIpxToc != NULL ) && ( pIpxWanToc != NULL ) )
  1621. {
  1622. PIPX_IF_INFO pIpxInfo;
  1623. PIPXWAN_IF_INFO pIpxWanInfo;
  1624. pIpxInfo = (PIPX_IF_INFO) (pIfBlock+pIpxToc->Offset);
  1625. pIpxWanInfo = (PIPXWAN_IF_INFO) (pIfBlock+pIpxWanToc->Offset);
  1626. if ( ARGUMENT_PRESENT( pAdminState ) )
  1627. {
  1628. pIpxInfo->AdminState = *pAdminState;
  1629. }
  1630. if ( ARGUMENT_PRESENT( pWANProtocol ) )
  1631. {
  1632. pIpxWanInfo->AdminState = *pWANProtocol;
  1633. }
  1634. if ( InterfaceNameW != NULL )
  1635. {
  1636. rc = MprConfigInterfaceTransportSetInfo(
  1637. g_hMprConfig, hIfCfg, hIfTrCfg, pIfBlock, sz
  1638. );
  1639. }
  1640. else
  1641. {
  1642. rc = MprConfigTransportSetInfo(
  1643. g_hMprConfig, hTrCfg, NULL, 0, pIfBlock, sz, NULL
  1644. );
  1645. }
  1646. if ( rc != NO_ERROR )
  1647. {
  1648. DisplayError( g_hModule, rc );
  1649. }
  1650. }
  1651. else
  1652. {
  1653. DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED );
  1654. rc = ERROR_INVALID_DATA;
  1655. }
  1656. MprConfigBufferFree( pIfBlock );
  1657. }
  1658. else
  1659. {
  1660. DisplayError( g_hModule, rc );
  1661. }
  1662. return rc;
  1663. }
  1664. DWORD
  1665. AdmSetIpxIf (
  1666. LPWSTR InterfaceNameW,
  1667. PULONG pAdminState OPTIONAL,
  1668. PULONG pWANProtocol OPTIONAL
  1669. )
  1670. /*++
  1671. Routine Description :
  1672. This routine updates the interface setting in the router service.
  1673. Arguments :
  1674. InterfaceNameW - Name of interface being updated
  1675. pAdminState - New value for adminstate
  1676. pWANProtocol - New value for WAN protocol
  1677. Return value :
  1678. --*/
  1679. {
  1680. DWORD rc;
  1681. DWORD sz;
  1682. HANDLE hIfAdm;
  1683. LPBYTE pIfBlock;
  1684. if ( InterfaceNameW != NULL )
  1685. {
  1686. rc = MprAdminInterfaceGetHandle(
  1687. g_hMprAdmin, InterfaceNameW, &hIfAdm, FALSE
  1688. );
  1689. if ( rc == NO_ERROR )
  1690. {
  1691. rc = MprAdminInterfaceTransportGetInfo(
  1692. g_hMprAdmin, hIfAdm, PID_IPX, &pIfBlock, &sz
  1693. );
  1694. }
  1695. }
  1696. else
  1697. {
  1698. rc = MprAdminTransportGetInfo(
  1699. g_hMprAdmin, PID_IPX, NULL, NULL, &pIfBlock, &sz
  1700. );
  1701. if ( rc == NO_ERROR )
  1702. {
  1703. if ( pIfBlock == NULL ) { return rc; }
  1704. }
  1705. }
  1706. if ( rc == NO_ERROR )
  1707. {
  1708. PIPX_TOC_ENTRY pIpxToc;
  1709. PIPX_TOC_ENTRY pIpxWanToc;
  1710. pIpxToc = GetIPXTocEntry(
  1711. (PIPX_INFO_BLOCK_HEADER)pIfBlock,
  1712. IPX_INTERFACE_INFO_TYPE
  1713. );
  1714. pIpxWanToc = GetIPXTocEntry(
  1715. (PIPX_INFO_BLOCK_HEADER)pIfBlock,
  1716. IPXWAN_INTERFACE_INFO_TYPE
  1717. );
  1718. if ( ( pIpxToc != NULL ) && ( pIpxWanToc != NULL ) )
  1719. {
  1720. PIPX_IF_INFO pIpxInfo;
  1721. PIPXWAN_IF_INFO pIpxWanInfo;
  1722. pIpxInfo = (PIPX_IF_INFO) (pIfBlock + pIpxToc-> Offset);
  1723. pIpxWanInfo = (PIPXWAN_IF_INFO) (pIfBlock + pIpxWanToc-> Offset);
  1724. if ( ARGUMENT_PRESENT( pAdminState ) )
  1725. {
  1726. pIpxInfo->AdminState = *pAdminState;
  1727. }
  1728. if (ARGUMENT_PRESENT( pWANProtocol) )
  1729. {
  1730. pIpxWanInfo->AdminState = *pWANProtocol;
  1731. }
  1732. if ( InterfaceNameW != NULL )
  1733. {
  1734. rc = MprAdminInterfaceTransportSetInfo(
  1735. g_hMprAdmin, hIfAdm, PID_IPX, pIfBlock,
  1736. ((PIPX_INFO_BLOCK_HEADER)pIfBlock)->Size
  1737. );
  1738. }
  1739. else
  1740. {
  1741. rc = MprAdminTransportSetInfo(
  1742. g_hMprAdmin, PID_IPX, NULL, 0, pIfBlock,
  1743. ((PIPX_INFO_BLOCK_HEADER)pIfBlock)->Size
  1744. );
  1745. }
  1746. if ( rc != NO_ERROR )
  1747. {
  1748. DisplayError( g_hModule, rc);
  1749. }
  1750. }
  1751. else
  1752. {
  1753. DisplayIPXMessage (g_hModule, MSG_INTERFACE_INFO_CORRUPTED );
  1754. rc = ERROR_INVALID_DATA;
  1755. }
  1756. MprAdminBufferFree( pIfBlock );
  1757. }
  1758. else
  1759. {
  1760. DisplayError( g_hModule, rc );
  1761. }
  1762. return rc;
  1763. }
  1764. PIPX_IF_INFO
  1765. GetIpxNbInterface(
  1766. HANDLE hIf,
  1767. LPBYTE *pIfBlock,
  1768. PIPXWAN_IF_INFO *ppWanIf
  1769. )
  1770. {
  1771. DWORD dwSize;
  1772. DWORD dwErr;
  1773. PIPX_TOC_ENTRY pIpxToc;
  1774. dwErr = MprAdminInterfaceTransportGetInfo(
  1775. g_hMprAdmin, hIf, PID_IPX, pIfBlock, &dwSize
  1776. );
  1777. if ( dwErr != NO_ERROR )
  1778. {
  1779. return NULL;
  1780. }
  1781. pIpxToc = GetIPXTocEntry(
  1782. (PIPX_INFO_BLOCK_HEADER)(*pIfBlock),
  1783. IPXWAN_INTERFACE_INFO_TYPE
  1784. );
  1785. if ( pIpxToc )
  1786. {
  1787. *ppWanIf = (PIPXWAN_IF_INFO) ((*pIfBlock)+(pIpxToc->Offset));
  1788. }
  1789. pIpxToc = GetIPXTocEntry (
  1790. (PIPX_INFO_BLOCK_HEADER)(*pIfBlock),
  1791. IPX_INTERFACE_INFO_TYPE
  1792. );
  1793. if (!pIpxToc)
  1794. {
  1795. return NULL;
  1796. }
  1797. return (PIPX_IF_INFO)((*pIfBlock)+(pIpxToc->Offset));
  1798. }