The default Xen network setup is, in my opinion, really confusing. Moreover, it is built by a script that is prone to fail in complex situations. For example, the part that handles bonds doesn’t seem to work properly on Squeeze.
If you do not believe that the default setup is complicated, just look at that. I’m not sure why it does things in such a complicated way, just so that your bridge takes the name of the former physical interface. The end result is that people not familiar with Xen (just like me a few month ago) will scratch their head before realizing eth0 is NOT a network interface but a bridge !
Today I wanted to setup Xen on top of a bonded interface. The scripts failed, and I resolved to stop using them. My approach is to use what comes with your distribution. The main advantage is that it is WAY easier to understand what is being done. Here is a snippet /etc/network/interfaces that builds a bridge suitable for Xen on top of a bonded link made of eth0 and eth1 :
iface eth0 inet manual iface eth1 inet manual auto bond0 iface bond0 inet manual slaves eth0 eth1 bond-mode active-backup bond_miimon 100 bond_downdelay 200 bond_updelay 200 auto xenbr iface xenbr inet static bridge_ports bond0 address 220.127.116.11 netmask 255.255.255.0 gateway 18.104.22.168
No more worries. My xen network-script now just creates Vlan bridges over bond0 (it is scripted because the vlan list is computed, but I could do it just like that in Puppet).