]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/dpdk/doc/guides/sample_app_ug/ip_frag.rst
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / dpdk / doc / guides / sample_app_ug / ip_frag.rst
CommitLineData
11fdf7f2
TL
1.. SPDX-License-Identifier: BSD-3-Clause
2 Copyright(c) 2010-2014 Intel Corporation.
7c673cae
FG
3
4IP Fragmentation Sample Application
5===================================
6
7The IPv4 Fragmentation application is a simple example of packet processing
8using the Data Plane Development Kit (DPDK).
9The application does L3 forwarding with IPv4 and IPv6 packet fragmentation.
10
11Overview
12--------
13
14The application demonstrates the use of zero-copy buffers for packet fragmentation.
15The initialization and run-time paths are very similar to those of the :doc:`l2_forward_real_virtual`.
16This guide highlights the differences between the two applications.
17
18There are three key differences from the L2 Forwarding sample application:
19
20* The first difference is that the IP Fragmentation sample application makes use of indirect buffers.
21
22* The second difference is that the forwarding decision is taken
23 based on information read from the input packet's IP header.
24
25* The third difference is that the application differentiates between
26 IP and non-IP traffic by means of offload flags.
27
28The Longest Prefix Match (LPM for IPv4, LPM6 for IPv6) table is used to store/lookup an outgoing port number,
29associated with that IP address.
30Any unmatched packets are forwarded to the originating port.
31
32By default, input frame sizes up to 9.5 KB are supported.
33Before forwarding, the input IP packet is fragmented to fit into the "standard" Ethernet* v2 MTU (1500 bytes).
34
11fdf7f2
TL
35Compiling the Application
36-------------------------
7c673cae 37
11fdf7f2 38To compile the sample application see :doc:`compiling`.
7c673cae 39
11fdf7f2 40The application is located in the ``ip_fragmentation`` sub-directory.
7c673cae
FG
41
42Running the Application
43-----------------------
44
45The LPM object is created and loaded with the pre-configured entries read from
46global l3fwd_ipv4_route_array and l3fwd_ipv6_route_array tables.
47For each input packet, the packet forwarding decision
48(that is, the identification of the output interface for the packet) is taken as a result of LPM lookup.
49If the IP packet size is greater than default output MTU,
50then the input packet is fragmented and several fragments are sent via the output interface.
51
52Application usage:
53
54.. code-block:: console
55
56 ./build/ip_fragmentation [EAL options] -- -p PORTMASK [-q NQ]
57
58where:
59
60* -p PORTMASK is a hexadecimal bitmask of ports to configure
61
62* -q NQ is the number of queue (=ports) per lcore (the default is 1)
63
9f95a23c 64To run the example in linux environment with 2 lcores (2,4) over 2 ports(0,2) with 1 RX queue per lcore:
7c673cae
FG
65
66.. code-block:: console
67
11fdf7f2 68 ./build/ip_fragmentation -l 2,4 -n 3 -- -p 5
7c673cae
FG
69 EAL: coremask set to 14
70 EAL: Detected lcore 0 on socket 0
71 EAL: Detected lcore 1 on socket 1
72 EAL: Detected lcore 2 on socket 0
73 EAL: Detected lcore 3 on socket 1
74 EAL: Detected lcore 4 on socket 0
75 ...
76
77 Initializing port 0 on lcore 2... Address:00:1B:21:76:FA:2C, rxq=0 txq=2,0 txq=4,1
78 done: Link Up - speed 10000 Mbps - full-duplex
79 Skipping disabled port 1
80 Initializing port 2 on lcore 4... Address:00:1B:21:5C:FF:54, rxq=0 txq=2,0 txq=4,1
81 done: Link Up - speed 10000 Mbps - full-duplex
82 Skipping disabled port 3IP_FRAG: Socket 0: adding route 100.10.0.0/16 (port 0)
83 IP_FRAG: Socket 0: adding route 100.20.0.0/16 (port 1)
84 ...
85 IP_FRAG: Socket 0: adding route 0101:0101:0101:0101:0101:0101:0101:0101/48 (port 0)
86 IP_FRAG: Socket 0: adding route 0201:0101:0101:0101:0101:0101:0101:0101/48 (port 1)
87 ...
88 IP_FRAG: entering main loop on lcore 4
89 IP_FRAG: -- lcoreid=4 portid=2
90 IP_FRAG: entering main loop on lcore 2
91 IP_FRAG: -- lcoreid=2 portid=0
92
9f95a23c 93To run the example in linux environment with 1 lcore (4) over 2 ports(0,2) with 2 RX queues per lcore:
7c673cae
FG
94
95.. code-block:: console
96
11fdf7f2 97 ./build/ip_fragmentation -l 4 -n 3 -- -p 5 -q 2
7c673cae
FG
98
99To test the application, flows should be set up in the flow generator that match the values in the
100l3fwd_ipv4_route_array and/or l3fwd_ipv6_route_array table.
101
102The default l3fwd_ipv4_route_array table is:
103
104.. code-block:: c
105
106 struct l3fwd_ipv4_route l3fwd_ipv4_route_array[] = {
f67539c2
TL
107 {RTE_IPV4(100, 10, 0, 0), 16, 0},
108 {RTE_IPV4(100, 20, 0, 0), 16, 1},
109 {RTE_IPV4(100, 30, 0, 0), 16, 2},
110 {RTE_IPV4(100, 40, 0, 0), 16, 3},
111 {RTE_IPV4(100, 50, 0, 0), 16, 4},
112 {RTE_IPV4(100, 60, 0, 0), 16, 5},
113 {RTE_IPV4(100, 70, 0, 0), 16, 6},
114 {RTE_IPV4(100, 80, 0, 0), 16, 7},
7c673cae
FG
115 };
116
117The default l3fwd_ipv6_route_array table is:
118
119.. code-block:: c
120
121 struct l3fwd_ipv6_route l3fwd_ipv6_route_array[] = {
122 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 0},
123 {{2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 1},
124 {{3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 2},
125 {{4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 3},
126 {{5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 4},
127 {{6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 5},
128 {{7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 6},
129 {{8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 7},
130 };
131
132For example, for the input IPv4 packet with destination address: 100.10.1.1 and packet length 9198 bytes,
133seven IPv4 packets will be sent out from port #0 to the destination address 100.10.1.1:
134six of those packets will have length 1500 bytes and one packet will have length 318 bytes.
135IP Fragmentation sample application provides basic NUMA support
136in that all the memory structures are allocated on all sockets that have active lcores on them.
137
138
139Refer to the *DPDK Getting Started Guide* for general information on running applications
140and the Environment Abstraction Layer (EAL) options.