所有的测试流程表明,程序已经成功的创建新的数据包,然后调用NdisFSendNetBufferLists发送数据。更令人不甚明白的是,在本地的有线网卡上可以成功的发送出去到目的地,就是单纯无线网卡没有按照约定发送数据,所以一个可以怀疑的理由就是我们的约定出错了。调试显示所有的步骤都跟有线的一样,没有什么出路。一直觉得不可思议。
VOID NdisFSendNetBufferLists( IN NDIS_HANDLE NdisFilterHandle, IN PNET_BUFFER_LIST NetBufferLists, IN NDIS_PORT_NUMBER PortNumber, IN ULONG SendFlags );
但是回到家里仔细看看了函数的其中一个参数 portNumber.这里的默认值是0.然后问题可能出在这里:
1. 如果你只有一张网卡激活使用,通常情况下,这种网卡的port number 就是0.这也就是解释为什么如果只有一张有线网卡,可以正常发送数据,或者是在两张网卡的情况下,本来两种都要发送数据的,结果却捕捉到一个数据。
2. 曾记得上次在创建一个新的Mac Entity的时候,申请的端口已经是1了。所以我怀疑如果一台机器如果有两张网卡同时使用,那么是不是每一张使用的Ndis prot number 不是一样的,其中一张自然是0,那么另外一张就可能是1了。
如果不小心设置了第二张网卡来发送数据,可是prot number填充的是0,估计就有问题了。我现在对Ndis Port不是很明白里面的架构:是每张网卡对应一个miniprot driver?然后各自激活port,还是每台机器就一个整体miniprot driver,共同分配port number,如果是第二种情况,那么我担忧的就不是多余的了。
改天抽空验证:方法应该是调用OID_GEN_ENUMERATE_PORTS
As a query, NDIS and overlying drivers use the OID_GEN_ENUMERATE_PORTS OID to determine the characteristics of the active NDIS ports that are associated with an underlying miniport adapter.
返回的结果保存在一个NDIS_PORT_ARRAY结构中
typedef struct _NDIS_PORT_ARRAY { NDIS_OBJECT_HEADER Header; ULONG NumberOfPorts; ULONG OffsetFirstPort; ULONG ElementSize; NDIS_PORT_CHARACTERISTICS Ports[1]; } NDIS_PORT_ARRAY, *PNDIS_PORT_ARRAY;
NumberOfPorts记录的是port 的个数。
typedef struct _NDIS_PORT_CHARACTERISTICS { NDIS_OBJECT_HEADER Header; NDIS_PORT_NUMBER PortNumber; ... }
这个数据结构中的ProtNumber表示的就是Port的数值了,默认是0,最大为0xFFFFFF.
================================================================================
刚才测试了,发现应该不是端口的问题,反而有可能是数据包的格式有问题。老师说Native Wifi的数据包格式会与802.3不一样。所以估计要重新设计那个Ethernet Header的格式??
===============================================================================
我问了有些人,他们说值一样的。所以我继续做了测试,那么接下来的怀疑就落在了内容得填充上了。是否无线网卡的mac地址如果不是对应本张网卡就发送不了呢? 有线的以太网卡是可以冒填的。所以我重新认真填写了一遍mac源地址。这下子就OK了。
具体的信息为:
Frame: Number = 1475, Captured Frame Length = 130, MediaType = WiFi
- WiFi: [Unencrypted Data] .T...., (I)
- MetaData:
Version: 2 (0x2)
Length: 32 (0x20)
- OpMode: Extensible Station Mode
StationMode: (...............................0) Not Station Mode
APMode: (..............................0.) Not AP Mode
ExtensibleStationMode: (.............................1..) Extensible Station Mode
Unused: (.0000000000000000000000000000...)
MonitorMode: (0...............................) Monitor Mode
Flags: 4294967295 (0xFFFFFFFF)
RemData: Outbound
TimeStamp: 03/31/2010, 09:47:58 AM
- FrameControl: .T.... (0x0801)
Version: (..............00) 0
Type: (............10..) Data
SubType: (........0000....) Data
DS: (......01........) STA to DS via AP
MoreFrag: (.....0..........) No
Retransmission: (....0...........) No
PowerMgt: (...0............) Active Mode
MoreData: (..0.............) No
Encrypted: (.0..............) No
Order: (0...............) Unordered
- Data:
Duration: 32768 (0x8000)
- ClientToAP:
BSSID: Cisco Systems, Inc. 549143
Source: 002586 EB7B0C
Destination: USI 5B1430
- SequenceControl: Sequence Number = 0
FragmentNumber: (............0000) 0
SequenceNumber: (000000000000....) 0
- LLC: Unnumbered(U) Frame, Command Frame, SSAP = SNAP(Sub-Network Access Protocol), DSAP = SNAP(Sub-Network Access Protocol)
- DSAP: SNAP(Sub-Network Access Protocol), Individual DSAP
Address: (1010101.) SNAP(Sub-Network Access Protocol)
IG: (.......0) Individual Address
- SSAP: SNAP(Sub-Network Access Protocol), Command
Address: (1010101.) SNAP(Sub-Network Access Protocol)
CR: (.......0) Command Frame
- Unnumbered: UI - Unnumbered Information
MMM: (000.....) 0
PF: (...0....) Poll Bit - No Response Solicited
MM: (....00..)
Type: (......11) Unnumbered(U) Frame
- Snap: EtherType = EAPOL/802.1x, OrgCode = XEROX CORPORATION
OrganizationCode: XEROX CORPORATION, 0(0x0000)
EtherType: EAPOL/802.1x, 34958(0x888E)
- Eapol: EAPOL-Start , Length = 515
Version: 0 (0x0)
Type: EAPOL-Start, 1(0x01)
BodyLength: 515 bytes
EAPOLTypeError: EAPOL Type Error
- remainder: Length = 62
Data: Binary Large Object (62 Bytes)
---------注意 [USI 5B1430]很奇怪,本來一連串的mac地址前面變成了USI字母,我以為那裡出錯了。一查才知道這種網卡芯片應該是USI公司的產品,即每個生成廠商都會以某個地址段為標誌。具体那些MAC地址分配给哪些厂商,可在 IEEE Standards Association的查询网址内查询得知。
http://standards.ieee.org/regauth/oui/index.shtml