]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/dpdk/doc/guides/nics/kni.rst
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / dpdk / doc / guides / nics / kni.rst
CommitLineData
11fdf7f2
TL
1.. SPDX-License-Identifier: BSD-3-Clause
2 Copyright(c) 2017 Intel Corporation.
3
4KNI Poll Mode Driver
5======================
6
7KNI PMD is wrapper to the :ref:`librte_kni <kni>` library.
8
9This PMD enables using KNI without having a KNI specific application,
10any forwarding application can use PMD interface for KNI.
11
12Sending packets to any DPDK controlled interface or sending to the
13Linux networking stack will be transparent to the DPDK application.
14
15To create a KNI device ``net_kni#`` device name should be used, and this
16will create ``kni#`` Linux virtual network interface.
17
18There is no physical device backend for the virtual KNI device.
19
20Packets sent to the KNI Linux interface will be received by the DPDK
21application, and DPDK application may forward packets to a physical NIC
22or to a virtual device (like another KNI interface or PCAP interface).
23
24To forward any traffic from physical NIC to the Linux networking stack,
25an application should control a physical port and create one virtual KNI port,
26and forward between two.
27
28Using this PMD requires KNI kernel module be inserted.
29
30
31Usage
32-----
33
34EAL ``--vdev`` argument can be used to create KNI device instance, like::
35
36 testpmd --vdev=net_kni0 --vdev=net_kn1 -- -i
37
38Above command will create ``kni0`` and ``kni1`` Linux network interfaces,
39those interfaces can be controlled by standard Linux tools.
40
41When testpmd forwarding starts, any packets sent to ``kni0`` interface
42forwarded to the ``kni1`` interface and vice versa.
43
44There is no hard limit on number of interfaces that can be created.
45
46
47Default interface configuration
48-------------------------------
49
50``librte_kni`` can create Linux network interfaces with different features,
51feature set controlled by a configuration struct, and KNI PMD uses a fixed
52configuration:
53
54 .. code-block:: console
55
56 Interface name: kni#
57 force bind kernel thread to a core : NO
9f95a23c 58 mbuf size: (rte_pktmbuf_data_room_size(pktmbuf_pool) - RTE_PKTMBUF_HEADROOM)
f67539c2 59 mtu: (conf.mbuf_size - RTE_ETHER_HDR_LEN)
11fdf7f2
TL
60
61KNI control path is not supported with the PMD, since there is no physical
62backend device by default.
63
64
65PMD arguments
66-------------
67
9f95a23c 68``no_request_thread``, by default PMD creates a pthread for each KNI interface
11fdf7f2
TL
69to handle Linux network interface control commands, like ``ifconfig kni0 up``
70
71With ``no_request_thread`` option, pthread is not created and control commands
72not handled by PMD.
73
74By default request thread is enabled. And this argument should not be used
75most of the time, unless this PMD used with customized DPDK application to handle
76requests itself.
77
78Argument usage::
79
80 testpmd --vdev "net_kni0,no_request_thread=1" -- -i
81
82
83PMD log messages
84----------------
85
86If KNI kernel module (rte_kni.ko) not inserted, following error log printed::
87
88 "KNI: KNI subsystem has not been initialized. Invoke rte_kni_init() first"
89
90
91PMD testing
92-----------
93
94It is possible to test PMD quickly using KNI kernel module loopback feature:
95
96* Insert KNI kernel module with loopback support:
97
98 .. code-block:: console
99
100 insmod build/kmod/rte_kni.ko lo_mode=lo_mode_fifo_skb
101
102* Start testpmd with no physical device but two KNI virtual devices:
103
104 .. code-block:: console
105
106 ./testpmd --vdev net_kni0 --vdev net_kni1 -- -i
107
108 .. code-block:: console
109
110 ...
111 Configuring Port 0 (socket 0)
112 KNI: pci: 00:00:00 c580:b8
113 Port 0: 1A:4A:5B:7C:A2:8C
114 Configuring Port 1 (socket 0)
115 KNI: pci: 00:00:00 600:b9
116 Port 1: AE:95:21:07:93:DD
117 Checking link statuses...
118 Port 0 Link Up - speed 10000 Mbps - full-duplex
119 Port 1 Link Up - speed 10000 Mbps - full-duplex
120 Done
121 testpmd>
122
123* Observe Linux interfaces
124
125 .. code-block:: console
126
127 $ ifconfig kni0 && ifconfig kni1
128 kni0: flags=4098<BROADCAST,MULTICAST> mtu 1500
129 ether ae:8e:79:8e:9b:c8 txqueuelen 1000 (Ethernet)
130 RX packets 0 bytes 0 (0.0 B)
131 RX errors 0 dropped 0 overruns 0 frame 0
132 TX packets 0 bytes 0 (0.0 B)
133 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
134
135 kni1: flags=4098<BROADCAST,MULTICAST> mtu 1500
136 ether 9e:76:43:53:3e:9b txqueuelen 1000 (Ethernet)
137 RX packets 0 bytes 0 (0.0 B)
138 RX errors 0 dropped 0 overruns 0 frame 0
139 TX packets 0 bytes 0 (0.0 B)
140 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
141
142
143* Start forwarding with tx_first:
144
145 .. code-block:: console
146
147 testpmd> start tx_first
148
149* Quit and check forwarding stats:
150
151 .. code-block:: console
152
153 testpmd> quit
154 Telling cores to stop...
155 Waiting for lcores to finish...
156
157 ---------------------- Forward statistics for port 0 ----------------------
158 RX-packets: 35637905 RX-dropped: 0 RX-total: 35637905
159 TX-packets: 35637947 TX-dropped: 0 TX-total: 35637947
160 ----------------------------------------------------------------------------
161
162 ---------------------- Forward statistics for port 1 ----------------------
163 RX-packets: 35637915 RX-dropped: 0 RX-total: 35637915
164 TX-packets: 35637937 TX-dropped: 0 TX-total: 35637937
165 ----------------------------------------------------------------------------
166
167 +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
168 RX-packets: 71275820 RX-dropped: 0 RX-total: 71275820
169 TX-packets: 71275884 TX-dropped: 0 TX-total: 71275884
170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++