From 27e290bf617b5e2623b261c10f26c445690b57ae Mon Sep 17 00:00:00 2001 From: Gleb Natapov <gleb@redhat.com> Date: Mon, 25 May 2009 16:02:53 +0300 Subject: [PATCH 13/14] Don't send all gratuitous packets at once. Use timer to separate them in time. Signed-off-by: Gleb Natapov <gleb@redhat.com> Message-Id: <1243256573-9056-4-git-send-email-gleb@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> RH-Upstream-status: submitted Acked-by: Mark McLoughlin <markmc@redhat.com> Acked-by: Kevin Wolf <kwolf@redhat.com> Acked-by: Glauber Costa <glommer@redhat.com> Acked-by: Dor Laor <dlaor@redhat.com> Bugzilla: 503793 --- qemu/savevm.c | 24 +++++++++++++++++++----- 1 files changed, 19 insertions(+), 5 deletions(-) diff --git a/qemu/savevm.c b/qemu/savevm.c index 37d8c4e..8c003f9 100644 --- a/qemu/savevm.c +++ b/qemu/savevm.c @@ -112,23 +112,37 @@ static int announce_self_create(uint8_t *buf, return 64; /* len */ } -void qemu_announce_self(void) +static void qemu_announce_self_once(void *opaque) { - int i, j, len; + int i, len; VLANState *vlan; VLANClientState *vc; uint8_t buf[256]; + static int count = SELF_ANNOUNCE_ROUNDS; + QEMUTimer *timer = *(QEMUTimer **)opaque; for (i = 0; i < MAX_NICS; i++) { if (!nd_table[i].used) continue; len = announce_self_create(buf, nd_table[i].macaddr); vlan = nd_table[i].vlan; - for(vc = vlan->first_client; vc != NULL; vc = vc->next) { - for (j=0; j < SELF_ANNOUNCE_ROUNDS; j++) - vc->fd_read(vc->opaque, buf, len); + for(vc = vlan->first_client; vc != NULL; vc = vc->next) { + qemu_send_packet_raw(vc, buf, len); } } + if (count--) { + qemu_mod_timer(timer, qemu_get_clock(rt_clock) + 100); + } else { + qemu_del_timer(timer); + qemu_free_timer(timer); + } +} + +void qemu_announce_self(void) +{ + static QEMUTimer *timer; + timer = qemu_new_timer(rt_clock, qemu_announce_self_once, &timer); + qemu_announce_self_once(&timer); } /***********************************************************/ -- 1.6.3.rc4.29.g8146