@@ -44,6 +44,7 @@ typedef ssize_t (NetReceiveIOV)(NetClientState *, const struct iovec *, int);
typedef void (NetCleanup) (NetClientState *);
typedef void (LinkStatusChanged)(NetClientState *);
typedef void (NetClientDestructor)(NetClientState *);
+typedef int (NetAnnounce)(NetClientState *);
typedef struct NetClientInfo {
NetClientOptionsKind type;
@@ -55,6 +56,7 @@ typedef struct NetClientInfo {
NetCleanup *cleanup;
LinkStatusChanged *link_status_changed;
NetPoll *poll;
+ NetAnnounce *announce;
} NetClientInfo;
struct NetClientState {
@@ -76,12 +76,16 @@ static int announce_self_create(uint8_t *buf,
static void qemu_announce_self_iter(NICState *nic, void *opaque)
{
+ NetClientState *nc = qemu_get_queue(nic);
+ NetAnnounce *announce = nc->info->announce;
uint8_t buf[60];
int len;
- len = announce_self_create(buf, nic->conf->macaddr.a);
+ if (!announce || announce(nc)) {
+ len = announce_self_create(buf, nic->conf->macaddr.a);
- qemu_send_packet_raw(qemu_get_queue(nic), buf, len);
+ qemu_send_packet_raw(qemu_get_queue(nic), buf, len);
+ }
}
This patch introduces a function pointer in NetClientInfo which is called during self announcement. With this, each kind of card can announce the link with a model specific way. The old method is still kept for cards that have not implemented this or old guest. The first user would be virtio-net. Signed-off-by: Jason Wang <jasowang@redhat.com> --- include/net/net.h | 2 ++ savevm.c | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-)