valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2360回复:15

ndis网卡驱动的mac地址问题

楼主#
更多 发布于:2002-12-11 17:16
我现在在编写miniport的sendpackethandler历程,入口函数是sendpack,有个问题实在是想不通,
我们都知道要传送的packet的指针作为sendpack参数输入,可是对发送的物理网卡来说需要数据和发送目标的mac地址两个参数,这个mac地址驱动是怎样传给网卡的,是在packet内封装好了吗?,还有packet的结构是怎样的?
那位DX提供些信息?
bow )
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-11 17:24
所有的mac信息都已经被上层协议填好了,下面的代码就是拷贝packet里的数据
NdisQueryPacket(Packet, NULL, &BufferCount, &NdisBuffer, &PacketLength);

    if (PacketLength == 0)
{
        return(TRUE);
    }

// 拷贝所有的内存
           ReceiveLength = 0;
for( ;BufferCount > 0 && NdisBuffer; BufferCount-- )
{
NdisQueryBuffer(NdisBuffer, &BufferMemory, &BufferLength);
NdisMoveMemory(
&ReceiveBuffer[ReceiveLength],
BufferMemory,
BufferLength
);
ReceiveLength += BufferLength;
NdisGetNextBuffer(NdisBuffer, &NdisBuffer);
}
valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-11 19:54
谢谢你的回答,
由于要跟网卡的mac控制起衔接,我必须知道packet中那部分是mac地址,那部分时数据,这在网卡中要分别处理的,怎么办?
valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-11 22:05
自己顶,难道没有人作ndis底层的驱动马?
这个问题我都高不清,怎么往下做阿,sigh
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-11 22:31
不在mac头里面么??都有的吖
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-12 09:12
谢谢你的回答,
由于要跟网卡的mac控制起衔接,我必须知道packet中那部分是mac地址,那部分时数据,这在网卡中要分别处理的,怎么办?

最前面14字节就是Mac头,DesMac(6),SourceMac(6),Protocol(2)
建议你找一本关于网络协议介绍的书看看
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-12 09:18
mac头不一定是14个字节吧,要看是那种网络类型
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
yebear
驱动牛犊
驱动牛犊
  • 注册日期2001-05-18
  • 最后登录2013-04-05
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望51点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-12 11:26
我 来 告诉你,

这个mac地址 你不用管,

如果NDIS要你发包,你只管把 packet-> ndis_buffers 中的
数据发出去就行乐。mac_address已经在ndis_buffers中了。

至于 src-mac-address ,NDIS是通过 QueryInformation得到的,
而   des-mac-adddress, NDIS是通过接收到的包,由上层协议
确定的。

[编辑 -  12/13/02 by  yebear]
valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-12 14:41
首先我做的是PCMCIA接口的wirless网卡(802.11标准),我想ndismedium 应该选NdisMediumWirelessWan 对马? (总觉的不大对,为什么不叫ndisMediumWirelessLan呢?),
802.11标准中MAC帧格式如下:括号内为字节数,从地位到高位
FrameControl(2),DurationID(2),Address1(6),Address2(6),Address3(6),SequenceControl(2),Address4(6),FrameBody(?),CRC(4)
那么packet->ndis_buffers 中的数据既然包括mac地址和地址(这个我想可能随NdisMedium不同而不同),但是上述802.11的FrameBody数据是要经过WEP加密的,而address是不加密的,这还是需要把数据和mac address分开处理的,我在ddk中没有发现关于packet>ndis_buffers 的结构,还请各位多多帮忙
valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-12 19:43
有没有人做过类似的工作,这个问题怎么解决?
yebear是不是有过经验,解答一下,
hehe
sigh,现在真的有点作不下去了。
freducn2002
驱动小牛
驱动小牛
  • 注册日期2002-06-26
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望29点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-12-13 09:33
我已经完成了NT下的PCMCIA WLAN driver,是download firmware的
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-13 09:42
 
我在ddk中没有发现关于packet>ndis_buffers 的结构


你仔细看ndis_packet的结构,怎么会没有?buffer就是一块内存,你放什么都行的内存块,mac头就在buffer里面
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
yebear
驱动牛犊
驱动牛犊
  • 注册日期2001-05-18
  • 最后登录2013-04-05
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望51点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-13 14:03
老兄,我也在做相同的工作,我们交流交流吧 ,
下面所说的都是在win2000的环境下,2000不支持
Wireless Lan! xp 倒是支持。



ndismedium 选 802。3

既然是 sendpacket函数要发的包,那应该是数据包了,
当然,des-mac & src-mac都在packet第一个ndis-buffer里
注意, 包的协议是按802.3来组织的,所以将该包重新包装
一下,变成802.11的,原理很简单,但是做起来非常麻烦。

最后,
     freducn2002 大虾,能否给点原码,我写得烦死了。

[编辑 -  12/13/02 by  yebear]
valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-13 14:08
typedef struct _NDIS_PACKET {
    NDIS_PACKET_PRIVATE  Private;
    union {
        struct {
             UCHAR       MiniportReserved[2*sizeof(PVOID)];
             UCHAR       WrapperReserved[2*sizeof(PVOID)];
        };
        struct {
             UCHAR       MiniportReservedEx[3*sizeof(PVOID)];
             UCHAR       WrapperReservedEx[sizeof(PVOID)];
        };
        struct {
             UCHAR       MacReserved[4*sizeof(PVOID)];
        };
    };
    ULONG_PTR            Reserved[2];
    UCHAR                ProtocolReserved[1];
} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;

NDIS_PACKET defines the packet descriptors with chained buffer descriptors for which pointers are passed to many NdisXxx, MiniportXxx, and ProtocolXxx functions.

Members
Private
This is reserved for use exclusively by NDIS. Drivers must call the appropriate NdisXxx functions or NDIS-supplied macros to affect the contents of this area.
MiniportReserved
Serialized miniport drivers and NDIS intermediate drivers can use this area for their own purposes.
WrapperReserved
This is reserved for use exclusively by NDIS.
MiniportReservedEx
Deserialized and connection-oriented miniport drivers can use this area for their own purposes.
WrapperReservedEx
This is reserved for use exclusively by NDIS.
Reserved
This is for compatibility with Windows 95/98.
MacReserved
This is reserved for use by legacy drivers.
ProtocolReserved
Highest-level protocol drivers and NDIS intermediate drivers can use this variable-sized area for their own purposes, as long as each such driver is given a fresh packet descriptor.
这里面好像没说MAC 地址的事
valey
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2003-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-16 03:08
yebear,ndis 5.1已经支持wlan了,是不是升级一下ddk,就可以在win2000下写wlan得驱动了?
你说得选 802。3是可以做的,这点我明白,
但我不知你为什么还要转成802。11帧格式,难道你的驱动已经包含了802。11 mac控制器得功能?如果是硬件mac得话,我想驱动分别吧mac add和LLc data传给mac不就行了?

还有包的协议是按802.3来组织得,具体结构是什么?哪里有讲?
nicol
驱动大牛
驱动大牛
  • 注册日期2001-11-28
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-16 17:19
包的结构去查查RFC。里面有详细的标准说明。
用GOOGLE搜索一样RFC,就能找到,好象这里也有。

如果你只要告诉网卡目的MAC。其实不用管什么类型。只需要把前面6个byte的数据告诉它就行了。
因为不管是以太头,还是8023结构,前12byte是一致的。
DesMac(6),SourceMac(6),
==寂寞骆驼==
游客

返回顶部