€•+ËŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ%/translations/zh_CN/networking/tuntap”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/zh_TW/networking/tuntap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/it_IT/networking/tuntap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/ja_JP/networking/tuntap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/ko_KR/networking/tuntap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/pt_BR/networking/tuntap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/sp_SP/networking/tuntap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ?/var/lib/git/docbuild/linux/Documentation/networking/tuntap.rst”h´Kubh¶)�”}”(hŒ4This data file has been placed in the public domain.”h]”hŒ4This data file has been placed in the public domain.”…”�”}”hhÈsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³Œo/srv/docbuild/lib/venvs/build-kernel-docs/lib64/python3.9/site-packages/docutils/parsers/rst/include/isonum.txt”h´Kubh¶)�”}”(hŒ¸Derived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .”h]”hŒ¸Derived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .”…”�”}”hh×sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÖh´KubhŒsubstitution_definition”“”)�”}”(hŒ*.. |amp| unicode:: U+00026 .. AMPERSAND”h]”hŒ&”…”�”}”hhçsbah}”(h]”h ]”h"]”Œamp”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ+.. |apos| unicode:: U+00027 .. APOSTROPHE”h]”hŒ'”…”�”}”hhösbah}”(h]”h ]”h"]”Œapos”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ).. |ast| unicode:: U+0002A .. ASTERISK”h]”hŒ*”…”�”}”hjsbah}”(h]”h ]”h"]”Œast”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ+.. |brvbar| unicode:: U+000A6 .. BROKEN BAR”h]”hŒ¦”…”�”}”hjsbah}”(h]”h ]”h"]”Œbrvbar”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUS”h]”hŒ\”…”�”}”hj#sbah}”(h]”h ]”h"]”Œbsol”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ*.. |cent| unicode:: U+000A2 .. CENT SIGN”h]”hŒ¢”…”�”}”hj2sbah}”(h]”h ]”h"]”Œcent”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ&.. |colon| unicode:: U+0003A .. COLON”h]”hŒ:”…”�”}”hjAsbah}”(h]”h ]”h"]”Œcolon”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ&.. |comma| unicode:: U+0002C .. COMMA”h]”hŒ,”…”�”}”hjPsbah}”(h]”h ]”h"]”Œcomma”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ... |commat| unicode:: U+00040 .. COMMERCIAL AT”h]”hŒ@”…”�”}”hj_sbah}”(h]”h ]”h"]”Œcommat”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN”h]”hŒ©”…”�”}”hjnsbah}”(h]”h ]”h"]”Œcopy”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ... |curren| unicode:: U+000A4 .. CURRENCY SIGN”h]”hŒ¤”…”�”}”hj}sbah}”(h]”h ]”h"]”Œcurren”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROW”h]”hŒ↓”…”�”}”hjŒsbah}”(h]”h ]”h"]”Œdarr”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ,.. |deg| unicode:: U+000B0 .. DEGREE SIGN”h]”hŒ°”…”�”}”hj›sbah}”(h]”h ]”h"]”Œdeg”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ... |divide| unicode:: U+000F7 .. DIVISION SIGN”h]”hŒ÷”…”�”}”hjªsbah}”(h]”h ]”h"]”Œdivide”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ,.. |dollar| unicode:: U+00024 .. DOLLAR SIGN”h]”hŒ$”…”�”}”hj¹sbah}”(h]”h ]”h"]”Œdollar”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ,.. |equals| unicode:: U+0003D .. EQUALS SIGN”h]”hŒ=”…”�”}”hjÈsbah}”(h]”h ]”h"]”Œequals”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ1.. |excl| unicode:: U+00021 .. EXCLAMATION MARK”h]”hŒ!”…”�”}”hj×sbah}”(h]”h ]”h"]”Œexcl”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF”h]”hŒ½”…”�”}”hjæsbah}”(h]”h ]”h"]”Œfrac12”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER”h]”hŒ¼”…”�”}”hjõsbah}”(h]”h ]”h"]”Œfrac14”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH”h]”hŒâ…›”…”�”}”hjsbah}”(h]”h ]”h"]”Œfrac18”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS”h]”hŒ¾”…”�”}”hjsbah}”(h]”h ]”h"]”Œfrac34”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS”h]”hŒâ…œ”…”�”}”hj"sbah}”(h]”h ]”h"]”Œfrac38”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS”h]”hŒâ…�”…”�”}”hj1sbah}”(h]”h ]”h"]”Œfrac58”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS”h]”hŒâ…ž”…”�”}”hj@sbah}”(h]”h ]”h"]”Œfrac78”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGN”h]”hŒ>”…”�”}”hjOsbah}”(h]”h ]”h"]”Œgt”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALF”h]”hŒ½”…”�”}”hj^sbah}”(h]”h ]”h"]”Œhalf”ah$]”h&]”uh1håh³hÖh´K hhh²hubhæ)�”}”(hŒ/.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR”h]”hŒ―”…”�”}”hjmsbah}”(h]”h ]”h"]”Œhorbar”ah$]”h&]”uh1håh³hÖh´K!hhh²hubhæ)�”}”(hŒ'.. |hyphen| unicode:: U+02010 .. HYPHEN”h]”hŒâ€�”…”�”}”hj|sbah}”(h]”h ]”h"]”Œhyphen”ah$]”h&]”uh1håh³hÖh´K"hhh²hubhæ)�”}”(hŒ:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARK”h]”hŒ¡”…”�”}”hj‹sbah}”(h]”h ]”h"]”Œiexcl”ah$]”h&]”uh1håh³hÖh´K#hhh²hubhæ)�”}”(hŒ7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK”h]”hŒ¿”…”�”}”hjšsbah}”(h]”h ]”h"]”Œiquest”ah$]”h&]”uh1håh³hÖh´K$hhh²hubhæ)�”}”(hŒJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK”h]”hŒ«”…”�”}”hj©sbah}”(h]”h ]”h"]”Œlaquo”ah$]”h&]”uh1håh³hÖh´K%hhh²hubhæ)�”}”(hŒ0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROW”h]”hŒâ†�”…”�”}”hj¸sbah}”(h]”h ]”h"]”Œlarr”ah$]”h&]”uh1håh³hÖh´K&hhh²hubhæ)�”}”(hŒ3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKET”h]”hŒ{”…”�”}”hjÇsbah}”(h]”h ]”h"]”Œlcub”ah$]”h&]”uh1håh³hÖh´K'hhh²hubhæ)�”}”(hŒ;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK”h]”hŒ“”…”�”}”hjÖsbah}”(h]”h ]”h"]”Œldquo”ah$]”h&]”uh1håh³hÖh´K(hhh²hubhæ)�”}”(hŒ).. |lowbar| unicode:: U+0005F .. LOW LINE”h]”hŒ_”…”�”}”hjåsbah}”(h]”h ]”h"]”Œlowbar”ah$]”h&]”uh1håh³hÖh´K)hhh²hubhæ)�”}”(hŒ1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESIS”h]”hŒ(”…”�”}”hjôsbah}”(h]”h ]”h"]”Œlpar”ah$]”h&]”uh1håh³hÖh´K*hhh²hubhæ)�”}”(hŒ4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKET”h]”hŒ[”…”�”}”hjsbah}”(h]”h ]”h"]”Œlsqb”ah$]”h&]”uh1håh³hÖh´K+hhh²hubhæ)�”}”(hŒ;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK”h]”hŒ‘”…”�”}”hjsbah}”(h]”h ]”h"]”Œlsquo”ah$]”h&]”uh1håh³hÖh´K,hhh²hubhæ)�”}”(hŒ/.. |lt| unicode:: U+0003C .. LESS-THAN SIGN”h]”hŒ<”…”�”}”hj!sbah}”(h]”h ]”h"]”Œlt”ah$]”h&]”uh1håh³hÖh´K-hhh²hubhæ)�”}”(hŒ+.. |micro| unicode:: U+000B5 .. MICRO SIGN”h]”hŒµ”…”�”}”hj0sbah}”(h]”h ]”h"]”Œmicro”ah$]”h&]”uh1håh³hÖh´K.hhh²hubhæ)�”}”(hŒ+.. |middot| unicode:: U+000B7 .. MIDDLE DOT”h]”hŒ·”…”�”}”hj?sbah}”(h]”h ]”h"]”Œmiddot”ah$]”h&]”uh1håh³hÖh´K/hhh²hubhæ)�”}”(hŒ/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACE”h]”hŒ ”…”�”}”hjNsbah}”(h]”h ]”h"]”Œnbsp”ah$]”h&]”uh1håh³hÖh´K0hhh²hubhæ)�”}”(hŒ).. |not| unicode:: U+000AC .. NOT SIGN”h]”hŒ¬”…”�”}”hj]sbah}”(h]”h ]”h"]”Œnot”ah$]”h&]”uh1håh³hÖh´K1hhh²hubhæ)�”}”(hŒ,.. |num| unicode:: U+00023 .. NUMBER SIGN”h]”hŒ#”…”�”}”hjlsbah}”(h]”h ]”h"]”Œnum”ah$]”h&]”uh1håh³hÖh´K2hhh²hubhæ)�”}”(hŒ).. |ohm| unicode:: U+02126 .. OHM SIGN”h]”hŒΩ”…”�”}”hj{sbah}”(h]”h ]”h"]”Œohm”ah$]”h&]”uh1håh³hÖh´K3hhh²hubhæ)�”}”(hŒ;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATOR”h]”hŒª”…”�”}”hjŠsbah}”(h]”h ]”h"]”Œordf”ah$]”h&]”uh1håh³hÖh´K4hhh²hubhæ)�”}”(hŒ<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR”h]”hŒº”…”�”}”hj™sbah}”(h]”h ]”h"]”Œordm”ah$]”h&]”uh1håh³hÖh´K5hhh²hubhæ)�”}”(hŒ-.. |para| unicode:: U+000B6 .. PILCROW SIGN”h]”hŒ¶”…”�”}”hj¨sbah}”(h]”h ]”h"]”Œpara”ah$]”h&]”uh1håh³hÖh´K6hhh²hubhæ)�”}”(hŒ-.. |percnt| unicode:: U+00025 .. PERCENT SIGN”h]”hŒ%”…”�”}”hj·sbah}”(h]”h ]”h"]”Œpercnt”ah$]”h&]”uh1håh³hÖh´K7hhh²hubhæ)�”}”(hŒ*.. |period| unicode:: U+0002E .. FULL STOP”h]”hŒ.”…”�”}”hjÆsbah}”(h]”h ]”h"]”Œperiod”ah$]”h&]”uh1håh³hÖh´K8hhh²hubhæ)�”}”(hŒ*.. |plus| unicode:: U+0002B .. PLUS SIGN”h]”hŒ+”…”�”}”hjÕsbah}”(h]”h ]”h"]”Œplus”ah$]”h&]”uh1håh³hÖh´K9hhh²hubhæ)�”}”(hŒ0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN”h]”hŒ±”…”�”}”hjäsbah}”(h]”h ]”h"]”Œplusmn”ah$]”h&]”uh1håh³hÖh´K:hhh²hubhæ)�”}”(hŒ+.. |pound| unicode:: U+000A3 .. POUND SIGN”h]”hŒ£”…”�”}”hjósbah}”(h]”h ]”h"]”Œpound”ah$]”h&]”uh1håh³hÖh´K;hhh²hubhæ)�”}”(hŒ... |quest| unicode:: U+0003F .. QUESTION MARK”h]”hŒ?”…”�”}”hjsbah}”(h]”h ]”h"]”Œquest”ah$]”h&]”uh1håh³hÖh´Khhh²hubhæ)�”}”(hŒ1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROW”h]”hŒ→”…”�”}”hj/sbah}”(h]”h ]”h"]”Œrarr”ah$]”h&]”uh1håh³hÖh´K?hhh²hubhæ)�”}”(hŒ4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKET”h]”hŒ}”…”�”}”hj>sbah}”(h]”h ]”h"]”Œrcub”ah$]”h&]”uh1håh³hÖh´K@hhh²hubhæ)�”}”(hŒ<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK”h]”hŒâ€�”…”�”}”hjMsbah}”(h]”h ]”h"]”Œrdquo”ah$]”h&]”uh1håh³hÖh´KAhhh²hubhæ)�”}”(hŒ0.. |reg| unicode:: U+000AE .. REGISTERED SIGN”h]”hŒ®”…”�”}”hj\sbah}”(h]”h ]”h"]”Œreg”ah$]”h&]”uh1håh³hÖh´KBhhh²hubhæ)�”}”(hŒ2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESIS”h]”hŒ)”…”�”}”hjksbah}”(h]”h ]”h"]”Œrpar”ah$]”h&]”uh1håh³hÖh´KChhh²hubhæ)�”}”(hŒ5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKET”h]”hŒ]”…”�”}”hjzsbah}”(h]”h ]”h"]”Œrsqb”ah$]”h&]”uh1håh³hÖh´KDhhh²hubhæ)�”}”(hŒ<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK”h]”hŒ’”…”�”}”hj‰sbah}”(h]”h ]”h"]”Œrsquo”ah$]”h&]”uh1håh³hÖh´KEhhh²hubhæ)�”}”(hŒ-.. |sect| unicode:: U+000A7 .. SECTION SIGN”h]”hŒ§”…”�”}”hj˜sbah}”(h]”h ]”h"]”Œsect”ah$]”h&]”uh1håh³hÖh´KFhhh²hubhæ)�”}”(hŒ*.. |semi| unicode:: U+0003B .. SEMICOLON”h]”hŒ;”…”�”}”hj§sbah}”(h]”h ]”h"]”Œsemi”ah$]”h&]”uh1håh³hÖh´KGhhh²hubhæ)�”}”(hŒ,.. |shy| unicode:: U+000AD .. SOFT HYPHEN”h]”hŒ­”…”�”}”hj¶sbah}”(h]”h ]”h"]”Œshy”ah$]”h&]”uh1håh³hÖh´KHhhh²hubhæ)�”}”(hŒ(.. |sol| unicode:: U+0002F .. SOLIDUS”h]”hŒ/”…”�”}”hjÅsbah}”(h]”h ]”h"]”Œsol”ah$]”h&]”uh1håh³hÖh´KIhhh²hubhæ)�”}”(hŒ,.. |sung| unicode:: U+0266A .. EIGHTH NOTE”h]”hŒ♪”…”�”}”hjÔsbah}”(h]”h ]”h"]”Œsung”ah$]”h&]”uh1håh³hÖh´KJhhh²hubhæ)�”}”(hŒ0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONE”h]”hŒ¹”…”�”}”hjãsbah}”(h]”h ]”h"]”Œsup1”ah$]”h&]”uh1håh³hÖh´KKhhh²hubhæ)�”}”(hŒ0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWO”h]”hŒ²”…”�”}”hjòsbah}”(h]”h ]”h"]”Œsup2”ah$]”h&]”uh1håh³hÖh´KLhhh²hubhæ)�”}”(hŒ2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREE”h]”hŒ³”…”�”}”hjsbah}”(h]”h ]”h"]”Œsup3”ah$]”h&]”uh1håh³hÖh´KMhhh²hubhæ)�”}”(hŒ4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGN”h]”hŒ×”…”�”}”hjsbah}”(h]”h ]”h"]”Œtimes”ah$]”h&]”uh1håh³hÖh´KNhhh²hubhæ)�”}”(hŒ0.. |trade| unicode:: U+02122 .. TRADE MARK SIGN”h]”hŒâ„¢”…”�”}”hjsbah}”(h]”h ]”h"]”Œtrade”ah$]”h&]”uh1håh³hÖh´KOhhh²hubhæ)�”}”(hŒ... |uarr| unicode:: U+02191 .. UPWARDS ARROW”h]”hŒ↑”…”�”}”hj.sbah}”(h]”h ]”h"]”Œuarr”ah$]”h&]”uh1håh³hÖh´KPhhh²hubhæ)�”}”(hŒ... |verbar| unicode:: U+0007C .. VERTICAL LINE”h]”hŒ|”…”�”}”hj=sbah}”(h]”h ]”h"]”Œverbar”ah$]”h&]”uh1håh³hÖh´KQhhh²hubhæ)�”}”(hŒ*.. |yen| unicode:: U+000A5 .. YEN SIGN ”h]”hŒÂ¥”…”�”}”hjLsbah}”(h]”h ]”h"]”Œyen”ah$]”h&]”uh1håh³hÖh´KRhhh²hubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒUniversal TUN/TAP device driver”h]”hŒUniversal TUN/TAP device driver”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj]h²hh³hÇh´KubhŒ paragraph”“”)�”}”(hŒ?Copyright |copy| 1999-2000 Maxim Krasnyansky ”h]”(hŒ Copyright ”…”�”}”(hjrh²hh³Nh´NubhŒ©”…”�”}”(hjrh²hh³Nh´NubhŒ 1999-2000 Maxim Krasnyansky <”…”�”}”(hjrh²hh³Nh´NubhŒ reference”“”)�”}”(hŒmax_mk@yahoo.com”h]”hŒmax_mk@yahoo.com”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:max_mk@yahoo.com”uh1j‚hjrubhŒ>”…”�”}”(hjrh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Khj]h²hubhŒ block_quote”“”)�”}”(hŒ÷Linux, 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]”(jq)�”}”(hŒVLinux, Solaris drivers Copyright |copy| 1999-2000 Maxim Krasnyansky ”h]”(hŒ!Linux, Solaris drivers Copyright ”…”�”}”(hj¤h²hh³Nh´NubhŒ©”…”�”}”(hj¤h²hh³Nh´NubhŒ 1999-2000 Maxim Krasnyansky <”…”�”}”(hj¤h²hh³Nh´Nubjƒ)�”}”(hŒmax_mk@yahoo.com”h]”hŒmax_mk@yahoo.com”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:max_mk@yahoo.com”uh1j‚hj¤ubhŒ>”…”�”}”(hj¤h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K hj ubjq)�”}”(hŒUFreeBSD TAP driver Copyright |copy| 1999-2000 Maksim Yevmenkin ”h]”(hŒFreeBSD TAP driver Copyright ”…”�”}”(hjÎh²hh³Nh´NubhŒ©”…”�”}”(hjÎh²hh³Nh´NubhŒ 1999-2000 Maksim Yevmenkin <”…”�”}”(hjÎh²hh³Nh´Nubjƒ)�”}”(hŒm_evmenkin@yahoo.com”h]”hŒm_evmenkin@yahoo.com”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:m_evmenkin@yahoo.com”uh1j‚hjÎubhŒ>”…”�”}”(hjÎh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K hj ubjq)�”}”(hŒGRevision of this document 2002 by Florian Thiel ”h]”(hŒ1Revision of this document 2002 by Florian Thiel <”…”�”}”(hjøh²hh³Nh´Nubjƒ)�”}”(hŒflorian.thiel@gmx.net”h]”hŒflorian.thiel@gmx.net”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:florian.thiel@gmx.net”uh1j‚hjøubhŒ>”…”�”}”(hjøh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Khj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžh³hÇh´K hj]h²hubj\)�”}”(hhh]”(ja)�”}”(hŒ1. Description”h]”hŒ1. Description”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj h²hh³hÇh´KubjŸ)�”}”(hXºTUN/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]”(jq)�”}”(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.”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Khj1ubjq)�”}”(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.”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Khj1ubjq)�”}”(hŒÈ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().”h]”hŒÈ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().”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K!hj1ubjq)�”}”(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]”(hŒThe package from ”…”�”}”(hj_h²hh³Nh´Nubjƒ)�”}”(hŒhttp://vtun.sourceforge.net/tun”h]”hŒhttp://vtun.sourceforge.net/tun”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jiuh1j‚hj_ubhX 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 ”…”�”}”(hj_h²hh³Nh´Nubjƒ)�”}”(hŒhttp://vtun.sourceforge.net”h]”hŒhttp://vtun.sourceforge.net”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j|uh1j‚hj_ubhŒ :))”…”�”}”(hj_h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K%hj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžh³hÇh´Khj h²hubeh}”(h]”Œ description”ah ]”h"]”Œ1. description”ah$]”h&]”uh1j[hj]h²hh³hÇh´Kubj\)�”}”(hhh]”(ja)�”}”(hŒ2. Configuration”h]”hŒ2. Configuration”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj¡h²hh³hÇh´K-ubjŸ)�”}”(hXµCreate 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]”(jq)�”}”(hŒCreate device node::”h]”hŒCreate device node:”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K/hj²ubhŒ literal_block”“”)�”}”(hŒHmkdir /dev/net (if it doesn't exist already) mknod /dev/net/tun c 10 200”h]”hŒHmkdir /dev/net (if it doesn't exist already) mknod /dev/net/tun c 10 200”…”�”}”hjÆsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÄh³hÇh´K1hj²ubjq)�”}”(hŒSet permissions::”h]”hŒSet permissions:”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K4hj²ubjÅ)�”}”(hŒe.g. chmod 0666 /dev/net/tun”h]”hŒe.g. chmod 0666 /dev/net/tun”…”�”}”hjâsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÄh³hÇh´K6hj²ubjq)�”}”(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.”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K8hj²ubjq)�”}”(hŒDriver module autoloading”h]”hŒDriver module autoloading”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K?hj²ubjŸ)�”}”(hŒ‹Make sure that "Kernel module loader" - module auto-loading support is enabled in your kernel. The kernel should load it on first access. ”h]”jq)�”}”(hŒŠMake sure that "Kernel module loader" - module auto-loading support is enabled in your kernel. The kernel should load it on first access.”h]”hŒŽMake sure that “Kernel module loaderâ€� - module auto-loading support is enabled in your kernel. The kernel should load it on first access.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KAhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jžh³hÇh´KAhj²ubjq)�”}”(hŒManual loading”h]”hŒManual loading”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KEhj²ubjŸ)�”}”(hŒ-insert the module by hand:: modprobe tun ”h]”(jq)�”}”(hŒinsert the module by hand::”h]”hŒinsert the module by hand:”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KGhj2ubjÅ)�”}”(hŒ modprobe tun”h]”hŒ modprobe tun”…”�”}”hjDsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÄh³hÇh´KIhj2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžh³hÇh´KGhj²ubjq)�”}”(hŒ®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]”hŒ®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.”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KKhj²ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžh³hÇh´K/hj¡h²hubeh}”(h]”Œ configuration”ah ]”h"]”Œ2. configuration”ah$]”h&]”uh1j[hj]h²hh³hÇh´K-ubj\)�”}”(hhh]”(ja)�”}”(hŒ3. Program interface”h]”hŒ3. Program interface”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjth²hh³hÇh´KPubj\)�”}”(hhh]”(ja)�”}”(hŒ3.1 Network device allocation”h]”hŒ3.1 Network device allocation”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hj…h²hh³hÇh´KSubjq)�”}”(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]”(hŒliteral”“”)�”}”(hŒ ``char *dev``”h]”hŒ char *dev”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhj–ubhŒð 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â€�):”…”�”}”(hj–h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KUhj…h²hubjÅ)�”}”(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; }”…”�”}”hj´sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÄh³hÇh´KZhj…h²hubeh}”(h]”Œnetwork-device-allocation”ah ]”h"]”Œ3.1 network device allocation”ah$]”h&]”uh1j[hjth²hh³hÇh´KSubj\)�”}”(hhh]”(ja)�”}”(hŒ3.2 Frame format”h]”hŒ3.2 Frame format”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjÊh²hh³hÇh´Kyubjq)�”}”(hŒ3If flag IFF_NO_PI is not set each frame format is::”h]”hŒ2If flag IFF_NO_PI is not set each frame format is:”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K{hjÊh²hubjÅ)�”}”(hŒBFlags [2 bytes] Proto [2 bytes] Raw protocol(IP, IPv6, etc) frame.”h]”hŒBFlags [2 bytes] Proto [2 bytes] Raw protocol(IP, IPv6, etc) frame.”…”�”}”hjésbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÄh³hÇh´K}hjÊh²hubeh}”(h]”Œ frame-format”ah ]”h"]”Œ3.2 frame format”ah$]”h&]”uh1j[hjth²hh³hÇh´Kyubj\)�”}”(hhh]”(ja)�”}”(hŒ3.3 Multiqueue tuntap interface”h]”hŒ3.3 Multiqueue tuntap interface”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjÿh²hh³hÇh´K‚ubjq)�”}”(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.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K„hjÿh²hubjq)�”}”(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”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhjubhX 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.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KŠhjÿh²hubjÅ)�”}”(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&]”hÅhÆuh1jÄh³hÇh´K‘hjÿh²hubjq)�”}”(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.”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K¸hjÿh²hubjq)�”}”(hŒ€fd is the file descriptor (queue) that we want to enable or disable, when enable is true we enable it, otherwise we disable it::”h]”hŒfd is the file descriptor (queue) that we want to enable or disable, when enable is true we enable it, otherwise we disable it:”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´K½hjÿh²hubjÅ)�”}”(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); }”…”�”}”hjdsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÄh³hÇh´KÀhjÿh²hubeh}”(h]”Œmultiqueue-tuntap-interface”ah ]”h"]”Œ3.3 multiqueue tuntap interface”ah$]”h&]”uh1j[hjth²hh³hÇh´K‚ubj\)�”}”(hhh]”(ja)�”}”(hŒ3.4 qdisc backpressure”h]”hŒ3.4 qdisc backpressure”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjzh²hh³hÇh´KÒubjq)�”}”(hŒëIFF_BACKPRESSURE can be set to enable qdisc backpressure. Without it, TX drops occur when the internal ring buffer is full, so any attached qdisc is effectively bypassed and applications only learn about congestion through those drops.”h]”hŒëIFF_BACKPRESSURE can be set to enable qdisc backpressure. Without it, TX drops occur when the internal ring buffer is full, so any attached qdisc is effectively bypassed and applications only learn about congestion through those drops.”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KÔhjzh²hubjq)�”}”(hXeWith it, the kernel stops the queue instead, letting the qdisc hold and schedule packets, so its AQM, shaping and fairness actually apply. This helps protocols like TCP, which cut throughput in reaction to packet drops. With IFF_BACKPRESSURE, drops then only occur as a rare race. Backpressure requires a qdisc to be attached and has no effect with noqueue.”h]”hXeWith it, the kernel stops the queue instead, letting the qdisc hold and schedule packets, so its AQM, shaping and fairness actually apply. This helps protocols like TCP, which cut throughput in reaction to packet drops. With IFF_BACKPRESSURE, drops then only occur as a rare race. Backpressure requires a qdisc to be attached and has no effect with noqueue.”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KÙhjzh²hubjq)�”}”(hŒ¹The flag is a property of the TUN/TAP device rather than of the file descriptor it was set on, so it applies to all queues of the device, regardless of which process opened which queue.”h]”hŒ¹The flag is a property of the TUN/TAP device rather than of the file descriptor it was set on, so it applies to all queues of the device, regardless of which process opened which queue.”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Kàhjzh²hubjq)�”}”(hŒýThe flag can only be changed while the device has at most one queue. On a multiqueue device that already has a second queue attached or detached, a later TUNSETIFF succeeds but leaves the flag as it is. All the other TUNSETIFF flags behave the same way.”h]”hŒýThe flag can only be changed while the device has at most one queue. On a multiqueue device that already has a second queue attached or detached, a later TUNSETIFF succeeds but leaves the flag as it is. All the other TUNSETIFF flags behave the same way.”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Kähjzh²hubjq)�”}”(hŒ“The txqueuelen can be reduced alongside this flag to further shift buffering into the qdisc and reduce bufferbloat, at a possible performance cost.”h]”hŒ“The txqueuelen can be reduced alongside this flag to further shift buffering into the qdisc and reduce bufferbloat, at a possible performance cost.”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Kéhjzh²hubjq)�”}”(hŒªWhen running multiple network streams in parallel through a single TUN/TAP queue, the flag may reduce performance due to the extra overhead of the backpressure mechanism.”h]”hŒªWhen running multiple network streams in parallel through a single TUN/TAP queue, the flag may reduce performance due to the extra overhead of the backpressure mechanism.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Kíhjzh²hubeh}”(h]”Œqdisc-backpressure”ah ]”h"]”Œ3.4 qdisc backpressure”ah$]”h&]”uh1j[hjth²hh³hÇh´KÒubeh}”(h]”Œprogram-interface”ah ]”h"]”Œ3. program interface”ah$]”h&]”uh1j[hj]h²hh³hÇh´KPubj\)�”}”(hhh]”(ja)�”}”(hŒ9Universal TUN/TAP device driver Frequently Asked Question”h]”hŒ9Universal TUN/TAP device driver Frequently Asked Question”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j`hjïh²hh³hÇh´KòubhŒenumerated_list”“”)�”}”(hhh]”hŒ list_item”“”)�”}”(hŒ1What platforms are supported by TUN/TAP driver ? ”h]”jq)�”}”(hŒ0What platforms are supported by TUN/TAP driver ?”h]”hŒ0What platforms are supported by TUN/TAP driver ?”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Kôhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1j hjïh²hh³hÇh´Kôubjq)�”}”(hŒ/Currently driver has been written for 3 Unices:”h]”hŒ/Currently driver has been written for 3 Unices:”…”�”}”(hj* h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Köhjïh²hubjŸ)�”}”(hŒM- 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 )�”}”(hŒLinux kernels 2.2.x, 2.4.x”h]”jq)�”}”(hjC h]”hŒLinux kernels 2.2.x, 2.4.x”…”�”}”(hjE h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KøhjA ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj> ubj )�”}”(hŒFreeBSD 3.x, 4.x, 5.x”h]”jq)�”}”(hjZ h]”hŒFreeBSD 3.x, 4.x, 5.x”…”�”}”(hj\ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´KùhjX ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj> ubj )�”}”(hŒSolaris 2.6, 7.0, 8.0 ”h]”jq)�”}”(hŒSolaris 2.6, 7.0, 8.0”h]”hŒSolaris 2.6, 7.0, 8.0”…”�”}”(hjs h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Kúhjo ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj> ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j< h³hÇh´Køhj8 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jžh³hÇh´Køhjïh²hubj )�”}”(hhh]”j )�”}”(hŒ!What is TUN/TAP driver used for? ”h]”jq)�”}”(hŒ What is TUN/TAP driver used for?”h]”hŒ What is TUN/TAP driver used for?”…”�”}”(hjœ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Kühj˜ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj• h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j% j& j' hj( j) Œstart”Kuh1j hjïh²hh³hÇh´Küubjq)�”}”(hŒrAs mentioned above, main purpose of TUN/TAP driver is tunneling. It is used by VTun (http://vtun.sourceforge.net).”h]”(hŒUAs mentioned above, main purpose of TUN/TAP driver is tunneling. It is used by VTun (”…”�”}”(hj· h²hh³Nh´Nubjƒ)�”}”(hŒhttp://vtun.sourceforge.net”h]”hŒhttp://vtun.sourceforge.net”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÁ uh1j‚hj· ubhŒ).”…”�”}”(hj· h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Kþhjïh²hubjq)�”}”(hŒ»Another 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 (”…”�”}”(hjØ h²hh³Nh´Nubjƒ)�”}”(hŒ%http://perso.enst.fr/~beyssac/pipsec/”h]”hŒ%http://perso.enst.fr/~beyssac/pipsec/”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jâ uh1j‚hjØ ubhŒ\), a userspace IPSec implementation that can use complete kernel routing (unlike FreeS/WAN).”…”�”}”(hjØ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Mhjïh²hubj )�”}”(hhh]”j )�”}”(hŒ0How does Virtual network device actually work ? ”h]”jq)�”}”(hŒ/How does Virtual network device actually work ?”h]”hŒ/How does Virtual network device actually work ?”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Mhjü ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjù h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j% j& j' hj( j) j¶ Kuh1j hjïh²hh³hÇh´Mubjq)�”}”(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 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Mhjïh²hubjq)�”}”(hX¬Let'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]”hX®Let’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( h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´M hjïh²hubj )�”}”(hhh]”j )�”}”(hŒ:What is the difference between TUN driver and TAP driver? ”h]”jq)�”}”(hŒ9What is the difference between TUN driver and TAP driver?”h]”hŒ9What is the difference between TUN driver and TAP driver?”…”�”}”(hj= h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Mhj9 ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj6 h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j% j& j' hj( j) j¶ Kuh1j hjïh²hh³hÇh´Mubjq)�”}”(hŒ9TUN works with IP frames. TAP works with Ethernet frames.”h]”hŒ9TUN works with IP frames. TAP works with Ethernet frames.”…”�”}”(hjW h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Mhjïh²hubjq)�”}”(hŒlThis means that you have to read/write IP packets when you are using tun and ethernet frames when using tap.”h]”hŒlThis means that you have to read/write IP packets when you are using tun and ethernet frames when using tap.”…”�”}”(hje h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Mhjïh²hubj )�”}”(hhh]”j )�”}”(hŒ7What is the difference between BPF and TUN/TAP driver? ”h]”jq)�”}”(hŒ6What is the difference between BPF and TUN/TAP driver?”h]”hŒ6What is the difference between BPF and TUN/TAP driver?”…”�”}”(hjz h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Mhjv ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjs h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j% j& j' hj( j) j¶ Kuh1j hjïh²hh³hÇh´Mubjq)�”}”(hŒòBPF 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]”hŒòBPF 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” h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´Mhjïh²hubj )�”}”(hhh]”j )�”}”(hŒ2Does TAP driver support kernel Ethernet bridging? ”h]”jq)�”}”(hŒ1Does TAP driver support kernel Ethernet bridging?”h]”hŒ1Does TAP driver support kernel Ethernet bridging?”…”�”}”(hj© h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´M!hj¥ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¢ h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j% j& j' hj( j) j¶ Kuh1j hjïh²hh³hÇh´M!ubjq)�”}”(hŒ9Yes. Linux and FreeBSD drivers support Ethernet bridging.”h]”hŒ9Yes. Linux and FreeBSD drivers support Ethernet bridging.”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jph³hÇh´M#hjïh²hubeh}”(h]”Œ9universal-tun-tap-device-driver-frequently-asked-question”ah ]”h"]”Œ9universal tun/tap device driver frequently asked question”ah$]”h&]”uh1j[hj]h²hh³hÇh´Kòubeh}”(h]”Œuniversal-tun-tap-device-driver”ah ]”h"]”Œuniversal tun/tap device driver”ah$]”h&]”uh1j[hhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(j`NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”(hóhçjhöjjj jj/j#j>j2jMjAj\jPjkj_jzjnj‰j}j˜jŒj§j›j¶jªjÅj¹jÔjÈjãj×jòjæjjõjjjjj.j"j=j1jLj@j[jOjjj^jyjmjˆj|j—j‹j¦jšjµj©jÄj¸jÓjÇjâjÖjñjåjjôjjjjj-j!j<j0jKj?jZjNjij]jxjlj‡j{j–jŠj¥j™j´j¨jÃj·jÒjÆjájÕjðjäjÿjójjjjj,j j;j/jJj>jYjMjhj\jwjkj†jzj•j‰j¤j˜j³j§jÂj¶jÑjÅjàjÔjïjãjþjòj jjjj+jj:j.jIj=jXjLuŒsubstitution_names”}”(Œamp”hóŒapos”jŒast”jŒbrvbar”j Œbsol”j/Œcent”j>Œcolon”jMŒcomma”j\Œcommat”jkŒcopy”jzŒcurren”j‰Œdarr”j˜Œdeg”j§Œdivide”j¶Œdollar”jÅŒequals”jÔŒexcl”jãŒfrac12”jòŒfrac14”jŒfrac18”jŒfrac34”jŒfrac38”j.Œfrac58”j=Œfrac78”jLŒgt”j[Œhalf”jjŒhorbar”jyŒhyphen”jˆŒiexcl”j—Œiquest”j¦Œlaquo”jµŒlarr”jÄŒlcub”jÓŒldquo”jâŒlowbar”jñŒlpar”jŒlsqb”jŒlsquo”jŒlt”j-Œmicro”j<Œmiddot”jKŒnbsp”jZŒnot”jiŒnum”jxŒohm”j‡Œordf”j–Œordm”j¥Œpara”j´Œpercnt”jÃŒperiod”jÒŒplus”jáŒplusmn”jðŒpound”jÿŒquest”jŒquot”jŒraquo”j,Œrarr”j;Œrcub”jJŒrdquo”jYŒreg”jhŒrpar”jwŒrsqb”j†Œrsquo”j•Œsect”j¤Œsemi”j³Œshy”jÂŒsol”jÑŒsung”jàŒsup1”jïŒsup2”jþŒsup3”j Œtimes”jŒtrade”j+Œuarr”j:Œverbar”jIŒyen”jXuŒrefnames”}”Œrefids”}”Œnameids”}”(jÞ jÛ jžj›jqjnjìjéjÇjÄjüjùjwjtjäjájÖ jÓ uŒ nametypes”}”(jÞ ‰jž‰jq‰jì‰jljjü‰jw‰jä‰jÖ ‰uh}”(jÛ j]j›j jnj¡jéjtjÄj…jùjÊjtjÿjájzjÓ jïuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”(hŒsystem_message”“”)�”}”(hhh]”jq)�”}”(hŒ:Enumerated list start value not ordinal-1: "2" (ordinal 2)”h]”hŒ>Enumerated list start value not ordinal-1: “2â€� (ordinal 2)”…”�”}”(hj· h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jphj´ ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÇŒline”Kuh1j² hjïh²hh³hÇh´Küubj³ )�”}”(hhh]”jq)�”}”(hŒ:Enumerated list start value not ordinal-1: "3" (ordinal 3)”h]”hŒ>Enumerated list start value not ordinal-1: “3â€� (ordinal 3)”…”�”}”(hjÓ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jphjÐ ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÍ Œsource”hÇŒline”Kuh1j² hjïh²hh³hÇh´Mubj³ )�”}”(hhh]”jq)�”}”(hŒ:Enumerated list start value not ordinal-1: "4" (ordinal 4)”h]”hŒ>Enumerated list start value not ordinal-1: “4â€� (ordinal 4)”…”�”}”(hjî h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jphjë ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÍ Œsource”hÇŒline”Kuh1j² hjïh²hh³hÇh´Mubj³ )�”}”(hhh]”jq)�”}”(hŒ:Enumerated list start value not ordinal-1: "5" (ordinal 5)”h]”hŒ>Enumerated list start value not ordinal-1: “5â€� (ordinal 5)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jphj ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÍ Œsource”hÇŒline”Kuh1j² hjïh²hh³hÇh´Mubj³ )�”}”(hhh]”jq)�”}”(hŒ:Enumerated list start value not ordinal-1: "6" (ordinal 6)”h]”hŒ>Enumerated list start value not ordinal-1: “6â€� (ordinal 6)”…”�”}”(hj$ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jphj! ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jÍ Œsource”hÇŒline”Kuh1j² hjïh²hh³hÇh´M!ubeŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ#Documentation/networking/tuntap.rst”(NNNNt”†”aŒ decoration”Nh²hub.