1# -*- Mode: Python -*- 2# vim: filetype=python 3# 4 5## 6# = Net devices 7## 8 9{ 'include': 'common.json' } 10 11## 12# @set_link: 13# 14# Sets the link status of a virtual network adapter. 15# 16# @name: the device name of the virtual network adapter 17# 18# @up: true to set the link status to be up 19# 20# Returns: Nothing on success 21# If @name is not a valid network device, DeviceNotFound 22# 23# Since: 0.14 24# 25# Notes: Not all network adapters support setting link status. This command 26# will succeed even if the network adapter does not support link status 27# notification. 28# 29# Example: 30# 31# -> { "execute": "set_link", 32# "arguments": { "name": "e1000.0", "up": false } } 33# <- { "return": {} } 34# 35## 36{ 'command': 'set_link', 'data': {'name': 'str', 'up': 'bool'} } 37 38## 39# @netdev_add: 40# 41# Add a network backend. 42# 43# Additional arguments depend on the type. 44# 45# Since: 0.14 46# 47# Returns: Nothing on success 48# If @type is not a valid network backend, DeviceNotFound 49# 50# Example: 51# 52# -> { "execute": "netdev_add", 53# "arguments": { "type": "user", "id": "netdev1", 54# "dnssearch": [ { "str": "example.org" } ] } } 55# <- { "return": {} } 56# 57## 58{ 'command': 'netdev_add', 'data': 'Netdev', 'boxed': true, 59 'allow-preconfig': true } 60 61## 62# @netdev_del: 63# 64# Remove a network backend. 65# 66# @id: the name of the network backend to remove 67# 68# Returns: Nothing on success 69# If @id is not a valid network backend, DeviceNotFound 70# 71# Since: 0.14 72# 73# Example: 74# 75# -> { "execute": "netdev_del", "arguments": { "id": "netdev1" } } 76# <- { "return": {} } 77# 78## 79{ 'command': 'netdev_del', 'data': {'id': 'str'}, 80 'allow-preconfig': true } 81 82## 83# @NetLegacyNicOptions: 84# 85# Create a new Network Interface Card. 86# 87# @netdev: id of -netdev to connect to 88# 89# @macaddr: MAC address 90# 91# @model: device model (e1000, rtl8139, virtio etc.) 92# 93# @addr: PCI device address 94# 95# @vectors: number of MSI-x vectors, 0 to disable MSI-X 96# 97# Since: 1.2 98## 99{ 'struct': 'NetLegacyNicOptions', 100 'data': { 101 '*netdev': 'str', 102 '*macaddr': 'str', 103 '*model': 'str', 104 '*addr': 'str', 105 '*vectors': 'uint32' } } 106 107## 108# @NetdevUserOptions: 109# 110# Use the user mode network stack which requires no administrator privilege to 111# run. 112# 113# @hostname: client hostname reported by the builtin DHCP server 114# 115# @restrict: isolate the guest from the host 116# 117# @ipv4: whether to support IPv4, default true for enabled 118# (since 2.6) 119# 120# @ipv6: whether to support IPv6, default true for enabled 121# (since 2.6) 122# 123# @ip: legacy parameter, use net= instead 124# 125# @net: IP network address that the guest will see, in the 126# form addr[/netmask] The netmask is optional, and can be 127# either in the form a.b.c.d or as a number of valid top-most 128# bits. Default is 10.0.2.0/24. 129# 130# @host: guest-visible address of the host 131# 132# @tftp: root directory of the built-in TFTP server 133# 134# @bootfile: BOOTP filename, for use with tftp= 135# 136# @dhcpstart: the first of the 16 IPs the built-in DHCP server can 137# assign 138# 139# @dns: guest-visible address of the virtual nameserver 140# 141# @dnssearch: list of DNS suffixes to search, passed as DHCP option 142# to the guest 143# 144# @domainname: guest-visible domain name of the virtual nameserver 145# (since 3.0) 146# 147# @ipv6-prefix: IPv6 network prefix (default is fec0::) (since 148# 2.6). The network prefix is given in the usual 149# hexadecimal IPv6 address notation. 150# 151# @ipv6-prefixlen: IPv6 network prefix length (default is 64) 152# (since 2.6) 153# 154# @ipv6-host: guest-visible IPv6 address of the host (since 2.6) 155# 156# @ipv6-dns: guest-visible IPv6 address of the virtual 157# nameserver (since 2.6) 158# 159# @smb: root directory of the built-in SMB server 160# 161# @smbserver: IP address of the built-in SMB server 162# 163# @hostfwd: redirect incoming TCP or UDP host connections to guest 164# endpoints 165# 166# @guestfwd: forward guest TCP connections 167# 168# @tftp-server-name: RFC2132 "TFTP server name" string (Since 3.1) 169# 170# Since: 1.2 171## 172{ 'struct': 'NetdevUserOptions', 173 'data': { 174 '*hostname': 'str', 175 '*restrict': 'bool', 176 '*ipv4': 'bool', 177 '*ipv6': 'bool', 178 '*ip': 'str', 179 '*net': 'str', 180 '*host': 'str', 181 '*tftp': 'str', 182 '*bootfile': 'str', 183 '*dhcpstart': 'str', 184 '*dns': 'str', 185 '*dnssearch': ['String'], 186 '*domainname': 'str', 187 '*ipv6-prefix': 'str', 188 '*ipv6-prefixlen': 'int', 189 '*ipv6-host': 'str', 190 '*ipv6-dns': 'str', 191 '*smb': 'str', 192 '*smbserver': 'str', 193 '*hostfwd': ['String'], 194 '*guestfwd': ['String'], 195 '*tftp-server-name': 'str' } } 196 197## 198# @NetdevTapOptions: 199# 200# Used to configure a host TAP network interface backend. 201# 202# @ifname: interface name 203# 204# @fd: file descriptor of an already opened tap 205# 206# @fds: multiple file descriptors of already opened multiqueue capable 207# tap 208# 209# @script: script to initialize the interface 210# 211# @downscript: script to shut down the interface 212# 213# @br: bridge name (since 2.8) 214# 215# @helper: command to execute to configure bridge 216# 217# @sndbuf: send buffer limit. Understands [TGMKkb] suffixes. 218# 219# @vnet_hdr: enable the IFF_VNET_HDR flag on the tap interface 220# 221# @vhost: enable vhost-net network accelerator 222# 223# @vhostfd: file descriptor of an already opened vhost net device 224# 225# @vhostfds: file descriptors of multiple already opened vhost net 226# devices 227# 228# @vhostforce: vhost on for non-MSIX virtio guests 229# 230# @queues: number of queues to be created for multiqueue capable tap 231# 232# @poll-us: maximum number of microseconds that could 233# be spent on busy polling for tap (since 2.7) 234# 235# Since: 1.2 236## 237{ 'struct': 'NetdevTapOptions', 238 'data': { 239 '*ifname': 'str', 240 '*fd': 'str', 241 '*fds': 'str', 242 '*script': 'str', 243 '*downscript': 'str', 244 '*br': 'str', 245 '*helper': 'str', 246 '*sndbuf': 'size', 247 '*vnet_hdr': 'bool', 248 '*vhost': 'bool', 249 '*vhostfd': 'str', 250 '*vhostfds': 'str', 251 '*vhostforce': 'bool', 252 '*queues': 'uint32', 253 '*poll-us': 'uint32'} } 254 255## 256# @NetdevSocketOptions: 257# 258# Socket netdevs are used to establish a network connection to another 259# QEMU virtual machine via a TCP socket. 260# 261# @fd: file descriptor of an already opened socket 262# 263# @listen: port number, and optional hostname, to listen on 264# 265# @connect: port number, and optional hostname, to connect to 266# 267# @mcast: UDP multicast address and port number 268# 269# @localaddr: source address and port for multicast and udp packets 270# 271# @udp: UDP unicast address and port number 272# 273# Since: 1.2 274## 275{ 'struct': 'NetdevSocketOptions', 276 'data': { 277 '*fd': 'str', 278 '*listen': 'str', 279 '*connect': 'str', 280 '*mcast': 'str', 281 '*localaddr': 'str', 282 '*udp': 'str' } } 283 284## 285# @NetdevL2TPv3Options: 286# 287# Configure an Ethernet over L2TPv3 tunnel. 288# 289# @src: source address 290# 291# @dst: destination address 292# 293# @srcport: source port - mandatory for udp, optional for ip 294# 295# @dstport: destination port - mandatory for udp, optional for ip 296# 297# @ipv6: force the use of ipv6 298# 299# @udp: use the udp version of l2tpv3 encapsulation 300# 301# @cookie64: use 64 bit cookies 302# 303# @counter: have sequence counter 304# 305# @pincounter: pin sequence counter to zero - 306# workaround for buggy implementations or 307# networks with packet reorder 308# 309# @txcookie: 32 or 64 bit transmit cookie 310# 311# @rxcookie: 32 or 64 bit receive cookie 312# 313# @txsession: 32 bit transmit session 314# 315# @rxsession: 32 bit receive session - if not specified 316# set to the same value as transmit 317# 318# @offset: additional offset - allows the insertion of 319# additional application-specific data before the packet payload 320# 321# Since: 2.1 322## 323{ 'struct': 'NetdevL2TPv3Options', 324 'data': { 325 'src': 'str', 326 'dst': 'str', 327 '*srcport': 'str', 328 '*dstport': 'str', 329 '*ipv6': 'bool', 330 '*udp': 'bool', 331 '*cookie64': 'bool', 332 '*counter': 'bool', 333 '*pincounter': 'bool', 334 '*txcookie': 'uint64', 335 '*rxcookie': 'uint64', 336 'txsession': 'uint32', 337 '*rxsession': 'uint32', 338 '*offset': 'uint32' } } 339 340## 341# @NetdevVdeOptions: 342# 343# Connect to a vde switch running on the host. 344# 345# @sock: socket path 346# 347# @port: port number 348# 349# @group: group owner of socket 350# 351# @mode: permissions for socket 352# 353# Since: 1.2 354## 355{ 'struct': 'NetdevVdeOptions', 356 'data': { 357 '*sock': 'str', 358 '*port': 'uint16', 359 '*group': 'str', 360 '*mode': 'uint16' } } 361 362## 363# @NetdevBridgeOptions: 364# 365# Connect a host TAP network interface to a host bridge device. 366# 367# @br: bridge name 368# 369# @helper: command to execute to configure bridge 370# 371# Since: 1.2 372## 373{ 'struct': 'NetdevBridgeOptions', 374 'data': { 375 '*br': 'str', 376 '*helper': 'str' } } 377 378## 379# @NetdevHubPortOptions: 380# 381# Connect two or more net clients through a software hub. 382# 383# @hubid: hub identifier number 384# @netdev: used to connect hub to a netdev instead of a device (since 2.12) 385# 386# Since: 1.2 387## 388{ 'struct': 'NetdevHubPortOptions', 389 'data': { 390 'hubid': 'int32', 391 '*netdev': 'str' } } 392 393## 394# @NetdevNetmapOptions: 395# 396# Connect a client to a netmap-enabled NIC or to a VALE switch port 397# 398# @ifname: Either the name of an existing network interface supported by 399# netmap, or the name of a VALE port (created on the fly). 400# A VALE port name is in the form 'valeXXX:YYY', where XXX and 401# YYY are non-negative integers. XXX identifies a switch and 402# YYY identifies a port of the switch. VALE ports having the 403# same XXX are therefore connected to the same switch. 404# 405# @devname: path of the netmap device (default: '/dev/netmap'). 406# 407# Since: 2.0 408## 409{ 'struct': 'NetdevNetmapOptions', 410 'data': { 411 'ifname': 'str', 412 '*devname': 'str' } } 413 414## 415# @NetdevVhostUserOptions: 416# 417# Vhost-user network backend 418# 419# @chardev: name of a unix socket chardev 420# 421# @vhostforce: vhost on for non-MSIX virtio guests (default: false). 422# 423# @queues: number of queues to be created for multiqueue vhost-user 424# (default: 1) (Since 2.5) 425# 426# Since: 2.1 427## 428{ 'struct': 'NetdevVhostUserOptions', 429 'data': { 430 'chardev': 'str', 431 '*vhostforce': 'bool', 432 '*queues': 'int' } } 433 434## 435# @NetdevVhostVDPAOptions: 436# 437# Vhost-vdpa network backend 438# 439# vDPA device is a device that uses a datapath which complies with the virtio 440# specifications with a vendor specific control path. 441# 442# @vhostdev: path of vhost-vdpa device 443# (default:'/dev/vhost-vdpa-0') 444# 445# @queues: number of queues to be created for multiqueue vhost-vdpa 446# (default: 1) 447# 448# Since: 5.1 449## 450{ 'struct': 'NetdevVhostVDPAOptions', 451 'data': { 452 '*vhostdev': 'str', 453 '*queues': 'int' } } 454 455## 456# @NetdevVmnetHostOptions: 457# 458# vmnet (host mode) network backend. 459# 460# Allows the vmnet interface to communicate with other vmnet 461# interfaces that are in host mode and also with the host. 462# 463# @start-address: The starting IPv4 address to use for the interface. 464# Must be in the private IP range (RFC 1918). Must be 465# specified along with @end-address and @subnet-mask. 466# This address is used as the gateway address. The 467# subsequent address up to and including end-address are 468# placed in the DHCP pool. 469# 470# @end-address: The DHCP IPv4 range end address to use for the 471# interface. Must be in the private IP range (RFC 1918). 472# Must be specified along with @start-address and 473# @subnet-mask. 474# 475# @subnet-mask: The IPv4 subnet mask to use on the interface. Must 476# be specified along with @start-address and @subnet-mask. 477# 478# @isolated: Enable isolation for this interface. Interface isolation 479# ensures that vmnet interface is not able to communicate 480# with any other vmnet interfaces. Only communication with 481# host is allowed. Requires at least macOS Big Sur 11.0. 482# 483# @net-uuid: The identifier (UUID) to uniquely identify the isolated 484# network vmnet interface should be added to. If 485# set, no DHCP service is provided for this interface and 486# network communication is allowed only with other interfaces 487# added to this network identified by the UUID. Requires 488# at least macOS Big Sur 11.0. 489# 490# Since: 7.1 491## 492{ 'struct': 'NetdevVmnetHostOptions', 493 'data': { 494 '*start-address': 'str', 495 '*end-address': 'str', 496 '*subnet-mask': 'str', 497 '*isolated': 'bool', 498 '*net-uuid': 'str' }, 499 'if': 'CONFIG_VMNET' } 500 501## 502# @NetdevVmnetSharedOptions: 503# 504# vmnet (shared mode) network backend. 505# 506# Allows traffic originating from the vmnet interface to reach the 507# Internet through a network address translator (NAT). 508# The vmnet interface can communicate with the host and with 509# other shared mode interfaces on the same subnet. If no DHCP 510# settings, subnet mask and IPv6 prefix specified, the interface can 511# communicate with any of other interfaces in shared mode. 512# 513# @start-address: The starting IPv4 address to use for the interface. 514# Must be in the private IP range (RFC 1918). Must be 515# specified along with @end-address and @subnet-mask. 516# This address is used as the gateway address. The 517# subsequent address up to and including end-address are 518# placed in the DHCP pool. 519# 520# @end-address: The DHCP IPv4 range end address to use for the 521# interface. Must be in the private IP range (RFC 1918). 522# Must be specified along with @start-address and @subnet-mask. 523# 524# @subnet-mask: The IPv4 subnet mask to use on the interface. Must 525# be specified along with @start-address and @subnet-mask. 526# 527# @isolated: Enable isolation for this interface. Interface isolation 528# ensures that vmnet interface is not able to communicate 529# with any other vmnet interfaces. Only communication with 530# host is allowed. Requires at least macOS Big Sur 11.0. 531# 532# @nat66-prefix: The IPv6 prefix to use into guest network. Must be a 533# unique local address i.e. start with fd00::/8 and have 534# length of 64. 535# 536# Since: 7.1 537## 538{ 'struct': 'NetdevVmnetSharedOptions', 539 'data': { 540 '*start-address': 'str', 541 '*end-address': 'str', 542 '*subnet-mask': 'str', 543 '*isolated': 'bool', 544 '*nat66-prefix': 'str' }, 545 'if': 'CONFIG_VMNET' } 546 547## 548# @NetdevVmnetBridgedOptions: 549# 550# vmnet (bridged mode) network backend. 551# 552# Bridges the vmnet interface with a physical network interface. 553# 554# @ifname: The name of the physical interface to be bridged. 555# 556# @isolated: Enable isolation for this interface. Interface isolation 557# ensures that vmnet interface is not able to communicate 558# with any other vmnet interfaces. Only communication with 559# host is allowed. Requires at least macOS Big Sur 11.0. 560# 561# Since: 7.1 562## 563{ 'struct': 'NetdevVmnetBridgedOptions', 564 'data': { 565 'ifname': 'str', 566 '*isolated': 'bool' }, 567 'if': 'CONFIG_VMNET' } 568 569## 570# @NetClientDriver: 571# 572# Available netdev drivers. 573# 574# Since: 2.7 575# 576# @vhost-vdpa since 5.1 577# @vmnet-host since 7.1 578# @vmnet-shared since 7.1 579# @vmnet-bridged since 7.1 580## 581{ 'enum': 'NetClientDriver', 582 'data': [ 'none', 'nic', 'user', 'tap', 'l2tpv3', 'socket', 'vde', 583 'bridge', 'hubport', 'netmap', 'vhost-user', 'vhost-vdpa', 584 { 'name': 'vmnet-host', 'if': 'CONFIG_VMNET' }, 585 { 'name': 'vmnet-shared', 'if': 'CONFIG_VMNET' }, 586 { 'name': 'vmnet-bridged', 'if': 'CONFIG_VMNET' }] } 587 588## 589# @Netdev: 590# 591# Captures the configuration of a network device. 592# 593# @id: identifier for monitor commands. 594# 595# @type: Specify the driver used for interpreting remaining arguments. 596# 597# Since: 1.2 598# 599# 'l2tpv3' - since 2.1 600# 'vmnet-host' - since 7.1 601# 'vmnet-shared' - since 7.1 602# 'vmnet-bridged' - since 7.1 603## 604{ 'union': 'Netdev', 605 'base': { 'id': 'str', 'type': 'NetClientDriver' }, 606 'discriminator': 'type', 607 'data': { 608 'nic': 'NetLegacyNicOptions', 609 'user': 'NetdevUserOptions', 610 'tap': 'NetdevTapOptions', 611 'l2tpv3': 'NetdevL2TPv3Options', 612 'socket': 'NetdevSocketOptions', 613 'vde': 'NetdevVdeOptions', 614 'bridge': 'NetdevBridgeOptions', 615 'hubport': 'NetdevHubPortOptions', 616 'netmap': 'NetdevNetmapOptions', 617 'vhost-user': 'NetdevVhostUserOptions', 618 'vhost-vdpa': 'NetdevVhostVDPAOptions', 619 'vmnet-host': { 'type': 'NetdevVmnetHostOptions', 620 'if': 'CONFIG_VMNET' }, 621 'vmnet-shared': { 'type': 'NetdevVmnetSharedOptions', 622 'if': 'CONFIG_VMNET' }, 623 'vmnet-bridged': { 'type': 'NetdevVmnetBridgedOptions', 624 'if': 'CONFIG_VMNET' } } } 625 626## 627# @RxState: 628# 629# Packets receiving state 630# 631# @normal: filter assigned packets according to the mac-table 632# 633# @none: don't receive any assigned packet 634# 635# @all: receive all assigned packets 636# 637# Since: 1.6 638## 639{ 'enum': 'RxState', 'data': [ 'normal', 'none', 'all' ] } 640 641## 642# @RxFilterInfo: 643# 644# Rx-filter information for a NIC. 645# 646# @name: net client name 647# 648# @promiscuous: whether promiscuous mode is enabled 649# 650# @multicast: multicast receive state 651# 652# @unicast: unicast receive state 653# 654# @vlan: vlan receive state (Since 2.0) 655# 656# @broadcast-allowed: whether to receive broadcast 657# 658# @multicast-overflow: multicast table is overflowed or not 659# 660# @unicast-overflow: unicast table is overflowed or not 661# 662# @main-mac: the main macaddr string 663# 664# @vlan-table: a list of active vlan id 665# 666# @unicast-table: a list of unicast macaddr string 667# 668# @multicast-table: a list of multicast macaddr string 669# 670# Since: 1.6 671## 672{ 'struct': 'RxFilterInfo', 673 'data': { 674 'name': 'str', 675 'promiscuous': 'bool', 676 'multicast': 'RxState', 677 'unicast': 'RxState', 678 'vlan': 'RxState', 679 'broadcast-allowed': 'bool', 680 'multicast-overflow': 'bool', 681 'unicast-overflow': 'bool', 682 'main-mac': 'str', 683 'vlan-table': ['int'], 684 'unicast-table': ['str'], 685 'multicast-table': ['str'] }} 686 687## 688# @query-rx-filter: 689# 690# Return rx-filter information for all NICs (or for the given NIC). 691# 692# @name: net client name 693# 694# Returns: list of @RxFilterInfo for all NICs (or for the given NIC). 695# Returns an error if the given @name doesn't exist, or given 696# NIC doesn't support rx-filter querying, or given net client 697# isn't a NIC. 698# 699# Since: 1.6 700# 701# Example: 702# 703# -> { "execute": "query-rx-filter", "arguments": { "name": "vnet0" } } 704# <- { "return": [ 705# { 706# "promiscuous": true, 707# "name": "vnet0", 708# "main-mac": "52:54:00:12:34:56", 709# "unicast": "normal", 710# "vlan": "normal", 711# "vlan-table": [ 712# 4, 713# 0 714# ], 715# "unicast-table": [ 716# ], 717# "multicast": "normal", 718# "multicast-overflow": false, 719# "unicast-overflow": false, 720# "multicast-table": [ 721# "01:00:5e:00:00:01", 722# "33:33:00:00:00:01", 723# "33:33:ff:12:34:56" 724# ], 725# "broadcast-allowed": false 726# } 727# ] 728# } 729# 730## 731{ 'command': 'query-rx-filter', 732 'data': { '*name': 'str' }, 733 'returns': ['RxFilterInfo'] } 734 735## 736# @NIC_RX_FILTER_CHANGED: 737# 738# Emitted once until the 'query-rx-filter' command is executed, the first event 739# will always be emitted 740# 741# @name: net client name 742# 743# @path: device path 744# 745# Since: 1.6 746# 747# Example: 748# 749# <- { "event": "NIC_RX_FILTER_CHANGED", 750# "data": { "name": "vnet0", 751# "path": "/machine/peripheral/vnet0/virtio-backend" }, 752# "timestamp": { "seconds": 1368697518, "microseconds": 326866 } } 753# } 754# 755## 756{ 'event': 'NIC_RX_FILTER_CHANGED', 757 'data': { '*name': 'str', 'path': 'str' } } 758 759## 760# @AnnounceParameters: 761# 762# Parameters for self-announce timers 763# 764# @initial: Initial delay (in ms) before sending the first GARP/RARP 765# announcement 766# 767# @max: Maximum delay (in ms) between GARP/RARP announcement packets 768# 769# @rounds: Number of self-announcement attempts 770# 771# @step: Delay increase (in ms) after each self-announcement attempt 772# 773# @interfaces: An optional list of interface names, which restricts the 774# announcement to the listed interfaces. (Since 4.1) 775# 776# @id: A name to be used to identify an instance of announce-timers 777# and to allow it to modified later. Not for use as 778# part of the migration parameters. (Since 4.1) 779# 780# Since: 4.0 781## 782 783{ 'struct': 'AnnounceParameters', 784 'data': { 'initial': 'int', 785 'max': 'int', 786 'rounds': 'int', 787 'step': 'int', 788 '*interfaces': ['str'], 789 '*id' : 'str' } } 790 791## 792# @announce-self: 793# 794# Trigger generation of broadcast RARP frames to update network switches. 795# This can be useful when network bonds fail-over the active slave. 796# 797# Example: 798# 799# -> { "execute": "announce-self", 800# "arguments": { 801# "initial": 50, "max": 550, "rounds": 10, "step": 50, 802# "interfaces": ["vn2", "vn3"], "id": "bob" } } 803# <- { "return": {} } 804# 805# Since: 4.0 806## 807{ 'command': 'announce-self', 'boxed': true, 808 'data' : 'AnnounceParameters'} 809 810## 811# @FAILOVER_NEGOTIATED: 812# 813# Emitted when VIRTIO_NET_F_STANDBY was enabled during feature negotiation. 814# Failover primary devices which were hidden (not hotplugged when requested) 815# before will now be hotplugged by the virtio-net standby device. 816# 817# @device-id: QEMU device id of the unplugged device 818# 819# Since: 4.2 820# 821# Example: 822# 823# <- { "event": "FAILOVER_NEGOTIATED", 824# "data": { "device-id": "net1" }, 825# "timestamp": { "seconds": 1368697518, "microseconds": 326866 } } 826# 827## 828{ 'event': 'FAILOVER_NEGOTIATED', 829 'data': {'device-id': 'str'} } 830