DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Rapelly, Varun" <vrapelly@sonusnet.com>
To: "dev@dpdk.org" <dev@dpdk.org>
Subject: [dpdk-dev] ACL Issue with single field rule and rest with wild card entry
Date: Fri, 6 Feb 2015 07:24:50 +0000	[thread overview]
Message-ID: <BLUPR03MB26439D70812C21D10A429C2B7380@BLUPR03MB264.namprd03.prod.outlook.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 986 bytes --]

Hi,

struct ipv6_5tuple {
   uint8_t proto;         /* Protocol, next header. */
   uint32_t src_addr0;  /* IP address of source host. */
   uint32_t src_addr1;  /* IP address of source host. */
   uint32_t src_addr2;  /* IP address of source host. */
   uint32_t src_addr3;  /* IP address of source host. */
};

enum {
   PROTO_FIELD_IPV6,
   SRC_FIELD0_IPV6,
   SRC_FIELD1_IPV6,
   SRC_FIELD2_IPV6,
   SRC_FIELD3_IPV6,
   NUM_FIELDS_IPV6
};


I'm using the above data to insert in to ACL trie.

If I'm inserting rules with only different proto fields, [I'm expecting others fields as wild card entries]  then the rules are not matching.

But if I insert one rule with dummy entries [in the attached file line num 118-125], then the above issue is resolved.

Please let me know:


1.       Can we have rules with only one entry and others as wild card entries?

2.       Is there any other way to match wild card entries in a rule?

Regards,
Varun


[-- Attachment #2: main.c --]
[-- Type: text/plain, Size: 4901 bytes --]

#include <rte_acl.h>
#include <getopt.h>
#include <string.h>

#ifndef RTE_LIBRTE_ACL_STANDALONE

#include <rte_cycles.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
#include <rte_ip.h>

#define	PRINT_USAGE_START	"%s [EAL options]\n"

#else 

#define	RTE_LCORE_FOREACH_SLAVE(x)	while (((x) = 0))

#define	rte_eal_remote_launch(a, b, c)	DUMMY_MACRO
#define	rte_eal_mp_wait_lcore()		DUMMY_MACRO

#define	rte_eal_init(c, v)	(0)

#define	PRINT_USAGE_START	"%s\n"

#endif /*RTE_LIBRTE_ACL_STANDALONE */

#include "main.h"

/*
 * Rule and trace formats definitions.
 */

typedef struct ipv6_5tuple ipv6_5tuple;
struct ipv6_5tuple {
   uint8_t proto;         /* Protocol, next header. */
   uint32_t src_addr0;  /* IP address of source host. */
   uint32_t src_addr1;  /* IP address of source host. */
   uint32_t src_addr2;  /* IP address of source host. */
   uint32_t src_addr3;  /* IP address of source host. */
}; 

enum {
   PROTO_FIELD_IPV6,
   SRC_FIELD0_IPV6,
   SRC_FIELD1_IPV6,
   SRC_FIELD2_IPV6,
   SRC_FIELD3_IPV6,
   NUM_FIELDS_IPV6
};

struct rte_acl_field_def ipv6_2tuple_defs[NUM_FIELDS_IPV6] = {
   {
      .type = RTE_ACL_FIELD_TYPE_BITMASK,
      .size = sizeof (uint8_t),
      .field_index = PROTO_FIELD_IPV6,
      .input_index = PROTO_FIELD_IPV6,
      .offset = offsetof (ipv6_5tuple, proto),
   },
   {
      .type = RTE_ACL_FIELD_TYPE_BITMASK,
      .size = sizeof (uint8_t),
      .field_index = SRC_FIELD0_IPV6,
      .input_index = SRC_FIELD0_IPV6,
      .offset = offsetof (ipv6_5tuple, src_addr0),
   },
   {
      .type = RTE_ACL_FIELD_TYPE_BITMASK,
      .size = sizeof (uint8_t),
      .field_index = SRC_FIELD1_IPV6,
      .input_index = SRC_FIELD1_IPV6,
      .offset = offsetof (ipv6_5tuple, src_addr1),
   },
   {
      .type = RTE_ACL_FIELD_TYPE_BITMASK,
      .size = sizeof (uint8_t),
      .field_index = SRC_FIELD2_IPV6,
      .input_index = SRC_FIELD2_IPV6,
      .offset = offsetof (ipv6_5tuple, src_addr2),
   },
   {
      .type = RTE_ACL_FIELD_TYPE_BITMASK,
      .size = sizeof (uint8_t),
      .field_index = SRC_FIELD2_IPV6,
      .input_index = SRC_FIELD2_IPV6,
      .offset = offsetof (ipv6_5tuple, src_addr3),
   },
};

struct rte_acl_ctx *acx;
struct rte_acl_config cfg;
int ret;

/* define a structure for the rule with up to 5 fields. */


RTE_ACL_RULE_DEF(acl_ipv6_rule, RTE_DIM(ipv6_2tuple_defs));

/* AC context creation parameters. */

struct rte_acl_param prm = {
   .name = "ACL_example",
   .socket_id = SOCKET_ID_ANY,
   .rule_size = RTE_ACL_RULE_SZ(RTE_DIM(ipv6_2tuple_defs)),

   /* number of fields per rule. */
   .max_rule_num = 8, /* maximum number of rules in the AC context. */
};

struct acl_ipv6_rule acl6_rules[] = {
   {
      .data = {.userdata = 1, .category_mask = 1, .priority = 1},
      .field[0] = {.value.u8 = 0x33, .mask_range.u8 = 0xFF,},
   },
   {
      .data = {.userdata = 11, .category_mask = 1, .priority = 11},
      .field[0] = {.value.u8 = 0x3a, .mask_range.u8 = 0xFF,},
   },
   {
      .data = {.userdata = 3, .category_mask = 1, .priority = 255},
      .field[0] = {.value.u8 = 0xFF, .mask_range.u8 = 0xFF,},
      //.field[1] = {.value.u32 = 0xFFFFFFFF,. mask_range.u32 = 0xFFFFFFFF,},
      //.field[2] = {.value.u32 = 0xFFFFFFFF,. mask_range.u32 = 0xFFFFFFFF,},
      //.field[3] = {.value.u32 = 0xFFFFFFFF,. mask_range.u32 = 0xFFFFFFFF,},
      //.field[4] = {.value.u32 = 0xFFFFFFFF,. mask_range.u32 = 0xFFFFFFFF,},
   },
   {
      .data = {.userdata = 2, .category_mask = 1, .priority = 2},
      .field[0] = {.value.u8 = 0x35, .mask_range.u8 = 0xFF,},
   },
};

ipv6_5tuple data;

int MAIN(int argc, char **argv)
{
   int ret;
   int32_t rc;
   uint32_t res;
   const uint8_t *dp;

   data.proto = 0x3a;
   data.src_addr0 = 0x12345678;
   data.src_addr1 = 0xaabbccdd;
   data.src_addr2 = 0xaabbccdd;
   data.src_addr3 = 0xaabbccdd;
   dp = (const uint8_t *)&data;

   ret = rte_eal_init(argc, argv);
   if (ret < 0)
      rte_panic("Cannot init EAL\n");

   /* create an empty AC context  */

   if ((acx = rte_acl_create(&prm)) == NULL) {

      /* handle context create failure. */

   }

   /* add rules to the context */

   ret = rte_acl_add_rules(acx, (const struct rte_acl_rule *)acl6_rules, RTE_DIM(acl6_rules));
   if (ret != 0) {
      /* handle error at adding ACL rules. */
   }

   /* prepare AC build config. */

   cfg.num_categories = 1;
   cfg.num_fields = RTE_DIM(ipv6_2tuple_defs);

   memcpy(cfg.defs, ipv6_2tuple_defs, sizeof (ipv6_2tuple_defs));

   /* build the runtime structures for added rules, with 2 categories. */

   ret = rte_acl_build(acx, &cfg);
   if (ret != 0) {
      /* handle error at build runtime structures for ACL context. */
   }
   rc = rte_acl_classify(acx, &dp, &res, 1, 1);
   if(rc != 0)
   {
      printf("rte_acl_classify failed!!\n");
      exit(0);
   }

   printf("rte_acl_classify() returns %d\n, res[0]=%u\n", rc, res);

   return (0);
}

             reply	other threads:[~2015-02-06  7:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-06  7:24 Rapelly, Varun [this message]
2015-02-06 11:44 ` Ananyev, Konstantin
     [not found]   ` <BLUPR03MB26439FB073B40A02131C823B7380@BLUPR03MB264.namprd03.prod.outlook.com>
2015-02-09 16:28     ` Ananyev, Konstantin

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=BLUPR03MB26439D70812C21D10A429C2B7380@BLUPR03MB264.namprd03.prod.outlook.com \
    --to=vrapelly@sonusnet.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).