Что такое действительный идентификатор дескриптора фильтра TC (QoS) u32?

Я пытаюсь найти способ использовать какое-то соглашение об именах для распределения уникальных идентификаторов между моими модулями приложения.
Я хочу, чтобы у каждого был диапазон идентификаторов, которые он может использовать для создания фильтров / классов TC и т. Д.
Как говорится на этой странице:

Дескриптор u32 - это на самом деле 3 числа, записанные так: 800:0:3. Они все в гексе.

Допустимые маркеры элемента фильтра варьируются от 1 до 5 шестнадцатеричных

Но когда я пытаюсь установить 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 ответ

Я не знаю iproute2 библиотека, но tc filter show dev eth0 показывает их в формате "800::123". (Пример nl-cls-списка LibNL показывает тот же дескриптор, что и "8000:123".) Также tc filter add принимает дескриптор в виде '0x123'.

Попробуйте установить первое поле равным 800, а второе - 0 или пустое. Это помогает?

Другие вопросы по тегам