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.

892 lines
55 KiB

  1. /*++
  2. Copyright (c) 1990-1995 Microsoft Corporation
  3. Module Name:
  4. filter.h
  5. Abstract:
  6. MACRO for protocol filters.
  7. Author:
  8. Environment:
  9. Kernel mode, FSD
  10. Revision History:
  11. Jun-95 Jameel Hyder New functionality
  12. --*/
  13. #ifndef _FILTER_DEFS_
  14. #define _FILTER_DEFS_
  15. #define INDICATED_PACKET(_Miniport) (_Miniport)->IndicatedPacket[CURRENT_PROCESSOR]
  16. //
  17. // Used by the filter packages for indicating receives
  18. //
  19. #define FilterIndicateReceive(Status, \
  20. NdisBindingHandle, \
  21. MacReceiveContext, \
  22. HeaderBuffer, \
  23. HeaderBufferSize, \
  24. LookaheadBuffer, \
  25. LookaheadBufferSize, \
  26. PacketSize) \
  27. { \
  28. *(Status) =(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->ReceiveHandler)( \
  29. ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->ProtocolBindingContext, \
  30. (MacReceiveContext), \
  31. (HeaderBuffer), \
  32. (HeaderBufferSize), \
  33. (LookaheadBuffer), \
  34. (LookaheadBufferSize), \
  35. (PacketSize)); \
  36. }
  37. //
  38. // Used by the filter packages for indicating receive completion
  39. //
  40. #define FilterIndicateReceiveComplete(NdisBindingHandle) \
  41. { \
  42. (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->ReceiveCompleteHandler)( \
  43. ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->ProtocolBindingContext); \
  44. }
  45. #if TRACK_RECEIVED_PACKETS
  46. #define IndicateToProtocol(_Miniport, \
  47. _Filter, \
  48. _pOpenBlock, \
  49. _Packet, \
  50. _NSR, \
  51. _Hdr, \
  52. _PktSize, \
  53. _HdrSize, \
  54. _fFallBack, \
  55. _Pmode, \
  56. _Medium) \
  57. { \
  58. UINT LookaheadBufferSize; \
  59. PNDIS_PACKET pPrevIndicatedPacket; \
  60. \
  61. /* \
  62. * We indicate this via the IndicatePacketHandler if all of the following \
  63. * conditions are met: \
  64. * - The binding is not p-mode or all-local \
  65. * - The binding specifies a ReceivePacketHandler \
  66. * - The miniport indicates that it is willing to let go of the packet \
  67. * - No binding has already claimed the packet \
  68. */ \
  69. \
  70. pPrevIndicatedPacket = INDICATED_PACKET(_Miniport); \
  71. INDICATED_PACKET(_Miniport) = (_Packet); \
  72. \
  73. /* \
  74. * Indicate the packet to the binding. \
  75. */ \
  76. if (*(_fFallBack) || \
  77. ((_pOpenBlock)->ReceivePacketHandler == NULL) || \
  78. ((_Pmode) && ((_Filter)->SingleActiveOpen == NULL))) \
  79. { \
  80. NDIS_STATUS _StatusOfReceive; \
  81. NDIS_STATUS _OldPacketStatus = NDIS_GET_PACKET_STATUS(_Packet); \
  82. NDIS_SET_PACKET_STATUS(_Packet, NDIS_STATUS_RESOURCES); \
  83. \
  84. NDIS_APPEND_RCV_LOGFILE(_Packet, _Miniport, CurThread, \
  85. 3, OrgPacketStackLocation+1, _NSR->RefCount, _NSR->XRefCount, NDIS_GET_PACKET_STATUS(_Packet)); \
  86. \
  87. \
  88. /* \
  89. * Revert back to old-style indication in this case \
  90. */ \
  91. /* \
  92. NdisQueryBuffer((_Packet)->Private.Head, NULL, &LookaheadBufferSize); \
  93. */ \
  94. LookaheadBufferSize = MDL_SIZE((_Packet)->Private.Head); \
  95. ProtocolFilterIndicateReceive(&_StatusOfReceive, \
  96. (_pOpenBlock), \
  97. (_Packet), \
  98. (_Hdr), \
  99. (_HdrSize), \
  100. (_Hdr) + (_HdrSize), \
  101. LookaheadBufferSize - (_HdrSize), \
  102. (_PktSize) - (_HdrSize), \
  103. Medium); \
  104. \
  105. NDIS_APPEND_RCV_LOGFILE(_Packet, _Miniport, CurThread, \
  106. 4, OrgPacketStackLocation+1, _NSR->RefCount, _NSR->XRefCount, NDIS_GET_PACKET_STATUS(_Packet)); \
  107. \
  108. NDIS_SET_PACKET_STATUS(_Packet, _OldPacketStatus); \
  109. } \
  110. else \
  111. { \
  112. NDIS_APPEND_RCV_LOGFILE(_Packet, _Miniport, CurThread, \
  113. 5, OrgPacketStackLocation+1, _NSR->RefCount, _NSR->XRefCount, NDIS_GET_PACKET_STATUS(_Packet)); \
  114. \
  115. (_NSR)->XRefCount += (SHORT)(*(_pOpenBlock)->ReceivePacketHandler)( \
  116. (_pOpenBlock)->ProtocolBindingContext, \
  117. (_Packet)); \
  118. \
  119. NDIS_APPEND_RCV_LOGFILE(_Packet, _Miniport, CurThread, \
  120. 6, OrgPacketStackLocation+1, _NSR->RefCount, _NSR->XRefCount, NDIS_GET_PACKET_STATUS(_Packet)); \
  121. \
  122. ASSERT((_NSR)->XRefCount >= 0); \
  123. } \
  124. \
  125. /* \
  126. * Manipulate refcount on the packet with miniport lock held \
  127. * Set the reference count on the packet to what the protocol \
  128. * asked for. See NdisReturnPackets for how this is handled \
  129. * when the packets are returned. \
  130. */ \
  131. if ((_NSR)->XRefCount > 0) \
  132. { \
  133. /* \
  134. * Now that a binding has claimed it, make sure others do not get a chance \
  135. * except if this protocol promises to behave and not use the protocol rsvd \
  136. */ \
  137. \
  138. if (!MINIPORT_TEST_FLAG(_pOpenBlock, fMINIPORT_OPEN_NO_PROT_RSVD)) \
  139. { \
  140. *(_fFallBack) = TRUE; \
  141. } \
  142. } \
  143. INDICATED_PACKET(_Miniport) = pPrevIndicatedPacket; \
  144. }
  145. #else
  146. #define IndicateToProtocol(_Miniport, \
  147. _Filter, \
  148. _pOpenBlock, \
  149. _Packet, \
  150. _NSR, \
  151. _Hdr, \
  152. _PktSize, \
  153. _HdrSize, \
  154. _fFallBack, \
  155. _Pmode, \
  156. _Medium) \
  157. { \
  158. UINT LookaheadBufferSize; \
  159. PNDIS_PACKET pPrevIndicatedPacket; \
  160. \
  161. /* \
  162. * We indicate this via the IndicatePacketHandler if all of the following \
  163. * conditions are met: \
  164. * - The binding is not p-mode or all-local \
  165. * - The binding specifies a ReceivePacketHandler \
  166. * - The miniport indicates that it is willing to let go of the packet \
  167. * - No binding has already claimed the packet \
  168. */ \
  169. \
  170. pPrevIndicatedPacket = INDICATED_PACKET(_Miniport); \
  171. INDICATED_PACKET(_Miniport) = (_Packet); \
  172. \
  173. /* \
  174. * Indicate the packet to the binding. \
  175. */ \
  176. if (*(_fFallBack) || \
  177. ((_pOpenBlock)->ReceivePacketHandler == NULL) || \
  178. ((_Pmode) && ((_Filter)->SingleActiveOpen == NULL))) \
  179. { \
  180. NDIS_STATUS _StatusOfReceive; \
  181. NDIS_STATUS _OldPacketStatus = NDIS_GET_PACKET_STATUS(_Packet); \
  182. NDIS_SET_PACKET_STATUS(_Packet, NDIS_STATUS_RESOURCES); \
  183. \
  184. /* \
  185. * Revert back to old-style indication in this case \
  186. */ \
  187. /* \
  188. NdisQueryBuffer((_Packet)->Private.Head, NULL, &LookaheadBufferSize); \
  189. */ \
  190. LookaheadBufferSize = MDL_SIZE((_Packet)->Private.Head); \
  191. ProtocolFilterIndicateReceive(&_StatusOfReceive, \
  192. (_pOpenBlock), \
  193. (_Packet), \
  194. (_Hdr), \
  195. (_HdrSize), \
  196. (_Hdr) + (_HdrSize), \
  197. LookaheadBufferSize - (_HdrSize), \
  198. (_PktSize) - (_HdrSize), \
  199. Medium); \
  200. NDIS_SET_PACKET_STATUS(_Packet, _OldPacketStatus); \
  201. } \
  202. else \
  203. { \
  204. (_NSR)->XRefCount += (SHORT)(*(_pOpenBlock)->ReceivePacketHandler)( \
  205. (_pOpenBlock)->ProtocolBindingContext, \
  206. (_Packet)); \
  207. ASSERT((_NSR)->XRefCount >= 0); \
  208. } \
  209. \
  210. /* \
  211. * Manipulate refcount on the packet with miniport lock held \
  212. * Set the reference count on the packet to what the protocol \
  213. * asked for. See NdisReturnPackets for how this is handled \
  214. * when the packets are returned. \
  215. */ \
  216. if ((_NSR)->XRefCount > 0) \
  217. { \
  218. /* \
  219. * Now that a binding has claimed it, make sure others do not get a chance \
  220. * except if this protocol promises to behave and not use the protocol rsvd \
  221. */ \
  222. \
  223. if (!MINIPORT_TEST_FLAG(_pOpenBlock, fMINIPORT_OPEN_NO_PROT_RSVD)) \
  224. { \
  225. *(_fFallBack) = TRUE; \
  226. } \
  227. } \
  228. INDICATED_PACKET(_Miniport) = pPrevIndicatedPacket; \
  229. }
  230. #endif
  231. #define ProtocolFilterIndicateReceive(_pStatus, \
  232. _OpenB, \
  233. _MacReceiveContext, \
  234. _HeaderBuffer, \
  235. _HeaderBufferSize, \
  236. _LookaheadBuffer, \
  237. _LookaheadBufferSize, \
  238. _PacketSize, \
  239. _Medium) \
  240. { \
  241. FilterIndicateReceive(_pStatus, \
  242. (_OpenB), \
  243. _MacReceiveContext, \
  244. _HeaderBuffer, \
  245. _HeaderBufferSize, \
  246. _LookaheadBuffer, \
  247. _LookaheadBufferSize, \
  248. _PacketSize); \
  249. }
  250. //
  251. // Loopback macros
  252. //
  253. #define EthShouldAddressLoopBackMacro(_Filter, \
  254. _Address, \
  255. _pfLoopback, \
  256. _pfSelfDirected) \
  257. { \
  258. UINT CombinedFilters; \
  259. \
  260. CombinedFilters = ETH_QUERY_FILTER_CLASSES(_Filter); \
  261. \
  262. *(_pfLoopback) = FALSE; \
  263. *(_pfSelfDirected) = FALSE; \
  264. \
  265. do \
  266. { \
  267. \
  268. /* \
  269. * Check if it *at least* has the multicast address bit. \
  270. */ \
  271. \
  272. if (ETH_IS_MULTICAST(_Address)) \
  273. { \
  274. /* \
  275. * It is at least a multicast address. Check to see if \
  276. * it is a broadcast address. \
  277. */ \
  278. \
  279. if (ETH_IS_BROADCAST(_Address)) \
  280. { \
  281. if (CombinedFilters & NDIS_PACKET_TYPE_BROADCAST) \
  282. { \
  283. *(_pfLoopback) = TRUE; \
  284. break; \
  285. } \
  286. } \
  287. else \
  288. { \
  289. if ((CombinedFilters & NDIS_PACKET_TYPE_ALL_MULTICAST) || \
  290. ((CombinedFilters & NDIS_PACKET_TYPE_MULTICAST) && \
  291. ethFindMulticast((_Filter)->NumAddresses, \
  292. (_Filter)->MCastAddressBuf, \
  293. _Address))) \
  294. { \
  295. *(_pfLoopback) = TRUE; \
  296. break; \
  297. } \
  298. } \
  299. } \
  300. else \
  301. { \
  302. /* \
  303. * Directed to ourself?? \
  304. */ \
  305. \
  306. if ((*(ULONG UNALIGNED *)&(_Address)[2] == \
  307. *(ULONG UNALIGNED *)&(_Filter)->AdapterAddress[2]) && \
  308. (*(USHORT UNALIGNED *)&(_Address)[0] == \
  309. *(USHORT UNALIGNED *)&(_Filter)->AdapterAddress[0])) \
  310. { \
  311. *(_pfLoopback) = TRUE; \
  312. *(_pfSelfDirected) = TRUE; \
  313. break; \
  314. } \
  315. } \
  316. } while (FALSE); \
  317. \
  318. /* \
  319. * Check if the filter is promiscuous. \
  320. */ \
  321. \
  322. if (CombinedFilters & (NDIS_PACKET_TYPE_PROMISCUOUS | NDIS_PACKET_TYPE_ALL_LOCAL)) \
  323. { \
  324. *(_pfLoopback) = TRUE; \
  325. } \
  326. }
  327. #define FddiShouldAddressLoopBackMacro( _Filter, \
  328. _Address, \
  329. _AddressLength, \
  330. _pfLoopBack, \
  331. _pfSelfDirected) \
  332. { \
  333. INT ResultOfAddressCheck; \
  334. \
  335. UINT CombinedFilters; \
  336. \
  337. CombinedFilters = FDDI_QUERY_FILTER_CLASSES(_Filter); \
  338. \
  339. *(_pfLoopBack) = FALSE; \
  340. *(_pfSelfDirected) = FALSE; \
  341. \
  342. do \
  343. { \
  344. /* \
  345. * Check if it *at least* has the multicast address bit. \
  346. */ \
  347. \
  348. FDDI_IS_MULTICAST(_Address, \
  349. (_AddressLength), \
  350. &ResultOfAddressCheck); \
  351. \
  352. if (ResultOfAddressCheck) \
  353. { \
  354. /* \
  355. * It is at least a multicast address. Check to see if \
  356. * it is a broadcast address. \
  357. */ \
  358. \
  359. FDDI_IS_BROADCAST(_Address, \
  360. (_AddressLength), \
  361. &ResultOfAddressCheck); \
  362. \
  363. if (ResultOfAddressCheck) \
  364. { \
  365. if (CombinedFilters & NDIS_PACKET_TYPE_BROADCAST) \
  366. { \
  367. *(_pfLoopBack) = TRUE; \
  368. break; \
  369. } \
  370. } \
  371. else \
  372. { \
  373. if ((CombinedFilters & NDIS_PACKET_TYPE_ALL_MULTICAST) || \
  374. ((CombinedFilters & NDIS_PACKET_TYPE_MULTICAST) && \
  375. ((((_AddressLength) == FDDI_LENGTH_OF_LONG_ADDRESS) && \
  376. fddiFindMulticastLongAddress((_Filter)->NumLongAddresses, \
  377. (_Filter)->MCastLongAddressBuf, \
  378. _Address)) || \
  379. (((_AddressLength) == FDDI_LENGTH_OF_SHORT_ADDRESS) && \
  380. fddiFindMulticastShortAddress((_Filter)->NumShortAddresses, \
  381. (_Filter)->MCastShortAddressBuf, \
  382. _Address))))) \
  383. { \
  384. *(_pfLoopBack) = TRUE; \
  385. break; \
  386. } \
  387. } \
  388. } \
  389. else \
  390. { \
  391. /* \
  392. * Directed to ourself? \
  393. */ \
  394. if ((_AddressLength) == FDDI_LENGTH_OF_LONG_ADDRESS) \
  395. { \
  396. FDDI_COMPARE_NETWORK_ADDRESSES_EQ((_Filter)->AdapterLongAddress, \
  397. _Address, \
  398. FDDI_LENGTH_OF_LONG_ADDRESS, \
  399. &ResultOfAddressCheck \
  400. ); \
  401. } \
  402. else \
  403. { \
  404. FDDI_COMPARE_NETWORK_ADDRESSES_EQ((_Filter)->AdapterShortAddress, \
  405. _Address, \
  406. FDDI_LENGTH_OF_SHORT_ADDRESS, \
  407. &ResultOfAddressCheck \
  408. ); \
  409. } \
  410. \
  411. if (ResultOfAddressCheck == 0) \
  412. { \
  413. *(_pfLoopBack) = TRUE; \
  414. *(_pfSelfDirected) = TRUE; \
  415. break; \
  416. } \
  417. } \
  418. } while (FALSE); \
  419. \
  420. /* \
  421. * First check if the filter is promiscuous. \
  422. */ \
  423. \
  424. if (CombinedFilters & (NDIS_PACKET_TYPE_PROMISCUOUS | NDIS_PACKET_TYPE_ALL_LOCAL)) \
  425. { \
  426. *(_pfLoopBack) = TRUE; \
  427. } \
  428. }
  429. #define TrShouldAddressLoopBackMacro(_Filter, \
  430. _DAddress, \
  431. _SAddress, \
  432. _pfLoopback, \
  433. _pfSelfDirected) \
  434. { \
  435. /* Holds the result of address determinations. */ \
  436. BOOLEAN ResultOfAddressCheck; \
  437. \
  438. BOOLEAN IsSourceRouting; \
  439. \
  440. UINT CombinedFilters; \
  441. \
  442. ULONG GroupAddress; \
  443. \
  444. *(_pfLoopback) = FALSE; \
  445. *(_pfSelfDirected) = FALSE; \
  446. \
  447. do \
  448. { \
  449. CombinedFilters = TR_QUERY_FILTER_CLASSES(_Filter); \
  450. \
  451. /* Convert the 32 bits of the address to a longword. */ \
  452. RetrieveUlong(&GroupAddress, ((_DAddress) + 2)); \
  453. \
  454. /* Check if the destination is a preexisting group address */ \
  455. TR_IS_GROUP((_DAddress), &ResultOfAddressCheck); \
  456. \
  457. if (ResultOfAddressCheck && \
  458. (GroupAddress == (_Filter)->GroupAddress) && \
  459. ((_Filter)->GroupReferences != 0)) \
  460. { \
  461. *(_pfLoopback) = TRUE; \
  462. break; \
  463. } \
  464. else \
  465. { \
  466. TR_IS_SOURCE_ROUTING((_SAddress), &IsSourceRouting); \
  467. \
  468. if (IsSourceRouting && (CombinedFilters & NDIS_PACKET_TYPE_SOURCE_ROUTING)) \
  469. { \
  470. *(_pfLoopback) = TRUE; \
  471. break; \
  472. } \
  473. else \
  474. { \
  475. /* First check if it *at least* has the functional address bit. */ \
  476. TR_IS_NOT_DIRECTED((_DAddress), &ResultOfAddressCheck); \
  477. \
  478. if (ResultOfAddressCheck) \
  479. { \
  480. /* It is at least a functional address. Check to see if */ \
  481. /* it is a broadcast address. */ \
  482. \
  483. TR_IS_BROADCAST((_DAddress), &ResultOfAddressCheck); \
  484. \
  485. if (ResultOfAddressCheck) \
  486. { \
  487. if (CombinedFilters & NDIS_PACKET_TYPE_BROADCAST) \
  488. { \
  489. *(_pfLoopback) = TRUE; \
  490. break; \
  491. } \
  492. } \
  493. else \
  494. { \
  495. TR_IS_FUNCTIONAL((_DAddress), &ResultOfAddressCheck); \
  496. if (ResultOfAddressCheck) \
  497. { \
  498. if (CombinedFilters & \
  499. (NDIS_PACKET_TYPE_ALL_FUNCTIONAL | \
  500. NDIS_PACKET_TYPE_FUNCTIONAL)) \
  501. { \
  502. ULONG FunctionalAddress; \
  503. \
  504. RetrieveUlong(&FunctionalAddress, ((_DAddress) + 2)); \
  505. if ((FunctionalAddress & \
  506. (_Filter)->CombinedFunctionalAddress)) \
  507. { \
  508. *(_pfLoopback) = TRUE; \
  509. break; \
  510. } \
  511. } \
  512. } \
  513. } \
  514. } \
  515. else \
  516. { \
  517. /* See if it is self-directed. */ \
  518. \
  519. if ((*(ULONG UNALIGNED *)(_DAddress + 2) == \
  520. *(ULONG UNALIGNED *)(&(_Filter)->AdapterAddress[2])) && \
  521. (*(USHORT UNALIGNED *)(_DAddress) == \
  522. *(USHORT UNALIGNED *)(&(_Filter)->AdapterAddress[0]))) \
  523. { \
  524. *(_pfLoopback) = TRUE; \
  525. *(_pfSelfDirected) = TRUE; \
  526. break; \
  527. } \
  528. } \
  529. \
  530. } \
  531. } \
  532. } while (FALSE); \
  533. \
  534. if (CombinedFilters & (NDIS_PACKET_TYPE_PROMISCUOUS | NDIS_PACKET_TYPE_ALL_LOCAL)) \
  535. { \
  536. *(_pfLoopback) = TRUE; \
  537. } \
  538. }
  539. typedef struct _X_BINDING_INFO X_BINDING_INFO, *PX_BINDING_INFO;
  540. typedef struct _X_BINDING_INFO
  541. {
  542. //
  543. // The following pointers are used to travers the specific
  544. // and total filter lists. They need to be at the first
  545. // elements in the structure
  546. //
  547. PX_BINDING_INFO NextOpen;
  548. PNDIS_OPEN_BLOCK NdisBindingHandle;
  549. PVOID Reserved;
  550. UINT PacketFilters;
  551. UINT OldPacketFilters;
  552. ULONG References;
  553. PX_BINDING_INFO NextInactiveOpen;
  554. BOOLEAN ReceivedAPacket;
  555. union
  556. {
  557. //
  558. // Ethernet
  559. //
  560. struct
  561. {
  562. UCHAR (*MCastAddressBuf)[ETH_LENGTH_OF_ADDRESS];
  563. UINT NumAddresses;
  564. UCHAR (*OldMCastAddressBuf)[ETH_LENGTH_OF_ADDRESS];
  565. UINT OldNumAddresses;
  566. };
  567. //
  568. // Fddi
  569. //
  570. struct
  571. {
  572. UCHAR (*MCastLongAddressBuf)[FDDI_LENGTH_OF_LONG_ADDRESS];
  573. UINT NumLongAddresses;
  574. UCHAR (*MCastShortAddressBuf)[FDDI_LENGTH_OF_SHORT_ADDRESS];
  575. UINT NumShortAddresses;
  576. //
  577. // Save area while the change is made
  578. //
  579. UCHAR (*OldMCastLongAddressBuf)[FDDI_LENGTH_OF_LONG_ADDRESS];
  580. UINT OldNumLongAddresses;
  581. UCHAR (*OldMCastShortAddressBuf)[FDDI_LENGTH_OF_SHORT_ADDRESS];
  582. UINT OldNumShortAddresses;
  583. };
  584. //
  585. // Token-Ring
  586. //
  587. struct
  588. {
  589. TR_FUNCTIONAL_ADDRESS FunctionalAddress;
  590. TR_FUNCTIONAL_ADDRESS OldFunctionalAddress;
  591. BOOLEAN UsingGroupAddress;
  592. BOOLEAN OldUsingGroupAddress;
  593. };
  594. };
  595. } X_BINDING_INFO, *PX_BINDING_INFO;
  596. typedef struct _X_FILTER
  597. {
  598. //
  599. // The list of bindings are seperated for directed and broadcast/multicast
  600. // Promiscuous bindings are on both lists
  601. //
  602. PX_BINDING_INFO OpenList;
  603. NDIS_RW_LOCK BindListLock;
  604. PNDIS_MINIPORT_BLOCK Miniport;
  605. UINT CombinedPacketFilter;
  606. UINT OldCombinedPacketFilter;
  607. UINT NumOpens;
  608. PX_BINDING_INFO MCastSet;
  609. PX_BINDING_INFO SingleActiveOpen;
  610. UCHAR AdapterAddress[ETH_LENGTH_OF_ADDRESS];
  611. union
  612. {
  613. //
  614. // Ethernet
  615. //
  616. struct
  617. {
  618. UCHAR (*MCastAddressBuf)[ETH_LENGTH_OF_ADDRESS];
  619. UCHAR (*OldMCastAddressBuf)[ETH_LENGTH_OF_ADDRESS];
  620. UINT MaxMulticastAddresses;
  621. UINT NumAddresses;
  622. UINT OldNumAddresses;
  623. };
  624. //
  625. // Fddi
  626. //
  627. struct
  628. {
  629. #define AdapterLongAddress AdapterAddress
  630. UCHAR AdapterShortAddress[FDDI_LENGTH_OF_SHORT_ADDRESS];
  631. UCHAR (*MCastLongAddressBuf)[FDDI_LENGTH_OF_LONG_ADDRESS];
  632. UCHAR (*MCastShortAddressBuf)[FDDI_LENGTH_OF_SHORT_ADDRESS];
  633. UCHAR (*OldMCastLongAddressBuf)[FDDI_LENGTH_OF_LONG_ADDRESS];
  634. UCHAR (*OldMCastShortAddressBuf)[FDDI_LENGTH_OF_SHORT_ADDRESS];
  635. UINT MaxMulticastLongAddresses;
  636. UINT MaxMulticastShortAddresses;
  637. UINT NumLongAddresses;
  638. UINT NumShortAddresses;
  639. UINT OldNumLongAddresses;
  640. UINT OldNumShortAddresses;
  641. BOOLEAN SupportsShortAddresses;
  642. };
  643. struct
  644. {
  645. TR_FUNCTIONAL_ADDRESS CombinedFunctionalAddress;
  646. TR_FUNCTIONAL_ADDRESS GroupAddress;
  647. UINT GroupReferences;
  648. TR_FUNCTIONAL_ADDRESS OldCombinedFunctionalAddress;
  649. TR_FUNCTIONAL_ADDRESS OldGroupAddress;
  650. UINT OldGroupReferences;
  651. };
  652. };
  653. } X_FILTER, *PX_FILTER;
  654. //
  655. //UINT
  656. //ETH_QUERY_FILTER_CLASSES(
  657. // IN PETH_FILTER Filter
  658. // )
  659. //
  660. // This macro returns the currently enabled filter classes.
  661. //
  662. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  663. //
  664. #define ETH_QUERY_FILTER_CLASSES(Filter) ((Filter)->CombinedPacketFilter)
  665. //
  666. //UINT
  667. //ETH_QUERY_PACKET_FILTER(
  668. // IN PETH_FILTER Filter,
  669. // IN NDIS_HANDLE NdisFilterHandle
  670. // )
  671. //
  672. // This macro returns the currently enabled filter classes for a specific
  673. // open instance.
  674. //
  675. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  676. //
  677. #define ETH_QUERY_PACKET_FILTER(Filter, NdisFilterHandle) \
  678. (((PETH_BINDING_INFO)(NdisFilterHandle))->PacketFilters)
  679. //
  680. //UINT
  681. //ETH_NUMBER_OF_GLOBAL_FILTER_ADDRESSES(
  682. // IN PETH_FILTER Filter
  683. // )
  684. //
  685. // This macro returns the number of multicast addresses in the
  686. // multicast address list.
  687. //
  688. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  689. //
  690. #define ETH_NUMBER_OF_GLOBAL_FILTER_ADDRESSES(Filter) ((Filter)->NumAddresses)
  691. typedef X_BINDING_INFO ETH_BINDING_INFO, *PETH_BINDING_INFO;
  692. typedef X_FILTER ETH_FILTER, *PETH_FILTER;
  693. //
  694. //UINT
  695. //FDDI_QUERY_FILTER_CLASSES(
  696. // IN PFDDI_FILTER Filter
  697. // )
  698. //
  699. // This macro returns the currently enabled filter classes.
  700. //
  701. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  702. //
  703. #define FDDI_QUERY_FILTER_CLASSES(Filter) ((Filter)->CombinedPacketFilter)
  704. //
  705. //UINT
  706. //FDDI_QUERY_PACKET_FILTER(
  707. // IN PFDDI_FILTER Filter,
  708. // IN NDIS_HANDLE NdisFilterHandle
  709. // )
  710. //
  711. // This macro returns the currently enabled filter classes for a specific
  712. // open instance.
  713. //
  714. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  715. //
  716. #define FDDI_QUERY_PACKET_FILTER(Filter, NdisFilterHandle) \
  717. (((PFDDI_BINDING_INFO)(NdisFilterHandle))->PacketFilters)
  718. //
  719. //UINT
  720. //FDDI_NUMBER_OF_GLOBAL_FILTER_LONG_ADDRESSES(
  721. // IN PFDDI_FILTER Filter
  722. // )
  723. //
  724. // This macro returns the number of multicast addresses in the
  725. // multicast address list.
  726. //
  727. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  728. //
  729. #define FDDI_NUMBER_OF_GLOBAL_FILTER_LONG_ADDRESSES(Filter) ((Filter)->NumLongAddresses)
  730. //
  731. //UINT
  732. //FDDI_NUMBER_OF_GLOBAL_FILTER_SHORT_ADDRESSES(
  733. // IN PFDDI_FILTER Filter
  734. // )
  735. //
  736. // This macro returns the number of multicast addresses in the
  737. // multicast address list.
  738. //
  739. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  740. //
  741. #define FDDI_NUMBER_OF_GLOBAL_FILTER_SHORT_ADDRESSES(Filter) ((Filter)->NumShortAddresses)
  742. #define FDDI_FILTER_SUPPORTS_SHORT_ADDR(Filter) (Filter)->SupportsShortAddresses
  743. //
  744. // The binding info is threaded on two lists. When
  745. // the binding is free it is on a single freelist.
  746. //
  747. // When the binding is being used it is on an index list
  748. // and possibly on seperate broadcast and directed lists.
  749. //
  750. typedef X_BINDING_INFO FDDI_BINDING_INFO,*PFDDI_BINDING_INFO;
  751. typedef X_FILTER FDDI_FILTER, *PFDDI_FILTER;
  752. //
  753. //UINT
  754. //TR_QUERY_FILTER_CLASSES(
  755. // IN PTR_FILTER Filter
  756. // )
  757. //
  758. // This macro returns the currently enabled filter classes.
  759. //
  760. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  761. //
  762. #define TR_QUERY_FILTER_CLASSES(Filter) ((Filter)->CombinedPacketFilter)
  763. //
  764. //UINT
  765. //TR_QUERY_PACKET_FILTER(
  766. // IN PTR_FILTER Filter,
  767. // IN NDIS_HANDLE NdisFilterHandle
  768. // )
  769. //
  770. // This macro returns the currently enabled filter classes for a specific
  771. // open instance.
  772. //
  773. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  774. //
  775. #define TR_QUERY_PACKET_FILTER(Filter, NdisFilterHandle) \
  776. (((PTR_BINDING_INFO)NdisFilterHandle)->PacketFilters)
  777. //
  778. //UINT
  779. //TR_QUERY_FILTER_ADDRESSES(
  780. // IN PTR_FILTER Filter
  781. // )
  782. //
  783. // This macro returns the currently enabled functional address.
  784. //
  785. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  786. //
  787. #define TR_QUERY_FILTER_ADDRESSES(Filter) ((Filter)->CombinedFunctionalAddress)
  788. //
  789. //UINT
  790. //TR_QUERY_FILTER_GROUP(
  791. // IN PTR_FILTER Filter
  792. // )
  793. //
  794. // This macro returns the currently enabled Group address.
  795. //
  796. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  797. //
  798. #define TR_QUERY_FILTER_Group(Filter) ((Filter)->GroupAddress)
  799. #define TR_QUERY_FILTER_GROUP(Filter) ((Filter)->GroupAddress)
  800. //
  801. //UINT
  802. //TR_QUERY_FILTER_BINDING_ADDRESS(
  803. // IN PTR_FILTER Filter
  804. // IN NDIS_HANDLE NdisFilterHandle,
  805. // )
  806. //
  807. // This macro returns the currently desired functional addresses
  808. // for the specified binding.
  809. //
  810. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  811. //
  812. #define TR_QUERY_FILTER_BINDING_ADDRESS(Filter, NdisFilterHandle) \
  813. (((PTR_BINDING_INFO)NdisFilterHandle)->FunctionalAddress)
  814. //
  815. //BOOLEAN
  816. //TR_QUERY_FILTER_BINDING_GROUP(
  817. // IN PTR_FILTER Filter
  818. // IN NDIS_HANDLE NdisFilterHandle,
  819. // )
  820. //
  821. // This macro returns TRUE if the specified binding is using the
  822. // current group address.
  823. //
  824. // NOTE: THIS MACRO ASSUMES THAT THE FILTER LOCK IS HELD.
  825. //
  826. #define TR_QUERY_FILTER_BINDING_GROUP(Filter, NdisFilterHandle) \
  827. (((PTR_BINDING_INFO)NdisFilterHandle)->UsingGroupAddress)
  828. typedef X_BINDING_INFO TR_BINDING_INFO,*PTR_BINDING_INFO;
  829. typedef X_FILTER TR_FILTER, *PTR_FILTER;
  830. #endif // _FILTER_DEFS_