€•{Œ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/nf_flowtable”Œ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/nf_flowtable”Œ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/nf_flowtable”Œ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/nf_flowtable”Œ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/nf_flowtable”Œ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/nf_flowtable”Œ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/nf_flowtable”Œ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³ŒE/var/lib/git/docbuild/linux/Documentation/networking/nf_flowtable.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ$Netfilter's flowtable infrastructure”h]”hŒ&Netfilter’s flowtable infrastructure”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)”}”(hX!This documentation describes the Netfilter flowtable infrastructure which allows you to define a fastpath through the flowtable datapath. This infrastructure also provides hardware offload support. The flowtable supports for the layer 3 IPv4 and IPv6 and the layer 4 TCP and UDP protocols.”h]”hX!This documentation describes the Netfilter flowtable infrastructure which allows you to define a fastpath through the flowtable datapath. This infrastructure also provides hardware offload support. The flowtable supports for the layer 3 IPv4 and IPv6 and the layer 4 TCP and UDP protocols.”…””}”(hhßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒOverview”h]”hŒOverview”…””}”(hhðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhíh²hh³hÇh´K ubhÞ)”}”(hX.Once the first packet of the flow successfully goes through the IP forwarding path, from the second packet on, you might decide to offload the flow to the flowtable through your ruleset. The flowtable infrastructure provides a rule action that allows you to specify when to add a flow to the flowtable.”h]”hX.Once the first packet of the flow successfully goes through the IP forwarding path, from the second packet on, you might decide to offload the flow to the flowtable through your ruleset. The flowtable infrastructure provides a rule action that allows you to specify when to add a flow to the flowtable.”…””}”(hhþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhíh²hubhÞ)”}”(hX©A packet that finds a matching entry in the flowtable (ie. flowtable hit) is transmitted to the output netdevice via neigh_xmit(), hence, packets bypass the classic IP forwarding path (the visible effect is that you do not see these packets from any of the Netfilter hooks coming after ingress). In case that there is no matching entry in the flowtable (ie. flowtable miss), the packet follows the classic IP forwarding path.”h]”hX©A packet that finds a matching entry in the flowtable (ie. flowtable hit) is transmitted to the output netdevice via neigh_xmit(), hence, packets bypass the classic IP forwarding path (the visible effect is that you do not see these packets from any of the Netfilter hooks coming after ingress). In case that there is no matching entry in the flowtable (ie. flowtable miss), the packet follows the classic IP forwarding path.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhíh²hubhÞ)”}”(hX*The flowtable uses a resizable hashtable. Lookups are based on the following n-tuple selectors: layer 2 protocol encapsulation (VLAN and PPPoE), layer 3 source and destination, layer 4 source and destination ports and the input interface (useful in case there are several conntrack zones in place).”h]”hX*The flowtable uses a resizable hashtable. Lookups are based on the following n-tuple selectors: layer 2 protocol encapsulation (VLAN and PPPoE), layer 3 source and destination, layer 4 source and destination ports and the input interface (useful in case there are several conntrack zones in place).”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhíh²hubhÞ)”}”(hXThe 'flow add' action allows you to populate the flowtable, the user selectively specifies what flows are placed into the flowtable. Hence, packets follow the classic IP forwarding path unless the user explicitly instruct flows to use this new alternative forwarding path via policy.”h]”hXThe ‘flow add’ action allows you to populate the flowtable, the user selectively specifies what flows are placed into the flowtable. Hence, packets follow the classic IP forwarding path unless the user explicitly instruct flows to use this new alternative forwarding path via policy.”…””}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hhíh²hubhÞ)”}”(hŒŸThe flowtable datapath is represented in Fig.1, which describes the classic IP forwarding path including the Netfilter hooks and the flowtable fastpath bypass.”h]”hŒŸThe flowtable datapath is represented in Fig.1, which describes the classic IP forwarding path including the Netfilter hooks and the flowtable fastpath bypass.”…””}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K%hhíh²hubhŒ literal_block”“”)”}”(hXp userspace process ^ | | | _____|____ ____\/___ / \ / \ | input | | output | \__________/ \_________/ ^ | | | _________ __________ --------- _____\/_____ / \ / \ |Routing | / \ --> ingress ---> prerouting ---> |decision| | postrouting |--> neigh_xmit \_________/ \__________/ ---------- \____________/ ^ | ^ | ^ | flowtable | ____\/___ | | | | / \ | | __\/___ | | forward |------------ | |-----| | \_________/ | |-----| | 'flow offload' rule | |-----| | adds entry to | |_____| | flowtable | | | | / \ | | /hit\_no_| | \ ? / | \ / | |__yes_________________fastpath bypass ____________________________| Fig.1 Netfilter hooks and flowtable interactions”h]”hXp userspace process ^ | | | _____|____ ____\/___ / \ / \ | input | | output | \__________/ \_________/ ^ | | | _________ __________ --------- _____\/_____ / \ / \ |Routing | / \ --> ingress ---> prerouting ---> |decision| | postrouting |--> neigh_xmit \_________/ \__________/ ---------- \____________/ ^ | ^ | ^ | flowtable | ____\/___ | | | | / \ | | __\/___ | | forward |------------ | |-----| | \_________/ | |-----| | 'flow offload' rule | |-----| | adds entry to | |_____| | flowtable | | | | / \ | | /hit\_no_| | \ ? / | \ / | |__yes_________________fastpath bypass ____________________________| Fig.1 Netfilter hooks and flowtable interactions”…””}”hjFsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jDh³hÇh´K*hhíh²hubhÞ)”}”(hXnThe flowtable entry also stores the NAT configuration, so all packets are mangled according to the NAT policy that is specified from the classic IP forwarding path. The TTL is decremented before calling neigh_xmit(). Fragmented traffic is passed up to follow the classic IP forwarding path given that the transport header is missing, in this case, flowtable lookups are not possible. TCP RST and FIN packets are also passed up to the classic IP forwarding path to release the flow gracefully. Packets that exceed the MTU are also passed up to the classic forwarding path to report packet-too-big ICMP errors to the sender.”h]”hXnThe flowtable entry also stores the NAT configuration, so all packets are mangled according to the NAT policy that is specified from the classic IP forwarding path. The TTL is decremented before calling neigh_xmit(). Fragmented traffic is passed up to follow the classic IP forwarding path given that the transport header is missing, in this case, flowtable lookups are not possible. TCP RST and FIN packets are also passed up to the classic IP forwarding path to release the flow gracefully. Packets that exceed the MTU are also passed up to the classic forwarding path to report packet-too-big ICMP errors to the sender.”…””}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KHhhíh²hubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)”}”(hhh]”(hÎ)”}”(hŒExample configuration”h]”hŒExample configuration”…””}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjjh²hh³hÇh´KRubhÞ)”}”(hŒ~Enabling the flowtable bypass is relatively easy, you only need to create a flowtable and add one rule to your forward chain::”h]”hŒ}Enabling the flowtable bypass is relatively easy, you only need to create a flowtable and add one rule to your forward chain:”…””}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KThjjh²hubjE)”}”(hX)table inet x { flowtable f { hook ingress priority 0; devices = { eth0, eth1 }; } chain y { type filter hook forward priority 0; policy accept; ip protocol tcp flow add @f counter packets 0 bytes 0 } }”h]”hX)table inet x { flowtable f { hook ingress priority 0; devices = { eth0, eth1 }; } chain y { type filter hook forward priority 0; policy accept; ip protocol tcp flow add @f counter packets 0 bytes 0 } }”…””}”hj‰sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jDh³hÇh´KWhjjh²hubhÞ)”}”(hXÎThis example adds the flowtable 'f' to the ingress hook of the eth0 and eth1 netdevices. You can create as many flowtables as you want in case you need to perform resource partitioning. The flowtable priority defines the order in which hooks are run in the pipeline, this is convenient in case you already have a nftables ingress chain (make sure the flowtable priority is smaller than the nftables ingress chain hence the flowtable runs before in the pipeline).”h]”hXÒThis example adds the flowtable ‘f’ to the ingress hook of the eth0 and eth1 netdevices. You can create as many flowtables as you want in case you need to perform resource partitioning. The flowtable priority defines the order in which hooks are run in the pipeline, this is convenient in case you already have a nftables ingress chain (make sure the flowtable priority is smaller than the nftables ingress chain hence the flowtable runs before in the pipeline).”…””}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kbhjjh²hubhÞ)”}”(hXBThe 'flow offload' action from the forward chain 'y' adds an entry to the flowtable for the TCP syn-ack packet coming in the reply direction. Once the flow is offloaded, you will observe that the counter rule in the example above does not get updated for the packets that are being forwarded through the forwarding bypass.”h]”hXJThe ‘flow offload’ action from the forward chain ‘y’ adds an entry to the flowtable for the TCP syn-ack packet coming in the reply direction. Once the flow is offloaded, you will observe that the counter rule in the example above does not get updated for the packets that are being forwarded through the forwarding bypass.”…””}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kihjjh²hubhÞ)”}”(hŒgYou can identify offloaded flows through the [OFFLOAD] tag when listing your connection tracking table.”h]”hŒgYou can identify offloaded flows through the [OFFLOAD] tag when listing your connection tracking table.”…””}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kohjjh²hubjE)”}”(hŒ¡# conntrack -L tcp 6 src=10.141.10.2 dst=192.168.10.2 sport=52728 dport=5201 src=192.168.10.2 dst=192.168.10.1 sport=5201 dport=52728 [OFFLOAD] mark=0 use=2”h]”hŒ¡# conntrack -L tcp 6 src=10.141.10.2 dst=192.168.10.2 sport=52728 dport=5201 src=192.168.10.2 dst=192.168.10.1 sport=5201 dport=52728 [OFFLOAD] mark=0 use=2”…””}”hjÁsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jDh³hÇh´Kthjjh²hubeh}”(h]”Œexample-configuration”ah ]”h"]”Œexample configuration”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KRubhÉ)”}”(hhh]”(hÎ)”}”(hŒLayer 2 encapsulation”h]”hŒLayer 2 encapsulation”…””}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj×h²hh³hÇh´KyubhÞ)”}”(hXbSince Linux kernel 5.13, the flowtable infrastructure discovers the real netdevice behind VLAN and PPPoE netdevices. The flowtable software datapath parses the VLAN and PPPoE layer 2 headers to extract the ethertype and the VLAN ID / PPPoE session ID which are used for the flowtable lookups. The flowtable datapath also deals with layer 2 decapsulation.”h]”hXbSince Linux kernel 5.13, the flowtable infrastructure discovers the real netdevice behind VLAN and PPPoE netdevices. The flowtable software datapath parses the VLAN and PPPoE layer 2 headers to extract the ethertype and the VLAN ID / PPPoE session ID which are used for the flowtable lookups. The flowtable datapath also deals with layer 2 decapsulation.”…””}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K{hj×h²hubhÞ)”}”(hŒ•You do not need to add the PPPoE and the VLAN devices to your flowtable, instead the real device is sufficient for the flowtable to track your flows.”h]”hŒ•You do not need to add the PPPoE and the VLAN devices to your flowtable, instead the real device is sufficient for the flowtable to track your flows.”…””}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj×h²hubeh}”(h]”Œlayer-2-encapsulation”ah ]”h"]”Œlayer 2 encapsulation”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KyubhÉ)”}”(hhh]”(hÎ)”}”(hŒBridge and IP forwarding”h]”hŒBridge and IP forwarding”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj h²hh³hÇh´K…ubhÞ)”}”(hX_Since Linux kernel 5.13, you can add bridge ports to the flowtable. The flowtable infrastructure discovers the topology behind the bridge device. This allows the flowtable to define a fastpath bypass between the bridge ports (represented as eth1 and eth2 in the example figure below) and the gateway device (represented as eth0) in your switch/router.”h]”hX_Since Linux kernel 5.13, you can add bridge ports to the flowtable. The flowtable infrastructure discovers the topology behind the bridge device. This allows the flowtable to define a fastpath bypass between the bridge ports (represented as eth1 and eth2 in the example figure below) and the gateway device (represented as eth0) in your switch/router.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‡hj h²hubjE)”}”(hX6 fastpath bypass .-------------------------. / \ | IP forwarding | | / \ \/ | br0 eth0 ..... eth0 . / \ *host B* -> eth1 eth2 . *switch/router* . . eth0 *host A*”h]”hX6 fastpath bypass .-------------------------. / \ | IP forwarding | | / \ \/ | br0 eth0 ..... eth0 . / \ *host B* -> eth1 eth2 . *switch/router* . . eth0 *host A*”…””}”hj+sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jDh³hÇh´Khj h²hubhÞ)”}”(hŒ¬The flowtable infrastructure also supports for bridge VLAN filtering actions such as PVID and untagged. You can also stack a classic VLAN device on top of your bridge port.”h]”hŒ¬The flowtable infrastructure also supports for bridge VLAN filtering actions such as PVID and untagged. You can also stack a classic VLAN device on top of your bridge port.”…””}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj h²hubhÞ)”}”(hŒÖIf you would like that your flowtable defines a fastpath between your bridge ports and your IP forwarding path, you have to add your bridge ports (as represented by the real netdevice) to your flowtable definition.”h]”hŒÖIf you would like that your flowtable defines a fastpath between your bridge ports and your IP forwarding path, you have to add your bridge ports (as represented by the real netdevice) to your flowtable definition.”…””}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¡hj h²hubeh}”(h]”Œbridge-and-ip-forwarding”ah ]”h"]”Œbridge and ip forwarding”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K…ubhÉ)”}”(hhh]”(hÎ)”}”(hŒCounters”h]”hŒCounters”…””}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj]h²hh³hÇh´K¦ubhÞ)”}”(hŒ©The flowtable can synchronize packet and byte counters with the existing connection tracking entry by specifying the counter statement in your flowtable definition, e.g.”h]”hŒ©The flowtable can synchronize packet and byte counters with the existing connection tracking entry by specifying the counter statement in your flowtable definition, e.g.”…””}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¨hj]h²hubjE)”}”(hŒ‹table inet x { flowtable f { hook ingress priority 0; devices = { eth0, eth1 }; counter } }”h]”hŒ‹table inet x { flowtable f { hook ingress priority 0; devices = { eth0, eth1 }; counter } }”…””}”hj|sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jDh³hÇh´K®hj]h²hubhÞ)”}”(hŒ4Counter support is available since Linux kernel 5.7.”h]”hŒ4Counter support is available since Linux kernel 5.7.”…””}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kµhj]h²hubeh}”(h]”Œcounters”ah ]”h"]”Œcounters”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K¦ubhÉ)”}”(hhh]”(hÎ)”}”(hŒHardware offload”h]”hŒHardware offload”…””}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj h²hh³hÇh´K¸ubhÞ)”}”(hŒŽIf your network device provides hardware offload support, you can turn it on by means of the 'offload' flag in your flowtable definition, e.g.”h]”hŒ’If your network device provides hardware offload support, you can turn it on by means of the ‘offload’ flag in your flowtable definition, e.g.”…””}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kºhj h²hubjE)”}”(hŒ’table inet x { flowtable f { hook ingress priority 0; devices = { eth0, eth1 }; flags offload; } }”h]”hŒ’table inet x { flowtable f { hook ingress priority 0; devices = { eth0, eth1 }; flags offload; } }”…””}”hj¿sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jDh³hÇh´K¿hj h²hubhÞ)”}”(hŒÎThere is a workqueue that adds the flows to the hardware. Note that a few packets might still run over the flowtable software path until the workqueue has a chance to offload the flow to the network device.”h]”hŒÎThere is a workqueue that adds the flows to the hardware. Note that a few packets might still run over the flowtable software path until the workqueue has a chance to offload the flow to the network device.”…””}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÆhj h²hubhÞ)”}”(hXoYou can identify hardware offloaded flows through the [HW_OFFLOAD] tag when listing your connection tracking table. Please, note that the [OFFLOAD] tag refers to the software offload mode, so there is a distinction between [OFFLOAD] which refers to the software flowtable fastpath and [HW_OFFLOAD] which refers to the hardware offload datapath being used by the flow.”h]”hXoYou can identify hardware offloaded flows through the [HW_OFFLOAD] tag when listing your connection tracking table. Please, note that the [OFFLOAD] tag refers to the software offload mode, so there is a distinction between [OFFLOAD] which refers to the software flowtable fastpath and [HW_OFFLOAD] which refers to the hardware offload datapath being used by the flow.”…””}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÊhj h²hubhÞ)”}”(hŒjThe flowtable hardware offload infrastructure also supports for the DSA (Distributed Switch Architecture).”h]”hŒjThe flowtable hardware offload infrastructure also supports for the DSA (Distributed Switch Architecture).”…””}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÐhj h²hubeh}”(h]”Œhardware-offload”ah ]”h"]”Œhardware offload”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K¸ubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Limitations”h]”hŒ Limitations”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÿh²hh³hÇh´KÔubhÞ)”}”(hŒ®The flowtable behaves like a cache. The flowtable entries might get stale if either the destination MAC address or the egress netdevice that is used for transmission changes.”h]”hŒ®The flowtable behaves like a cache. The flowtable entries might get stale if either the destination MAC address or the egress netdevice that is used for transmission changes.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÖhjÿh²hubhÞ)”}”(hŒThis might be a problem if:”h]”hŒThis might be a problem if:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÚhjÿh²hubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ^You run the flowtable in software mode and you combine bridge and IP forwarding in your setup.”h]”hÞ)”}”(hŒ^You run the flowtable in software mode and you combine bridge and IP forwarding in your setup.”h]”hŒ^You run the flowtable in software mode and you combine bridge and IP forwarding in your setup.”…””}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÜhj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj.h²hh³hÇh´Nubj2)”}”(hŒHardware offload is enabled. ”h]”hÞ)”}”(hŒHardware offload is enabled.”h]”hŒHardware offload is enabled.”…””}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÞhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hj.h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j,h³hÇh´KÜhjÿh²hubeh}”(h]”Œ limitations”ah ]”h"]”Œ limitations”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KÔubhÉ)”}”(hhh]”(hÎ)”}”(hŒ More reading”h]”hŒ More reading”…””}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjsh²hh³hÇh´KáubhÞ)”}”(hX,This documentation is based on the LWN.net articles [1]_\ [2]_. Rafal Milecki also made a very complete and comprehensive summary called "A state of network acceleration" that describes how things were before this infrastructure was mainlined [3]_ and it also makes a rough summary of this work [4]_.”h]”(hŒ4This documentation is based on the LWN.net articles ”…””}”(hj„h²hh³Nh´NubhŒfootnote_reference”“”)”}”(hŒ[1]_”h]”hŒ1”…””}”(hjŽh²hh³Nh´Nubah}”(h]”Œid1”ah ]”h"]”h$]”h&]”Œrefid”Œid5”Œdocname”Œnetworking/nf_flowtable”uh1jŒhj„Œresolved”KubhŒ ”…””}”(hj„h²hh³Nh´Nubj)”}”(hŒ[2]_”h]”hŒ2”…””}”(hj¦h²hh³Nh´Nubah}”(h]”Œid2”ah ]”h"]”h$]”h&]”jŒid6”jŸj uh1jŒhj„j¡KubhŒ¹. Rafal Milecki also made a very complete and comprehensive summary called “A state of network acceleration†that describes how things were before this infrastructure was mainlined ”…””}”(hj„h²hh³Nh´Nubj)”}”(hŒ[3]_”h]”hŒ3”…””}”(hjºh²hh³Nh´Nubah}”(h]”Œid3”ah ]”h"]”h$]”h&]”jŒid7”jŸj uh1jŒhj„j¡KubhŒ0 and it also makes a rough summary of this work ”…””}”(hj„h²hh³Nh´Nubj)”}”(hŒ[4]_”h]”hŒ4”…””}”(hjÎh²hh³Nh´Nubah}”(h]”Œid4”ah ]”h"]”h$]”h&]”jŒid8”jŸj uh1jŒhj„j¡KubhŒ.”…””}”(hj„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kãhjsh²hubhŒfootnote”“”)”}”(hŒ https://lwn.net/Articles/738214/”h]”(hŒlabel”“”)”}”(hŒ1”h]”hŒ1”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jîhjêubhÞ)”}”(hjìh]”hŒ reference”“”)”}”(hjìh]”hŒ https://lwn.net/Articles/738214/”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jìuh1jhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kèhjêubeh}”(h]”jžah ]”h"]”Œ1”ah$]”h&]”j˜ajŸj uh1jèh³hÇh´Kèhjsh²hj¡Kubjé)”}”(hŒ https://lwn.net/Articles/742164/”h]”(jï)”}”(hŒ2”h]”hŒ2”…””}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jîhjubhÞ)”}”(hj h]”j)”}”(hj h]”hŒ https://lwn.net/Articles/742164/”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j uh1jhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kéhjubeh}”(h]”jµah ]”h"]”Œ2”ah$]”h&]”j°ajŸj uh1jèh³hÇh´Kéhjsh²hj¡Kubjé)”}”(hŒFhttp://lists.infradead.org/pipermail/lede-dev/2018-January/010830.html”h]”(jï)”}”(hŒ3”h]”hŒ3”…””}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jîhjNubhÞ)”}”(hjPh]”j)”}”(hjPh]”hŒFhttp://lists.infradead.org/pipermail/lede-dev/2018-January/010830.html”…””}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jPuh1jhj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KêhjNubeh}”(h]”jÉah ]”h"]”Œ3”ah$]”h&]”jÄajŸj uh1jèh³hÇh´Kêhjsh²hj¡Kubjé)”}”(hŒFhttp://lists.infradead.org/pipermail/lede-dev/2018-January/010829.html”h]”(jï)”}”(hŒ4”h]”hŒ4”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jîhj~ubhÞ)”}”(hj€h]”j)”}”(hj€h]”hŒFhttp://lists.infradead.org/pipermail/lede-dev/2018-January/010829.html”…””}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j€uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Këhj~ubeh}”(h]”jÝah ]”h"]”Œ4”ah$]”h&]”jØajŸj uh1jèh³hÇh´Këhjsh²hj¡Kubeh}”(h]”Œ more-reading”ah ]”h"]”Œ more reading”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´Káubeh}”(h]”Œ$netfilter-s-flowtable-infrastructure”ah ]”h"]”Œ$netfilter's flowtable infrastructure”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍ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”}”Œsubstitution_names”}”Œrefnames”}”(Œ1”]”jŽaŒ2”]”j¦aŒ3”]”jºaŒ4”]”jÎauŒrefids”}”Œnameids”}”(j»j¸jgjdjÔjÑj jjZjWjjšjüjùjpjmj³j°jjžjKjµj{jÉj«jÝuŒ nametypes”}”(j»‰jg‰jÔ‰j ‰jZ‰j‰jü‰jp‰j³‰jˆjKˆj{ˆj«ˆuh}”(j¸hÊjdhíjÑjjjj×jWj jšj]jùj jmjÿj°jsj˜jŽj°j¦jÄjºjØjÎjžjêjµjjÉjNjÝj~uŒ footnote_refs”}”(j!]”jŽaj#]”j¦aj%]”jºaj']”jÎauŒ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”(jêjjNj~eŒ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”jïKs…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.