18e925890SGleb Smirnoff.\" $OpenBSD: carp.4,v 1.16 2004/12/07 23:41:35 jmc Exp $ 28e925890SGleb Smirnoff.\" 38e925890SGleb Smirnoff.\" Copyright (c) 2003, Ryan McBride. All rights reserved. 408b68b0eSGleb Smirnoff.\" Copyright (c) 2011, Gleb Smirnoff <glebius@FreeBSD.org> 58e925890SGleb Smirnoff.\" 68e925890SGleb Smirnoff.\" Redistribution and use in source and binary forms, with or without 78e925890SGleb Smirnoff.\" modification, are permitted provided that the following conditions 88e925890SGleb Smirnoff.\" are met: 98e925890SGleb Smirnoff.\" 1. Redistributions of source code must retain the above copyright 108e925890SGleb Smirnoff.\" notice, this list of conditions and the following disclaimer. 118e925890SGleb Smirnoff.\" 2. Redistributions in binary form must reproduce the above copyright 128e925890SGleb Smirnoff.\" notice, this list of conditions and the following disclaimer in the 138e925890SGleb Smirnoff.\" documentation and/or other materials provided with the distribution. 148e925890SGleb Smirnoff.\" 158e925890SGleb Smirnoff.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 168e925890SGleb Smirnoff.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 178e925890SGleb Smirnoff.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 188e925890SGleb Smirnoff.\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 198e925890SGleb Smirnoff.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 208e925890SGleb Smirnoff.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 218e925890SGleb Smirnoff.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 228e925890SGleb Smirnoff.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 238e925890SGleb Smirnoff.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 248e925890SGleb Smirnoff.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 258e925890SGleb Smirnoff.\" SUCH DAMAGE. 268e925890SGleb Smirnoff.\" 278e925890SGleb Smirnoff.\" $FreeBSD$ 288e925890SGleb Smirnoff.\" 290d3d234cSKristof Provost.Dd July 1, 2018 308e925890SGleb Smirnoff.Dt CARP 4 318e925890SGleb Smirnoff.Os 328e925890SGleb Smirnoff.Sh NAME 338e925890SGleb Smirnoff.Nm carp 348e925890SGleb Smirnoff.Nd Common Address Redundancy Protocol 358e925890SGleb Smirnoff.Sh SYNOPSIS 368e925890SGleb Smirnoff.Cd "device carp" 378e925890SGleb Smirnoff.Sh DESCRIPTION 3808b68b0eSGleb SmirnoffThe CARP allows multiple hosts on the same local network to share a set of 3908b68b0eSGleb SmirnoffIPv4 and/or IPv6 addresses. 408e925890SGleb SmirnoffIts primary purpose is to ensure that these 4108b68b0eSGleb Smirnoffaddresses are always available. 428e925890SGleb Smirnoff.Pp 438e925890SGleb SmirnoffTo use 448e925890SGleb Smirnoff.Nm , 4584e3b10bSBenjamin Kadukthe administrator needs to configure at a minimum a common virtual host ID 4684e3b10bSBenjamin Kaduk(vhid), and attach at least one IP address to this vhid on each machine which 4708b68b0eSGleb Smirnoffis to take part in the virtual group. 4808b68b0eSGleb SmirnoffAdditional parameters can also be set on a per-vhid basis: 498e925890SGleb Smirnoff.Cm advbase 508e925890SGleb Smirnoffand 518e925890SGleb Smirnoff.Cm advskew , 528e925890SGleb Smirnoffwhich are used to control how frequently the host sends advertisements when it 538e925890SGleb Smirnoffis the master for a virtual host, and 548e925890SGleb Smirnoff.Cm pass 553e630869SGleb Smirnoffwhich is used to authenticate 563e630869SGleb Smirnoff.Nm 573e630869SGleb Smirnoffadvertisements. 58762ce3e6SGleb SmirnoffThe 59762ce3e6SGleb Smirnoff.Cm advbase 60762ce3e6SGleb Smirnoffparameter stands for 61a4be0b3cSRuslan Ermilov.Dq "advertisement base" . 621a1fa3bdSGiorgos KeramidasIt is measured in seconds and specifies the base of the advertisement interval. 63762ce3e6SGleb SmirnoffThe 64762ce3e6SGleb Smirnoff.Cm advskew 65762ce3e6SGleb Smirnoffparameter stands for 66a4be0b3cSRuslan Ermilov.Dq "advertisement skew" . 67762ce3e6SGleb SmirnoffIt is measured in 1/256 of seconds. 68762ce3e6SGleb SmirnoffIt is added to the base advertisement interval to make one host advertise 69762ce3e6SGleb Smirnoffa bit slower that the other does. 70762ce3e6SGleb SmirnoffBoth 71762ce3e6SGleb Smirnoff.Cm advbase 72762ce3e6SGleb Smirnoffand 73762ce3e6SGleb Smirnoff.Cm advskew 74a4be0b3cSRuslan Ermilovare put inside CARP advertisements. 7584e3b10bSBenjamin KadukThese values can be configured using 768e925890SGleb Smirnoff.Xr ifconfig 8 , 778e925890SGleb Smirnoffor through the 788e925890SGleb Smirnoff.Dv SIOCSVH 793e630869SGleb Smirnoff.Xr ioctl 2 . 808e925890SGleb Smirnoff.Pp 8184e3b10bSBenjamin KadukCARP virtual hosts can be configured on multicast-capable interfaces: Ethernet, 8208b68b0eSGleb Smirnofflayer 2 VLAN, FDDI and Token Ring. 8308b68b0eSGleb SmirnoffAn arbitrary number of virtual host IDs can be configured on an interface. 8408b68b0eSGleb SmirnoffAn arbitrary number of IPv4 or IPv6 addresses can be attached to a particular 8508b68b0eSGleb Smirnoffvhid. 8608b68b0eSGleb SmirnoffIt is important that all hosts participating in a vhid have the same list 876dd9dfc4SKristof Provostof prefixes configured on the vhid, since all the prefixes are included in the 8808b68b0eSGleb Smirnoffcryptographic checksum supplied in each advertisement. 8908b68b0eSGleb SmirnoffMultiple vhids running on one interface participate in master/backup 9008b68b0eSGleb Smirnoffelections independently. 9108b68b0eSGleb Smirnoff.Pp 928e925890SGleb SmirnoffAdditionally, there are a number of global parameters which can be set using 938e925890SGleb Smirnoff.Xr sysctl 8 : 9484e3b10bSBenjamin Kaduk.Bl -tag -width ".Va net.inet.carp.ifdown_demotion_factor" 953e630869SGleb Smirnoff.It Va net.inet.carp.allow 96167a3440SAlexander MotinAllow 978e925890SGleb Smirnoff.Nm 98167a3440SAlexander Motinoperation. 99167a3440SAlexander MotinWhen disabled, virtual hosts remain in initial state, neither sending nor 100167a3440SAlexander Motinreceiving announcements or traffic. 1018e925890SGleb SmirnoffEnabled by default. 1023e630869SGleb Smirnoff.It Va net.inet.carp.preempt 1038e925890SGleb SmirnoffAllow virtual hosts to preempt each other. 104a1ae564eSGleb SmirnoffWhen enabled, a vhid in a backup state would preempt a master that 105a1ae564eSGleb Smirnoffis announcing itself with a lower advskew. 1068e925890SGleb SmirnoffDisabled by default. 1070d3d234cSKristof Provost.It Va net.inet.carp.dscp 1080d3d234cSKristof ProvostDSCP value in carp packet. 1090d3d234cSKristof ProvostValid Values are 0 to 63. 1100d3d234cSKristof ProvostA value of 4 is equivalent to the old standard of TOS LOW_DELAY. 1110d3d234cSKristof ProvostTOS values were deprecated and replaced by DSCP in 1998. 1120d3d234cSKristof ProvostThe default value is 56 (CS7/Network Control). 1133e630869SGleb Smirnoff.It Va net.inet.carp.log 11484e3b10bSBenjamin KadukDetermines what events relating to 11584e3b10bSBenjamin Kaduk.Nm 116e98adf39SBenjamin Kadukvhids are logged. 11784e3b10bSBenjamin KadukA value of 0 disables any logging. 11884e3b10bSBenjamin KadukA value of 1 enables logging state changes of 119442af10aSGleb Smirnoff.Nm 120a1ae564eSGleb Smirnoffvhids. 121acc0fee0SRuslan ErmilovValues above 1 enable logging of bad 122acc0fee0SRuslan Ermilov.Nm 123acc0fee0SRuslan Ermilovpackets. 12484e3b10bSBenjamin KadukThe default value is 1. 125f08535f8SGleb Smirnoff.It Va net.inet.carp.demotion 1266dd9dfc4SKristof ProvostThis value shows the current level of CARP demotion. 127f08535f8SGleb SmirnoffThe value is added to the actual advskew sent in announcements for 128f08535f8SGleb Smirnoffall vhids. 1296dd9dfc4SKristof ProvostDuring normal system operation the demotion factor is zero. 130f08535f8SGleb SmirnoffHowever, problematic conditions raise its level: when 131f08535f8SGleb Smirnoff.Nm 132f08535f8SGleb Smirnoffexperiences problem with sending announcements, when an interface 133f08535f8SGleb Smirnoffrunning a vhid goes down, or while the 1341771f872SGleb Smirnoff.Xr pfsync 4 1351771f872SGleb Smirnoffinterface is not synchronized. 1367951008bSGleb SmirnoffThe demotion factor can be adjusted writing to the sysctl oid. 1377951008bSGleb SmirnoffThe signed value supplied to the 1387951008bSGleb Smirnoff.Xr sysctl 8 1397951008bSGleb Smirnoffcommand is added to current demotion factor. 1407951008bSGleb SmirnoffThis allows to control 141f08535f8SGleb Smirnoff.Nm 1427951008bSGleb Smirnoffbehaviour depending on some external conditions, for example on the status 1437951008bSGleb Smirnoffof some daemon utility. 144f08535f8SGleb Smirnoff.It Va net.inet.carp.ifdown_demotion_factor 14584e3b10bSBenjamin KadukThis value is added to 146f08535f8SGleb Smirnoff.Va net.inet.carp.demotion 14784e3b10bSBenjamin Kadukwhen an interface running a vhid goes down. 14884e3b10bSBenjamin KadukThe default value is 240 (the maximum advskew value). 149f08535f8SGleb Smirnoff.It Va net.inet.carp.senderr_demotion_factor 15084e3b10bSBenjamin KadukThis value is added to 151f08535f8SGleb Smirnoff.Va net.inet.carp.demotion 152f08535f8SGleb Smirnoffwhen 153f08535f8SGleb Smirnoff.Nm 154f08535f8SGleb Smirnoffexperiences errors sending its announcements. 15584e3b10bSBenjamin KadukThe default value is 240 (the maximum advskew value). 1568e925890SGleb Smirnoff.El 15708b68b0eSGleb Smirnoff.\".Sh ARP level load balancing 15884e3b10bSBenjamin Kaduk.\"A 15908b68b0eSGleb Smirnoff.\".Nm 16084e3b10bSBenjamin Kaduk.\"interface has limited abilities for load balancing incoming connections 16184e3b10bSBenjamin Kaduk.\"between hosts in an Ethernet network. 16284e3b10bSBenjamin Kaduk.\"For load-balancing operation, one needs several CARP interfaces that 16308b68b0eSGleb Smirnoff.\"are configured to the same IP address, but to a different vhids. 16408b68b0eSGleb Smirnoff.\"Once an ARP request is received, the CARP protocol will use a hashing 16508b68b0eSGleb Smirnoff.\"function against the source IP address in the ARP request to determine 16684e3b10bSBenjamin Kaduk.\"which vhid the request will be assigned to. 16784e3b10bSBenjamin Kaduk.\"If the corresponding CARP interface is the current 16884e3b10bSBenjamin Kaduk.\"master interface, a reply will 16984e3b10bSBenjamin Kaduk.\"be sent to the ARP request; 17084e3b10bSBenjamin Kaduk.\"otherwise it will be ignored. 17108b68b0eSGleb Smirnoff.\"See the 17208b68b0eSGleb Smirnoff.\".Sx EXAMPLES 17308b68b0eSGleb Smirnoff.\"section for a practical example of load balancing. 17408b68b0eSGleb Smirnoff.\".Pp 17584e3b10bSBenjamin Kaduk.\"The ARP load balancing implemented in 17684e3b10bSBenjamin Kaduk.\".Nm 17784e3b10bSBenjamin Kaduk.\"has some limitations. 17808b68b0eSGleb Smirnoff.\"First, ARP balancing only works on the local network segment. 17908b68b0eSGleb Smirnoff.\"It cannot balance traffic that crosses a router, because the 18008b68b0eSGleb Smirnoff.\"router itself will always be balanced to the same virtual host. 18108b68b0eSGleb Smirnoff.\"Second, ARP load balancing can lead to asymmetric routing 18208b68b0eSGleb Smirnoff.\"of incoming and outgoing traffic, and thus combining it with 18308b68b0eSGleb Smirnoff.\".Xr pfsync 4 18408b68b0eSGleb Smirnoff.\"is dangerous, because this creates a race condition between 18508b68b0eSGleb Smirnoff.\"balanced routers and a host they are serving. 18608b68b0eSGleb Smirnoff.\"Imagine an incoming packet creating state on the first router, being 18784e3b10bSBenjamin Kaduk.\"forwarded to its destination, and the destination replying faster 18808b68b0eSGleb Smirnoff.\"than the state information is packed and synced with the second router. 18908b68b0eSGleb Smirnoff.\"If the reply would be load balanced to second router, it will be 19084e3b10bSBenjamin Kaduk.\"dropped since the second router has not yet received information about 19184e3b10bSBenjamin Kaduk.\"the connection state. 192cc8b2291SGleb Smirnoff.Sh STATE CHANGE NOTIFICATIONS 193cc8b2291SGleb SmirnoffSometimes it is useful to get notified about 194cc8b2291SGleb Smirnoff.Nm 195cc8b2291SGleb Smirnoffstatus change events. 196cc8b2291SGleb SmirnoffThis can be accomplished by using 197cc8b2291SGleb Smirnoff.Xr devd 8 198cc8b2291SGleb Smirnoffhooks. 19908b68b0eSGleb SmirnoffMaster/slave events are signalled under system 20008b68b0eSGleb Smirnoff.Dv CARP . 20184e3b10bSBenjamin KadukThe subsystem specifies the vhid and name of the interface where 20284e3b10bSBenjamin Kadukthe master/slave event occurred. 20384e3b10bSBenjamin KadukThe type of the message displays the new state of the vhid. 204cc8b2291SGleb SmirnoffPlease see 205cc8b2291SGleb Smirnoff.Xr devd.conf 5 20684e3b10bSBenjamin Kadukand the 207cc8b2291SGleb Smirnoff.Sx EXAMPLES 208cc8b2291SGleb Smirnoffsection for more information. 2098e925890SGleb Smirnoff.Sh EXAMPLES 2108e925890SGleb SmirnoffFor firewalls and routers with multiple interfaces, it is desirable to 211a1ae564eSGleb Smirnofffailover all of the addresses running 2128e925890SGleb Smirnoff.Nm 213a1ae564eSGleb Smirnofftogether, when one of the physical interfaces goes down. 21484e3b10bSBenjamin KadukThis is achieved by the use of the preempt option. 21584e3b10bSBenjamin KadukEnable it on both hosts A and B: 2168e925890SGleb Smirnoff.Pp 2173e630869SGleb Smirnoff.Dl sysctl net.inet.carp.preempt=1 2188e925890SGleb Smirnoff.Pp 21908b68b0eSGleb SmirnoffAssume that host A is the preferred master and we are running the 22008b68b0eSGleb Smirnoff192.168.1.0/24 prefix on em0 and 192.168.2.0/24 on em1. 221da4d5bb7SDmitry MorozovskyThis is the setup for host A (advskew is above 0 so it could be overwritten 222da4d5bb7SDmitry Morozovskyin the emergency situation from the other host): 2238e925890SGleb Smirnoff.Bd -literal -offset indent 224da4d5bb7SDmitry Morozovskyifconfig em0 vhid 1 advskew 100 pass mekmitasdigoat 192.168.1.1/24 225da4d5bb7SDmitry Morozovskyifconfig em1 vhid 2 advskew 100 pass mekmitasdigoat 192.168.2.1/24 2268e925890SGleb Smirnoff.Ed 2278e925890SGleb Smirnoff.Pp 2283e630869SGleb SmirnoffThe setup for host B is identical, but it has a higher 2293e630869SGleb Smirnoff.Cm advskew : 2308e925890SGleb Smirnoff.Bd -literal -offset indent 231da4d5bb7SDmitry Morozovskyifconfig em0 vhid 1 advskew 200 pass mekmitasdigoat 192.168.1.1/24 232da4d5bb7SDmitry Morozovskyifconfig em1 vhid 2 advskew 200 pass mekmitasdigoat 192.168.2.1/24 2338e925890SGleb Smirnoff.Ed 2348e925890SGleb Smirnoff.Pp 235a1ae564eSGleb SmirnoffWhen one of the physical interfaces of host A fails, 2363e630869SGleb Smirnoff.Cm advskew 237a1ae564eSGleb Smirnoffis demoted to a configured value on all its 2388e925890SGleb Smirnoff.Nm 239a1ae564eSGleb Smirnoffvhids. 240a1ae564eSGleb SmirnoffDue to the preempt option, host B would start announcing itself, and thus 241a1ae564eSGleb Smirnoffpreempt host A on both interfaces instead of just the failed one. 24208b68b0eSGleb Smirnoff.\".Pp 24308b68b0eSGleb Smirnoff.\"In order to set up an ARP balanced virtual host, it is necessary to configure 24408b68b0eSGleb Smirnoff.\"one virtual host for each physical host which would respond to ARP requests 24508b68b0eSGleb Smirnoff.\"and thus handle the traffic. 24608b68b0eSGleb Smirnoff.\"In the following example, two virtual hosts are configured on two hosts to 24708b68b0eSGleb Smirnoff.\"provide balancing and failover for the IP address 192.168.1.10. 24808b68b0eSGleb Smirnoff.\".Pp 24908b68b0eSGleb Smirnoff.\"First the 25008b68b0eSGleb Smirnoff.\".Nm 25108b68b0eSGleb Smirnoff.\"interfaces on host A are configured. 25208b68b0eSGleb Smirnoff.\"The 25308b68b0eSGleb Smirnoff.\".Cm advskew 25408b68b0eSGleb Smirnoff.\"of 100 on the second virtual host means that its advertisements will be sent 25508b68b0eSGleb Smirnoff.\"out slightly less frequently. 25608b68b0eSGleb Smirnoff.\".Bd -literal -offset indent 25708b68b0eSGleb Smirnoff.\"ifconfig carp0 create 258da4d5bb7SDmitry Morozovsky.\"ifconfig carp0 vhid 1 advskew 100 pass mekmitasdigoat 192.168.1.10/24 25908b68b0eSGleb Smirnoff.\"ifconfig carp1 create 260da4d5bb7SDmitry Morozovsky.\"ifconfig carp1 vhid 2 advskew 200 pass mekmitasdigoat 192.168.1.10/24 26108b68b0eSGleb Smirnoff.\".Ed 26208b68b0eSGleb Smirnoff.\".Pp 26308b68b0eSGleb Smirnoff.\"The configuration for host B is identical, except the 26408b68b0eSGleb Smirnoff.\".Cm advskew 26508b68b0eSGleb Smirnoff.\"is on virtual host 1 rather than virtual host 2. 26608b68b0eSGleb Smirnoff.\".Bd -literal -offset indent 26708b68b0eSGleb Smirnoff.\"ifconfig carp0 create 268da4d5bb7SDmitry Morozovsky.\"ifconfig carp0 vhid 1 advskew 200 pass mekmitasdigoat 192.168.1.10/24 26908b68b0eSGleb Smirnoff.\"ifconfig carp1 create 270da4d5bb7SDmitry Morozovsky.\"ifconfig carp1 vhid 2 advskew 100 pass mekmitasdigoat 192.168.1.10/24 27108b68b0eSGleb Smirnoff.\".Ed 27208b68b0eSGleb Smirnoff.\".Pp 27308b68b0eSGleb Smirnoff.\"Finally, the ARP balancing feature must be enabled on both hosts: 27408b68b0eSGleb Smirnoff.\".Pp 27508b68b0eSGleb Smirnoff.\".Dl sysctl net.inet.carp.arpbalance=1 27608b68b0eSGleb Smirnoff.\".Pp 27708b68b0eSGleb Smirnoff.\"When the hosts receive an ARP request for 192.168.1.10, the source IP address 27808b68b0eSGleb Smirnoff.\"of the request is used to compute which virtual host should answer the request. 27908b68b0eSGleb Smirnoff.\"The host which is master of the selected virtual host will reply to the 28008b68b0eSGleb Smirnoff.\"request, the other(s) will ignore it. 28108b68b0eSGleb Smirnoff.\".Pp 28208b68b0eSGleb Smirnoff.\"This way, locally connected systems will receive different ARP replies and 28308b68b0eSGleb Smirnoff.\"subsequent IP traffic will be balanced among the hosts. 28408b68b0eSGleb Smirnoff.\"If one of the hosts fails, the other will take over the virtual MAC address, 28508b68b0eSGleb Smirnoff.\"and begin answering ARP requests on its behalf. 286cc8b2291SGleb Smirnoff.Pp 287cc8b2291SGleb SmirnoffProcessing of 288cc8b2291SGleb Smirnoff.Nm 28908b68b0eSGleb Smirnoffstatus change events can be set up by using the following devd.conf rule: 290cc8b2291SGleb Smirnoff.Bd -literal -offset indent 291cc8b2291SGleb Smirnoffnotify 0 { 29208b68b0eSGleb Smirnoff match "system" "CARP"; 293*9f0b5687SDaniel Ebdrup Jensen match "subsystem" "[0-9]+@[0-9a-z\.]+"; 29408b68b0eSGleb Smirnoff match "type" "(MASTER|BACKUP)"; 29508b68b0eSGleb Smirnoff action "/root/carpcontrol.sh $subsystem $type"; 296cc8b2291SGleb Smirnoff}; 297cc8b2291SGleb Smirnoff.Ed 2989c883c6cSGleb Smirnoff.Pp 2999c883c6cSGleb SmirnoffTo see 3009c883c6cSGleb Smirnoff.Nm 3019c883c6cSGleb Smirnoffpackets decoded in 302e81210c1SEdward Tomasz Napierala.Xr tcpdump 1 3036dd9dfc4SKristof Provostoutput, one needs to specify the 3049c883c6cSGleb Smirnoff.Fl T Ar carp 3059c883c6cSGleb Smirnoffoption, otherwise 306e81210c1SEdward Tomasz Napierala.Xr tcpdump 1 3076dd9dfc4SKristof Provostwill interpret them as VRRP packets: 3089c883c6cSGleb Smirnoff.Bd -literal -offset indent 3099c883c6cSGleb Smirnofftcpdump -npi vlan0 -T carp 3109c883c6cSGleb Smirnoff.Ed 3118e925890SGleb Smirnoff.Sh SEE ALSO 312e81210c1SEdward Tomasz Napierala.Xr tcpdump 1 , 3138e925890SGleb Smirnoff.Xr inet 4 , 3141771f872SGleb Smirnoff.Xr pfsync 4 , 3151eefdc3bSGleb Smirnoff.Xr devd.conf 5 , 316923544aaSBaptiste Daroussin.Xr rc.conf 5 , 317a4be0b3cSRuslan Ermilov.Xr ifconfig 8 , 318e81210c1SEdward Tomasz Napierala.Xr sysctl 8 3198e925890SGleb Smirnoff.Sh HISTORY 3208e925890SGleb SmirnoffThe 3218e925890SGleb Smirnoff.Nm 3228e925890SGleb Smirnoffdevice first appeared in 3238e925890SGleb Smirnoff.Ox 3.5 . 3248e925890SGleb SmirnoffThe 3258e925890SGleb Smirnoff.Nm 3263e630869SGleb Smirnoffdevice was imported into 3278e925890SGleb Smirnoff.Fx 5.4 . 32808b68b0eSGleb SmirnoffIn 32984e3b10bSBenjamin Kaduk.Fx 10.0 , 33008b68b0eSGleb Smirnoff.Nm 33108b68b0eSGleb Smirnoffwas significantly rewritten, and is no longer a pseudo-interface. 332