All of lore.kernel.org
 help / color / mirror / Atom feed
From: bugzilla@dpdk.org
To: dev@dpdk.org
Subject: [Bug 1155] DPDK 22.07 RTE flow: Segmentation fault seen in i40e_flow_parse_fdir_filter() for raw item type
Date: Wed, 21 Dec 2022 02:47:03 +0000	[thread overview]
Message-ID: <bug-1155-3@http.bugs.dpdk.org/> (raw)

https://bugs.dpdk.org/show_bug.cgi?id=1155

            Bug ID: 1155
           Summary: DPDK 22.07 RTE flow: Segmentation fault seen in
                    i40e_flow_parse_fdir_filter() for raw item type
           Product: DPDK
           Version: 22.07
          Hardware: x86
                OS: Linux
            Status: UNCONFIRMED
          Severity: critical
          Priority: Normal
         Component: other
          Assignee: dev@dpdk.org
          Reporter: lthammin@usc.edu
  Target Milestone: ---

I am using a RTE_FLOW_ITEM_TYPE_RAW to match a flow with specific src-ip
address from IP header. With this, it is recommended to use pre-defined
rte_flow_item_raw_mask(default mask) as the mask.

/** Default mask for RTE_FLOW_ITEM_TYPE_RAW. */
#ifndef __cplusplus
static const struct rte_flow_item_raw rte_flow_item_raw_mask = {
        .relative = 1,
        .search = 1,
        .reserved = 0x3fffffff,
        .offset = 0xffffffff,
        .limit = 0xffff,
        .length = 0xffff,
        .pattern = NULL,
};
#endif

When I use this default mask and call rte_flow_validate(), I get a segmentation
fault. But, if I replace the NULL pattern by a non-NULL pointer having some
string then I don't see the segmentation fault (uncomment pattern[1].mask =
&raw_mask; in below code). 

Below are my api and gdb backtrace.

void
dpdk_flow_add_raw_type (dpdk_device_t * xd)
{
        /* create the attribute structure */
        struct rte_flow_attr attr = { .ingress = 1 };
        struct rte_flow_item pattern[3];
        struct rte_flow_action actions[2];
        struct rte_flow_item_raw raw_src_ip;
        struct rte_flow_item_raw raw_mask;
        uint8_t src_ip_str[5];
        uint8_t raw_mask_str[5];
        struct rte_flow_action_queue queue = { .index = 3 };
        struct rte_flow_error error;
        int rv;


        /* setting the eth to pass all packets */
        pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
        pattern[0].spec = NULL;
        pattern[0].mask = NULL;
        pattern[0].last = NULL;

        /* Match src-ip 44.45.46.47 */
        src_ip_str[0] = 44;
        src_ip_str[1] = 45;
        src_ip_str[2] = 46;
        src_ip_str[3] = 47;
        src_ip_str[4] = '\0';

        /* Setting raw item mask's pattern to all 1s. Not sure if this is right
*/
        raw_mask_str[0] = 0xff;
        raw_mask_str[1] = 0xff;
        raw_mask_str[2] = 0xff;
        raw_mask_str[3] = 0xff;
        raw_mask_str[4] = '\0';

        /* Same as rte_flow_item_raw_mask (default raw mask) except that
pattern is non-NULL */
        raw_mask.relative = 1;
        raw_mask.search = 1;
        raw_mask.reserved = 0x3fffffff;
        raw_mask.offset = 0xffffffff;
        raw_mask.limit = 0xffff;
        raw_mask.length = 0xffff;
        //raw_mask.pattern = NULL,
        raw_mask.pattern = raw_mask_str;


        pattern[1].type = RTE_FLOW_ITEM_TYPE_RAW;

        raw_src_ip.relative = 1;
        raw_src_ip.search = 0;
        raw_src_ip.offset = 12; // src-ip in IP header starts after 12 bytes
        raw_src_ip.limit = 0;
        raw_src_ip.length = 4; // src-ip is 4 bytes long
        raw_src_ip.pattern = src_ip_str; // Match 44.45.46.47 of length 4 bytes
after 12 bytes

        pattern[1].spec = &raw_src_ip;

        pattern[1].mask = &rte_flow_item_raw_mask;
        //pattern[1].mask = &raw_mask;  // comment above line and un-comment
this. Then segmentation fault is not seen.

        pattern[1].last = NULL;

        pattern[2].type = RTE_FLOW_ITEM_TYPE_END;

        /* create the queue action */
        actions[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
        actions[0].conf = &queue;                                              
// redirect to queue 3
        actions[1].type = RTE_FLOW_ACTION_TYPE_END;


        /* validate and create the flow rule */
        if (!(rv = rte_flow_validate(xd->port_id, &attr, pattern, actions,
&error)))
                rte_flow_create(xd->port_id, &attr, pattern, actions, &error);

}





Thread 1 "vpp_main" received signal SIGSEGV, Segmentation fault.
0x00007fffb4c9b35b in i40e_flow_parse_fdir_filter () from
build-root/install-vpp_debug-native/vpp/lib/x86_64-linux-gnu/vpp_plugins/dpdk_plugin.so
(gdb) bt
#0  0x00007fffb4c9b35b in i40e_flow_parse_fdir_filter () from
build-root/install-vpp_debug-native/vpp/lib/x86_64-linux-gnu/vpp_plugins/dpdk_plugin.so
#1  0x00007fffb4c97c6e in i40e_flow_validate () from
build-root/install-vpp_debug-native/vpp/lib/x86_64-linux-gnu/vpp_plugins/dpdk_plugin.so
#2  0x00007fffb4aa50f2 in rte_flow_validate () from
build-root/install-vpp_debug-native/vpp/lib/x86_64-linux-gnu/vpp_plugins/dpdk_plugin.so
#3  0x00007fffb4fdab1e in dpdk_flow_add_raw_type (xd=0x7fffbda2b200) at 



Please check this out and let me know.

Thanks,
Nikhil

-- 
You are receiving this mail because:
You are the assignee for the bug.

                 reply	other threads:[~2022-12-21  2:47 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-1155-3@http.bugs.dpdk.org/ \
    --to=bugzilla@dpdk.org \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.