什么是有效的TC(QoS)u32过滤器句柄ID

时间:2015-01-05 09:43:15

标签: c qos iproute

我正试图找到一种方法来使用某种命名约定来在我的app模块中分配唯一ID。
我希望每个人都可以使用一系列id来创建TC过滤器/类等。
正如this page所述:

  

实际上是一个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),任何其他值都无法解析。

1 个答案:

答案 0 :(得分:0)

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

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