Annotation of ntddk/src/network/tdi/stmac.h, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1989-1993  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     stmac.h
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This header file defines manifest constants and necessary macros for use
        !            12:     by transports dealing with multiple MAC cards through the NDIS interface.
        !            13: 
        !            14: Revision History:
        !            15: 
        !            16: --*/
        !            17: 
        !            18: #ifndef _STMAC_
        !            19: #define _STMAC_
        !            20: 
        !            21: //
        !            22: // MAC-specific definitions, some of which get used below
        !            23: //
        !            24: 
        !            25: #define MAX_MAC_HEADER_LENGTH       32
        !            26: #define MAX_SOURCE_ROUTING          18
        !            27: #define MAX_DEFAULT_SR               2
        !            28: 
        !            29: #define ETHERNET_ADDRESS_LENGTH        6
        !            30: #define ETHERNET_PACKET_LENGTH      1514  // max size of an ethernet packet
        !            31: #define ETHERNET_HEADER_LENGTH        14  // size of the ethernet MAC header
        !            32: #define ETHERNET_DATA_LENGTH_OFFSET   12
        !            33: #define ETHERNET_DESTINATION_OFFSET    0
        !            34: #define ETHERNET_SOURCE_OFFSET         6
        !            35: 
        !            36: #define TR_ADDRESS_LENGTH        6
        !            37: #define TR_ADDRESS_OFFSET        2
        !            38: #define TR_SPECIFIC_OFFSET       0
        !            39: #define TR_PACKET_LENGTH      1514  // max size of a TR packet //BUGBUG
        !            40: #define TR_HEADER_LENGTH        36  // size of the MAC header w/o source routing
        !            41: #define TR_DATA_LENGTH_OFFSET    0
        !            42: #define TR_DESTINATION_OFFSET    2
        !            43: #define TR_SOURCE_OFFSET         8
        !            44: #define TR_ROUTING_OFFSET       14      // starts at the 14th byte
        !            45: #define TR_GR_BCAST_LENGTH       2
        !            46: #define TR_GR_BROADCAST         0xC270  // what a general route b'cast looks like
        !            47: #define TR_ROUTING_LENGTH_MASK  0x1F    // low 5 bits in byte
        !            48: #define TR_DIRECTION_MASK       0x80    // returns direction bit
        !            49: 
        !            50: #define TR_PREAMBLE_AC        0x10  // how would these be specified?
        !            51: #define TR_PREAMBLE_FC        0x40
        !            52: 
        !            53: #define TR_HEADER_BYTE_0            0x10
        !            54: #define TR_HEADER_BYTE_1            0x40
        !            55: 
        !            56: #define FDDI_ADDRESS_LENGTH         6
        !            57: #define FDDI_HEADER_BYTE            0x57
        !            58: 
        !            59: 
        !            60: 
        !            61: //
        !            62: // We need this to define information about the MAC. Note that
        !            63: // it is a strange structure in that the first four elements
        !            64: // are for use internally by the stmac routines, while the
        !            65: // DeviceContext knows about and uses the last two.
        !            66: //
        !            67: 
        !            68: typedef struct _ST_NDIS_IDENTIFICATION {
        !            69:   NDIS_MEDIUM MediumType;
        !            70:   BOOLEAN SourceRouting;
        !            71:   BOOLEAN MediumAsync;
        !            72:   BOOLEAN CopyLookahead;
        !            73:   ULONG DestinationOffset;
        !            74:   ULONG SourceOffset;
        !            75:   ULONG AddressLength;
        !            76:   ULONG MaxHeaderLength;
        !            77: } ST_NDIS_IDENTIFICATION, *PST_NDIS_IDENTIFICATION;
        !            78: 
        !            79: 
        !            80: 
        !            81: VOID
        !            82: MacConstructHeader(
        !            83:     IN PST_NDIS_IDENTIFICATION MacInfo,
        !            84:     IN PUCHAR Buffer,
        !            85:     IN PUCHAR DestinationAddress,
        !            86:     IN PUCHAR SourceAddress,
        !            87:     IN UINT PacketLength,
        !            88:     IN PUCHAR SourceRouting,
        !            89:     IN UINT SourceRoutingLength,
        !            90:     OUT PUINT HeaderLength
        !            91:     );
        !            92: 
        !            93: VOID
        !            94: MacReturnMaxDataSize(
        !            95:     IN PST_NDIS_IDENTIFICATION MacInfo,
        !            96:     IN PUCHAR SourceRouting,
        !            97:     IN UINT SourceRoutingLength,
        !            98:     IN UINT DeviceMaxFrameSize,
        !            99:     OUT PUINT MaxFrameSize
        !           100:     );
        !           101: 
        !           102: VOID
        !           103: MacInitializeMacInfo(
        !           104:     IN NDIS_MEDIUM MacType,
        !           105:     OUT PST_NDIS_IDENTIFICATION MacInfo
        !           106:     );
        !           107: 
        !           108: 
        !           109: extern UCHAR SingleRouteSourceRouting[];
        !           110: extern UCHAR GeneralRouteSourceRouting[];
        !           111: extern ULONG DefaultSourceRoutingLength;
        !           112: 
        !           113: 
        !           114: //++
        !           115: //
        !           116: // VOID
        !           117: // MacReturnDestinationAddress(
        !           118: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           119: //     IN PVOID Packet,
        !           120: //     OUT PVOID * DestinationAddress
        !           121: //     );
        !           122: //
        !           123: // Routine Description:
        !           124: //
        !           125: //     Returns the a pointer to the destination address in the packet.
        !           126: //
        !           127: // Arguments:
        !           128: //
        !           129: //     MacInfo - Describes the MAC we wish to decode.
        !           130: //
        !           131: //     Packet - The packet data.
        !           132: //
        !           133: //     DestinationAddress - Returns the start of the destination address.
        !           134: //
        !           135: // Return Value:
        !           136: //
        !           137: //     None.
        !           138: //
        !           139: //--
        !           140: 
        !           141: #define MacReturnDestinationAddress(_MacInfo, _Packet, _DestinationAddress) \
        !           142:     *(_DestinationAddress) = ((PUCHAR)(_Packet)) + (_MacInfo)->DestinationOffset
        !           143: 
        !           144: 
        !           145: //++
        !           146: //
        !           147: // VOID
        !           148: // MacReturnSourceAddress(
        !           149: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           150: //     IN PVOID Packet,
        !           151: //     OUT PHARDWARE_ADDRESS SourceAddressBuffer,
        !           152: //     OUT PHARDWARE_ADDRESS * SourceAddress,
        !           153: //     );
        !           154: //
        !           155: // Routine Description:
        !           156: //
        !           157: //     Copies the source address in the packet into SourceAddress.
        !           158: //     NOTE THAT IT MAY COPY THE DATA, UNLIKE ReturnDestinationAddress
        !           159: //     AND ReturnSourceRouting.  Optionally, indicates whether the
        !           160: //     destination address is a multicast address.
        !           161: //
        !           162: // Arguments:
        !           163: //
        !           164: //     MacInfo - Describes the MAC we wish to decode.
        !           165: //
        !           166: //     Packet - The packet data.
        !           167: //
        !           168: //     SourceAddressBuffer - A buffer to hold the source address,
        !           169: //         if needed.
        !           170: //
        !           171: //     SourceAddress - Returns a pointer to the source address.
        !           172: //
        !           173: //     Multicast - Optional pointer to a BOOLEAN to receive indication
        !           174: //         of whether the destination was a multicast address.
        !           175: //
        !           176: // Return Value:
        !           177: //
        !           178: //     None.
        !           179: //
        !           180: //--
        !           181: 
        !           182: //
        !           183: // NOTE:  The default case below handles Ethernet and FDDI.
        !           184: //
        !           185: 
        !           186: #define MacReturnSourceAddress(_MacInfo, _Packet, _SourceAddressBuffer, _SourceAddress) \
        !           187: {                                                                       \
        !           188:     PUCHAR TmpPacket = (PUCHAR)(_Packet);                               \
        !           189:     PUCHAR SrcBuffer = (PUCHAR)(_SourceAddressBuffer);                  \
        !           190:                                                                         \
        !           191:     switch ((_MacInfo)->MediumType) {                                   \
        !           192:     case NdisMedium802_5:                                               \
        !           193:         *(PULONG)SrcBuffer = *(ULONG UNALIGNED *)(&TmpPacket[8]) & ~0x80;\
        !           194:         SrcBuffer[4] = TmpPacket[12];                                   \
        !           195:         SrcBuffer[5] = TmpPacket[13];                                   \
        !           196:         *(_SourceAddress) = (PHARDWARE_ADDRESS)SrcBuffer;               \
        !           197:         break;                                                          \
        !           198:     default:                                                            \
        !           199:         *(_SourceAddress) = (PHARDWARE_ADDRESS)(TmpPacket +             \
        !           200:                                         (_MacInfo)->SourceOffset);      \
        !           201:         break;                                                          \
        !           202:     }                                                                   \
        !           203: }
        !           204: 
        !           205: 
        !           206: //++
        !           207: //
        !           208: // VOID
        !           209: // MacReturnSourceRouting(
        !           210: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           211: //     IN PVOID Packet,
        !           212: //     OUT PVOID * SourceRouting
        !           213: //     OUT PUINT SourceRoutingLength
        !           214: //     );
        !           215: //
        !           216: // Routine Description:
        !           217: //
        !           218: //     Returns the a pointer to the source routing info in the packet.
        !           219: //
        !           220: // Arguments:
        !           221: //
        !           222: //     MacInfo - Describes the MAC we wish to decode.
        !           223: //
        !           224: //     Packet - The packet data.
        !           225: //
        !           226: //     SourceRouting - Returns the start of the source routing information,
        !           227: //         or NULL if none is present.
        !           228: //
        !           229: //     SourceRoutingLength - Returns the length of the source routing
        !           230: //         information.
        !           231: //
        !           232: // Return Value:
        !           233: //
        !           234: //     None.
        !           235: //
        !           236: //--
        !           237: 
        !           238: #define MacReturnSourceRouting(_MacInfo, _Packet, _SourceRouting, _SourceRoutingLength) \
        !           239: {                                                               \
        !           240:     PUCHAR TmpPacket = (PUCHAR)(_Packet);                       \
        !           241:     if ((_MacInfo)->SourceRouting) {                            \
        !           242:         if (TmpPacket[8] & 0x80) {                              \
        !           243:             *(_SourceRouting) = TmpPacket + 14;                 \
        !           244:             *(_SourceRoutingLength) = TmpPacket[14] & 0x1f;     \
        !           245:         } else {                                                \
        !           246:             *(_SourceRouting) = NULL;                           \
        !           247:         }                                                       \
        !           248:     } else {                                                    \
        !           249:         *(_SourceRouting) = NULL;                               \
        !           250:     }                                                           \
        !           251: }
        !           252: 
        !           253: //++
        !           254: //
        !           255: // VOID
        !           256: // MacReturnPacketLength(
        !           257: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           258: //     IN PVOID Header,
        !           259: //     IN UINT PacketLength,
        !           260: //     OUT PUINT DataLength
        !           261: //     );
        !           262: //
        !           263: // Routine Description:
        !           264: //
        !           265: //     Returns the length of data in the packet given the header.
        !           266: //
        !           267: // Arguments:
        !           268: //
        !           269: //     MacInfo - Describes the MAC we wish to decode.
        !           270: //
        !           271: //     Header - The packet header.
        !           272: //
        !           273: //     PacketLength - The length of the data (not including header).
        !           274: //
        !           275: //     DataLength - Returns the length of the data.  Unchanged if the
        !           276: //         packet is not recognized.  Should be initialized by caller to 0.
        !           277: //
        !           278: // Return Value:
        !           279: //
        !           280: //     None.
        !           281: //
        !           282: //--
        !           283: 
        !           284: #define MacReturnPacketLength(_MacInfo, _Header, _HeaderLength, _PacketLength, _DataLength) \
        !           285: {                                                               \
        !           286:     PUCHAR TmpPacket = (PUCHAR)(_Header);                       \
        !           287:     UINT TmpLength;                                             \
        !           288:                                                                 \
        !           289:     switch ((_MacInfo)->MediumType) {                           \
        !           290:     case NdisMedium802_3:                                       \
        !           291:         if ((_HeaderLength) >= 14) {                            \
        !           292:             TmpLength = (TmpPacket[12] << 8) | TmpPacket[13];   \
        !           293:             if (TmpLength <= 0x600) {                           \
        !           294:                 if (TmpLength <= (_PacketLength)) {             \
        !           295:                     *(_DataLength) = TmpLength;                 \
        !           296:                 }                                               \
        !           297:             }                                                   \
        !           298:         }                                                       \
        !           299:         break;                                                  \
        !           300:     case NdisMedium802_5:                                       \
        !           301:         if (((_HeaderLength) >= 14) &&                          \
        !           302:             (!(TmpPacket[8] & 0x80) ||                          \
        !           303:              ((_HeaderLength) >=                                \
        !           304:                        (UINT)(14 + (TmpPacket[14] & 0x1f))))) { \
        !           305:             *(_DataLength) = (_PacketLength);                   \
        !           306:         }                                                       \
        !           307:         break;                                                  \
        !           308:     case NdisMediumFddi:                                        \
        !           309:         if ((_HeaderLength) >= 13) {                            \
        !           310:             *(_DataLength) = (_PacketLength);                   \
        !           311:         }                                                       \
        !           312:         break;                                                  \
        !           313:     }                                                           \
        !           314: }
        !           315: 
        !           316: //++
        !           317: //
        !           318: // VOID
        !           319: // MacReturnHeaderLength(
        !           320: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           321: //     IN PVOID Packet,
        !           322: //     OUT PVOID HeaderLength,
        !           323: //     );
        !           324: //
        !           325: // Routine Description:
        !           326: //
        !           327: //     Returns the length of the MAC header in a packet (this
        !           328: //     is used for loopback indications to separate header
        !           329: //     and data).
        !           330: //
        !           331: // Arguments:
        !           332: //
        !           333: //     MacInfo - Describes the MAC we wish to decode.
        !           334: //
        !           335: //     Header - The packet header.
        !           336: //
        !           337: //     HeaderLength - Returns the length of the header.
        !           338: //
        !           339: // Return Value:
        !           340: //
        !           341: //     None.
        !           342: //
        !           343: //--
        !           344: 
        !           345: #define MacReturnHeaderLength(_MacInfo, _Header, _HeaderLength) \
        !           346: {                                                               \
        !           347:     PUCHAR TmpPacket = (PUCHAR)(_Header);                       \
        !           348:                                                                 \
        !           349:     switch ((_MacInfo)->MediumType) {                           \
        !           350:     case NdisMedium802_3:                                       \
        !           351:         *(_HeaderLength) = 14;                                  \
        !           352:         break;                                                  \
        !           353:     case NdisMedium802_5:                                       \
        !           354:          if (TmpPacket[8] & 0x80) {                             \
        !           355:              *(_HeaderLength) = (TmpPacket[14] & 0x1f) + 14;    \
        !           356:          } else {                                               \
        !           357:              *(_HeaderLength) = 14;                             \
        !           358:          }                                                      \
        !           359:         break;                                                  \
        !           360:     case NdisMediumFddi:                                        \
        !           361:         *(_HeaderLength) = 13;                                  \
        !           362:         break;                                                  \
        !           363:     }                                                           \
        !           364: }
        !           365: 
        !           366: //++
        !           367: //
        !           368: // VOID
        !           369: // MacReturnSingleRouteSR(
        !           370: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           371: //     OUT PVOID * SingleRouteSR,
        !           372: //     OUT PUINT SingleRouteSRLength
        !           373: //     );
        !           374: //
        !           375: // Routine Description:
        !           376: //
        !           377: //     Returns the a pointer to the standard single route broadcast
        !           378: //     source routing information for the media type. This is used
        !           379: //     for ADD_NAME_QUERY, DATAGRAM, NAME_IN_CONFLICT, NAME_QUERY,
        !           380: //     and STATUS_QUERY frames.
        !           381: //
        !           382: // Arguments:
        !           383: //
        !           384: //     MacInfo - Describes the MAC we wish to decode.
        !           385: //
        !           386: //     SingleRouteSR - Returns a pointer to the data.
        !           387: //
        !           388: //     SingleRouteSRLength - The length of SingleRouteSR.
        !           389: //
        !           390: // Return Value:
        !           391: //
        !           392: //     None.
        !           393: //
        !           394: //--
        !           395: 
        !           396: #define MacReturnSingleRouteSR(_MacInfo, _SingleRouteSR, _SingleRouteSRLength) \
        !           397: {                                                               \
        !           398:     switch ((_MacInfo)->MediumType) {                           \
        !           399:     case NdisMedium802_5:                                       \
        !           400:         *(_SingleRouteSR) = SingleRouteSourceRouting;           \
        !           401:         *(_SingleRouteSRLength) = DefaultSourceRoutingLength;   \
        !           402:         break;                                                  \
        !           403:     default:                                                    \
        !           404:         *(_SingleRouteSR) = NULL;                               \
        !           405:         break;                                                  \
        !           406:     }                                                           \
        !           407: }
        !           408: 
        !           409: 
        !           410: //++
        !           411: //
        !           412: // VOID
        !           413: // MacReturnGeneralRouteSR(
        !           414: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           415: //     OUT PVOID * GeneralRouteSR,
        !           416: //     OUT PUINT GeneralRouteSRLength
        !           417: //     );
        !           418: //
        !           419: // Routine Description:
        !           420: //
        !           421: //     Returns the a pointer to the standard general route broadcast
        !           422: //     source routing information for the media type. This is used
        !           423: //     for NAME_RECOGNIZED frames.
        !           424: //
        !           425: // Arguments:
        !           426: //
        !           427: //     MacInfo - Describes the MAC we wish to decode.
        !           428: //
        !           429: //     GeneralRouteSR - Returns a pointer to the data.
        !           430: //
        !           431: //     GeneralRouteSRLength - The length of GeneralRouteSR.
        !           432: //
        !           433: // Return Value:
        !           434: //
        !           435: //     None.
        !           436: //
        !           437: //--
        !           438: 
        !           439: #define MacReturnGeneralRouteSR(_MacInfo, _GeneralRouteSR, _GeneralRouteSRLength) \
        !           440: {                                                               \
        !           441:     switch ((_MacInfo)->MediumType) {                           \
        !           442:     case NdisMedium802_5:                                       \
        !           443:         *(_GeneralRouteSR) = GeneralRouteSourceRouting;         \
        !           444:         *(_GeneralRouteSRLength) = DefaultSourceRoutingLength;  \
        !           445:         break;                                                  \
        !           446:     default:                                                    \
        !           447:         *(_GeneralRouteSR) = NULL;                              \
        !           448:         break;                                                  \
        !           449:     }                                                           \
        !           450: }
        !           451: 
        !           452: #if 0
        !           453: 
        !           454: //++
        !           455: //
        !           456: // VOID
        !           457: // MacCreateGeneralRouteReplySR(
        !           458: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           459: //     IN PUCHAR ExistingSR,
        !           460: //     IN UINT ExistingSRLength,
        !           461: //     OUT PUCHAR * NewSR
        !           462: //     );
        !           463: //
        !           464: // Routine Description:
        !           465: //
        !           466: //     This modifies an existing source routing entry to make
        !           467: //     it into a general-route source routing entry. The assumption
        !           468: //     is that is to reply to existing source routing, so the
        !           469: //     direction bit is also reversed. In addition, if it is
        !           470: //     determined that no source routing is needed in the reply,
        !           471: //     then NULL is returned.
        !           472: //
        !           473: //     Note that the information is modified in-place, but a
        !           474: //     separate pointer is returned (to allow NULL to be returned).
        !           475: //
        !           476: // Arguments:
        !           477: //
        !           478: //     MacInfo - Describes the MAC we wish to decode.
        !           479: //
        !           480: //     ExistingSR - The existing source routing to be modified.
        !           481: //
        !           482: // Return Value:
        !           483: //
        !           484: //     None.
        !           485: //
        !           486: //--
        !           487: 
        !           488: #define MacCreateGeneralRouteReplySR(_MacInfo, _ExistingSR, _ExistingSRLength, _NewSR)  \
        !           489: {                                                               \
        !           490:     if (_ExistingSR) {                                          \
        !           491:         PUCHAR TmpSR = (PUCHAR)(_ExistingSR);                   \
        !           492:         switch ((_MacInfo)->MediumType) {                       \
        !           493:         case NdisMedium802_5:                                   \
        !           494:             TmpSR[0] = (TmpSR[0] & 0x1f) | 0x80;                \
        !           495:             TmpSR[1] = (TmpSR[1] ^ 0x80) | 0x70;                \
        !           496:             *(_NewSR) = (_ExistingSR);                          \
        !           497:             break;                                              \
        !           498:         default:                                                \
        !           499:             *(_NewSR) = (_ExistingSR);                          \
        !           500:             break;                                              \
        !           501:         }                                                       \
        !           502:     } else {                                                    \
        !           503:         *(_NewSR) = NULL;                                       \
        !           504:     }                                                           \
        !           505: }
        !           506: #endif
        !           507: 
        !           508: 
        !           509: //++
        !           510: //
        !           511: // VOID
        !           512: // MacCreateNonBroadcastReplySR(
        !           513: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           514: //     IN PUCHAR ExistingSR,
        !           515: //     IN UINT ExistingSRLength,
        !           516: //     OUT PUCHAR * NewSR
        !           517: //     );
        !           518: //
        !           519: // Routine Description:
        !           520: //
        !           521: //     This modifies an existing source routing entry to make
        !           522: //     it into a non-broadcast source routing entry. The assumption
        !           523: //     is that is to reply to existing source routing, so the
        !           524: //     direction bit is also reversed. In addition, if it is
        !           525: //     determined that no source routing is needed in the reply,
        !           526: //     then NULL is returned.
        !           527: //
        !           528: //     Note that the information is modified in-place, but a
        !           529: //     separate pointer is returned (to allow NULL to be returned).
        !           530: //
        !           531: // Arguments:
        !           532: //
        !           533: //     MacInfo - Describes the MAC we wish to decode.
        !           534: //
        !           535: //     ExistingSR - The existing source routing to be modified.
        !           536: //
        !           537: // Return Value:
        !           538: //
        !           539: //     None.
        !           540: //
        !           541: //--
        !           542: 
        !           543: #define MacCreateNonBroadcastReplySR(_MacInfo, _ExistingSR, _ExistingSRLength, _NewSR)  \
        !           544: {                                                               \
        !           545:     if (_ExistingSR) {                                          \
        !           546:         PUCHAR TmpSR = (PUCHAR)(_ExistingSR);                   \
        !           547:         switch ((_MacInfo)->MediumType) {                       \
        !           548:         case NdisMedium802_5:                                   \
        !           549:             if ((_ExistingSRLength) == 2) {                     \
        !           550:                 *(_NewSR) = NULL;                               \
        !           551:             } else {                                            \
        !           552:                 TmpSR[0] = (TmpSR[0] & 0x1f);                   \
        !           553:                 TmpSR[1] = (TmpSR[1] ^ 0x80) | 0x70;            \
        !           554:                 *(_NewSR) = (_ExistingSR);                      \
        !           555:             }                                                   \
        !           556:             break;                                              \
        !           557:         default:                                                \
        !           558:             *(_NewSR) = (_ExistingSR);                          \
        !           559:             break;                                              \
        !           560:         }                                                       \
        !           561:     } else {                                                    \
        !           562:         *(_NewSR) = NULL;                                       \
        !           563:     }                                                           \
        !           564: }
        !           565: 
        !           566: 
        !           567: //++
        !           568: //
        !           569: // VOID
        !           570: // MacModifyHeader(
        !           571: //     IN PST_NDIS_IDENTIFICATION MacInfo,
        !           572: //     IN PUCHAR Header,
        !           573: //     IN UINT PacketLength
        !           574: //     );
        !           575: //
        !           576: // Routine Description:
        !           577: //
        !           578: //     Modifies a pre-built packet header to include the
        !           579: //     packet length. Used for connection-oriented traffic
        !           580: //     where the header is pre-built.
        !           581: //
        !           582: // Arguments:
        !           583: //
        !           584: //     MacInfo - Describes the MAC we wish to decode.
        !           585: //
        !           586: //     Header - The header to modify.
        !           587: //
        !           588: //     PacketLength - Packet length (not including the header).
        !           589: //       Currently this is the only field that cannot be pre-built.
        !           590: //
        !           591: // Return Value:
        !           592: //
        !           593: //     None.
        !           594: //
        !           595: //--
        !           596: 
        !           597: #define MacModifyHeader(_MacInfo, _Header, _PacketLength)            \
        !           598: {                                                                    \
        !           599:     switch ((_MacInfo)->MediumType) {                                \
        !           600:     case NdisMedium802_3:                                            \
        !           601:         (_Header)[12] = (UCHAR)((_PacketLength) >> 8);               \
        !           602:         (_Header)[13] = (UCHAR)((_PacketLength) & 0xff);             \
        !           603:         break;                                                       \
        !           604:     }                                                                \
        !           605: }
        !           606: 
        !           607: 
        !           608: VOID
        !           609: MacSetMulticastAddress(
        !           610:     IN NDIS_MEDIUM Type,
        !           611:     IN PUCHAR Buffer
        !           612:     );
        !           613: 
        !           614: 
        !           615: 
        !           616: //  VOID
        !           617: //  StSetNdisPacketLength (
        !           618: //      IN NDIS_PACKET Packet,
        !           619: //      IN ULONG Length
        !           620: //      );
        !           621: //
        !           622: // NB: This is not a general purpose macro; it assumes that we are setting the
        !           623: //     length of an NDIS packet with only one NDIS_BUFFER chained. We do
        !           624: //     this to save time during the sending of short control packets.
        !           625: //
        !           626: 
        !           627: #define StSetNdisPacketLength(_packet,_length) {              \
        !           628:     PNDIS_BUFFER NdisBuffer;                                   \
        !           629:     NdisQueryPacket((_packet), NULL, NULL, &NdisBuffer, NULL); \
        !           630:     NdisAdjustBufferLength(NdisBuffer, (_length));             \
        !           631:     NdisRecalculatePacketCounts(_packet);                      \
        !           632: }
        !           633: 
        !           634: #endif // ifdef _STMAC_
        !           635: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.