【问题标题】:What is a valid TC (QoS) u32 filter handle id什么是有效的 TC (QoS) u32 过滤器句柄 ID
【发布时间】:2015-03-02 19:57:26
【问题描述】:

我正在尝试找到一种使用某种命名约定在我的应用模块之间分配唯一 ID 的方法。
我希望每个 up 都有一系列可用于创建 TC 过滤器/类等的 id。
正如this page 所说:

一个u32句柄实际上是 3 个数字,写成这样:800:0:3。它们都是十六进制的。

有效的过滤器项目句柄范围为 1 转换为十六进制。

但是当我尝试设置 handle 1:1:1 时它失败了。

这里是iproute2-3.17.0模块中u32 handle id的解析:(不一定是机器上安装的版本)

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 &lt; 0x1000,但它没有这样做。 (我认为第一部分(即hash必须为800),任何其他值都无法解析。

【问题讨论】:

  • TC 代表什么?

标签: c qos iproute


【解决方案1】:

我不知道 iproute2 库,但 tc filter show dev eth0 以 '800::123' 格式显示它们。 (LibNL 的样本 nl-cls-list 显示与 '8000:123' 相同的句柄。) 此外,tc filter add 接受 '0x123' 形式的句柄。

尝试将第一个字段设置为 800,将第二个字段设置为 0 或为空。这有帮助吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多