X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/9423a2e8dd362a271bfe194ec131062814557b95..d1b719e98ce8b506d122a845d405f941a7a497c1:/net.c diff --git a/net.c b/net.c index f7bebf8cc4..1922d8abd1 100644 --- a/net.c +++ b/net.c @@ -38,6 +38,11 @@ #include "hw/qdev.h" #include "iov.h" +/* Net bridge is currently not supported for W32. */ +#if !defined(_WIN32) +# define CONFIG_NET_BRIDGE +#endif + static QTAILQ_HEAD(, VLANState) vlans; static QTAILQ_HEAD(, VLANClientState) non_vlan_clients; @@ -952,6 +957,12 @@ static const struct { .type = QEMU_OPT_STRING, .help = "script to shut down the interface", }, { +#ifdef CONFIG_NET_BRIDGE + .name = "helper", + .type = QEMU_OPT_STRING, + .help = "command to execute to configure bridge", + }, { +#endif .name = "sndbuf", .type = QEMU_OPT_SIZE, .help = "send buffer limit" @@ -1000,7 +1011,11 @@ static const struct { }, { .name = "localaddr", .type = QEMU_OPT_STRING, - .help = "source address for multicast packets", + .help = "source address and port for multicast and udp packets", + }, { + .name = "udp", + .type = QEMU_OPT_STRING, + .help = "UDP unicast address and port number", }, { /* end of list */ } }, @@ -1049,6 +1064,25 @@ static const struct { { /* end of list */ } }, }, +#ifdef CONFIG_NET_BRIDGE + [NET_CLIENT_TYPE_BRIDGE] = { + .type = "bridge", + .init = net_init_bridge, + .desc = { + NET_COMMON_PARAMS_DESC, + { + .name = "br", + .type = QEMU_OPT_STRING, + .help = "bridge name", + }, { + .name = "helper", + .type = QEMU_OPT_STRING, + .help = "command to execute to configure bridge", + }, + { /* end of list */ } + }, + }, +#endif /* CONFIG_NET_BRIDGE */ }; int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev) @@ -1065,6 +1099,9 @@ int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev) if (is_netdev) { if (strcmp(type, "tap") != 0 && +#ifdef CONFIG_NET_BRIDGE + strcmp(type, "bridge") != 0 && +#endif #ifdef CONFIG_SLIRP strcmp(type, "user") != 0 && #endif @@ -1135,6 +1172,9 @@ static int net_host_check_device(const char *device) { int i; const char *valid_param_list[] = { "tap", "socket", "dump" +#ifdef CONFIG_NET_BRIDGE + , "bridge" +#endif #ifdef CONFIG_SLIRP ,"user" #endif @@ -1435,3 +1475,26 @@ int net_client_parse(QemuOptsList *opts_list, const char *optarg) default_net = 0; return 0; } + +/* From FreeBSD */ +/* XXX: optimize */ +unsigned compute_mcast_idx(const uint8_t *ep) +{ + uint32_t crc; + int carry, i, j; + uint8_t b; + + crc = 0xffffffff; + for (i = 0; i < 6; i++) { + b = *ep++; + for (j = 0; j < 8; j++) { + carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01); + crc <<= 1; + b >>= 1; + if (carry) { + crc = ((crc ^ POLYNOMIAL) | carry); + } + } + } + return crc >> 26; +}