首先,感谢xiaohua,他提示了我,帮我解决了问题!
既然没有人来解决我的问题,那我把我的解决办法贴上来,可能比较粗糙,希望大家多多指点!
原来我一直不能将帧发完全的主要原因还是出在M_BLK_ID pMblk上,muxSend要发送的数据是都用mBlk,但其中的成员比如pClBlk尤其需要注意,不能简单的将其填充为其他的值。
要使用muxSend()来发送数据只要步骤应该是这样的:首先用muxBind来绑定你要发送的设备,这里我是这样实现的:
muxBind ("motfec", 0, (FUNCPTR)monitorSendProcess,NULL, NULL, NULL, MUX_PROTO_SNARF, "VLAN", NULL);
绑定后应该对NetPool进行初始化操作,应为你要发送的数据mBlk需要从你的NetPool中申请。这一步有些麻烦,我是这样实现的:
变量声明:
NET_POOL_ID pNetPool = (NET_POOL_ID)calloc(1,sizeof(NET_POOL));
M_CL_CONFIG MclBlkConfig;
CL_DESC ClDescTbl;
int ClDescTblNumEnt;
具体实现:
ClDescTbl.clNum = 4;
MclBlkConfig.mBlkNum = ClDescTbl.clNum;
MclBlkConfig.clBlkNum = ClDescTbl.clNum;
//define the M_CL_CONFIG size
MclBlkConfig.memSize = (int)(
((unsigned int)MclBlkConfig.mBlkNum * ( MSIZE + sizeof ( long ))) +
((unsigned int)MclBlkConfig.clBlkNum * ( CL_BLK_SZ + sizeof (long)))
);
//allocate the memery size of M_CL_CONFIG
MclBlkConfig.memArea = (char *)memalign(sizeof (long ),(unsigned int)MclBlkConfig.memSize);
if (MclBlkConfig.memArea == NULL)
{
free( (char *)pNetPool);
//free((char *)pMblk);
return (ERROR);
}
//defin the CL_DESC size
ClDescTbl.memSize = (ClDescTbl.clNum * ( BUFSIZE + 8 ) ) + sizeof ( int ) ;
//allocate the memery size of CL_DESC
ClDescTbl.memArea = (char *) cacheDmaMalloc ( ( unsigned int ) ClDescTbl.memSize );
if ( ( int ) ClDescTbl.memArea == NULL )
{
perror ( "Error: Memory for buffers unavailable" );
free ( ( char * ) MclBlkConfig.memArea );
free ( ( char * ) pNetPool );
//free((char *)pMblk);
return (ERROR);
}
//initial the netpool
if ( netPoolInit ( pNetPool, &MclBlkConfig, &ClDescTbl, ClDescTblNumEnt, NULL ) == ERROR )
{
perror ( "Error: Could not init buffers" );
free ( ( char * ) MclBlkConfig.memArea );
free ( ( char * ) ClDescTbl.memArea );
free ( ( char * ) pNetPool );
//free((char *)pMblk);
return (ERROR);
}
//apply for mBlk
pMblk = netMblkGet(pNetPool, M_DONTWAIT, MT_DATA);
这样就基本完成对NetPool的初始化了,并申请了你要发送的pMblk,接下来就是对pMblk指向的数据进行填充,如此这般后,就可以用muxSend发送你要的数据了!
最后,要注意对资源的释放!
free ( ( char * ) MclBlkConfig.memArea );
free ( ( char * ) ClDescTbl.memArea );
free ( ( char * ) pNetPool );
muxSendStop("motfec",0);
由于是刚玩VxWorks编程不到3天,所以提出的问题可能有些低级,希望各位不要见笑了!
更具体代码涉及公司产品机密,恕不能提供。
谢谢了!
[align=right][color=#000066][此贴子已经被作者于2005-9-12 14:09:43编辑过][/color][/align]