X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=doc%2Fguides%2Fsample_app_ug%2Fflow_filtering.rst;h=5e5a6cd8a07dd13df97d10522b3c1224434e2ae5;hb=2f827f5ea6e19f59386e82dc2dacb2ea353866f4;hp=bd0ae1e2f5fc7062b2993f45be0e9e1e73790c99;hpb=ab3ce1e0c19329c8a2d21480b0db55be259bc168;p=dpdk.git diff --git a/doc/guides/sample_app_ug/flow_filtering.rst b/doc/guides/sample_app_ug/flow_filtering.rst index bd0ae1e2f5..5e5a6cd8a0 100644 --- a/doc/guides/sample_app_ug/flow_filtering.rst +++ b/doc/guides/sample_app_ug/flow_filtering.rst @@ -26,7 +26,7 @@ Set the target, for example: .. code-block:: console - export RTE_TARGET=x86_64-native-linuxapp-gcc + export RTE_TARGET=x86_64-native-linux-gcc See the *DPDK Getting Started* Guide for possible ``RTE_TARGET`` values. @@ -40,7 +40,7 @@ Build the application as follows: Running the Application ----------------------- -To run the example in a ``linuxapp`` environment: +To run the example in a ``linux`` environment: .. code-block:: console @@ -53,7 +53,7 @@ applications and the Environment Abstraction Layer (EAL) options. Explanation ----------- -The example is build from 2 main files, +The example is built from 2 files, ``main.c`` which holds the example logic and ``flow_blocks.c`` that holds the implementation for building the flow rule. @@ -139,7 +139,6 @@ application is shown below: struct rte_eth_conf port_conf = { .rxmode = { .split_hdr_size = 0, - .offloads = DEV_RX_OFFLOAD_CRC_STRIP, }, .txmode = { .offloads = @@ -194,7 +193,13 @@ application is shown below: } } - rte_eth_promiscuous_enable(port_id); + ret = rte_eth_promiscuous_enable(port_id); + if (ret != 0) { + rte_exit(EXIT_FAILURE, + ":: cannot enable promiscuous mode: err=%d, port=%u\n", + ret, port_id); + } + ret = rte_eth_dev_start(port_id); if (ret < 0) { rte_exit(EXIT_FAILURE, @@ -215,7 +220,6 @@ The Ethernet port is configured with default settings using the struct rte_eth_conf port_conf = { .rxmode = { .split_hdr_size = 0, - .offloads = DEV_RX_OFFLOAD_CRC_STRIP, }, .txmode = { .offloads = @@ -280,7 +284,12 @@ We are setting the RX port to promiscuous mode: .. code-block:: c - rte_eth_promiscuous_enable(port_id); + ret = rte_eth_promiscuous_enable(port_id); + if (ret != 0) { + rte_exit(EXIT_FAILURE, + ":: cannot enable promiscuous mode: err=%d, port=%u\n", + ret, port_id); + } The last step is to start the port. @@ -306,7 +315,7 @@ looks like the following: main_loop(void) { struct rte_mbuf *mbufs[32]; - struct ether_hdr *eth_hdr; + struct rte_ether_hdr *eth_hdr; uint16_t nb_rx; uint16_t i; uint16_t j; @@ -320,7 +329,7 @@ looks like the following: struct rte_mbuf *m = mbufs[j]; eth_hdr = rte_pktmbuf_mtod(m, - struct ether_hdr *); + struct rte_ether_hdr *); print_ether_addr("src=", ð_hdr->s_addr); print_ether_addr(" - dst=", @@ -350,7 +359,7 @@ queues and printing for each packet the destination queue: if (nb_rx) { for (j = 0; j < nb_rx; j++) { struct rte_mbuf *m = mbufs[j]; - eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *); + eth_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *); print_ether_addr("src=", ð_hdr->s_addr); print_ether_addr(" - dst=", ð_hdr->d_addr); printf(" - queue=0x%x", (unsigned int)i); @@ -369,7 +378,7 @@ The forwarding loop can be interrupted and the application closed using The generate_ipv4_flow function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The generate_ipv4_rule function is responsible for creating the flow rule. +The generate_ipv4_flow function is responsible for creating the flow rule. This function is located in the ``flow_blocks.c`` file. .. code-block:: c @@ -382,13 +391,9 @@ This function is located in the ``flow_blocks.c`` file. { struct rte_flow_attr attr; struct rte_flow_item pattern[MAX_PATTERN_NUM]; - struct rte_flow_action action[MAX_PATTERN_NUM]; + struct rte_flow_action action[MAX_ACTION_NUM]; struct rte_flow *flow = NULL; struct rte_flow_action_queue queue = { .index = rx_q }; - struct rte_flow_item_eth eth_spec; - struct rte_flow_item_eth eth_mask; - struct rte_flow_item_vlan vlan_spec; - struct rte_flow_item_vlan vlan_mask; struct rte_flow_item_ipv4 ip_spec; struct rte_flow_item_ipv4 ip_mask; @@ -406,37 +411,19 @@ This function is located in the ``flow_blocks.c`` file. * create the action sequence. * one action only, move packet to queue */ - action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE; action[0].conf = &queue; action[1].type = RTE_FLOW_ACTION_TYPE_END; /* - * set the first level of the pattern (eth). + * set the first level of the pattern (ETH). * since in this example we just want to get the * ipv4 we set this level to allow all. */ - memset(ð_spec, 0, sizeof(struct rte_flow_item_eth)); - memset(ð_mask, 0, sizeof(struct rte_flow_item_eth)); - eth_spec.type = 0; - eth_mask.type = 0; pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH; - pattern[0].spec = ð_spec; - pattern[0].mask = ð_mask; /* - * setting the second level of the pattern (vlan). - * since in this example we just want to get the - * ipv4 we also set this level to allow all. - */ - memset(&vlan_spec, 0, sizeof(struct rte_flow_item_vlan)); - memset(&vlan_mask, 0, sizeof(struct rte_flow_item_vlan)); - pattern[1].type = RTE_FLOW_ITEM_TYPE_VLAN; - pattern[1].spec = &vlan_spec; - pattern[1].mask = &vlan_mask; - - /* - * setting the third level of the pattern (ip). + * setting the second level of the pattern (IP). * in this example this is the level we care about * so we set it according to the parameters. */ @@ -446,12 +433,12 @@ This function is located in the ``flow_blocks.c`` file. ip_mask.hdr.dst_addr = dest_mask; ip_spec.hdr.src_addr = htonl(src_ip); ip_mask.hdr.src_addr = src_mask; - pattern[2].type = RTE_FLOW_ITEM_TYPE_IPV4; - pattern[2].spec = &ip_spec; - pattern[2].mask = &ip_mask; + pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4; + pattern[1].spec = &ip_spec; + pattern[1].mask = &ip_mask; /* the final level must be always type end */ - pattern[3].type = RTE_FLOW_ITEM_TYPE_END; + pattern[2].type = RTE_FLOW_ITEM_TYPE_END; int res = rte_flow_validate(port_id, &attr, pattern, action, error); if(!res) @@ -466,14 +453,10 @@ The first part of the function is declaring the structures that will be used. struct rte_flow_attr attr; struct rte_flow_item pattern[MAX_PATTERN_NUM]; - struct rte_flow_action action[MAX_PATTERN_NUM]; + struct rte_flow_action action[MAX_ACTION_NUM]; struct rte_flow *flow; struct rte_flow_error error; struct rte_flow_action_queue queue = { .index = rx_q }; - struct rte_flow_item_eth eth_spec; - struct rte_flow_item_eth eth_mask; - struct rte_flow_item_vlan vlan_spec; - struct rte_flow_item_vlan vlan_mask; struct rte_flow_item_ipv4 ip_spec; struct rte_flow_item_ipv4 ip_mask; @@ -493,33 +476,17 @@ the rule. In this case send the packet to queue. action[0].conf = &queue; action[1].type = RTE_FLOW_ACTION_TYPE_END; -The forth part is responsible for creating the pattern and is build from -number of step. In each step we build one level of the pattern starting with +The fourth part is responsible for creating the pattern and is built from +number of steps. In each step we build one level of the pattern starting with the lowest one. Setting the first level of the pattern ETH: .. code-block:: c - memset(ð_spec, 0, sizeof(struct rte_flow_item_eth)); - memset(ð_mask, 0, sizeof(struct rte_flow_item_eth)); - eth_spec.type = 0; - eth_mask.type = 0; pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH; - pattern[0].spec = ð_spec; - pattern[0].mask = ð_mask; - -Setting the second level of the pattern VLAN: -.. code-block:: c - - memset(&vlan_spec, 0, sizeof(struct rte_flow_item_vlan)); - memset(&vlan_mask, 0, sizeof(struct rte_flow_item_vlan)); - pattern[1].type = RTE_FLOW_ITEM_TYPE_VLAN; - pattern[1].spec = &vlan_spec; - pattern[1].mask = &vlan_mask; - -Setting the third level ip: +Setting the second level of the pattern IP: .. code-block:: c @@ -529,15 +496,15 @@ Setting the third level ip: ip_mask.hdr.dst_addr = dest_mask; ip_spec.hdr.src_addr = htonl(src_ip); ip_mask.hdr.src_addr = src_mask; - pattern[2].type = RTE_FLOW_ITEM_TYPE_IPV4; - pattern[2].spec = &ip_spec; - pattern[2].mask = &ip_mask; + pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4; + pattern[1].spec = &ip_spec; + pattern[1].mask = &ip_mask; Closing the pattern part. .. code-block:: c - pattern[3].type = RTE_FLOW_ITEM_TYPE_END; + pattern[2].type = RTE_FLOW_ITEM_TYPE_END; The last part of the function is to validate the rule and create it. @@ -546,4 +513,3 @@ The last part of the function is to validate the rule and create it. int res = rte_flow_validate(port_id, &attr, pattern, action, &error); if (!res) flow = rte_flow_create(port_id, &attr, pattern, action, &error); -