我试图解决another problem,但我在 VxWorks 6.8上遇到了 MAC地址
muxIoctl()
我没有得到正确的结果:
/* Binding the cookie */
PROTO_COOKIE muxCookie = muxBind( ... ); /* Binding network service <-> end */
/*
* Error handling etc.
* [...]
*/
/* Getting the the address */
char result[6];
STATUS status = muxIoctl(muxCookie, EIOCGADDR, result); /* ioctl the device address */
if( status != OK )
{
/* Error handling */
}
else
{
/* ioctl() was Ok, print 'result' */
}
对我来说看起来不错的事实在现实中失败了。由于muxIoctl()
,缓冲区不包含正确的MAC地址,而是看起来像这样(在两个设备上测试):
Device #1: 00 00 00 00 0A 00
Device #2: 00 00 00 00 0B 00
^
|
Every byte is 0, with the exception of these
两个设备都有一个有效的MAC地址,这可以通过ifconfig
或传输的数据包看到。接口(如上所述)很好并且正常工作。
通过muxDevAcquire()
(或 deprcated endFindByName()
)而不是使用muxBind()
直接获取Cookie会产生相同的结果。
此外:muxDevExists()
会返回TRUE
而另一个&#34; hacky&#34; 代码也不起作用(但是它会将值返回为以上):
const char* devName = ...
int unit = ...
char result[6];
END_OBJ* end = endFindByName(devName, unit);
STATUS status = end->pFuncTable->ioctl(end, EIOCGADDR, result);
顺便说一下。 1}}在同一位置的其他控制工作正常。
上述设备使用 dtsec ,它们也正常工作,但有一个例外:muxIoctl()
的相关案例 - 基础{{ 1}}给dtsecEndIoctl()
代表 - 没有设置地址!它只在系统启动时执行一次(否则它会复制上面的字节)!
ioctl()
muxIoctl()
EIOCGADDR
dtsecEndIoctl()
bcopy()
pDrvCtrl->dtsecAddr
pDrvCtrl
muxCookie
DTSEC_DRV_CTRL*
muxCookie
muxIoctl()
{{1}} {{1}} {{1}} {{1}}这对我来说看起来像{{1}}的问题。然而,cookie每次都在运行正常 - 预计在这里(旁注:尚未在 etsec 上测试)。
冗长的解释,简短的问题:如何解决这个问题,分别如何获取MAC地址?
解决此问题的其他讨论:
(全部无效)
[更新]:在 etsec {{1}}上使用正确的MAC,在 dtsec 上失败,如上所述。
答案 0 :(得分:0)
看起来dtsecEndIoctl无法正常工作。
在END驱动程序中,end-> pFuncTable-> ioctl的地址为dtsecEndIoctl。
这意味着如果dtsecEndIoctl的EIOCGADDR
正确复制了MAC,则end-> pFuncTable-> ioctl正确复制了MAC。