xref: /dpdk/doc/guides/sample_app_ug/ip_frag.rst (revision 8750576fb2a9a067ffbcce4bab6481f3bfa47097)
15630257fSFerruh Yigit..  SPDX-License-Identifier: BSD-3-Clause
25630257fSFerruh Yigit    Copyright(c) 2010-2014 Intel Corporation.
3d0dff9baSBernard Iremonger
4d0dff9baSBernard IremongerIP Fragmentation Sample Application
5d0dff9baSBernard Iremonger===================================
6d0dff9baSBernard Iremonger
7d0dff9baSBernard IremongerThe IPv4 Fragmentation application is a simple example of packet processing
8e0c7c473SSiobhan Butlerusing the Data Plane Development Kit (DPDK).
9d0dff9baSBernard IremongerThe application does L3 forwarding with IPv4 and IPv6 packet fragmentation.
10d0dff9baSBernard Iremonger
11d0dff9baSBernard IremongerOverview
12d0dff9baSBernard Iremonger--------
13d0dff9baSBernard Iremonger
14d0dff9baSBernard IremongerThe application demonstrates the use of zero-copy buffers for packet fragmentation.
15513b0723SMauricio Vasquez BThe initialization and run-time paths are very similar to those of the :doc:`l2_forward_real_virtual`.
16d0dff9baSBernard IremongerThis guide highlights the differences between the two applications.
17d0dff9baSBernard Iremonger
18d0dff9baSBernard IremongerThere are three key differences from the L2 Forwarding sample application:
19d0dff9baSBernard Iremonger
20d0dff9baSBernard Iremonger*   The first difference is that the IP Fragmentation sample application makes use of indirect buffers.
21d0dff9baSBernard Iremonger
22d0dff9baSBernard Iremonger*   The second difference is that the forwarding decision is taken
23d0dff9baSBernard Iremonger    based on information read from the input packet's IP header.
24d0dff9baSBernard Iremonger
25d0dff9baSBernard Iremonger*   The third difference is that the application differentiates between
26d0dff9baSBernard Iremonger    IP and non-IP traffic by means of offload flags.
27d0dff9baSBernard Iremonger
28*8750576fSNandini PersadThe Longest Prefix Match (LPM for IPv4, LPM6 for IPv6) table
29*8750576fSNandini Persadis used to store/lookup an outgoing port number associated with that IP address.
30d0dff9baSBernard IremongerAny unmatched packets are forwarded to the originating port.
31d0dff9baSBernard Iremonger
32d0dff9baSBernard IremongerBy default, input frame sizes up to 9.5 KB are supported.
33*8750576fSNandini PersadBefore forwarding, the input IP packet is fragmented
34*8750576fSNandini Persadto fit into the "standard" Ethernet* v2 MTU (1500 bytes).
35d0dff9baSBernard Iremonger
367cacb056SHerakliusz LipiecCompiling the Application
377cacb056SHerakliusz Lipiec-------------------------
38d0dff9baSBernard Iremonger
39*8750576fSNandini PersadTo compile the sample application, see :doc:`compiling`.
40d0dff9baSBernard Iremonger
417cacb056SHerakliusz LipiecThe application is located in the ``ip_fragmentation`` sub-directory.
42d0dff9baSBernard Iremonger
43d0dff9baSBernard IremongerRunning the Application
44d0dff9baSBernard Iremonger-----------------------
45d0dff9baSBernard Iremonger
46d0dff9baSBernard IremongerThe LPM object is created and loaded with the pre-configured entries read from
47d0dff9baSBernard Iremongerglobal l3fwd_ipv4_route_array and l3fwd_ipv6_route_array tables.
48d0dff9baSBernard IremongerFor each input packet, the packet forwarding decision
49d0dff9baSBernard Iremonger(that is, the identification of the output interface for the packet) is taken as a result of LPM lookup.
50*8750576fSNandini PersadIf the IP packet size is greater than the default output MTU,
51d0dff9baSBernard Iremongerthen the input packet is fragmented and several fragments are sent via the output interface.
52d0dff9baSBernard Iremonger
53d0dff9baSBernard IremongerApplication usage:
54d0dff9baSBernard Iremonger
55d0dff9baSBernard Iremonger.. code-block:: console
56d0dff9baSBernard Iremonger
57e2a94f9aSCiara Power    ./<build_dir>/examples/dpdk-ip_fragmentation [EAL options] -- -p PORTMASK [-q NQ]
58d0dff9baSBernard Iremonger
59d0dff9baSBernard Iremongerwhere:
60d0dff9baSBernard Iremonger
61d0dff9baSBernard Iremonger*   -p PORTMASK is a hexadecimal bitmask of ports to configure
62d0dff9baSBernard Iremonger
63885807aeSStephen Hemminger*   -q NQ: Maximum number of queues per lcore (default is 1)
64d0dff9baSBernard Iremonger
65218c4e68SBruce RichardsonTo run the example in linux environment with 2 lcores (2,4) over 2 ports(0,2) with 1 RX queue per lcore:
66d0dff9baSBernard Iremonger
67d0dff9baSBernard Iremonger.. code-block:: console
68d0dff9baSBernard Iremonger
69e2a94f9aSCiara Power    ./<build_dir>/examples/dpdk-ip_fragmentation -l 2,4 -n 3 -- -p 5
70d0dff9baSBernard Iremonger    EAL: coremask set to 14
71d0dff9baSBernard Iremonger    EAL: Detected lcore 0 on socket 0
72d0dff9baSBernard Iremonger    EAL: Detected lcore 1 on socket 1
73d0dff9baSBernard Iremonger    EAL: Detected lcore 2 on socket 0
74d0dff9baSBernard Iremonger    EAL: Detected lcore 3 on socket 1
75d0dff9baSBernard Iremonger    EAL: Detected lcore 4 on socket 0
76d0dff9baSBernard Iremonger    ...
77d0dff9baSBernard Iremonger
78d0dff9baSBernard Iremonger    Initializing port 0 on lcore 2... Address:00:1B:21:76:FA:2C, rxq=0 txq=2,0 txq=4,1
79d0dff9baSBernard Iremonger    done: Link Up - speed 10000 Mbps - full-duplex
80d0dff9baSBernard Iremonger    Skipping disabled port 1
81d0dff9baSBernard Iremonger    Initializing port 2 on lcore 4... Address:00:1B:21:5C:FF:54, rxq=0 txq=2,0 txq=4,1
82d0dff9baSBernard Iremonger    done: Link Up - speed 10000 Mbps - full-duplex
83d0dff9baSBernard Iremonger    Skipping disabled port 3IP_FRAG: Socket 0: adding route 100.10.0.0/16 (port 0)
84d0dff9baSBernard Iremonger    IP_FRAG: Socket 0: adding route 100.20.0.0/16 (port 1)
85d0dff9baSBernard Iremonger    ...
86d0dff9baSBernard Iremonger    IP_FRAG: Socket 0: adding route 0101:0101:0101:0101:0101:0101:0101:0101/48 (port 0)
87d0dff9baSBernard Iremonger    IP_FRAG: Socket 0: adding route 0201:0101:0101:0101:0101:0101:0101:0101/48 (port 1)
88d0dff9baSBernard Iremonger    ...
89d0dff9baSBernard Iremonger    IP_FRAG: entering main loop on lcore 4
90d0dff9baSBernard Iremonger    IP_FRAG: -- lcoreid=4 portid=2
91d0dff9baSBernard Iremonger    IP_FRAG: entering main loop on lcore 2
92d0dff9baSBernard Iremonger    IP_FRAG: -- lcoreid=2 portid=0
93d0dff9baSBernard Iremonger
94218c4e68SBruce RichardsonTo run the example in linux environment with 1 lcore (4) over 2 ports(0,2) with 2 RX queues per lcore:
95d0dff9baSBernard Iremonger
96d0dff9baSBernard Iremonger.. code-block:: console
97d0dff9baSBernard Iremonger
98e2a94f9aSCiara Power    ./<build_dir>/examples/dpdk-ip_fragmentation -l 4 -n 3 -- -p 5 -q 2
99d0dff9baSBernard Iremonger
100d0dff9baSBernard IremongerTo test the application, flows should be set up in the flow generator that match the values in the
101d0dff9baSBernard Iremongerl3fwd_ipv4_route_array and/or l3fwd_ipv6_route_array table.
102d0dff9baSBernard Iremonger
103d0dff9baSBernard IremongerThe default l3fwd_ipv4_route_array table is:
104d0dff9baSBernard Iremonger
1059a212dc0SConor Fogarty.. literalinclude:: ../../../examples/ip_fragmentation/main.c
1069a212dc0SConor Fogarty    :language: c
1079a212dc0SConor Fogarty    :start-after: Default l3fwd_ipv4_route_array table. 8<
1089a212dc0SConor Fogarty    :end-before: >8 End of default l3fwd_ipv4_route_array table
109d0dff9baSBernard Iremonger
110d0dff9baSBernard IremongerThe default l3fwd_ipv6_route_array table is:
111d0dff9baSBernard Iremonger
1129a212dc0SConor Fogarty.. literalinclude:: ../../../examples/ip_fragmentation/main.c
1139a212dc0SConor Fogarty    :language: c
1149a212dc0SConor Fogarty    :start-after: Default l3fwd_ipv6_route_array table. 8<
1159a212dc0SConor Fogarty    :end-before: >8 End of default l3fwd_ipv6_route_array table.
116d0dff9baSBernard Iremonger
117d0dff9baSBernard IremongerFor example, for the input IPv4 packet with destination address: 100.10.1.1 and packet length 9198 bytes,
118d0dff9baSBernard Iremongerseven IPv4 packets will be sent out from port #0 to the destination address 100.10.1.1:
119d0dff9baSBernard Iremongersix of those packets will have length 1500 bytes and one packet will have length 318 bytes.
120d0dff9baSBernard IremongerIP Fragmentation sample application provides basic NUMA support
121d0dff9baSBernard Iremongerin that all the memory structures are allocated on all sockets that have active lcores on them.
122d0dff9baSBernard Iremonger
123d0dff9baSBernard Iremonger
124e0c7c473SSiobhan ButlerRefer to the *DPDK Getting Started Guide* for general information on running applications
125d0dff9baSBernard Iremongerand the Environment Abstraction Layer (EAL) options.
126