我正在尝试找到一种使用某种命名约定在我的应用程序模块之间分配唯一 ID 的方法。
我希望每个人都有一系列可用于创建 TC 过滤器/类等的 id。
正如本页所述:
一个u32句柄实际上是3个数字,写成这样:800:0:3。它们都是十六进制的。
有效的过滤器项目句柄范围从 1 到 ffe hex。
但是当我尝试设置handle 1:1:1
它失败。
这里是u32 handle id
从iproute2-3.17.0
模块的解析:(不一定是机器上安装的版本)
static int get_u32_handle(__u32 *handle, const char *str)
{
__u32 htid=0, hash=0, nodeid=0;
char *tmp = strchr(str, ':');
if (tmp == NULL) {
if (memcmp("0x", str, 2) == 0)
return get_u32(handle, str, 16);
return -1;
}
htid = strtoul(str, &tmp, 16);
if (tmp == str && *str != ':' && *str != 0)
return -1;
if (htid>=0x1000)
return -1;
if (*tmp) {
str = tmp+1;
hash = strtoul(str, &tmp, 16);
if (tmp == str && *str != ':' && *str != 0)
return -1;
if (hash>=0x100)
return -1;
if (*tmp) {
str = tmp+1;
nodeid = strtoul(str, &tmp, 16);
if (tmp == str && *str != 0)
return -1;
if (nodeid>=0x1000)
return -1;
}
}
*handle = (htid<<20)|(hash<<12)|nodeid;
return 0;
}
看起来它应该得到任何XXX:XXX:XXX
只要xxx < 0x1000
,但它没有这样做。(我认为第一部分(hash
必须是 800),任何其他值都无法解析。