sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget%/translations/zh_CN/networking/tuntapmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/zh_TW/networking/tuntapmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/it_IT/networking/tuntapmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/ja_JP/networking/tuntapmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/ko_KR/networking/tuntapmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget%/translations/sp_SP/networking/tuntapmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh?/var/lib/git/docbuild/linux/Documentation/networking/tuntap.rsthKubh)}(h4This data file has been placed in the public domain.h]h4This data file has been placed in the public domain.}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhho/srv/docbuild/lib/venvs/build-kernel-docs/lib64/python3.9/site-packages/docutils/parsers/rst/include/isonum.txthKubh)}(hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .h]hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubhsubstitution_definition)}(h*.. |amp| unicode:: U+00026 .. AMPERSANDh]h&}hhsbah}(h]h ]h"]ampah$]h&]uh1hhhhKhhhhubh)}(h+.. |apos| unicode:: U+00027 .. APOSTROPHEh]h'}hhsbah}(h]h ]h"]aposah$]h&]uh1hhhhKhhhhubh)}(h).. |ast| unicode:: U+0002A .. ASTERISKh]h*}hhsbah}(h]h ]h"]astah$]h&]uh1hhhhK hhhhubh)}(h+.. |brvbar| unicode:: U+000A6 .. BROKEN BARh]h¦}hjsbah}(h]h ]h"]brvbarah$]h&]uh1hhhhK hhhhubh)}(h0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUSh]h\}hjsbah}(h]h ]h"]bsolah$]h&]uh1hhhhK hhhhubh)}(h*.. |cent| unicode:: U+000A2 .. CENT SIGNh]h¢}hjsbah}(h]h ]h"]centah$]h&]uh1hhhhK hhhhubh)}(h&.. |colon| unicode:: U+0003A .. COLONh]h:}hj-sbah}(h]h ]h"]colonah$]h&]uh1hhhhK hhhhubh)}(h&.. |comma| unicode:: U+0002C .. COMMAh]h,}hj<sbah}(h]h ]h"]commaah$]h&]uh1hhhhKhhhhubh)}(h... |commat| unicode:: U+00040 .. COMMERCIAL ATh]h@}hjKsbah}(h]h ]h"]commatah$]h&]uh1hhhhKhhhhubh)}(h/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGNh]h©}hjZsbah}(h]h ]h"]copyah$]h&]uh1hhhhKhhhhubh)}(h... |curren| unicode:: U+000A4 .. CURRENCY SIGNh]h¤}hjisbah}(h]h ]h"]currenah$]h&]uh1hhhhKhhhhubh)}(h0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROWh]h↓}hjxsbah}(h]h ]h"]darrah$]h&]uh1hhhhKhhhhubh)}(h,.. |deg| unicode:: U+000B0 .. DEGREE SIGNh]h°}hjsbah}(h]h ]h"]degah$]h&]uh1hhhhKhhhhubh)}(h... |divide| unicode:: U+000F7 .. DIVISION SIGNh]h÷}hjsbah}(h]h ]h"]divideah$]h&]uh1hhhhKhhhhubh)}(h,.. |dollar| unicode:: U+00024 .. DOLLAR SIGNh]h$}hjsbah}(h]h ]h"]dollarah$]h&]uh1hhhhKhhhhubh)}(h,.. |equals| unicode:: U+0003D .. EQUALS SIGNh]h=}hjsbah}(h]h ]h"]equalsah$]h&]uh1hhhhKhhhhubh)}(h1.. |excl| unicode:: U+00021 .. EXCLAMATION MARKh]h!}hjsbah}(h]h ]h"]exclah$]h&]uh1hhhhKhhhhubh)}(h9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjsbah}(h]h ]h"]frac12ah$]h&]uh1hhhhKhhhhubh)}(h<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTERh]h¼}hjsbah}(h]h ]h"]frac14ah$]h&]uh1hhhhKhhhhubh)}(h;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTHh]h⅛}hjsbah}(h]h ]h"]frac18ah$]h&]uh1hhhhKhhhhubh)}(h?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERSh]h¾}hjsbah}(h]h ]h"]frac34ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHSh]h⅜}hjsbah}(h]h ]h"]frac38ah$]h&]uh1hhhhKhhhhubh)}(h=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHSh]h⅝}hjsbah}(h]h ]h"]frac58ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHSh]h⅞}hj,sbah}(h]h ]h"]frac78ah$]h&]uh1hhhhKhhhhubh)}(h2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGNh]h>}hj;sbah}(h]h ]h"]gtah$]h&]uh1hhhhKhhhhubh)}(h9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjJsbah}(h]h ]h"]halfah$]h&]uh1hhhhK hhhhubh)}(h/.. |horbar| unicode:: U+02015 .. HORIZONTAL BARh]h―}hjYsbah}(h]h ]h"]horbarah$]h&]uh1hhhhK!hhhhubh)}(h'.. |hyphen| unicode:: U+02010 .. HYPHENh]h‐}hjhsbah}(h]h ]h"]hyphenah$]h&]uh1hhhhK"hhhhubh)}(h:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARKh]h¡}hjwsbah}(h]h ]h"]iexclah$]h&]uh1hhhhK#hhhhubh)}(h7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARKh]h¿}hjsbah}(h]h ]h"]iquestah$]h&]uh1hhhhK$hhhhubh)}(hJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARKh]h«}hjsbah}(h]h ]h"]laquoah$]h&]uh1hhhhK%hhhhubh)}(h0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROWh]h←}hjsbah}(h]h ]h"]larrah$]h&]uh1hhhhK&hhhhubh)}(h3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKETh]h{}hjsbah}(h]h ]h"]lcubah$]h&]uh1hhhhK'hhhhubh)}(h;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARKh]h“}hjsbah}(h]h ]h"]ldquoah$]h&]uh1hhhhK(hhhhubh)}(h).. |lowbar| unicode:: U+0005F .. LOW LINEh]h_}hjsbah}(h]h ]h"]lowbarah$]h&]uh1hhhhK)hhhhubh)}(h1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESISh]h(}hjsbah}(h]h ]h"]lparah$]h&]uh1hhhhK*hhhhubh)}(h4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKETh]h[}hjsbah}(h]h ]h"]lsqbah$]h&]uh1hhhhK+hhhhubh)}(h;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARKh]h‘}hjsbah}(h]h ]h"]lsquoah$]h&]uh1hhhhK,hhhhubh)}(h/.. |lt| unicode:: U+0003C .. LESS-THAN SIGNh]h<}hj sbah}(h]h ]h"]ltah$]h&]uh1hhhhK-hhhhubh)}(h+.. |micro| unicode:: U+000B5 .. MICRO SIGNh]hµ}hjsbah}(h]h ]h"]microah$]h&]uh1hhhhK.hhhhubh)}(h+.. |middot| unicode:: U+000B7 .. MIDDLE DOTh]h·}hj+sbah}(h]h ]h"]middotah$]h&]uh1hhhhK/hhhhubh)}(h/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACEh]h }hj:sbah}(h]h ]h"]nbspah$]h&]uh1hhhhK0hhhhubh)}(h).. |not| unicode:: U+000AC .. NOT SIGNh]h¬}hjIsbah}(h]h ]h"]notah$]h&]uh1hhhhK1hhhhubh)}(h,.. |num| unicode:: U+00023 .. NUMBER SIGNh]h#}hjXsbah}(h]h ]h"]numah$]h&]uh1hhhhK2hhhhubh)}(h).. |ohm| unicode:: U+02126 .. OHM SIGNh]hΩ}hjgsbah}(h]h ]h"]ohmah$]h&]uh1hhhhK3hhhhubh)}(h;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATORh]hª}hjvsbah}(h]h ]h"]ordfah$]h&]uh1hhhhK4hhhhubh)}(h<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATORh]hº}hjsbah}(h]h ]h"]ordmah$]h&]uh1hhhhK5hhhhubh)}(h-.. |para| unicode:: U+000B6 .. PILCROW SIGNh]h¶}hjsbah}(h]h ]h"]paraah$]h&]uh1hhhhK6hhhhubh)}(h-.. |percnt| unicode:: U+00025 .. PERCENT SIGNh]h%}hjsbah}(h]h ]h"]percntah$]h&]uh1hhhhK7hhhhubh)}(h*.. |period| unicode:: U+0002E .. FULL STOPh]h.}hjsbah}(h]h ]h"]periodah$]h&]uh1hhhhK8hhhhubh)}(h*.. |plus| unicode:: U+0002B .. PLUS SIGNh]h+}hjsbah}(h]h ]h"]plusah$]h&]uh1hhhhK9hhhhubh)}(h0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGNh]h±}hjsbah}(h]h ]h"]plusmnah$]h&]uh1hhhhK:hhhhubh)}(h+.. |pound| unicode:: U+000A3 .. POUND SIGNh]h£}hjsbah}(h]h ]h"]poundah$]h&]uh1hhhhK;hhhhubh)}(h... |quest| unicode:: U+0003F .. QUESTION MARKh]h?}hjsbah}(h]h ]h"]questah$]h&]uh1hhhhKhhhhubh)}(h1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROWh]h→}hjsbah}(h]h ]h"]rarrah$]h&]uh1hhhhK?hhhhubh)}(h4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKETh]h}}hj*sbah}(h]h ]h"]rcubah$]h&]uh1hhhhK@hhhhubh)}(h<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARKh]h”}hj9sbah}(h]h ]h"]rdquoah$]h&]uh1hhhhKAhhhhubh)}(h0.. |reg| unicode:: U+000AE .. REGISTERED SIGNh]h®}hjHsbah}(h]h ]h"]regah$]h&]uh1hhhhKBhhhhubh)}(h2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESISh]h)}hjWsbah}(h]h ]h"]rparah$]h&]uh1hhhhKChhhhubh)}(h5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKETh]h]}hjfsbah}(h]h ]h"]rsqbah$]h&]uh1hhhhKDhhhhubh)}(h<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARKh]h’}hjusbah}(h]h ]h"]rsquoah$]h&]uh1hhhhKEhhhhubh)}(h-.. |sect| unicode:: U+000A7 .. SECTION SIGNh]h§}hjsbah}(h]h ]h"]sectah$]h&]uh1hhhhKFhhhhubh)}(h*.. |semi| unicode:: U+0003B .. SEMICOLONh]h;}hjsbah}(h]h ]h"]semiah$]h&]uh1hhhhKGhhhhubh)}(h,.. |shy| unicode:: U+000AD .. SOFT HYPHENh]h­}hjsbah}(h]h ]h"]shyah$]h&]uh1hhhhKHhhhhubh)}(h(.. |sol| unicode:: U+0002F .. SOLIDUSh]h/}hjsbah}(h]h ]h"]solah$]h&]uh1hhhhKIhhhhubh)}(h,.. |sung| unicode:: U+0266A .. EIGHTH NOTEh]h♪}hjsbah}(h]h ]h"]sungah$]h&]uh1hhhhKJhhhhubh)}(h0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONEh]h¹}hjsbah}(h]h ]h"]sup1ah$]h&]uh1hhhhKKhhhhubh)}(h0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWOh]h²}hjsbah}(h]h ]h"]sup2ah$]h&]uh1hhhhKLhhhhubh)}(h2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREEh]h³}hjsbah}(h]h ]h"]sup3ah$]h&]uh1hhhhKMhhhhubh)}(h4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGNh]h×}hjsbah}(h]h ]h"]timesah$]h&]uh1hhhhKNhhhhubh)}(h0.. |trade| unicode:: U+02122 .. TRADE MARK SIGNh]h™}hj sbah}(h]h ]h"]tradeah$]h&]uh1hhhhKOhhhhubh)}(h... |uarr| unicode:: U+02191 .. UPWARDS ARROWh]h↑}hjsbah}(h]h ]h"]uarrah$]h&]uh1hhhhKPhhhhubh)}(h... |verbar| unicode:: U+0007C .. VERTICAL LINEh]h|}hj)sbah}(h]h ]h"]verbarah$]h&]uh1hhhhKQhhhhubh)}(h*.. |yen| unicode:: U+000A5 .. YEN SIGN h]h¥}hj8sbah}(h]h ]h"]yenah$]h&]uh1hhhhKRhhhhubhsection)}(hhh](htitle)}(hUniversal TUN/TAP device driverh]hUniversal TUN/TAP device driver}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhhhhhKubh paragraph)}(h?Copyright |copy| 1999-2000 Maxim Krasnyansky h](h Copyright }(hj^hhhNhNubh©}(hj^hhhNhNubh 1999-2000 Maxim Krasnyansky <}(hj^hhhNhNubh reference)}(hmax_mk@yahoo.comh]hmax_mk@yahoo.com}(hjphhhNhNubah}(h]h ]h"]h$]h&]refurimailto:max_mk@yahoo.comuh1jnhj^ubh>}(hj^hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjIhhubh block_quote)}(hLinux, Solaris drivers Copyright |copy| 1999-2000 Maxim Krasnyansky FreeBSD TAP driver Copyright |copy| 1999-2000 Maksim Yevmenkin Revision of this document 2002 by Florian Thiel h](j])}(hVLinux, Solaris drivers Copyright |copy| 1999-2000 Maxim Krasnyansky h](h!Linux, Solaris drivers Copyright }(hjhhhNhNubh©}(hjhhhNhNubh 1999-2000 Maxim Krasnyansky <}(hjhhhNhNubjo)}(hmax_mk@yahoo.comh]hmax_mk@yahoo.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:max_mk@yahoo.comuh1jnhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhK hjubj])}(hUFreeBSD TAP driver Copyright |copy| 1999-2000 Maksim Yevmenkin h](hFreeBSD TAP driver Copyright }(hjhhhNhNubh©}(hjhhhNhNubh 1999-2000 Maksim Yevmenkin <}(hjhhhNhNubjo)}(hm_evmenkin@yahoo.comh]hm_evmenkin@yahoo.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:m_evmenkin@yahoo.comuh1jnhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhK hjubj])}(hGRevision of this document 2002 by Florian Thiel h](h1Revision of this document 2002 by Florian Thiel <}(hjhhhNhNubjo)}(hflorian.thiel@gmx.neth]hflorian.thiel@gmx.net}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:florian.thiel@gmx.netuh1jnhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjubeh}(h]h ]h"]h$]h&]uh1jhhhK hjIhhubjH)}(hhh](jM)}(h1. Descriptionh]h1. Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hhhhhKubj)}(hXTUN/TAP provides packet reception and transmission for user space programs. It can be seen as a simple Point-to-Point or Ethernet device, which, instead of receiving packets from physical media, receives them from user space program and instead of sending packets via physical media writes them to the user space program. In order to use the driver a program has to open /dev/net/tun and issue a corresponding ioctl() to register a network device with the kernel. A network device will appear as tunXX or tapXX, depending on the options chosen. When the program closes the file descriptor, the network device and all corresponding routes will disappear. Depending on the type of device chosen the userspace program has to read/write IP packets (with tun) or ethernet frames (with tap). Which one is being used depends on the flags given with the ioctl(). The package from http://vtun.sourceforge.net/tun contains two simple examples for how to use tun and tap devices. Both programs work like a bridge between two network interfaces. br_select.c - bridge based on select system call. br_sigio.c - bridge based on async io and SIGIO signal. However, the best example is VTun http://vtun.sourceforge.net :)) h](j])}(hXATUN/TAP provides packet reception and transmission for user space programs. It can be seen as a simple Point-to-Point or Ethernet device, which, instead of receiving packets from physical media, receives them from user space program and instead of sending packets via physical media writes them to the user space program.h]hXATUN/TAP provides packet reception and transmission for user space programs. It can be seen as a simple Point-to-Point or Ethernet device, which, instead of receiving packets from physical media, receives them from user space program and instead of sending packets via physical media writes them to the user space program.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubj])}(hXKIn order to use the driver a program has to open /dev/net/tun and issue a corresponding ioctl() to register a network device with the kernel. A network device will appear as tunXX or tapXX, depending on the options chosen. When the program closes the file descriptor, the network device and all corresponding routes will disappear.h]hXKIn order to use the driver a program has to open /dev/net/tun and issue a corresponding ioctl() to register a network device with the kernel. A network device will appear as tunXX or tapXX, depending on the options chosen. When the program closes the file descriptor, the network device and all corresponding routes will disappear.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubj])}(hDepending on the type of device chosen the userspace program has to read/write IP packets (with tun) or ethernet frames (with tap). Which one is being used depends on the flags given with the ioctl().h]hDepending on the type of device chosen the userspace program has to read/write IP packets (with tun) or ethernet frames (with tap). Which one is being used depends on the flags given with the ioctl().}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhK!hjubj])}(hX_The package from http://vtun.sourceforge.net/tun contains two simple examples for how to use tun and tap devices. Both programs work like a bridge between two network interfaces. br_select.c - bridge based on select system call. br_sigio.c - bridge based on async io and SIGIO signal. However, the best example is VTun http://vtun.sourceforge.net :))h](hThe package from }(hjKhhhNhNubjo)}(hhttp://vtun.sourceforge.net/tunh]hhttp://vtun.sourceforge.net/tun}(hjShhhNhNubah}(h]h ]h"]h$]h&]refurijUuh1jnhjKubhX contains two simple examples for how to use tun and tap devices. Both programs work like a bridge between two network interfaces. br_select.c - bridge based on select system call. br_sigio.c - bridge based on async io and SIGIO signal. However, the best example is VTun }(hjKhhhNhNubjo)}(hhttp://vtun.sourceforge.neth]hhttp://vtun.sourceforge.net}(hjfhhhNhNubah}(h]h ]h"]h$]h&]refurijhuh1jnhjKubh :))}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhK%hjubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubeh}(h] descriptionah ]h"]1. descriptionah$]h&]uh1jGhjIhhhhhKubjH)}(hhh](jM)}(h2. Configurationh]h2. Configuration}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhK-ubj)}(hXCreate device node:: mkdir /dev/net (if it doesn't exist already) mknod /dev/net/tun c 10 200 Set permissions:: e.g. chmod 0666 /dev/net/tun There's no harm in allowing the device to be accessible by non-root users, since CAP_NET_ADMIN is required for creating network devices or for connecting to network devices which aren't owned by the user in question. If you want to create persistent devices and give ownership of them to unprivileged users, then you need the /dev/net/tun device to be usable by those users. Driver module autoloading Make sure that "Kernel module loader" - module auto-loading support is enabled in your kernel. The kernel should load it on first access. Manual loading insert the module by hand:: modprobe tun If you do it the latter way, you have to load the module every time you need it, if you do it the other way it will be automatically loaded when /dev/net/tun is being opened. h](j])}(hCreate device node::h]hCreate device node:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhK/hjubh literal_block)}(hHmkdir /dev/net (if it doesn't exist already) mknod /dev/net/tun c 10 200h]hHmkdir /dev/net (if it doesn't exist already) mknod /dev/net/tun c 10 200}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK1hjubj])}(hSet permissions::h]hSet permissions:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhK4hjubj)}(he.g. chmod 0666 /dev/net/tunh]he.g. chmod 0666 /dev/net/tun}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK6hjubj])}(hXvThere's no harm in allowing the device to be accessible by non-root users, since CAP_NET_ADMIN is required for creating network devices or for connecting to network devices which aren't owned by the user in question. If you want to create persistent devices and give ownership of them to unprivileged users, then you need the /dev/net/tun device to be usable by those users.h]hXzThere’s no harm in allowing the device to be accessible by non-root users, since CAP_NET_ADMIN is required for creating network devices or for connecting to network devices which aren’t owned by the user in question. If you want to create persistent devices and give ownership of them to unprivileged users, then you need the /dev/net/tun device to be usable by those users.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhK8hjubj])}(hDriver module autoloadingh]hDriver module autoloading}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhK?hjubj)}(hMake sure that "Kernel module loader" - module auto-loading support is enabled in your kernel. The kernel should load it on first access. h]j])}(hMake sure that "Kernel module loader" - module auto-loading support is enabled in your kernel. The kernel should load it on first access.h]hMake sure that “Kernel module loader” - module auto-loading support is enabled in your kernel. The kernel should load it on first access.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKAhjubah}(h]h ]h"]h$]h&]uh1jhhhKAhjubj])}(hManual loadingh]hManual loading}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKEhjubj)}(h-insert the module by hand:: modprobe tun h](j])}(hinsert the module by hand::h]hinsert the module by hand:}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKGhjubj)}(h modprobe tunh]h modprobe tun}hj0sbah}(h]h ]h"]h$]h&]hhuh1jhhhKIhjubeh}(h]h ]h"]h$]h&]uh1jhhhKGhjubj])}(hIf you do it the latter way, you have to load the module every time you need it, if you do it the other way it will be automatically loaded when /dev/net/tun is being opened.h]hIf you do it the latter way, you have to load the module every time you need it, if you do it the other way it will be automatically loaded when /dev/net/tun is being opened.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKKhjubeh}(h]h ]h"]h$]h&]uh1jhhhK/hjhhubeh}(h] configurationah ]h"]2. configurationah$]h&]uh1jGhjIhhhhhK-ubjH)}(hhh](jM)}(h3. Program interfaceh]h3. Program interface}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj`hhhhhKPubjH)}(hhh](jM)}(h3.1 Network device allocationh]h3.1 Network device allocation}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjqhhhhhKSubj])}(h``char *dev`` should be the name of the device with a format string (e.g. "tun%d"), but (as far as I can see) this can be any valid network device name. Note that the character pointer becomes overwritten with the real device name (e.g. "tun0")::h](hliteral)}(h ``char *dev``h]h char *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh should be the name of the device with a format string (e.g. “tun%d”), but (as far as I can see) this can be any valid network device name. Note that the character pointer becomes overwritten with the real device name (e.g. “tun0”):}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhKUhjqhhubj)}(hX#include #include int tun_alloc(char *dev) { struct ifreq ifr; int fd, err; if( (fd = open("/dev/net/tun", O_RDWR)) < 0 ) return tun_alloc_old(dev); memset(&ifr, 0, sizeof(ifr)); /* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device * * IFF_NO_PI - Do not provide packet information */ ifr.ifr_flags = IFF_TUN; if( *dev ) strscpy_pad(ifr.ifr_name, dev, IFNAMSIZ); if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){ close(fd); return err; } strcpy(dev, ifr.ifr_name); return fd; }h]hX#include #include int tun_alloc(char *dev) { struct ifreq ifr; int fd, err; if( (fd = open("/dev/net/tun", O_RDWR)) < 0 ) return tun_alloc_old(dev); memset(&ifr, 0, sizeof(ifr)); /* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device * * IFF_NO_PI - Do not provide packet information */ ifr.ifr_flags = IFF_TUN; if( *dev ) strscpy_pad(ifr.ifr_name, dev, IFNAMSIZ); if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){ close(fd); return err; } strcpy(dev, ifr.ifr_name); return fd; }}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKZhjqhhubeh}(h]network-device-allocationah ]h"]3.1 network device allocationah$]h&]uh1jGhj`hhhhhKSubjH)}(hhh](jM)}(h3.2 Frame formath]h3.2 Frame format}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhKyubj])}(h3If flag IFF_NO_PI is not set each frame format is::h]h2If flag IFF_NO_PI is not set each frame format is:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhK{hjhhubj)}(hBFlags [2 bytes] Proto [2 bytes] Raw protocol(IP, IPv6, etc) frame.h]hBFlags [2 bytes] Proto [2 bytes] Raw protocol(IP, IPv6, etc) frame.}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK}hjhhubeh}(h] frame-formatah ]h"]3.2 frame formatah$]h&]uh1jGhj`hhhhhKyubjH)}(hhh](jM)}(h3.3 Multiqueue tuntap interfaceh]h3.3 Multiqueue tuntap interface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhKubj])}(hXDFrom version 3.8, Linux supports multiqueue tuntap which can uses multiple file descriptors (queues) to parallelize packets sending or receiving. The device allocation is the same as before, and if user wants to create multiple queues, TUNSETIFF with the same device name must be called many times with IFF_MULTI_QUEUE flag.h]hXDFrom version 3.8, Linux supports multiqueue tuntap which can uses multiple file descriptors (queues) to parallelize packets sending or receiving. The device allocation is the same as before, and if user wants to create multiple queues, TUNSETIFF with the same device name must be called many times with IFF_MULTI_QUEUE flag.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjhhubj])}(hX``char *dev`` should be the name of the device, queues is the number of queues to be created, fds is used to store and return the file descriptors (queues) created to the caller. Each file descriptor were served as the interface of a queue which could be accessed by userspace.h](j)}(h ``char *dev``h]h char *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhX should be the name of the device, queues is the number of queues to be created, fds is used to store and return the file descriptors (queues) created to the caller. Each file descriptor were served as the interface of a queue which could be accessed by userspace.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjhhubj)}(hXw#include #include int tun_alloc_mq(char *dev, int queues, int *fds) { struct ifreq ifr; int fd, err, i; if (!dev) return -1; memset(&ifr, 0, sizeof(ifr)); /* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device * * IFF_NO_PI - Do not provide packet information * IFF_MULTI_QUEUE - Create a queue of multiqueue device */ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_MULTI_QUEUE; strcpy(ifr.ifr_name, dev); for (i = 0; i < queues; i++) { if ((fd = open("/dev/net/tun", O_RDWR)) < 0) goto err; err = ioctl(fd, TUNSETIFF, (void *)&ifr); if (err) { close(fd); goto err; } fds[i] = fd; } return 0; err: for (--i; i >= 0; i--) close(fds[i]); return err; }h]hXw#include #include int tun_alloc_mq(char *dev, int queues, int *fds) { struct ifreq ifr; int fd, err, i; if (!dev) return -1; memset(&ifr, 0, sizeof(ifr)); /* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device * * IFF_NO_PI - Do not provide packet information * IFF_MULTI_QUEUE - Create a queue of multiqueue device */ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_MULTI_QUEUE; strcpy(ifr.ifr_name, dev); for (i = 0; i < queues; i++) { if ((fd = open("/dev/net/tun", O_RDWR)) < 0) goto err; err = ioctl(fd, TUNSETIFF, (void *)&ifr); if (err) { close(fd); goto err; } fds[i] = fd; } return 0; err: for (--i; i >= 0; i--) close(fds[i]); return err; }}hj&sbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubj])}(hXA new ioctl(TUNSETQUEUE) were introduced to enable or disable a queue. When calling it with IFF_DETACH_QUEUE flag, the queue were disabled. And when calling it with IFF_ATTACH_QUEUE flag, the queue were enabled. The queue were enabled by default after it was created through TUNSETIFF.h]hXA new ioctl(TUNSETQUEUE) were introduced to enable or disable a queue. When calling it with IFF_DETACH_QUEUE flag, the queue were disabled. And when calling it with IFF_ATTACH_QUEUE flag, the queue were enabled. The queue were enabled by default after it was created through TUNSETIFF.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjhhubj])}(hfd is the file descriptor (queue) that we want to enable or disable, when enable is true we enable it, otherwise we disable it::h]hfd is the file descriptor (queue) that we want to enable or disable, when enable is true we enable it, otherwise we disable it:}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjhhubj)}(hX1#include #include int tun_set_queue(int fd, int enable) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); if (enable) ifr.ifr_flags = IFF_ATTACH_QUEUE; else ifr.ifr_flags = IFF_DETACH_QUEUE; return ioctl(fd, TUNSETQUEUE, (void *)&ifr); }h]hX1#include #include int tun_set_queue(int fd, int enable) { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); if (enable) ifr.ifr_flags = IFF_ATTACH_QUEUE; else ifr.ifr_flags = IFF_DETACH_QUEUE; return ioctl(fd, TUNSETQUEUE, (void *)&ifr); }}hjPsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubeh}(h]multiqueue-tuntap-interfaceah ]h"]3.3 multiqueue tuntap interfaceah$]h&]uh1jGhj`hhhhhKubeh}(h]program-interfaceah ]h"]3. program interfaceah$]h&]uh1jGhjIhhhhhKPubjH)}(hhh](jM)}(h9Universal TUN/TAP device driver Frequently Asked Questionh]h9Universal TUN/TAP device driver Frequently Asked Question}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjnhhhhhKubhenumerated_list)}(hhh]h list_item)}(h1What platforms are supported by TUN/TAP driver ? h]j])}(h0What platforms are supported by TUN/TAP driver ?h]h0What platforms are supported by TUN/TAP driver ?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjnhhhhhKubj])}(h/Currently driver has been written for 3 Unices:h]h/Currently driver has been written for 3 Unices:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjnhhubj)}(hM- Linux kernels 2.2.x, 2.4.x - FreeBSD 3.x, 4.x, 5.x - Solaris 2.6, 7.0, 8.0 h]h bullet_list)}(hhh](j)}(hLinux kernels 2.2.x, 2.4.xh]j])}(hjh]hLinux kernels 2.2.x, 2.4.x}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hFreeBSD 3.x, 4.x, 5.xh]j])}(hjh]hFreeBSD 3.x, 4.x, 5.x}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hSolaris 2.6, 7.0, 8.0 h]j])}(hSolaris 2.6, 7.0, 8.0h]hSolaris 2.6, 7.0, 8.0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjnhhubj)}(hhh]j)}(h!What is TUN/TAP driver used for? h]j])}(h What is TUN/TAP driver used for?h]h What is TUN/TAP driver used for?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubah}(h]h ]h"]h$]h&]jjjhjjstartKuh1jhjnhhhhhKubj])}(hrAs mentioned above, main purpose of TUN/TAP driver is tunneling. It is used by VTun (http://vtun.sourceforge.net).h](hUAs mentioned above, main purpose of TUN/TAP driver is tunneling. It is used by VTun (}(hj6 hhhNhNubjo)}(hhttp://vtun.sourceforge.neth]hhttp://vtun.sourceforge.net}(hj> hhhNhNubah}(h]h ]h"]h$]h&]refurij@ uh1jnhj6 ubh).}(hj6 hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjnhhubj])}(hAnother interesting application using TUN/TAP is pipsecd (http://perso.enst.fr/~beyssac/pipsec/), a userspace IPSec implementation that can use complete kernel routing (unlike FreeS/WAN).h](h:Another interesting application using TUN/TAP is pipsecd (}(hjW hhhNhNubjo)}(h%http://perso.enst.fr/~beyssac/pipsec/h]h%http://perso.enst.fr/~beyssac/pipsec/}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]refurija uh1jnhjW ubh\), a userspace IPSec implementation that can use complete kernel routing (unlike FreeS/WAN).}(hjW hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhKhjnhhubj)}(hhh]j)}(h0How does Virtual network device actually work ? h]j])}(h/How does Virtual network device actually work ?h]h/How does Virtual network device actually work ?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhj{ ubah}(h]h ]h"]h$]h&]uh1jhjx hhhhhNubah}(h]h ]h"]h$]h&]jjjhjjj5 Kuh1jhjnhhhhhKubj])}(hX Virtual network device can be viewed as a simple Point-to-Point or Ethernet device, which instead of receiving packets from a physical media, receives them from user space program and instead of sending packets via physical media sends them to the user space program.h]hX Virtual network device can be viewed as a simple Point-to-Point or Ethernet device, which instead of receiving packets from a physical media, receives them from user space program and instead of sending packets via physical media sends them to the user space program.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjnhhubj])}(hXLet's say that you configured IPv6 on the tap0, then whenever the kernel sends an IPv6 packet to tap0, it is passed to the application (VTun for example). The application encrypts, compresses and sends it to the other side over TCP or UDP. The application on the other side decompresses and decrypts the data received and writes the packet to the TAP device, the kernel handles the packet like it came from real physical device.h]hXLet’s say that you configured IPv6 on the tap0, then whenever the kernel sends an IPv6 packet to tap0, it is passed to the application (VTun for example). The application encrypts, compresses and sends it to the other side over TCP or UDP. The application on the other side decompresses and decrypts the data received and writes the packet to the TAP device, the kernel handles the packet like it came from real physical device.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjnhhubj)}(hhh]j)}(h:What is the difference between TUN driver and TAP driver? h]j])}(h9What is the difference between TUN driver and TAP driver?h]h9What is the difference between TUN driver and TAP driver?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubah}(h]h ]h"]h$]h&]jjjhjjj5 Kuh1jhjnhhhhhKubj])}(h9TUN works with IP frames. TAP works with Ethernet frames.h]h9TUN works with IP frames. TAP works with Ethernet frames.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjnhhubj])}(hlThis means that you have to read/write IP packets when you are using tun and ethernet frames when using tap.h]hlThis means that you have to read/write IP packets when you are using tun and ethernet frames when using tap.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjnhhubj)}(hhh]j)}(h7What is the difference between BPF and TUN/TAP driver? h]j])}(h6What is the difference between BPF and TUN/TAP driver?h]h6What is the difference between BPF and TUN/TAP driver?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubah}(h]h ]h"]h$]h&]jjjhjjj5 Kuh1jhjnhhhhhKubj])}(hBPF is an advanced packet filter. It can be attached to existing network interface. It does not provide a virtual network interface. A TUN/TAP driver does provide a virtual network interface and it is possible to attach BPF to this interface.h]hBPF is an advanced packet filter. It can be attached to existing network interface. It does not provide a virtual network interface. A TUN/TAP driver does provide a virtual network interface and it is possible to attach BPF to this interface.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjnhhubj)}(hhh]j)}(h2Does TAP driver support kernel Ethernet bridging? h]j])}(h1Does TAP driver support kernel Ethernet bridging?h]h1Does TAP driver support kernel Ethernet bridging?}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhMhj$ ubah}(h]h ]h"]h$]h&]uh1jhj! hhhhhNubah}(h]h ]h"]h$]h&]jjjhjjj5 Kuh1jhjnhhhhhMubj])}(h9Yes. Linux and FreeBSD drivers support Ethernet bridging.h]h9Yes. Linux and FreeBSD drivers support Ethernet bridging.}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhMhjnhhubeh}(h]9universal-tun-tap-device-driver-frequently-asked-questionah ]h"]9universal tun/tap device driver frequently asked questionah$]h&]uh1jGhjIhhhhhKubeh}(h]universal-tun-tap-device-driverah ]h"]universal tun/tap device driverah$]h&]uh1jGhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jLN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}(hhhhhhj jjjj*jj9j-jHj<jWjKjfjZjujijjxjjjjjjjjjjjjjjjjj jjjj)jj8j,jGj;jVjJjejYjtjhjjwjjjjjjjjjjjjjjjjj jjj j(jj7j+jFj:jUjIjdjXjsjgjjvjjjjjjjjjjjjjjjjj jjj j'jj6j*jEj9jTjHjcjWjrjfjjujjjjjjjjjjjjjjjjjjjj j&jj5j)jDj8usubstitution_names}(amphߌaposhasthbrvbarj bsoljcentj*colonj9commajHcommatjWcopyjfcurrenjudarrjdegjdividejdollarjequalsjexcljfrac12jfrac14jfrac18jfrac34j frac38jfrac58j)frac78j8gtjGhalfjVhorbarjehyphenjtiexcljiquestjlaquojlarrjlcubjldquojlowbarjlparjlsqbjlsquoj ltjmicroj(middotj7nbspjFnotjUnumjdohmjsordfjordmjparajpercntjperiodjplusjplusmnjpoundjquestjquotj raquojrarrj'rcubj6rdquojEregjTrparjcrsqbjrrsquojsectjsemijshyjsoljsungjsup1jsup2jsup3jtimesjtradejuarrj&verbarj5yenjDurefnames}refids}nameids}(j] jZ jjj]jZjkjhjjjjjcj`jU jR u nametypes}(j] jj]jkjjjcjU uh}(jZ jIjj jZjjhj`jjqjjj`jjR jnu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages](hsystem_message)}(hhh]j])}(h:Enumerated list start value not ordinal-1: "2" (ordinal 2)h]h>Enumerated list start value not ordinal-1: “2” (ordinal 2)}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj3 ubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineKuh1j1 hjnhhhhhKubj2 )}(hhh]j])}(h:Enumerated list start value not ordinal-1: "3" (ordinal 3)h]h>Enumerated list start value not ordinal-1: “3” (ordinal 3)}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjO ubah}(h]h ]h"]h$]h&]levelKtypejL sourcehlineKuh1j1 hjnhhhhhKubj2 )}(hhh]j])}(h:Enumerated list start value not ordinal-1: "4" (ordinal 4)h]h>Enumerated list start value not ordinal-1: “4” (ordinal 4)}(hjm hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjj ubah}(h]h ]h"]h$]h&]levelKtypejL sourcehlineKuh1j1 hjnhhhhhKubj2 )}(hhh]j])}(h:Enumerated list start value not ordinal-1: "5" (ordinal 5)h]h>Enumerated list start value not ordinal-1: “5” (ordinal 5)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj ubah}(h]h ]h"]h$]h&]levelKtypejL sourcehlineKuh1j1 hjnhhhhhKubj2 )}(hhh]j])}(h:Enumerated list start value not ordinal-1: "6" (ordinal 6)h]h>Enumerated list start value not ordinal-1: “6” (ordinal 6)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj ubah}(h]h ]h"]h$]h&]levelKtypejL sourcehlineKuh1j1 hjnhhhhhMubetransform_messages] transformerN include_log]#Documentation/networking/tuntap.rst(NNNNta decorationNhhub.