[dpdk-users] How to use .last and .spec fields in the Generic Flow API?

Andrew Bainbridge andbain at microsoft.com
Wed Mar 6 16:30:02 CET 2019


Hi

How should I specify a range of UDP ports in the generic flow API? Here's what I've tried...

I'm trying to create a flow to move packets with UDP dest ports from 1234 to 1244 into a specified queue. It works fine if I specify a single port of 1234, instead of the range. Here's how I set the flow item for that:

    struct rte_flow_item_udp udp_spec = { 0 };
    struct rte_flow_item_udp udp_mask = { 0 };
    udp_spec.hdr.dst_port = htons(udp_dst_port);
    udp_mask.hdr.dst_port = 0xffff;
    pattern[2].type = RTE_FLOW_ITEM_TYPE_UDP;
    pattern[2].spec = &udp_spec;
    pattern[2].mask = &udp_mask;

But if I attempt to specify the range, I believe I have to use the .last field. When I do that, I get this error, 'range between "spec" and "last" is larger than "mask"'. Here's how I set that flow item:

    struct rte_flow_item_udp udp_spec = { 0 };
    struct rte_flow_item_udp udp_last = { 0 };
    struct rte_flow_item_udp udp_mask = { 0 };
    udp_spec.hdr.dst_port = htons(1234);
    udp_last.hdr.dst_port = htons(1244);
    udp_mask.hdr.dst_port = 0xffff;
    pattern[2].type = RTE_FLOW_ITEM_TYPE_UDP;
    pattern[2].spec = &udp_spec;
    pattern[2].last = &udp_last;
    pattern[2].mask = &udp_mask;

I don't understand the error message. The range between spec and last is 10. The mask is 0xffff. The error message seems wrong. But probably I just misunderstood something.

More details:

I'm using the mlx4 PMD. The source of the error message is in mlx4_flow_item_check(), where the code appears goes through each byte of the spec and last and checks that:

    (((const uint8_t *)item->spec)[i] & mask[i]) != (((const uint8_t *)item->last)[i] & mask[i]))

Which makes no sense to me. That appears to require that spec and last are equal wherever mask is not zero.

Any ideas?

Thanks,
Andy


More information about the users mailing list