|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1989-1993 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: nbfmac.c ! 8: ! 9: Abstract: ! 10: ! 11: This module contains code which implements Mac type dependent code for ! 12: the ST transport. ! 13: ! 14: Environment: ! 15: ! 16: Kernel mode (Actually, unimportant) ! 17: ! 18: Revision History: ! 19: ! 20: --*/ ! 21: ! 22: #include "st.h" ! 23: ! 24: UCHAR SingleRouteSourceRouting[] = { 0xc2, 0x70 }; ! 25: UCHAR GeneralRouteSourceRouting[] = { 0x82, 0x70 }; ! 26: ULONG DefaultSourceRoutingLength = 2; ! 27: ! 28: VOID ! 29: MacInitializeMacInfo( ! 30: IN NDIS_MEDIUM MacType, ! 31: OUT PST_NDIS_IDENTIFICATION MacInfo ! 32: ); ! 33: ! 34: // ! 35: // This is the interpretation of the length bits in ! 36: // the 802.5 source-routing information. ! 37: // ! 38: ! 39: ULONG SR802_5Lengths[8] = { 516, 1500, 2052, 4472, ! 40: 8144, 11407, 17800, 17800 }; ! 41: ! 42: ! 43: #ifdef ALLOC_PRAGMA ! 44: #pragma alloc_text(init,MacInitializeMacInfo) ! 45: #pragma alloc_text(init,MacSetMulticastAddress) ! 46: #endif ! 47: ! 48: ! 49: ! 50: VOID ! 51: MacInitializeMacInfo( ! 52: IN NDIS_MEDIUM MacType, ! 53: OUT PST_NDIS_IDENTIFICATION MacInfo ! 54: ) ! 55: ! 56: /*++ ! 57: ! 58: Routine Description: ! 59: ! 60: Fills in the MacInfo table based on MacType. ! 61: ! 62: Arguments: ! 63: ! 64: MacType - The MAC type we wish to decode. ! 65: ! 66: MacInfo - The MacInfo structure to fill in. ! 67: ! 68: Return Value: ! 69: ! 70: None. ! 71: ! 72: --*/ ! 73: ! 74: { ! 75: switch (MacType) { ! 76: case NdisMedium802_3: ! 77: MacInfo->DestinationOffset = 0; ! 78: MacInfo->SourceOffset = 6; ! 79: MacInfo->SourceRouting = FALSE; ! 80: MacInfo->AddressLength = 6; ! 81: MacInfo->MaxHeaderLength = 14; ! 82: MacInfo->MediumType = NdisMedium802_3; ! 83: break; ! 84: case NdisMedium802_5: ! 85: MacInfo->DestinationOffset = 2; ! 86: MacInfo->SourceOffset = 8; ! 87: MacInfo->SourceRouting = TRUE; ! 88: MacInfo->AddressLength = 6; ! 89: MacInfo->MaxHeaderLength = 32; ! 90: MacInfo->MediumType = NdisMedium802_5; ! 91: break; ! 92: case NdisMediumFddi: ! 93: MacInfo->DestinationOffset = 1; ! 94: MacInfo->SourceOffset = 7; ! 95: MacInfo->SourceRouting = FALSE; ! 96: MacInfo->AddressLength = 6; ! 97: MacInfo->MaxHeaderLength = 13; ! 98: MacInfo->MediumType = NdisMediumFddi; ! 99: break; ! 100: default: ! 101: ASSERT(FALSE); ! 102: } ! 103: } ! 104: ! 105: VOID ! 106: MacConstructHeader ( ! 107: IN PST_NDIS_IDENTIFICATION MacInfo, ! 108: IN PUCHAR Buffer, ! 109: IN PUCHAR DestinationAddress, ! 110: IN PUCHAR SourceAddress, ! 111: IN UINT PacketLength, ! 112: IN PUCHAR SourceRouting, ! 113: IN UINT SourceRoutingLength, ! 114: OUT PUINT HeaderLength ! 115: ) ! 116: ! 117: /*++ ! 118: ! 119: Routine Description: ! 120: ! 121: This routine is called to construct the Mac header for the particular ! 122: network type we're talking to. ! 123: ! 124: Arguments: ! 125: ! 126: MacInfo - Describes the mac we wish to build a header for. ! 127: ! 128: Buffer - Where to build the header. ! 129: ! 130: DestinationAddress - the address this packet is to be sent to. ! 131: ! 132: SourceAddress - Our address. Passing it in as a parameter allows us to play ! 133: games with source if we need to. ! 134: ! 135: PacketLength - The length of this packet. Note that this does not ! 136: includes the Mac header. ! 137: ! 138: SourceRouting - Optional source routing information. ! 139: ! 140: SourceRoutingLength - The length of SourceRouting. ! 141: ! 142: HeaderLength - Returns the length of the constructed header. ! 143: ! 144: Return Value: ! 145: ! 146: None. ! 147: ! 148: --*/ ! 149: { ! 150: // ! 151: // Note network order of bytes. ! 152: // ! 153: ! 154: switch (MacInfo->MediumType) { ! 155: ! 156: case NdisMedium802_3: ! 157: ! 158: *(ULONG UNALIGNED *)&Buffer[6] = *(ULONG UNALIGNED *)&SourceAddress[0]; ! 159: Buffer[10] = SourceAddress[4]; ! 160: Buffer[11] = SourceAddress[5]; ! 161: ! 162: *(ULONG UNALIGNED *)&Buffer[0] = *(ULONG UNALIGNED *)&DestinationAddress[0]; ! 163: Buffer[4] = DestinationAddress[4]; ! 164: Buffer[5] = DestinationAddress[5]; ! 165: ! 166: Buffer[12] = (UCHAR)(PacketLength >> 8); ! 167: Buffer[13] = (UCHAR)PacketLength; ! 168: ! 169: *HeaderLength = 14; ! 170: ! 171: break; ! 172: ! 173: case NdisMedium802_5: ! 174: ! 175: Buffer[0] = TR_HEADER_BYTE_0; ! 176: Buffer[1] = TR_HEADER_BYTE_1; ! 177: ! 178: ASSERT (TR_ADDRESS_LENGTH == 6); ! 179: ! 180: *(ULONG UNALIGNED *)&Buffer[8] = *(ULONG UNALIGNED *)&SourceAddress[0]; ! 181: Buffer[12] = SourceAddress[4]; ! 182: Buffer[13] = SourceAddress[5]; ! 183: ! 184: *(ULONG UNALIGNED *)&Buffer[2] = *(ULONG UNALIGNED *)&DestinationAddress[0]; ! 185: Buffer[6] = DestinationAddress[4]; ! 186: Buffer[7] = DestinationAddress[5]; ! 187: ! 188: *HeaderLength = 14; ! 189: if (SourceRouting != NULL) { ! 190: RtlCopyMemory (&Buffer[14], SourceRouting, SourceRoutingLength); ! 191: Buffer[8] |= 0x80; // add SR bit in source address ! 192: *HeaderLength = 14 + SourceRoutingLength; ! 193: } ! 194: ! 195: break; ! 196: ! 197: case NdisMediumFddi: ! 198: ! 199: Buffer[0] = FDDI_HEADER_BYTE; ! 200: ! 201: *(ULONG UNALIGNED *)&Buffer[7] = *(ULONG UNALIGNED *)&SourceAddress[0]; ! 202: Buffer[11] = SourceAddress[4]; ! 203: Buffer[12] = SourceAddress[5]; ! 204: ! 205: *(ULONG UNALIGNED *)&Buffer[1] = *(ULONG UNALIGNED *)&DestinationAddress[0]; ! 206: Buffer[5] = DestinationAddress[4]; ! 207: Buffer[6] = DestinationAddress[5]; ! 208: ! 209: *HeaderLength = 13; ! 210: ! 211: break; ! 212: ! 213: default: ! 214: PANIC ("MacConstructHeader: PANIC! called with unsupported Mac type.\n"); ! 215: } ! 216: } ! 217: ! 218: ! 219: VOID ! 220: MacReturnMaxDataSize( ! 221: IN PST_NDIS_IDENTIFICATION MacInfo, ! 222: IN PUCHAR SourceRouting, ! 223: IN UINT SourceRoutingLength, ! 224: IN UINT DeviceMaxFrameSize, ! 225: OUT PUINT MaxFrameSize ! 226: ) ! 227: ! 228: /*++ ! 229: ! 230: Routine Description: ! 231: ! 232: This routine returns the space available for user data in a MAC packet. ! 233: This will be the available space after the MAC header; all headers ! 234: headers will be included in this space. ! 235: ! 236: Arguments: ! 237: ! 238: MacInfo - Describes the MAC we wish to decode. ! 239: ! 240: SourceRouting - If we are concerned about a reply to a specific ! 241: frame, then this information is used. ! 242: ! 243: SourceRouting - The length of SourceRouting. ! 244: ! 245: MaxFrameSize - The maximum frame size as returned by the adapter. ! 246: ! 247: MaxDataSize - The maximum data size computed. ! 248: ! 249: Return Value: ! 250: ! 251: None. ! 252: ! 253: --*/ ! 254: ! 255: { ! 256: switch (MacInfo->MediumType) { ! 257: ! 258: case NdisMedium802_3: ! 259: ! 260: // ! 261: // For 802.3, we always have a 14-byte MAC header. ! 262: // ! 263: ! 264: *MaxFrameSize = DeviceMaxFrameSize - 14; ! 265: break; ! 266: ! 267: case NdisMedium802_5: ! 268: ! 269: // ! 270: // For 802.5, if we have source routing information then ! 271: // use that, otherwise assume the worst. ! 272: // ! 273: ! 274: if (SourceRouting && SourceRoutingLength >= 2) { ! 275: ! 276: UINT SRLength; ! 277: ! 278: SRLength = SR802_5Lengths[(SourceRouting[1] & 0x70) >> 4]; ! 279: DeviceMaxFrameSize -= (SourceRoutingLength + 14); ! 280: ! 281: if (DeviceMaxFrameSize < SRLength) { ! 282: *MaxFrameSize = DeviceMaxFrameSize; ! 283: } else { ! 284: *MaxFrameSize = SRLength; ! 285: } ! 286: ! 287: } else { ! 288: ! 289: if (DeviceMaxFrameSize < 548) { ! 290: *MaxFrameSize = DeviceMaxFrameSize - 32; ! 291: } else { ! 292: *MaxFrameSize = 516; ! 293: } ! 294: } ! 295: ! 296: break; ! 297: ! 298: case NdisMediumFddi: ! 299: ! 300: // ! 301: // For FDDI, we always have a 13-byte MAC header. ! 302: // ! 303: ! 304: *MaxFrameSize = DeviceMaxFrameSize - 13; ! 305: break; ! 306: ! 307: } ! 308: } ! 309: ! 310: ! 311: ! 312: VOID ! 313: MacSetMulticastAddress ( ! 314: IN NDIS_MEDIUM Type, ! 315: IN PUCHAR Buffer ! 316: ) ! 317: /*++ ! 318: ! 319: Routine Description: ! 320: ! 321: This routine sets the multicast address into a buffer provided ! 322: by the user. ! 323: ! 324: Arguments: ! 325: ! 326: Type the Mac Medium type. ! 327: ! 328: Buffer the buffer to put the multicast address in. ! 329: ! 330: ! 331: Return Value: ! 332: ! 333: none. ! 334: ! 335: --*/ ! 336: { ! 337: switch (Type) { ! 338: case NdisMedium802_3: ! 339: case NdisMediumFddi: ! 340: Buffer[0] = 0x03; ! 341: Buffer[1] = 0x07; ! 342: Buffer[2] = 0x03; ! 343: Buffer[3] = 0x07; ! 344: Buffer[4] = 0x03; ! 345: Buffer[5] = 0x07; ! 346: break; ! 347: ! 348: case NdisMedium802_5: ! 349: Buffer[0] = 0xc0; ! 350: Buffer[3] = 0x20; ! 351: break; ! 352: ! 353: default: ! 354: PANIC ("MacSetMulticastAddress: PANIC! called with unsupported Mac type.\n"); ! 355: } ! 356: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.