[dpdk-users] Question about range type of DPDK ACL

이두환 letsme at gmail.com
Wed Jun 21 02:50:54 CEST 2017


IPv4 address can be just 4byte integer value.
10.10.10.10 means 0x0a0a0a0a and 20.20.20.20 means 0x14141414
10.10.10.30 is 0x0a0a0a1e and it is greater than 0x0a0a0a0a and less then
0x14141414.
So, I think it should be matched but the result was not.
Did I miss something?

On Tue, Jun 20, 2017 at 5:58 PM, Shyam Shrivastav <
shrivastav.shyam at gmail.com> wrote:

> RTE_ACL_FIELD_TYPE_RANGE is for linear integer range like port numbers
> For ip addresses RTE_ACL_FIELD_TYPE_MASK should be used.
>
> On Tue, Jun 20, 2017 at 1:57 PM, 이두환 <letsme at gmail.com> wrote:
>
>> Hello everyone.
>>
>> I want to implement some feature like ACL using DPDK ACL library.
>> so, I defined rule like below.
>>
>> struct acl_match_component
>> {
>>     uint8_t protocol;
>>     uint32_t sip;
>>     uint32_t dip;
>>     uint16_t sport;
>>     uint16_t dport;
>>     uint16_t in_if;
>>     uint16_t out_if;
>> }
>>
>>
>> struct rte_acl_field_def ipv4_defs[7] = {
>>     {
>>         .type = RTE_ACL_FIELD_TYPE_RANGE,
>>         .size = sizeof(uint8_t),
>>         .field_index = 0,
>>         .input_index = 0,
>>         .offset = 0
>>     },
>>     {
>>         .type = RTE_ACL_FIELD_TYPE_RANGE,
>>         .size = sizeof(uint32_t),
>>         .field_index = 1,
>>         .input_index = 1,
>>         .offset = offsetof(struct acl_match_component, sip)
>>     },
>>     {
>>         .type = RTE_ACL_FIELD_TYPE_RANGE,
>>         .size = sizeof(uint32_t),
>>         .field_index = 2,
>>         .input_index = 2,
>>         .offset = offsetof(struct acl_match_component, dip)
>>     },
>>     {
>>         .type = RTE_ACL_FIELD_TYPE_RANGE,
>>         .size = sizeof(uint16_t),
>>         .field_index = 3,
>>         .input_index = 3,
>>         .offset = offsetof(struct acl_match_component, sport)
>>     },
>>     {
>>         .type = RTE_ACL_FIELD_TYPE_RANGE,
>>         .size = sizeof(uint16_t),
>>         .field_index = 4,
>>         .input_index = 3,
>>         .offset = offsetof(struct acl_match_component, dport)
>>     },
>>     {
>>         .type = RTE_ACL_FIELD_TYPE_RANGE,
>>         .size = sizeof(uint16_t),
>>         .field_index = 5,
>>         .input_index = 4,
>>         .offset = offsetof(struct acl_match_component, in_if)
>>     },
>>     {
>>         .type = RTE_ACL_FIELD_TYPE_RANGE,
>>         .size = sizeof(uint16_t),
>>         .field_index = 6,
>>         .input_index = 4,
>>         .offset = offsetof(struct acl_match_component, out_if)
>>     },
>> };
>>
>> I defined 32bit IPv4 address filed as RTE_ACL_FIELD_TYPE_RANGE type.
>> and I set rte_acl_field for IP field like below.
>>
>> value.u32 = IPv4(10,10,10,10);
>> mask_range.u32 = IPv4(20,20,20,20);
>>
>> In this case, I think IP 10.10.10.15 and 10.10.10.30 should be matched.
>> but result was IP 10.10.10.15 was matched and 10.10.10.30 was not matched.
>>
>> I am using DPDK 16.04 and there was no example in the DPDK source using
>> 32bit field as range type.
>> Range type with 16bit field (ex. port number) works well.
>> And, DPDK 17.05 has no meaningful changes on ACL library compare to DPDK
>> 16.04
>>
>> Do you have any idea about this?
>>
>> Thank you.
>>
>
>


More information about the users mailing list