@@ -46,6 +46,7 @@ typedef ssize_t (NetReceive)(VLANClientState *, const uint8_t *, size_t);
typedef ssize_t (NetReceiveIOV)(VLANClientState *, const struct iovec *, int);
typedef void (NetCleanup) (VLANClientState *);
typedef void (LinkStatusChanged)(VLANClientState *);
+typedef int (NetAnnounce)(VLANClientState *);
typedef struct NetClientInfo {
net_client_type type;
@@ -57,6 +58,7 @@ typedef struct NetClientInfo {
NetCleanup *cleanup;
LinkStatusChanged *link_status_changed;
NetPoll *poll;
+ NetAnnounce *announce;
} NetClientInfo;
struct VLANClientState {
@@ -89,10 +89,12 @@ static void qemu_announce_self_iter(NICState *nic, void *opaque)
{
uint8_t buf[60];
int len;
+ NetAnnounce *func = nic->nc.info->announce;
- len = announce_self_create(buf, nic->conf->macaddr.a);
-
- qemu_send_packet_raw(&nic->nc, buf, len);
+ if (func == NULL || func(&nic->nc) != 0) {
+ len = announce_self_create(buf, nic->conf->macaddr.a);
+ qemu_send_packet_raw(&nic->nc, buf, len);
+ }
}
This patch introduce a function pointer in NetClientInfo which is called during self announcement to do the model specific announcement such as sending gratuitous packet. Previous method is kept when model specific announcing fails or without it. The first user would be virtio-net. Signed-off-by: Jason Wang <jasowang@redhat.com> --- net.h | 2 ++ savevm.c | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-)