Commit 34309d2b authored by Corey Bryant's avatar Corey Bryant Committed by Stefan Hajnoczi
Browse files

net: Add interface to bridge when SIOCBRADDIF isn't available



The bridge helper uses the SIOCBRADDIF ioctl to add an inteface to
a bridge.  SIOCBRADDIF is not available on old Linux versions.  This
patch adds support to use the SIOCDEVPRIVATE ioctl with BRCTL_ADD_IF
if SIOCBRADDIF is not available.

Reported-by: default avatarFabien Chouteau <chouteau@adacore.com>
Signed-off-by: default avatarCorey Bryant <coreyb@linux.vnet.ibm.com>
Signed-off-by: default avatarStefan Hajnoczi <stefanha@linux.vnet.ibm.com>
parent 0b22ef0f
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -35,6 +35,10 @@

#include <linux/sockios.h>

#ifndef SIOCBRADDIF
#include <linux/if_bridge.h>
#endif

#include "qemu-queue.h"

#include "net/tap-linux.h"
@@ -221,6 +225,10 @@ static int drop_privileges(void)
int main(int argc, char **argv)
{
    struct ifreq ifr;
#ifndef SIOCBRADDIF
    unsigned long ifargs[4];
#endif
    int ifindex;
    int fd, ctlfd, unixfd = -1;
    int use_vnet = 0;
    int mtu;
@@ -361,9 +369,19 @@ int main(int argc, char **argv)

    /* add the interface to the bridge */
    prep_ifreq(&ifr, bridge);
    ifr.ifr_ifindex = if_nametoindex(iface);

    if (ioctl(ctlfd, SIOCBRADDIF, &ifr) == -1) {
    ifindex = if_nametoindex(iface);
#ifndef SIOCBRADDIF
    ifargs[0] = BRCTL_ADD_IF;
    ifargs[1] = ifindex;
    ifargs[2] = 0;
    ifargs[3] = 0;
    ifr.ifr_data = (void *)ifargs;
    ret = ioctl(ctlfd, SIOCDEVPRIVATE, &ifr);
#else
    ifr.ifr_ifindex = ifindex;
    ret = ioctl(ctlfd, SIOCBRADDIF, &ifr);
#endif
    if (ret == -1) {
        fprintf(stderr, "failed to add interface `%s' to bridge `%s': %s\n",
                iface, bridge, strerror(errno));
        ret = EXIT_FAILURE;